A Mandelbrot halmaz

A Mandelbrot halmazt Benoit B. Mandelbrot lengyel származású matematikusról nevezték el, aki sok minden más mellett az általa elnevezett fraktálokkal foglalkozott. Furcsa, de pont a Mandelbrot halmaz nem igazi fraktál, csak ún. kvázifraktál, ami leegyszerûsítve annyit tesz, hogy a Mandelbrot halmaz nem önhasonló, csak majdnem.

A Mandelbrot halmazt egy egyszerû képletettel lehet elõállítani. A komplex számsíkon veszünk egy C pontot (egy komplex számot), és arra képezzük a következõ sorozatot : Z0 = C majd pedig Zi+1 = Zi2 + C. Az adott pont színét pedig az az i szám adja, amire elõször lépi át Zi abszolútértéke a megadott korlátot. Ez a korlát, amit jelöljünk K-val, lehet például 2. Azokat a pontokat, amelyekre Zn abszolútértéke mindig az K korlát alatt marad, általában fekete színnel jelölik, míg a többit az i-edik színnel. Be lehet bizonyítani, hogy ha egy pontra valamelyik Zi nagyobb lesz, mint 2, akkor bármely számnál is lesz nagyobb Zj, vagyis ilyen pontokra a Zn abszolútértéke a végtelenbe tart. Tehát a fekete pontok halmaza, amelyekre Zn nem tart a végtelenbe, minden L>=2 korlátra ugyanaz, hiszen az állítás szerint, ha nem lépi át a Zn abszolútértéke az L-et, akkor már a kettõt sem lépi át. A változás csak annyi, hogy ugyanannál a pontnál esetleg más i-re lépi át a K korlátot a Zi abszolútértéke, azaz a pontok színe változhat.
Gyakorlati megvalósítás esetén van még egy M korlát, ami a maximális i-t határozza meg. Ha Zi nagysága semmilyen M-nél kisebb i-ra nem lépi át a K korlátot, akkor úgy tekintjük, hogy az a pont már fekete, habár lehetséges, hogy valamilyen M-nél nagyobb i-re mégis átlépné a K korlátot. Nagy M-ekre (pl. 200) viszont elég jó közelítést kapunk. Erre azért van szükség, mert a programnak meg kell állnia, és ha a végtelenségig nézné Zi-t, akkor az elsõ fekete pontnál megakadna. Nyilván M adja a lehetséges színek számát, ha minden i-hez különbözõ színt párosítunk. Ezért minél nagyobb M, annál pontosabb, és színesebb ábrát kapunk, viszont a program annál lassabb lesz, és minden fekete pontra el kell számolni M-ig. Másik szokás, hogy a nagyítás során, amikor a halmaz apróbb részleteit nézegetjük, M-et is növeljük. Így a nagyítás után is kellõen részletgazdag képet nyerhetünk.

Álljon most itt egy egyszerû Pascal program, amely kirajzolja a Mandelbrot halmazt 16 féle szürkeárnyalattal.

 

Program mandelbrot;
   Uses Graph,Crt;
   Const m                 : Integer=100;
   Var driver,mode,x,y,i   : Integer;
       a0,b0,d,za,zb,aa,bb : Real;
       ch                  : Char;

Begin
DetectGraph(driver,mode);
InitGraph(driver,mode,'');
SetRGBPalette(1,4,4,4);
SetRGBPalette(2,8,8,8);
SetRGBPalette(3,12,12,12);
SetRGBPalette(4,16,16,16);
SetRGBPalette(5,20,20,20);
SetRGBPalette(20,24,24,24);
SetRGBPalette(7,28,28,28);
SetRGBPalette(56,32,32,32);
SetRGBPalette(57,36,36,36);
SetRGBPalette(58,40,40,40);
SetRGBPalette(59,44,44,44);
SetRGBPalette(60,48,48,48);
SetRGBPalette(61,52,52,52);
SetRGBPalette(62,56,56,56);
d:=1/120;
b0:=0;
For y:=240 To 479 Do
   Begin
   a0:=-2;
   For x:=100 To 580 Do
      Begin
      za:=a0;
      zb:=b0;
      aa:=a0*a0;
      bb:=b0*b0;
      i:=0;
      If (aa+bb>0.06) And (aa+bb<=4) Then
         Begin
         Repeat
            zb:=2*za*zb+b0;
            za:=aa-bb+a0;
            aa:=za*za;
            bb:=zb*zb;
            Inc(i)
         Until (aa+bb>4) Or (i>m);
         If i<=m Then
            Begin
            PutPixel(x,y,i);
            PutPixel(x,480-y,i)
            End
         End;
      a0:=a0+d
      End;
   b0:=b0+d
   End;
While KeyPressed Do ch:=ReadKey;
Repeat
   ch:=ReadKey
Until Not KeyPressed;
CloseGraph
End.

A program a [-2,2] x [-2,2] tartományban rajzolja ki a halmazt, K=2, M=100 értékeket használva. Ha M=100 iterációra (a sorozat 100-adik tagja) sem éri el a sorozat abszolútértéke a K=2 korlátot, akkor a pontot nem rajzoljuk ki (fekete marad), ha pedig az i-edik iterációra lépi át, akkor az i 16-os osztási maradéka adja a szürkeárnyalat fényességét (15 a fehér, 0 a fekete).

Az eredmény így néz ki :
(A képre kattintva a kép teljes méretben is megtekinthetõ)

Már a programban is felhasználtam azt az észrevételt, hogy a Mandelbrot halmaz tükrös a valós tengelyre, ami az x-tengelynek felel meg. Ennek oka egyszerûen abban áll, hogy Z és Z konjugáltja ugyanakkora abszolútértékû, és két szám összegének konjugáltja a konjugáltak összege, és hasonlóan két szám szorzatának konjugáltja a konjugáltak szorzata. Kicsit részletesebben is lehet bizonyítani mindezt. Ezt kihasználva a program tükrözi a kapott pontot a tengelyre, így egy pont kiszámolásával egyszerre két pontot kapunk meg.
A program nem vizsgálja azokat a pontokat, amelyek abszolútértéke 1/4-nél kisebb, vagy egyenlõ. Ezek biztosan feketék lesznek, mert ekkor a sorozat tagjainak (Zk) abszolútértéke végig 1/2 alatt marad.


Ezek után következzen pár kép a halmaz egyes részeirõl :

mandel.gif

(A program által készített kép)

mandel00.gif

mandel01.gif

mandel02.gif

mandel03.gif

mandel04.gif