第18回 フラクタル(2) 複素数平面

フラクタルの代表ともいえるマンデルブロ集合は複素数平面上で  の収束・発散によって分類された点の集合です。これだけでは意味がわからないので詳しく説明しましょう。

まず、ある点zを取ります。たとえば z=1+i としましょう。直交座標でいえば 点(1,1)です。上の式でn=2,C=1/2+1/2i としてf(z)に代入し、その結果をまたf(z)に代入する、という操作を繰り返していきます。

この操作を繰り返していくと、この点は原点からどんどん離れていきます。この状態を「発散」といいます。では、1/11 + 2/3i ではどうでしょうか。手計算では大変なので、CindyScriptで計算しましょう。CindyScriptなら、複素数の計算がそのままでできます。15回繰り返した結果が次の図です。

この場合、15回くらいでは、原点からあまり遠くに行きません。それでも20回繰り返せば遠くなりますが。しかし、この様子だと、ある回数を区切れば、原点から一定の距離内にとどまるものがありそうです。このような点を「収束する」ということにします。

平面全体(といっても、実際には原点近くですが)の点を、このようにして発散するか収束するかで分類してできた図形を、自己平方フラクタルと呼びます。そして、この図形は、自己相似形になるらしいのです。自己相似形とは、ある部分がそれを含む部分と相似になっている、ということです。

では、これをCindyScriptでプログラムを作って実行してみましょう。

使うのはcolorplot()という関数です。この関数は、2点を対角とする長方形の領域内の点について、計算結果によって色を割り当てる関数です。Mathematicaのdencityplot[]に相当します。

まず、長方形の領域を決める点を2つとっておきます。点Aは(-2,-1.5) 点Bは(2,1.5) とでもしましょう。

次にスクリプトエディタを開いて、次のコードを入力します。カットアンドペーストでも結構ですが、その場合は最初の行番号とコロンは削除してください。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

1:   c=-0.3-0.63*i;

2:   f(x,c,n):=(

3:       z=complex(x);

4:       k=0;

5:       while(abs(z)<2.0 & k<n,

6:          z=z^2+c;

7:          k=k+1;

8:       );

9:       if(k==n,col=0.7,col=k/n);

10:  );

11:  colorplot(hue(f(#,c,50)),A,B,pxlres->1);

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

1行目は定数Cです。複素数で指定します。

2行目から10行目が関数の定義ですが、これが実際の処理です。

2行目 この関数は、3つの値を指定して処理をする関数です。xは平面上の点の座標、cは定数項、nは繰り返す回数の上限。

3行目 受け取った点xを複素数に変換します。

4行目 回数を数える変数(カウンタ)です。最初は0

5行目 繰り返しの条件指定。複素数zの絶対値(原点からの距離)が2より小さく、繰り返し回数が上限を超えない限り繰り返します。&は and (かつ)

6行目 z^2+c を計算してその結果をzとします。

7行目 カウンタを1つ増やします。回数を数えていることになります。

8行目 繰り返しの関数 while() の後ろのかっこ

9行目 もしカウンタkが上限に等しければ、収束すると見なしてカラーコード col を0.7にします。これは紺色に相当します。

そうでなければ発散していますので、何回目に原点からの距離が2以上になったかでカラーコードを決めます。

0から1まで(未満)の数になります。この数つまりカラーコードが、if()関数の戻り値となりますが、f(x,c,n)の最後の行にあるので、これがそのままf(x,c,n)の戻り値(計算結果)になります。

10行目 これが本体。A,Bで指定されが長方形の領域の各点を#として、計算結果をその点の色とします。hue()関数がその色を示しますが、これは色相環をぐるっと1周する分を1として対応する色を返すものです。色相環の0.7がだいたい紺色になります。最後に書かれている pxlres->1 はcolorplot()関数のオプションで、解像度を指定するものです。

さて、実行してみましょう。しばらく時間がかかりますので結果が出るまで待ってください。コンピュータの処理能力にもよりますが、1分くらいかかるかもしれません。

ちょっとした模様がでました。上のコードでは、繰り返し回数の上限を50としていますが、これを500にするとずっときれいな図ができますのでやってみましょう。

また、1行目のcの値を変えるとさまざまな図形ができます。

さらに、定数cをその点自身にすると、いわゆるマンデルブロ集合というものが描けます。このとき、繰り返し回数の上限も低めにして

colorplot(hue(f(#,complex(#),40)),A,B,pxlres->1);

くらいにするときれいな図ができます。

また、長方形の領域を狭めて全体を拡大すると、同じ条件でも違った風景になります。一部分を拡大したことになるわけですが、場所によっては、全体と同じ形をしているものもあります。これが自己相似形です。マンデルブロ集合で領域を狭めていくと、まるで湖畔を高くあるいは低くヘリコプターで飛んでいるようで、興味はつきません。

実行時の注意としては、計算に時間がかかるのでじっくりと待つこと。特に、点A,Bをドラッグして領域を変えようとすると、まるでCinderella.2がとまってしまったかのようになります。(反応がすごく遅くなる。)それを避けるには、全体を Mouse Click スロットに置く、という手があります。すると、点A,Bをドラッグしている間は何も起こらず、マウスで画面をクリックしたときに実行されます。