Zbiór Mandelbrota

Kiedyś, gdy byłem dość młodym użytkownikiem 8-bitowego komputera Atari 65XE (z magnetofonem XC12 jako pamięcią masową) zobaczyłem w telewizji program edukacyjny poświęcony fraktalom. Zaciekawiło mnie to, że każdy fragment takiego fraktala po przybliżeniu daje w obraz bardzo podobny do całości. Marzyło mi się, żeby móc narysować coś takiego na moim komputerze – niestety nie posiadałem w tamtym czasie dostatecznych umiejętności matematyczynych, by zrozumieć w ogóle czym np. taki zbiór Mandelbrota jest (nie miałem zresztą również skąd zaczerpnąć tej wiedzy).

Na szczęście teraz mam dostęp do Wikipedii, a także znam już liczby zespolone – okazuje się, że nic więcej nie potrzeba, by zrozumieć, czym jest fraktal i jak go narysować. Jeśli jednak drogi czytelniku nie wiesz, czym są liczby zespolone, to nie przejmuj się tym za bardzo. Na użytek poniższego tekstu możemy przyjąć po prostu, że liczba zespolona określa pewien punkt na płaszczyźnie (tak jak liczba rzeczywista określa pewien punkt na prostej). Liczby zespolone najczęściej zapisuje się tak: [tex](a,b)[/tex], lub tak: [tex]a+bi[/tex]. Liczba [tex]i[/tex] ma taką ciekawą właściwość, że podniesiona do kwadratu daje [tex]-1[/tex]: [tex]i^2=-1[/tex]. Wiedza ta przyda nam się do wyprowadzenia wzoru na kwadrat liczby zespolonej, który to wzór jest niezbędny do narysowania ładnego fraktala: [tex](a+bi)^2=a^2+2abi+(bi)^2=a^2+2abi-b^2=a^2-b^2+(2ab)i[/tex].

Wiemy już, czym są liczby zespolone, jak można taką liczbę podnieść do kwadratu, możemy więc określić, czym jest zbiór Mandelbrota. Otóż, zbiór Mandelbrota, to zbiór takich liczby zespolonych [tex]p[/tex], dla których ciąg określony wzorem rekurencyjnym:

[tex]z_0=0[/tex]
[tex]z_{n+1}={z_n}^2+p[/tex]

ma określoną granicę (nie dąży do nieskończoności). W praktyce wystarczy sprawdzić, czy punkt określony przez tę liczbę zespoloną, leży w odległości mniejszej od [tex]\sqrt{2}[/tex] od początku układu współrzędnych (w Wikipedii napisane jest, że dla [tex]2[/tex], a nie dla [tex]\sqrt{2}[/tex], ale widocznie działa i tak i tak). Odległość punktu określonego przez liczbę zespoloną od początku układu współrzędnych można dość prosto obliczyć. Dla liczby zespolonej [tex](a,b)[/tex] jest to po prostu [tex]\sqrt{a^2+b^2}[/tex]. Odległość ta nazywa się modułem liczby zespolonej. Moduł ten musi więc wynosić mniej niż [tex]\sqrt{2}[/tex] dla pewnej liczby pierwszych wyrazów ciągu [tex]z_n[/tex]. Powstaje oczywiście pytanie: ile tych pierwszych wyrazów trzeba zbadać. Odpowiedź nie jest taka prosta – im mniej wyrazów zbadamy, tym szybszy uzyskamy algorytm, ale z drugiej strony – tym mniej dokładny obraz fraktala powstanie.

Pozostaje jeszcze pytanie o kolory. Fraktale, które widziałem w telewizji były bardzo kolorowe, tymczasem w/w algorytm pozwala nam jedynie domyśleć się, gdzie postawić kropkę, a gdzie jej nie stawiać. Otóż, jeśli w pewnych punktach [tex]n[/tex]-ty wyraz ciągu z ma moduł większy od [tex]\sqrt{2}[/tex], to [tex]n[/tex] możemy sobie zapamiętać i na jego podstawie pokolorować punkt, który aktualnie rozważamy.

„Przepis” na narysowanie fraktalu Mandelbrota jak widać nie jest bardzo skomplikowany, a pozwala uzyskać zadziwiające efekty. Pół godziny pracy w C# zaowocowało następującym obrazkiem:

Zbiór Mandelbrota narysowany przy użyciu programu w C#.

Jednak to nie koniec. Zachęcony powodzeniem tej operacji, postanowiłem sprawdzić, czy małe Atari poradzi sobie z narysowaniem fraktala (pomyślałem, że wystarczy przedstawienie dwukolorowe). Efektem krótkiego (nieco ponad 20 linijek!) programu w Basicu jest następujący obrazek:

Zbiór Mandelbrota narysowany przy użyciu Atari 65XE.

Mimo, że program w Basicu był krótszy niż ten w C# (a może właśnie dlatego), wykonywał się on o wiele dłużej. Uruchomiłem go na emulatorze z opcją Full speed (prędkość 10-krotnie przewyższająca oryginalne Atari), a mimo to obrazek powstawał przez kilkanaście godzin. Może gdyby zakodować to w asemblerze

Listing programu w Basicu.

Źródła w C#.

6 myśli nt. „Zbiór Mandelbrota

  1. r

    Czym jest to p we wzorze? w ogole nie wiem jak to narysowac… mało ci zrozumialem.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *