W 1980 roku Benoît Mandelbrot wydrukował pierwszy rozpoznawalny obraz zbioru noszącego dziś jego nazwisko na komputerze IBM w Yorktown Heights w stanie Nowy Jork. Jak na dzisiejsze standardy wydruk był prymitywny — blokowa, niemal ASCII-owa grafika na papierze — ale samopodobna, nieskończenie złożona granica była niepodważalna. Powstała z równania mieszczącego się w dwóch liniach. Niemal pięć dekad później zbiór Mandelbrota pozostaje jednym z najbardziej zdumiewających obiektów w całej matematyce — zarówno wizualnie, jak i matematycznie: strukturą nieskończonego bogactwa ukrytą w formule na tyle prostej, że mieści się w jednej linijce kodu.
Algorytm: iteracja liczb zespolonych
Liczba zespolona c należy do zbioru Mandelbrota wtedy i tylko wtedy, gdy ciąg zdefiniowany rekurencją z₀ = 0, zₙ₊₁ = zₙ² + c nie dąży do nieskończoności przy nieskończonej iteracji. Obliczeniowo stosujemy warunek ucieczki: jeśli moduł |z| kiedykolwiek przekroczy 2, ciąg gwarantowanie rozbiega się do nieskończoności, a punkt „ucieka”. Przerywamy wtedy iterację i zapisujemy, ile kroków to zajęło.
Punkty, które nigdy nie uciekają — czyli zwracają maxIter — należą do zbioru Mandelbrota i są kolorowane na czarno. Punkty, które uciekają, są kolorowane zależnie od tempa ucieczki: szybko uciekające otrzymują jeden kolor, wolno uciekające — inny. Limit iteracji zwykle ustawia się między 100 a 1000; wyższe limity ujawniają drobniejsze detale w pobliżu granicy zbioru, ale wymagają więcej obliczeń. Na samej granicy — nieskończenie cienkiej krawędzi między zbieżnością a rozbieżnością — liczba iteracji może być dowolnie duża.
Dlaczego promień ucieczki wynosi 2: matematycznie dowiedziono, że jeśli |z| kiedykolwiek przekroczy 2, orbita z₀, z₁, z₂, … rozbiegnie się do nieskończoności. Zastosowanie większego promienia ucieczki (na przykład 100) umożliwia opisany niżej algorytm płynnego kolorowania przy znikomym dodatkowym koszcie obliczeniowym.
Płynne kolorowanie i algorytm promienia ucieczki
Naiwne kolorowanie pikseli według całkowitej liczby iteracji daje brzydkie koncentryczne pasma — widoczne „pierścienie” wokół zbioru. Pasmowość wynika z tego, że liczba iteracji jest wielkością dyskretną, zmieniającą się skokowo o liczby całkowite, podczas gdy prawdziwe tempo rozbieżności zmienia się w sposób ciągły. Rozwiązaniem jest algorytm ciągłego (płynnego) czasu ucieczki.
Gdy punkt ucieka przy iteracji i z wartością końcową z, płynny czas ucieczki oblicza się jako:
Ten człon korygujący usuwa całkowitoliczbowe „schodki”, dając płynną liczbę rzeczywistą, która rośnie w sposób ciągły wraz z oddalaniem się punktów od granicy zbioru. Przypisanie mu do palety kolorów — zwykle poprzez cykliczne przejście przez odcień (hue) w przestrzeni HSL lub starannie zaprojektowany gradient — daje te płynne, przypominające płomienie pasma kolorów, które uczyniły wizualizacje Mandelbrota kultowymi.
Osiągalna programowo głębokość powiększenia jest oszałamiająca. Standardowe liczby zmiennoprzecinkowe podwójnej precyzji, stosowane w większości implementacji, pozwalają dotrzeć do powiększeń rzędu 10¹⁵, zanim zabraknie precyzji i obraz rozpadnie się na pikselowe artefakty. Na takiej głębokości pojawiają się struktury, które w niepokojący sposób powtarzają oryginalny zbiór najwyższego poziomu: miniaturowe kopie Mandelbrota unoszące się wśród nitkowatych struktur, otoczone własnym barokowym filigranem spirali i bulwek. Biblioteki arytmetyki dowolnej precyzji pozwalają osiągać powiększenia rzędu 10^1000 i większe, ujawniając strukturę w skalach niemających fizycznego znaczenia — zbiór nie jest obiektem fizycznym, to czysta matematyka.
Zbiory Julii: krewni Mandelbrota
Zbiór Mandelbrota jest ściśle powiązany z rodziną fraktali zwanych zbiorami Julii, nazwanymi na cześć francuskiego matematyka Gastona Julii, który badał iterację liczb zespolonych już w 1918 roku — dekady zanim ktokolwiek mógł zwizualizować jego pracę na komputerze. Aby obliczyć zbiór Julii, odwraca się role: c ustala się jako konkretną liczbę zespoloną, a punkt startowy z₀ zmienia się na całej płaszczyźnie zespolonej. Dla każdego punktu startowego zadaje się to samo pytanie: czy orbita się rozbiega?
Związek między tymi dwoma rodzajami zbiorów to jedno z najpiękniejszych twierdzeń dynamiki zespolonej:
- Jeśli c leży wewnątrz zbioru Mandelbrota, odpowiadający mu zbiór Julii J(c) jest spójnym, zwartym z wyglądu fraktalem — misternie zbudowaną wyspą.
- Jeśli c leży poza zbiorem Mandelbrota, odpowiadający mu zbiór Julii J(c) jest niespójną chmurą punktów zwaną pyłem Cantora — nieskończenie wieloma fragmentami bez żadnej łączącej je struktury.
Zbiór Mandelbrota jest więc dosłownie mapą spójności zbiorów Julii. Każdy punkt na granicy zbioru Mandelbrota odpowiada zbiorowi Julii przechodzącemu topologiczne przejście fazowe ze spójnego do niespójnego. Przybliżanie się do granicy Mandelbrota i znajdowanie miniaturowej kopii zbioru jest równoważne znalezieniu obszaru, w którym lokalne zbiory Julii ściśle przypominają całość.
Wymiar Hausdorffa granicy zbioru Mandelbrota Mitsuhiro Shishikura dowiódł w 1998 roku jako dokładnie równy 2 — co oznacza, że granica jest tak nieskończenie złożona, iż wypełnia przestrzeń równie dokładnie jak powierzchnia dwuwymiarowa, mimo że sama jest krzywą. To wymiar fraktalny w swojej najbardziej ekstremalnej matematycznej postaci.
Naturalne fraktale pojawiają się wszędzie tam, gdzie iteracyjne procesy wzrostu działają bez ustalonej skali: linie brzegowe mierzone z coraz większą rozdzielczością stają się coraz dłuższe (paradoks Richardsona), drzewa rozgałęziają się pod statystycznie samopodobnymi kątami, ramiona płatków śniegu rosną jako fraktale dendrytyczne, oskrzela ludzkich płuc rozgałęziają się przez 23 pokolenia, a delty rzek widziane z satelity wyglądają identycznie w skali 10 km i 100 km. Wszystkie mają wymiar fraktalny między 1 a 2 — bardziej złożone niż linia, ale mniej wypełniające przestrzeń niż płaszczyzna. Zbiór Mandelbrota łączy je wszystkie jako przykłady tego samego, leżącego u ich podstaw zjawiska matematycznego: nieskończonej złożoności wynikającej ze skończonej reguły iterowanej bez ograniczeń.