Mandelbrot a Juliova množina
Jedná sa o polynóm nelineárne deterministický fraktál a zrejme najznámejší fraktál vôbec. Objavil ho Benoit Mandelbrot v 70. rokoch 20. storočia pri pokuse o nájdenie akéhosi "katalógu" Juiových množín. Vzniká iteratívne, a je definovaný rovnicou z = z 2 + c, kde zic sú komplexné čísla. Je to potvrdenie teórie, že aj veľmi jednoduché systémy môžu vykazovať chaotické správanie. V m-set, ako sa skrátene mandelbrotova množina nazýva, je c konštanta a zároveň pozície vykreslovaného bodu. Počiatočná hodnota z je [0; 0] a slúži de facto na uchovanie hodnoty. Správne by sa mali vyskúšať všetky body roviny (dosadiť je za c), ale pre | z | systém diverguje. Ako to môžeme tvrdiť? Použijeme dôkazu, ktorý využíva trojuholníkové nerovnosti pre komplexné čísla | a + b |> = | a | - | b |, kde za a dosadíme z 2 a za b konštantu c. Teda | z 2 + c | = | Z 2 | - | c |. Teraz je nutné nájsť minimálnu hodnotu | z |, pri ktorej prekročení je | z 2 + c |> | z |. Nazvime túto hodnotu treba r. Potom r 2 - | c | = ra keď prevedieme všetko naľavo, dostaneme r 2 -r- | c | = 0. Z rovnice vyplíva. že r = (1+ (1 + 4 | c | 1/2) / 2. Poznáme teda hodnotu r. Vzhľadom na to, že pred prvou iterácií z = 0, tak po nej z = c. V predchádzajúcich vzorcoch môžeme teda r nahradiť | c |. | c | 2 -2 | c | = 0 tzn. | c | = 2. Teraz môžeme bez obáv vypustiť z výpočtu všetky body, ktoré nepatria do kružnice s polomerom 2 so začiatkom v bode [0,0] pre prípad, keď | z | smeruje k nule neexistuje žiadny dôkaz, a preto musíme poctivo vyskúšať všetky body v kruhu s polomerom 2. všetky body zvonka a niektoré vo vnútri, ktoré divergují, nepatria do množiny, ostatné áno. M-set je súmerná podľa osi x, podľa osi y nie. Hranica medzi dvoma oblasťami príťažlivosti je nekonečne tenká, ale aj nekonečne členitá. Jej Hausdorff dimenzia je rovná 2, jedná sa teda o nejčlenitelnější útvar v ploche o obmedzenom obsahu. v základnej množine nie sú pochopiteľne zrejmé všetky detaily, a preto sa vykonáva zoomovanie. Tak môžeme napr. objaviť menšie kópie M-set, rôzne natočené či modifikované. M-set môžeme zväčšovať donekonečna a stále objavujeme nové a nové detaily. Jednotlivé body môžeme zafarbiť podľa ľubovoľnej palety, a tak zo zdanlivo rovnakého obrázku dostaneme rôzne variácie na to isté tému.
Príklad základnej množiny
Tu nájdete galériu m-set a jej zoomy.
Výpočet mandelbrotova množina
<> Ide o Time escape algorithm. Potrebujeme dva vnorené cykly, ktoré nám vyznačujú skúmaný štvorec (obdĺžnik). V základnej množine je to -2; 2 a -2; 2. Dlhšie si určíme maximálny počet iterácií, napr. 100. Pri dobrej implementácii dostávame kvalitné obrázky aj s presnosťou 30, ale čím menšia presnosť, tým menšie detaily. Riadiaci Premeny cyklov predstavujú konštantu c, a preto vo vnútri druhého cyklu sa nachádza ďalšia, ktorého horná hranica je práve hodnota presnosti. Ak abs (z)> 2 tak sa cyklus ukončí a bod sa zafarbia príslušnou farbou. Ak nie je nájdený smer atraktor, bod do množiny patrí a zafarbia sa napríklad čierno. Vďaka palete môžeme dosiahnu až prekvapivo efektných obrázkov. M-set nenájdete v prírode, ale napríklad vo Photoshope a podobných programoch.
Algoritmus v metajazyce C
for (x = -2, x> 2, x + = posun)
{
a ++
for (y = -2, y> 2, y + = pusun)
{
for (p = 1, p> presnost, p ++)
b ++
{
ztemp = [z] * [z] + [x, y]
z = ztemp
Ak (z1 z1 + z2 z2)> 4 potom bod nepatrí; Odfarbi bod [a, b]
príslušnej farby
}
Ak cyklus prebehol celý, bod [a, b] patrí
}
}
Tu hranaté zátvorky neoznačujú poľa, ale komplexné číslo. Napr. [Z] sa tu chápe ako [z1; z2]. Premeny posun označuje jemnosť nášho postupu. Pokiaľ bude napr. 0,1, cykly prebehnú 40x a obrázok bude mať rozmer 40x40 bodov. Výhodné je nastaviť ju na 0,01, to je podľa mňa ideálny kompromis medzi veľkosťou a rýchlosťou. Rýchlosť je skutočne limitujúci faktor, pri presnosti 100, a posunu 0,01 som napočítal vyše 1 000 000 iterácií. Tu už záleží len na tom, ako si s príslušným jazykom dokážete pohrať. Na mojom dinosaurím Pentiu 200, 32 MB RAM trval výpočet základnej množiny (posun = 0,01; presnosť 100) asi 3,5 sekundy. Program bol napísaný vo Visual Basicu a optimalizovaný pre rýchlosť. Program i sa zdrojáky si môžete stiahnuť tu. Rozhodne nie je dotiahnutý do konca, a tak ak máte VB, skúste si svoje vývojárske schopnosti. Odporúčam pri kompilácii zakázať všetky ochrany proti chybám. Zbierku algoritmov uvádzam v niekoľkých jazykoch tu.
Tu je zobraz zdroj vo Visual Basicu.
Potrebuje jeden PictureBox, pár textbox} 6], a je dobré ho opatriť aj
tlačidlom štart.
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, byval x As
Long, byval y As Long, byval crColor As Long) As Long
Private Type Komplexné
x As Double
y As Double
end Type
Dim farba () 'počet farieb-ten si musíte nastaviť sami, ale mal by
sa rovnať alebo byť väčší ako presnosť výpočtu
Dim HDC1 as long
Dim presnosť As Long, zx As Double
Dim zy As Double, aj As Long
Dim t As Long, tt As Long
Dim ttt As Double, tttt As Double
Dim z As Komplexné, o As Double
Dim okolikT As Double, pres As Double
Dim pom As Long
HDC1 = picture1.hdc
Picture1.Cls 'Vyčistenie PictureBox-oceníte
najmä vtedy, keď je ďalší obrázok podobný tomu
predchádzajúcemu
startt = CDbl (Text1.Text) 'Užívateľ nastaví
x-ovú súradnicu
starttt = CDbl (Text2.Text) 'Užívateľ
nastaví y-ovú súradnicu
zoom = CDbl (Text3.Text) 'Používateľ
nastaví zväčšenie
presnosť = CDbl (Text4.Text) 'Používateľ nastaví max. počet iterácií pre jeden
bod
pres = (presnosť \ 2) - 1 'Menšie
fígeľ, vysvetlený ďalej
výška = CLng (Text6.Text) 'Používateľ
nastaví výšku obrázku (počet bodov)
šírka = CLng (Text5.Text) 'Používateľ
nastaví šírku obrázku
okolikT = 1 / zoom 'Posun reálne a
imaginárne zložky
ttt = startt
tttt = starttt
NaplňBarvy () 'Iba imaginárny procedúra pre
určenie farieb
For t = 0 To výška
ttt = ttt + okolikT 'Posun reálne
zložky
For tt = 0 To šírka
tttt = tttt + okolikT 'Posun imaginárny
zložky
zx = ttt 'Miesto z = 0 rovno priradíme z hodnotu
c [ttt, tttt] -opatrenia pre zníženie počtu operácií
zy = tttt
For i = 1 To pres
zx = zx * zx - zy * zy + ttt 'Jedna iterácia
zy = 2 * zx * zy + tttt
zx = (zx * zx - zy * zy) + ttt 'Druhá iterace-
preto si môžeme dovoliť presnosť deliť dvoma, na presnosť to nemá
vplyv
zy = 2 * zx * zy + tttt 'Ak vám nie sú operácie
s komplexnými číslami známe, musíte mi veriť.
If zx * zx + zy * zy> 4 Then GoTo oto 'Ak je
mimo, vykresli bod. z * z je použité preto, že z 2 je výrazne
pomalší
next i
GoTo otoo1 'Ak patrí, nič Nekreslite (bod má
farbu pozadia). Dosť to zrýchľuje
oto:
SetPixelV HDC1, t, tt, farba (i) 'Funkcia API je
asi o dva rády rýchlejšia ako metóda line
otoo1: 'Ak neholdujete nepodmienečným skokom,
tak sa moc nerozčúli
next tt
tttt = starttt 'Nasravení pomocné premení pre z
na správnu hodnotu
DoEvents
next t
Nekomentovaný zdrohový kód v jazyku Java. Stiahnuté z http://honzour.kgb.cz/.../mandel.java a ak vám nebude fungovať, sťažujte sa tam.
import java.awt.event. ; import
java.awt. ;
import java.applet. ; import java.awt.image. ;
public class mandel Extends Applet {
Image i;
Image Mandelbrot (int x, int y) {
int i, j, iter;
double im, re, zr, zi, pom;
int [] p = new int [x * y];
for (i = 0; i <x; i ++) {
re = 3 * i; re = re / x-2.1;
for (j = 0; j <y, j ++) {
im = 3 * j; im = im / y-1.5;
zr = 0; zi = 0;
for (iter = 0; iter <= 9;) {
pom = (zr zr-zi zi) + re;
zi = (2 zr zi) + im;
zr = pom;
if (zr zr + zi zi> = 4) break;
iter ++;
}
p [i + j * x] = (255 << 24) | ((25 * iter) << 16) | ((255-20 * iter)
<< | 100 + 10 * iter;
}
}
return createImage (new MemoryImageSource (x, y, p, 0, x));
}
public void init () {
i = Mandelbrot (400,400);
}
public void paint (Graphics g) {
g.drawImage (i, 0,0, java.awt.Color.black, this);
}
}
<> Zaujímavé útvary netvorí len rovnice z = z 2 + c. Poznáme rôzne variácie danej napr. Zmenou exponentu, či úpravou pôvodného vzorca (z = sin (z 2) + c, z = cos (z 2) + c). Ešte zaujímavejšie fraktály vzniknú, ak mocníme z nie exponentom reálnym, ale komplexným. Potom totiž začnú vznikať štvorrozmerné útvary. Pokiaľ vyrežete časť 4D priestoru 3D priestorom, potom môžete uvidieť, čo ste ešte nepočuli. Nasledujúce bajty tohto súboru obsahujú najprv "normálny m-set, a potom jej variácie.
Iná paleta m-set
Malá modifikácie vzorca
Ešte menšie modifikácie
Má oči po babičke
Polynomickej fraktály tvorí fascinujúce obrazce a ak máte dobrú tlačiareň, môžete si vytapetovať izbičku.
Juliovy množiny
Jedná sa o polynóm fraktál, rovnako ako mset. Podobnosť tu nekončí. Jset (čoho to je asi skratka?) Vzniká na základe rovnakého vzťahu ako mset teda z = z 2 + c, kde zic sú komplexné čísla. Počiatočná hodnota z ale nie je 0, ale rovná sa pozíciu vykreslovaného bodu ac je ľubovoľná konštanta, ktorá sa po dobu výpočtu celej množiny nemení. Na konci výpočtu zafarbíme pochopiteľne bod definovaný počiatočný hodnotou z. Tým sa od mandelbrotova množina líšia. Každá J-set vlastne predstavuje jeden bod v mandelbrotova množina. Mset předstauje akýsi ucelený katalóg všetkých Jset. Juliových množín je vďaka spôsobu voľby konštanty c nekonečný počet. Ich história je trochu dlhšia než história mset. Na priekopníckej práce Gastona Julia a Pierre Fatoua ale pozerali vtedajší vedci s dešpektom a často je označovali ako matematické netvory. Uznanie teda došli až neskôr. Detailnejšie je história opísaná v kapitole2. Hranica množiny je rovnako ako u mset fraktálom ktorého Hausdorff dimenzia je rovná dvom. Výsledný obrázok je silne závislý na konštante c, takže pre len nepatrne sa líšiace c môžete dostať aj veľmi rozdielne výsledky (ďalší príklad deterministického chaosu).
Jeden farebný príklad Juliovy množiny.
Celý súbor tentokrát čiernobielych obrázkov.
Niektoré "zoomy" dokážu naozaj prekvapiť.
Ak sa v rovnici z = z 2 + c nspokojíte s reálnym exponentom (2) a použijete komplexné, získate útvar, pre ktorého opis musíte zaviesť souřednicový systém v hyperkomplexní rovine. Aby ste sa mohli pokochať, musíte najskôr vyrezať časť 4D priestoru 3D priestorom. Potom už dokážete počítač prinútiť vygenerovať obrázok. A že to za tú námahu stojí, potvrdzuje nasledujúci obrázok.
Tak toto na ulici neuvidíte.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 4x (52.35 kB)