ホーム

VASS
デジカメ
小物箱
β版

M.I.B.
壁紙
マンデル

雑誌掲載
DLカウント

スペシャル
書いてけ堀
りんく


 マンデルブロ集合って?
 あなたはマンデルブロ集合をご存知でしょうか。マンデルブロ集合はフラクタル図形の1つとして位置づけられており、世にも不可思議な図形で近年特に注目を集めるようになっています。この集合はたった1つの式を繰り返し計算することによって導かれる結果の、複素平面状の集合のことをいいます。複素平面とは左の図のように縦軸が実軸、横軸が虚軸の平面のことです。その式とは

Zn+1=Zn2+C

で、CとZは複素数であり、それぞれが実値、虚値を持っています。また、Zn+1はZnから導かれていることを示しています。この式は1980年にフラクタル幾何学の創始者マンデルブロ博士が発表したものです。
 C は、複素平面状のある位置を表します。具体的には、左図のような複素平面状で、実値と虚値から示される一点です。導かれる結果とは、Z0=0 としたとき、上の式を∞回繰り返してもZnが∞にならないポイントの集合なのです。
 具体的に計算する場合は、Cの絶対値が2以上の場合存在しないこと、|Zn|が2を越えた場合は存在しないことが証明されていますので、|Zn|が2を超えるまで繰り返し計算していきます。また、nは∞回まで繰り返すわけには行きませんので有限回(拙作ソフトの場合マンツア、エスマンで最大約1000回、MandelToBryceで最大32768回)としています。
 マンデルブロ集合は正確にはこの∞にならない集合だけ(ひょうたんまたはおしり型の内側)を指しますが、何回で絶対値2を越えたかで色分けすると、周縁部にきわめて複雑な模様が描かれていきます。これが数学史上、最も奇怪で美しいとよばれるマンデルブロ図形なのです。
 マンデル・ツアーズ、マンデルからの脱出で紹介している絵柄は、このきわめて複雑な模様の部分に焦点をあてたもので、上に示すたった一つの式からすべて導き出されています。特にマンデルからの脱出では、どこまで拡大していっても限りなく類似の図形が現れてくる特徴を、実際に体験することができます。


 計算の中身を簡単に説明しましょう。式を文字どおり記述すると以下のようになります。

 (1)計算指定ポイントを複素数Cとする
 (2)複素数Zを0に初期化する。
 (3)Zを二乗して、複素数Cを加えたものを新しいZとする。
 (4)Zの絶対値が2を超えるまで、(3) を繰り返す。
 (5)繰り返し回数が指定ポイントの値となる。

 ところが、計算機の中では複素数を直接扱えません。そこで、複素数を実値と虚値に分解して計算します。
 まず、Z を実値 Zre と虚値 Zim に分けます。Z の二乗は実値が Zreの二乗- Zimの二乗、虚値が 2*Zre*Zim となります。この値に C の実値と虚値をそれぞれ加えれば、式が完成します。

 それでは、実際のプログラム例をみてみましょう。以下に示すのは Delphi で記述した複素平面上の1点の値を求める関数です。

 関数名は Calc1p、引数は double 形式の実数 Cre(複素平面の1点の実座標値)と Cim(同じく虚座標値) で、持ち帰る値は整数です。この整数は前述の式で、Zn+1 の絶対値が2を超えたときの数値を返します。ここで最も重要なのは最内側ループである repeatuntil で囲まれた部分の計算をいかに効率的に行うかです。この場所の組み方によってマンデルブロ計算のスピードが決定してしまいます。逆の見方をすると、この他の部分はスピードなど考えずにいかに見やすくプログラムするかを考えればよいのです。
 この関数で得られた数値を色に当てはめて1点1点塗り分けることにより、摩訶不思議な模様が出現するわけです。

 それぞれの変数、定数の意味は以下のとおりです。

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;

続きはそのうちに。


このHPは HyperEdit で作成しました。