ジュリア集合が「連結かどうか」を数えるだけでマンデルブロ集合が出てくる。ただし出てきたのはメインカージオイドだけだった
約9分で読めます

ジュリア集合が「連結かどうか」を数えるだけでマンデルブロ集合が出てくる。ただし出てきたのはメインカージオイドだけだった


マンデルブロ集合の境界の次元を測った回で、理論値2に対して1.09しか出せなかった。原因は「次元を担う細い枝が1画素より細い」ことだった。

その反省を持ったまま、隣の話題に手を出した。ジュリア集合だ。

マンデルブロ集合の定義は「zz2+cz \to z^2 + cz0=0z_0 = 0 から反復して発散しない cc の集合」。これはよく知られている。だがこの集合にはもう一つの顔がある。

マンデルブロ集合とは、ジュリア集合 JcJ_c が連結になるような cc の集合である

こちらの定義には z0=0z_0 = 0 が出てこない。まったく別のもの——各 cc に対して平面全体を反復して得られる図形——の「つながっているかどうか」だけで、同じ集合が定義できるという。

本当に出てくるのか。連結成分を数えるコードを書いて確かめた。

実験に使ったコードの全文はGitHubに置いています

ジュリア集合とは何か

マンデルブロ集合は「z0=0z_0=0 を固定して cc を動かす」。ジュリア集合はその逆で、「cc を固定して z0z_0 を動かす」。cc ひとつにつき1枚の絵ができる。

6枚のジュリア集合を並べた図。上段はダグラス・ラビット(3つ葉が連なった形)、バジリカ(円が数珠つなぎになった形)、ふくらんだ形。下段はデンドライト(内部を持たない枝だけの形)、砂粒が散ったような2枚。それぞれにMの内側か外側か、集合内の画素の割合、連結成分の数が書かれている

上段3枚は塊としてつながっている。下段の右2枚は、塵のように散っている。この違いが「連結かどうか」だ。

cc を連続的に動かすと、形も連続的に変わる。メインカージオイドの縁に沿って cc を一周させた。

cがマンデルブロ集合のメインカージオイドの縁に沿って一周するあいだ、ジュリア集合が連続的に姿を変えていくアニメーション。丸い形から、3つ葉、5つ葉、細長い渦巻き、うさぎ型へと次々に morph していき、左上にそのときのcの値が表示される

葉の枚数が変わり、渦の巻き方が変わる。cc の位置がそのまま形の設計図になっている。

自分で cc を選んで見比べられるようにもした。

連結成分を数えるだけで、マンデルブロ集合は出るか

cc90×9090 \times 90 の格子に振り、それぞれについて 120×120120 \times 120 のジュリア集合を描いて、scipy.ndimage.label で連結成分を数えた。マンデルブロ集合の定義(z0=0z_0=0 の軌道)は一切使っていない。

最初の試みは失敗した。「連結成分が少なければ連結」という条件にしたところ、一致率23%。原因はすぐ分かって、cc がマンデルブロ集合の外だとジュリア集合が画面上でほぼ空になり、成分数0を「連結」と数えていた。集合が無いことと、集合がひとつながりであることを区別していなかった。

条件を「成分がちょうど1個」に直す。

3枚並んだ白黒図。左は連結成分がちょうど1個だったcの集合で、マンデルブロ集合のメインカージオイド部分だけが黒く出ている。中央は定義どおりに描いたマンデルブロ集合で、左の円(周期2の球)や周囲の装飾もすべて含む。右は食い違いを色分けした図で、周期2の球と各バルブが丸ごと赤(取りこぼし)になっている

一致率95.72%。 誤検出はわずか2点。z0=0z_0=0 を一度も使わずに、マンデルブロ集合の形が出てきた。

だが右の図を見てほしい。取りこぼした345点は、ランダムに散らばっていない。周期2の球(左の円)と、周囲の装飾バルブが、丸ごと落ちている。 出てきたのはメインカージオイドだけだ。

解像度を上げても直らない。むしろ悪化する

落ちた cc のジュリア集合——たとえば c=1c = -1 の「バジリカ」——は、数学的には確かに連結だ。だが私のコードは9個の破片として数えていた。解像度が足りないのだろうと思って、上げてみた。

横軸が解像度(120から1920画素、対数)、縦軸が数えられた連結成分の数(対数)のグラフ。バジリカ(赤)は9個から113個へ、ダグラス・ラビット(橙)は9個から179個へと右肩上がりに増える。一方、メインカージオイド内のcと単位円(青と灰)は全解像度で1個のまま平ら

解像度バジリカ(c=1c=-1)ラビット(c=0.123+0.745ic=-0.123+0.745i)c=0.5+0.5ic=-0.5+0.5i単位円(c=0c=0)
120px9911
480px171311
1920px11317911

細かく描くほど、バラバラになっていく。

理由ははっきりしている。バジリカは「円が数珠つなぎになった形」で、隣り合う円は1点だけで接している。点で接するというのは面積ゼロの接触なので、正方形の画素では原理的に表現できない。解像度を上げると鎖のより細かい環まで見えるようになり、その分だけ「切れ目」が増える。

一方、メインカージオイド内の cc のジュリア集合は準円(quasicircle)で、内部を持つ塊がひとつあるだけだ。だから何画素で描いても1個のまま。

この方法で拾えるのは「面積を持ってつながっている」場合だけで、「点でつながっている」場合は拾えない。 マンデルブロ集合のメインカージオイドだけが出てきたのは、そこだけが前者だったからだった。

c=ic = i のデンドライト(ギャラリー上段右下)が象徴的で、これはマンデルブロ集合の内側にありながら、集合内の画素が0.00%しかない。内部を持たない枝だけの図形なので、面積ベースの物差しには最初から映らない。

前回の記事で「1画素より細い構造は測れない」と書いたが、今回はもっと極端で、厚みが最初からゼロの構造だった。

ついでに、ジュリア集合の次元も測った

前回と同じbox-countingのコードで、cc を実軸上で動かしながらジュリア集合の境界次元を測った。c|c| が小さいとき、理論的には

dimJc=1+c24ln2+O(c3)\dim J_c = 1 + \frac{|c|^2}{4\ln 2} + O(|c|^3)

という近似式が知られている(Ruelle 1982)。

横軸がc(実軸上、-0.75から0.24)、縦軸がジュリア集合の境界次元のグラフ。灰色の破線がRuelleの近似式で、赤い実測線がその少し下を並走している。c=0で1.0、c=-0.75で実測1.17に対し近似式1.20

cc実測(補正後)Ruelleの近似
0.001.00001.0000
0.201.01451.0144
-0.401.01601.0577
-0.601.10481.1298
-0.751.17231.2029

c=0c=0 はちょうど単位円なので次元1、そこから cc が離れるほど境界がほつれて次元が上がる、という傾向は近似式とよく合った。ただし c|c| が大きい側では実測のほうが低い。これは近似式が c|c| の小さい領域の展開であることに加えて、前回と同じ「細い部分が画素に乗らない」バイアスが効いている方向だ。同じコードで単位円を測ると0.9928(理論値1)なので、その系統誤差ぶんは補正してある。

まとめ

  • z0=0z_0=0 を使わず、ジュリア集合の連結成分を数えるだけで、マンデルブロ集合が一致率95.72%で再現できた(誤検出2点)
  • ただし取りこぼした345点は周期2以降の球に丸ごと集中していて、出てきたのは実質メインカージオイドだけ
  • それらのジュリア集合は「1点で接する円の鎖」なので、解像度を上げると成分数は9個→113個へ悪化する
  • c=ic = i のように、マンデルブロ集合の内側にありながら集合内の画素が0.00%になる例もある
  • ジュリア集合の境界次元はRuelleの近似式とよく合った(c=0.6c=-0.6 で実測1.105 対 近似1.130)

「連結かどうかを数える」という発想自体は正しかった。実際、誤検出は2点しかない。間違っていたのは、つながり方に種類があると思っていなかったことだ。

面積で触れ合っているつながりと、1点だけで触れているつながり。数学の上ではどちらも同じ「連結」で、区別する理由がない。だが画素で数える私のコードにとっては、前者は数えられて後者は数えられない。片方だけが存在するように見える。

これは物差しの解像度の問題ではなかった。解像度を上げるほど悪化したのだから、むしろ逆だ。細かく見れば見るほど、点で触れているだけのつながりは切れて見える。

人の関係でも似た取り違えをしている気がする。頻繁にやり取りしている相手との関係は目に見えて数えやすい。年に一度連絡するかどうかの相手との関係は、細かく調べれば調べるほど「実質切れている」と判定されそうになる。でもその判定を下しているのは、面積でしか数えられない私の物差しのほうかもしれない。