GNUPLOT

- not so Frequently Asked Questions -

update 2004/11/29

Mandelbrot集合

ある複素数 A に対して,次のような漸化式を計算します.nが無限に大きくなっても |z(n)|^2 が発散しないような複素数Aの集合をMandelbrot集合と呼びます.

z(0)   = 0.0
z(n+1) = z(n)*z(n) + A

複素平面をXY平面とし,この上にAをとります.z(n)が発散を始めるnの値 をZ座標としてプロットすればMandelbrot集合の3次元表示ができます.最初に 上の漸化式を再帰を使って定義します.これは,nをゼロから増加させていき, |z|^2がある数値(ここでは2としています)を越えたらその時のnを返すような 関数です.複素数Aによっては反復回数が非常に大きくなりますので,とりあ えずnの最大値を1000としておきます.

なおgnuplotでは,aを実部bを虚部とする複素数zは z={a,b}と表記します.複素数から実部・虚部を取り出すには,関数 real(z), imag(z) を使います.また,abs(z)でzの絶対値 が求まります.逆に実数から複素数を作る方法は無いので, complex(x,y)=x*{1,0}+y*{0,1}のように関数を定義します.

complex(x,y) = x*{1,0}+y*{0,1}
mandel(x,y,z,n) = (abs(z)>2.0 || n>=1000) ? \
n : mandel(x,y,z*z+complex(x,y),n+1)

x,yは複素平面での座標で,複素数Aを表します.zには漸化式z^2+Aが入り, nを0から最大1000まで変化させたときabs(z)が2.0を越えた時のnの値が関数の値 として返されます.この関数を呼ぶには,x,y 座標の他に,zの初期値{0,0}と nの初期値0が必要です.xとyの範囲を適当に与えたときの表示結果は次のよう になります.

gnuplot> set xrange [-1.5:0.5]
gnuplot> set yrange [-1:1]
gnuplot> set logscale z
gnuplot> set isosample 50
gnuplot> set hidden3d
gnuplot> set contour
gnuplot> splot mandel(x,y,{0,0},0) notitle
mandel1
mandelbrot0

普通Mandelbrot集合をCGで表示するときは,画像の各ピクセルを複素平面 に割り当てておき,そのピクセルに対して漸化式を計算します.計算値が発散 したらその反復回数Nに応じたカラーをそのピクセルに表示します.簡単なX Windowのプログラムで作成した2次元平面で のMandelbrot集合は右のようなものです.上の図の台地の部分が右の図では 黒に塗られている部分に対応します.


mandel1

左の図のように,Mandelbrot集合の一部を拡大すると非常に複雑な構造を 見ることができます.ここではかなり細かな等高線を描いてフラクタルらしさ を表現して見ましたが,gnuplotのような線画ではこれくらいが限界で,CGで 遊ぶにはやはりちょっと無理のようです.新しいgnuplot ver.3.8/4.0では3次元で のカラー表示が強化されています,それを使うと もっと綺麗なものが描けます.


up

ここではオマケとして,X Windowで作ったMandelbrot集合のCGをお見せし ます.漸化式の反復回数に応じてRGBを適当に割り当てることで綺麗な絵を描 くことができます.

mandelbrot1 mandelbrot2

mandelbrot3 mandelbrot4
up