|
|
![]() |
あなたはマンデルブロ集合をご存知でしょうか。マンデルブロ集合はフラクタル図形の1つとして位置づけられており、世にも不可思議な図形で近年特に注目を集めるようになっています。この集合はたった1つの式を繰り返し計算することによって導かれる結果の、複素平面状の集合のことをいいます。複素平面とは左の図のように縦軸が実軸、横軸が虚軸の平面のことです。その式とは
で、CとZは複素数であり、それぞれが実値、虚値を持っています。また、Zn+1はZnから導かれていることを示しています。この式は1980年にフラクタル幾何学の創始者マンデルブロ博士が発表したものです。 計算の中身を簡単に説明しましょう。式を文字どおり記述すると以下のようになります。
(1)計算指定ポイントを複素数Cとする
ところが、計算機の中では複素数を直接扱えません。そこで、複素数を実値と虚値に分解して計算します。 それでは、実際のプログラム例をみてみましょう。以下に示すのは Delphi で記述した複素平面上の1点の値を求める関数です。
関数名は Calc1p、引数は double 形式の実数 Cre(複素平面の1点の実座標値)と Cim(同じく虚座標値) で、持ち帰る値は整数です。この整数は前述の式で、Zn+1 の絶対値が2を超えたときの数値を返します。ここで最も重要なのは最内側ループである repeat と until で囲まれた部分の計算をいかに効率的に行うかです。この場所の組み方によってマンデルブロ計算のスピードが決定してしまいます。逆の見方をすると、この他の部分はスピードなど考えずにいかに見やすくプログラムするかを考えればよいのです。 それぞれの変数、定数の意味は以下のとおりです。
Cre 計算対象の複素平面上の1点の実座標
Cim 計算対象の複素平面上の1点の虚座標
Limit 最大繰り返し回数 超えた場合はマンデル図形の内側の扱い
この値を増やすと臨界付近のより詳細な図形が得られる。
Zre 上記式の計算経過の実値
Zim 上記式の計算経過の虚値
SqZre Zreの二乗を収容するワーク
SqZim Zimの二乗を収容するワーク
n 回数カウンター
function Calc1p(cre,cim:double):integer;
const Limit=100; { 仮に100を設定、NAGものではアプリにより105〜32768まである }
var Zre,Zim,SqZre,SqZim:double;
n:integer;
begin
Zre:=0; Zim:=0; { Z初期化 }
SqZre:=0; SqZim:=0; { Z の実虚の二乗初期化 }
n:=0; { カウント初期化 }
repeat { Z=Z^2+C を繰り返す }
Zim:=2*Zre*Zim+Cim; { まず虚値を計算 なぜなら実値が先だとZreが変わってしまう}
Zre:=SqZre-SqZim+Cre; { 予め計算しておいた実虚の二乗をもとに実値計算 }
SqZre:=Sqr(Zre); SqZim:=Sqr(Zim); { 絶対値計算と次の実値のために実虚の二乗を計算 }
inc(n) { 回数カウント }
until (SqZre+SqZre>4) or (n>Limit);{ ループ終了判断絶対値2は、実の二乗+虚の二乗の4と等価 }
result:=n { 関数の持ち帰り値設定 }
end;
続きはそのうちに。 |