マンデルブロ集合とは
まず、マンデルブロ集合とは一体何なのか、簡単に紹介します。このページは、高校レベルの数学の知識があることを前提にしています。
マンデルブロ集合の定義
マンデルブロ集合とは、次の定義で表される複素平面上の点の集まり(集合)のことです。
f(z) = z^2 + Cという関数を、z_0 = 0から始めて、
z_1 = f(z_0), z_2 = f(z_1), z_3 = f(z_2), …
とくり返し計算して数列を作っていったときに、k → ∞で|z_k|が発散しない複素数Cの集合
z_kやCは全て複素数です。|z_k|は絶対値ですが、複素数ですので、iを虚数単位としてz_k = α + βiとすると、|z_k| = (α^2 + β^2)^{1/2}です。
f(z)は、別の形の関数を考えることもあります。関数が異なればマンデルブロ集合の形も変わります。当サイトでは、z^2の指数を変化させたらどうなるかを紹介しています。また、数列の初項z_0を変更することも考えられます。f(z) = z^2 + Cにおいては、z_0を0以外にすると数学的な意義が薄れてしまいますが、この場合もまた形が変化します。
z_0, z_1, z_2, z_3, …は全て複素数ですので、複素平面上の点として順番に線で結んでいくと、1本の線になります。これを軌道といいます。
定義は、教科書や文献によっていろいろな書き方がされることがあります。数列の漸化式の形だったり、写像の考え方を使って説明されることもありますが、「反復計算によって複素数列を作り出していく」という考え方はどれも同じです。
具体例
具体的に考えてみましょう。例えば、C = 0がマンデルブロ集合に属するかどうかを考えてみます。
z_1 = f(z_0) = 0^2 + 0 = 0
z_2 = f(z_1) = 0^2 + 0 = 0
z_3 = f(z_2) = 0^2 + 0 = 0
…
0から一向に変化しませんね。つまり、このまま計算し続けても|z_k|は発散しません。したがって、C = 0はマンデルブロ集合に属する点となります。
では、C = -1はどうでしょうか。
z_1 = f(z_0) = 0^2 - 1 = -1
z_2 = f(z_1) = (-1)^2 - 1 = 0
z_3 = f(z_2) = 0^2 - 1 = -1
z_4 = f(z_3) = (-1)^2 - 1 = 0
…
-1と0が交互に現れる振動状態になりました。この場合も発散するわけではありませんので、C = -1もまたマンデルブロ集合に属する点となります。
それでは、C = -1 + iではどうでしょうか。
z_1 = f(z_0) = 0^2 + (-1 + i) = -1 + i
z_2 = f(z_1) = (-1 + i)^2 + (-1 + i) = -1 - i
z_3 = f(z_2) = (-1 - i)^2 + (-1 + i) = -1 + 3i
z_4 = f(z_3) = (-1 + 3i)^2 + (-1 + i) = -9 - 5i
z_5 = f(z_4) = (-9 - 5i)^2 + (-1 + i) = 55 + 91i
…
最初の数項だけで急激に絶対値が増大していってしまい、どうやらこの先は発散してしまうと思われます。したがって、C = -1 + iはマンデルブロ集合に属さない点となります。
たったこれだけのことですが、以上のようにして「マンデルブロ集合に属する」と判定された点の範囲を複素平面上に表したものが、この有名な形になるわけです。
図1-1:複素平面上に描いた有名なマンデルブロ集合の形。
この図では黒い部分が「マンデルブロ集合に属する」範囲である。
数列の軌道の視覚化
以下は、マンデルブロ集合の内外からCを自由に選んで、そのときのくり返し計算の数列(最初の100項)の軌道がどのようになるか、視覚的に確認できるプログラムです。マウスポインタで指した点をCとして採用し、数列の各点を順番に結んだ「軌道」を表示します。また、下は各点の絶対値の推移を折れ線グラフにしたものです。
前述の定義の通り、マンデルブロ集合の内側(白い部分)の点を選んだ場合(青い線)は、数列は発散せず収束したり振動したり、有限の範囲に収まっている様子が分かると思います。一方、外側(黒い部分)の点を選んだ場合(赤い線)は、無秩序に画面外の遠方へ発散していってしまう様子が分かります。さらに、マンデルブロ集合の境界付近では、ほんのわずかにCの位置が異なるだけで軌道の形が大きく変わり、発散したりしなかったりします。
また、グラフの方を見ると、マンデルブロ集合の内部では、収束したり一定の周期で振動したりしている様子が分かります。特に、中央の最も大きなハート型(カージオイド)の部分では1つの値に、その左隣の円の部分では2つの値の間の振動状態に収束していることが分かります。その他、境界付近では収束とも振動ともいえない不規則な変化を見せるカオスの状態となっていることも分かります。
このように、Cの値のわずかな違いで軌道に大きな違いが出たり、将来の予測が困難なカオスの状態が見られるのも、フラクタル図形であるマンデルブロ集合の大きな特徴です。
発散の判定
さて、定義の節では、数列が発散するかどうかの判断が少々雑でした。たとえ絶対値が1000になっても、また小さくなって収束するかもしれません。もう少し確実に論理的に判断するにはどうすればよいでしょうか?
実は、数列の途中で|z_k| > 2となるようなz_kが一つでも存在すると、その数列はいずれ発散することが知られており、それは以下のように説明できます。
今仮に、z_kにおいて初めて|z_k| > 2となったとします。まず、三角不等式(|A + B| >= |A| - |B|)を用いて、
|z_{k+1}| = |f(z_k)| = |z_k^2 + C| >= |z_k|^2 - |C|
となります。ここで、k = 1の場合は|z_k| = |z_1| = |C|、k > 1の場合は|z_k| > 2 >= |z_1| = |C|ですから、いずれにしても|z_k| >= |C|となり、
|z_{k+1}| = |f(z_k)| = |z_k^2 + C| >= |z_k|^2 - |C| >= |z_k|^2 - |z_k| = |z_k|(|z_k| - 1) > |z_k| > 2
が得られます。同様にして、
|z_{k+2}| = |z_{k+1}^2 + C| >= |z_{k+1}|^2 - |C| > |z_{k+1}|^2 - |z_{k+1}| = |z_{k+1}|(|z_{k+1}| - 1) > |z_k|(|z_k| - 1)^2 > |z_k| > 2
|z_{k+3}| = |z_{k+2}^2 + C| >= |z_{k+2}|^2 - |C| > |z_{k+2}|^2 - |z_{k+2}| = |z_{k+2}|(|z_{k+2}| - 1) > |z_k|(|z_k| - 1)^3 > |z_k| > 2
|z_{k+4}| = |z_{k+3}^2 + C| >= |z_{k+3}|^2 - |C| > |z_{k+3}|^2 - |z_{k+3}| = |z_{k+3}|(|z_{k+3}| - 1) > |z_k|(|z_k| - 1)^4 > |z_k| > 2
…
となり、|z_{k+m}| > |z_k|(|z_k| - 1)^mとなることが分かります。|z_k| - 1 > 1ですから、m → ∞のとき、(|z_k| - 1)^m → ∞、すなわち、|z_{k+m}| → ∞となるのです。また、これによりマンデルブロ集合は全て絶対値が2以下の範囲、すなわち複素平面の原点を中心とする半径2の円内に収まっていることも分かります。
マンデルブロ集合誕生の経緯
さて、いきなり定義から入りましたが、実際の歴史ではどのような経緯でマンデルブロ集合は発見されたのでしょうか。
複素数は、複素平面上の点として表されます。関数は、複素数を別の複素数に変換します。これを、“関数という複素平面上に働く力が、複素数という点を動かした”と考えて、その「力」が「点をどのように動かすか」に着目したものを複素力学系(Complex dynamics)と言います。
その中で、f(z) = z^2 + Cというシンプルな二次式から生まれる数列が、Cの値によって非常に多様な変化を見せることが発見され、「あるCに対して、発散しない初項z_0は何か」が考察されるようになりました。マンデルブロ集合は「初項z_0 = 0に対して、発散しないCは何か」でしたから、初項とCを逆に考えたものですね。これを充填ジュリア集合と言います。マンデルブロ集合と同じく、不思議なフラクタル図形です。マンデルブロ集合は、この充填ジュリア集合がCの値によってどのように変化するかという研究から、考え出されたものです。
最初の複素力学系の研究は、19世紀後半までさかのぼることができるそうですが、そのフラクタルな図形を視覚的に詳しく見られるようになったのは、コンピュータが登場してから後、1970年代になってのことです。マンデルブロ集合は、その頃、ブノワ・マンデルブロ(Benoit Mandelbrot, 1924-2010)という数学者によってコンピュータを使って描かれ、単なる幾何図形とは思えないその想像を遥かに超える複雑さと不思議さで、それ以降注目を集めることになったのです。