Mandelbrotova množina

Zde na svém blogu se občas zmiňuji o tzv. mandelbrotově množině, ačkoliv možná většina z vás neví, co to je. Pokusím se vám to tedy vysvětlit.

V matematice existuje obor čísel, který se nazývá "Komplexní čísla". Obecně se zapisuje ve tvaru (a+bi), například (3+2i). Ono i je tzv. imaginární složkou. S těmito čísly se pracuje úplně stejně jako s mnohočleny, až na to, že i2 = -1 a tedy že odmocnina ze záporného čísla je rovna odmocnině z absolutní hodnoty čísla krát i. Možná se to zdá trochu krkolomné, ale hned ukážu pár příkladů:


(3+2i)+(4-3i)=(7-i) - sjednotíme všechny a a b a vyjde nám výsledek.
(2+3i)×(4+2i)=8+4i+12i+6i2=8+16i+6×(-1)=2+16i - zde stejně jako u mnohočlenů roznásobíme navzájem závorky a využijeme znalosti, že i2=-1.
Zkusme další příklad, tentokrát trochu složitější.
c =(2+1i2)
Z0=c


Z1=Z02+c
Z2=Z12+c
Z3=Z22+c
...

Toto je v podstatě rozpis iterace funkce (hned vysvětlím) právě mandelbrotovy množiny. Do nekonečna bychom mohli počítat Zn=Zn-12+c, a viděli bychom velmi zajímavou věc. Zatímco některé body c (například c=(4-7i)) již po několikátém provedení této funkce (několikáté iteraci) získávají obrovské hodnoty, jiné (například c=(1+2i)) získávají vysoké hodnoty až po několika stovkách iterací a jiné (například c=(-0.5+1i))  nezačnou získávat vysoké hodnoty nikdy a jejich hodnota v podstatě "krouží" okolo bodu (0+0i). A právě toto je klíčem k výpočtu mandelbrotovy množiny.

Na soustavě souřadnic 0xy, na které je rovina bodů c=[x;y]. My ale budeme předpokládat, že to jsou body c=(x+yi). Pro každý tento bod provedeme nekonečno iterací a zjistíme, zda-li hodnota Z dosáhla nekonečna, či nikoliv. Pokud nedosáhla nekonečna, znamená to, že bod c patří do mandelbrotovy množiny. Počítače ale samozřejmě nemohou provádět nekonečné operace a proto se algoritmy pro počítání této množiny doplňují o různé výhybky, jako například že pokud absolutní hodnota Z přesáhne nějakou hodnotu (zvanou bailout), předpokládá se, že se již ke středu nevrátí. Dále musíme omezit počet iterací, protože jinak by první bod c, který do množiny patří, zacyklil celý program, neboť by se jeho hodnota neustále opakovala. Také nemůžeme počítat celou rovinu, protože ta má nekonečně mnoho bodů, proto vybíráme pouze body v nějakém rozsahu hustotě, například čtverec [-2;-2][2;2] s tím, že počítáme po 0.01

Ale pokusíme-li se takto propočítat alespoň malou část této roviny, vznikne nám obrazec podobný tomuto:
A to je mandelbrotova množina ;)