数学について

注意: 数学としてはどうかな。

このプログラムの開発者は数学者ではありません。この先のディスカッションは、数学者から見れば「単純化しすぎ」「間違い」かもしれません。


マンデルブロ集合

マンデルブロ集合は、平方と足し算を繰り返しても無限大にはならない複素数の集合と定義できるかもしれません。(公式の定義は多少違っています: 対応するジュリア集合が接続している、複素平面上の点の集合と定義されています。結局は同じことを言っています。)例えば、ある数で表される点が半径2の円の原点からだんだん離れていって、ついには円の外側に存在するようになれば、いずれその数は無限大になるだろうということはわかります。けれども、ある点が決して無限大にはならないということは、ふつうはわかりません。そのため、結論づける前に膨大な数で試して推定する必要があるのです。

Gnofract 4Dでは数式はこのようになっています。

Mandelbrot1 {
init:
    z = 0
loop:
    z = z^2 + c
bailout:
    |z| < 4.0
}
(|z|は zの絶対値を意味します。)ベイルアウトする(継続する条件が偽になってループから脱出する)か、あるいは反復の最大回数までループ関数を計算します。その時点でベイルアウトしていれば集合の外側にいることになり、でなければ(たぶん)集合の内側にいます。

この計算を、c の値を様々に設定してスクリーン上のひとつひとつの点で行います。これによってお馴染みのマンデルブロ集合が生成されます。

集合の内側にある点は(伝統的に)黒く塗られます。集合の外側の点はベイルアウトするまでにどのくらい計算されたかにより、様々な色になります。これらの色は数学的にはさほど重要ではありませんが、見栄えがします。

というわけで、では z の初期値がゼロではない複素数の値だったらどうなるでしょう? (厳密に言えば、この操作は実行しないでください。z^2+c では z がゼロから始まることが重要です。他の値は数学的には意味がありません。けれども多くのフラクタル・プログラムと同様に、Gnofract 4Dも数学的純粋さに関係なく、面白く見えるものを描くことができるようになっています。)結果はかなり奇妙に見える変形した多重集合になります。この初期値(z0 としましょう)は、初期摂動と呼ばれます。値がゼロではない z0 を持つ集合は摂動が加えられた集合といわれています。

ジュリア集合

ジュリア集合は実際はマンデルブロ集合と同じ手順で描画されます。しかし、各ピクセルの計算をする時 c の値を変えずに定数として保持したまま、z0 を変えます。c の値により様々なジュリア集合ができます。c = 0 の絵はこうなります。

つまらないですね? なぜかというと、何も加えずその都度の値を2乗しているだけだからです。そのため、1より小さい数から始まる値はひたすら小さくなっていきます。(なので必ず集合の内側になります。)ゼロ以外の数字であれば増えつづけます。完璧な円を描くにはむしろ非効率的な方法であることがわかりました。c に別の値を入れればもっと面白いものになります。

ジュリブロ(The Julibrot)

さて、核心です。ジュリア集合とマンデルブロ集合が同じ関数で描画されると上で述べました。

julibrot(z0,c) {
init:
    z = z0
loop:
    z = z^2 + c
bailout:
    |z| < 4.0
}

ジュリブロ関数は2つの複素数パラメータ、あるいは4つの実数パラメータがあります。Gnofract 4Dでは4つの実数パラメータを x, y, z, w で表します。これらは順に c.re, c.im, z0.re, z0.im となります。ジュリアとマンデルブロの違いは、描画の際にどのポイントを選ぶかです。マンデルブロ集合を描くなら各ピクセルの計算で z0 を定数にして c を変えます。ジュリア集合の場合は c が定数で z0 を変えます。ほんのちょっと見方をずらすと、どちらの集合も同じ4次元オブジェクトの、直交する別の面から見た「断面」であることが想像できるでしょう。Gnofract 4D的に言えば、マンデルブロ集合は xy で形成される面、ジュリア集合は zw の面ということになります。他の面から見ることもできます。これは xw の面から見た画像です:

四次元で表示

とはいえ、二次元のスライスならどんなものでも描けます。ジュリブロ集合を構成する軸に平行でなくてもかまいません。描画するにはシーンを4つの要素で表す必要があります。1)スクリーンの中心となる x, y, z, w の座標 2)X軸方向のベクトル。シーンが進むにつれてパラメータがどのように変化するかをジュリブロ関数に伝えます。3)Y軸方向のベクトル 4)イメージの大きさ。デフォルトで表示されるマンデルブロ集合は [0,0,0,0]を中心点とし、X軸方向のベクトルは[1,0,0,0]、Y軸方向のベクトルは[0,1,0,0]、イメージの大きさは4です。マンデルブロ集合の全体図は2x2の正方形に収まります。X、Y、ズームの倍率を変えてズームインできます。

他の平面におけるスライスを描きたい場合は、4つのディメンションを通してビューを回転させます。3Dにおいては、X軸・Y軸・Z軸の回りで回転できますね。4Dでは直線を軸とするのではなく、平面を中心にして回転します。xy, xz, xw, yz, yw, zw の6つの方向があります。例えば xz と yw 方向で90度回転させれば、ベクトルは [0,0,1,0] と [0,0,0,1] になり、つまりはジュリア集合になります。一部分だけ回転させると「二つの集合のハイブリッド」みたいになり、奇妙な絵になります。

※ここに絵

実際には、それぞれの平面で任意の角度で回転できます。奇妙な絵の世界がひろがります。

多元フラクタル、四元数

一般的に「4次元」で記述される別種のフラクタルがあります。超複素数とクォータニオン(四元数)に基づき記述される多元フラクタルです。超複素数は、4つ部分(ひとつの実数と3つの虚数)を持ちます。ここでは複素数部分が2つになります。超複素数のマンデルブロ集合では2種類の超複素数パラメータを持つことになり、Gnofract 4D的に言えば8次元のオブジェクトとなります。Gnofract 4Dの画面ではこのうち4つの要素が指定でき、他の4つはパラメータ経由で操作します。Gnofract 4Dは今のところ四元数をサポートしていません。


< コマンド・リファレンス 独自の関数を書く >