Hallo Ihr Lieben,
willkommen zurück in der Welt der Mandelbrotmenge. Unser Erkundungspfad zu selbiger ist ja bereits im letzten Teil meiner Beitragsserie wenigstens mal bis zur Definition der Mandelbrotmenge gelangt. Wir haben dort erfahren, dass die Mandelbrotmenge eine Teilmenge der Komplexen Zahlen ist. Und wir haben erfahren, welche komplexen Zahlen zur Mandelbrotmenge gehören und welche nicht.
Dazu haben wir meinen legendären „Mandelbrot-Transformator” kennengelernt. Er wird verwendet, indem man ihn anhand der beiden Schieberegler zunächst auf jene komplexe Zahl voreinstellt, für die man testen will, ob sie zur Mandelbrotmenge dazugehört. Ist die zu testende Zahl einmal eingestellt, startet man den Transformator, indem man oben eine Null einwirft. Es erscheint dann eine Zahl am Ausgang – und zwar immer diejenige Zahl, die entsteht, wenn man die oben eingeworfene Zahl mit sich selbst multipliziert und die zu testende Zahl zum Ergebnis dieser Selbstmultiplikation hinzuaddiert. Das Ergebnis dieses Vorgangs wirft man dann wieder oben in den Transformator ein und wiederholt dieses Prozedere solange, bis entweder eine Zahl mit einem (komplexen) Betrag größer als 2 herauskommt, oder aber, bis eine vorgegebene maximale Anzahl an Durchläufen – sogenannte Iterationen – erreicht ist. Ist ersteres der Fall, gehört die anfangs voreingestellte Zahl nicht zur Mandelbrotmenge. Ist letzteres der Fall, gehört sie dazu. Jedenfalls betrachten wir sie dann als zugehörig zur Mandelbrotmenge.
Wie aber entstehen jetzt daraus die spektakulären, unglaublich farben- und formenreichen Bilder, die im „Teaser-Video” aus dem ersten Beitrag dieser Serie zu sehen waren?
Punkt für Punkt
Tatsächlich sind diese sensationellen Visualisierungen der Mandelbrotmenge eindeutig Kinder des Computerzeitalters. Ohne Computer keine Apfelmännchen. Daher datiert die erste belegte Darstellung des Apfelmännchens auch erst aus dem Jahre 1978, wo sie in einem (allerdings erst 1980 publizierten) Fachkonferenzbeitrag der beiden Wissenschaftler Robert Wolfe Brooks und John Peter Matelski wie folgt zu sehen war:
Das würde man wohl kaum als visuelle Offenbarung bezeichnen wollen. Aber 1978 verfügten Computer gerade einmal über ein Millionstel der Rechenleistung unserer heutigen Computer. Viel mehr konnte man damals also nicht erwarten. Dennoch wäre diese Darstellung der Mandelbrotmenge ohne Computer nicht möglich gewesen. Per Hand könnte man nämlich nicht einmal die magere Darstellung aus dem obigen Bild berechnen.
Also – wie entsteht jetzt die Visualisierung der Mandelbrotmenge?
Dazu muss man zunächst einmal verstehen, dass computergenerierte Bilder sich heutzutage praktisch ausschließlich aus einer Aneinanderreihung einzelner Bildpunkte zusammensetzen. Solche Bildpunkte werden auf Englisch „picture elements” (wörtlich „Bildelemente”) genannt und gerne mit der Kurzform „pic-els” bzw. „pixels” bezeichnet. Stellen wir uns jetzt also mal eine Fläche aus lauter derartigen Pixels vor – angeordnet in Form von fünf Zeilen à 10 Punkten:
Das ist jetzt nicht gerade Retina-Auflösung. Moderne Computerdisplays lösen ohne Weiteres auf knapp 2.000 Zeilen à 4.000 Pixel auf. Für die folgenden Erläuterungen soll uns die oben gewählte Popel-Auflösung aber der besseren Anschauung halber genügen.
Als erstes wählt man dann für die Darstellung der Mandelbrotmenge denjenigen Ausschnitt der komplexen Ebene vor, den man sich betrachten möchte. In unserem Beispiel wählen wir jetzt mal auf der reellen Achse den Bereich von -2 bis 2 und auf der imaginären Achse den Bereich von -1 bis 1:
Wir beginnen unsere Darstellung mit dem linken oberen Pixel (also dasjenige mit den Bildschirmkoordinaten 1, 1 (erste Zeile, erste Spalte). Das macht man traditionell so, weil der Kathodenstrahl bei den guten alten Bildröhren den Bildaufbau auch immer oben links begonnen und das Bild dann in einer großen Abwärtsbewegung Zeile für Zeile von links nach rechts auf die Fluoreszenzschicht gemalt hat. Unser erstes Pixel entspricht damit der komplexen Zahl -2+1×i: Diese Zahl stellen wir an unserem Transformator ein und lassen ihn – vorschriftsgemäß – mit 0 beginnend loslaufen:
Die Beträge der ersten sechs Zahlen, die der Transformator daraufhin nacheinander ausspuckt lauten:
- 2,236067977
- 3,16227766
- 11,18033989
- 124,6194206
- 15.531,57703
- 241.229.886
Im Grunde sind wir also schon gleich beim ersten Betrag (2,236067977) über die magische 2 hinausgeschossen und hätten den Transformator gleich wieder anhalten können. Ich wollte Euch aber trotzdem mal zeigen, wie schnell unsere Ausgabefolge wächst. Im Ergebnis bedeutet das jedenfalls, dass die Zahl -2+1×i nicht zur Mandelbrotmenge dazugehört. In diesem Fall lassen wir unser Pixel dementsprechend weiß und schauen uns das nächste Pixel rechts daneben an (erste Zeile, zweite Spalte). Dieses entspricht der Zahl -1,6+1×i:
Das ist so, weil wir mit jedem der zehn Pixel in einer Zeile entsprechend ein Zehntel des Bereichs von ‑2 bis 2 abdecken. Der Bereich von ‑2 bis 2 hat eine Länge von 4 (zwei links von der Null plus zwei rechts von der Null) und ein Zehntel davon entsprechend die Länge von 0,4. Rechnet man dann ‑2+0,4 (also linker Bildrand plus die Länge eines Pixels), erhält man ‑1,6. Wer das mit minus und plus gerade nicht auf die Reihe kriegt, sei auf Teil 2 dieser Beitragsserie verwiesen, in dem die Ganzzahlarithmetik ausführlich diskutiert wurde. Wir stellen unseren Trafo also jetzt auf -1,6+1×i ein und lassen ihn mit 0 loslaufen:Die Beträge der ersten zwei Zahlen unserer Ausgabefolge lauten diesmal: 1,886796226 und 2,200363606. Damit sind wir zwar erst mit der zweiten Zahl über die magische 2er-Grenze gekommen, können dieses Pixel aber ebenfalls aus der Mandelbrotmenge ausschließen und es daher in Weiß darstellen. Das kann man jetzt nacheinander für alle unsere Pixel machen und erhält dann schließlich folgendes Bild:
Mit viel Fantasie kann man darin tatsächlich das Apfelmännchen erkennen, aber unsere didaktische Billigauflösung macht das Ganze zugegebenermaßen nicht gerade zu einer Augenweide. Jedenfalls zeigen die schwarzen Pixel jene Bereiche, bei denen unser Transformator (voreingestellt auf die zum jeweiligen Pixel gehörende Zahl) nach einer vorgegebenen Anzahl von Durchläufen immer noch keine Zahl ausgespuckt hat, deren Betrag größer als 2 ist. Schauen wir uns dazu mal exemplarisch das fünfte Pixel in der dritten Reihe an. Es entspricht aus den oben dargelegten Gründen der Zahl -0,4+0,2×i:
Wir stellen also unseren Trafo brav auf -0,4+0,2×i ein und lassen ihn – wie gewohnt – mit 0 beginnend loslaufen:Hier nun die Beträge der ersten 20 Zahlen, die auf diese Weise in der Ausgabefolge erscheinen:
Unten sind die Durchläufe von 1 bis 20 nummeriert und links die Beträge der Ausgabezahlen im Bereich zwischen 0,25 und 0,5. Es ist gut zu erkennen, dass sich das Ganze in der Nähe von 0,34 einschwingt. Damit gehört -0,4+0,2×i also wirklich zur Mandelbrotmenge und unser Pixel darf demnach in Schwarz erscheinen.
Eben wird’s zu bunt
Soweit so gut. Aber wo sind jetzt die spektakulären Visualisierungen? Klar, unsere Bildauflösung ist denkbar mager. Aber selbst, wenn man sie kräftig erhöhte – etwa auf 500 Zeilen à 1.000 Pixel – käme man nach dem eben erläuterten Prinzip zu folgender Darstellung:
Das sieht zwar schon deutlich mehr nach dem aus, was wir bisher so als Apfelmännchen kennengelernt haben. Aber es ist keineswegs so hübsch bunt, wie die Visualisierungen aus dem Teaser-Video.
Die Lösung: wir gehen all jene Pixel durch, die nicht zur Mandelbrotmenge gehören (und die wir daher bisher einfach in Weiß belassen haben) und schauen uns für jedes dieser Pixel an, nach wie vielen Durchläufen unser Transformator zum ersten Mal eine Zahl ausgespuckt hat, deren Betrag größer als 2 ist (so dass unser Pixel als nicht zugehörig zur Mandelbrotmenge identifiziert werden konnte). Wie wir oben (aber auch im vorangegangenen Teil dieser Blogserie) gesehen haben, geschieht das manchmal schon nach einem einzigen Durchlauf, manchmal nach ein paar Dutzend und manchmal erst nach vielen tausenden Durchläufen. Für die weiteren Betrachtungen wollen wir diese Anzahl an Trafo-Durchläufen bis zum erstmaligen Erscheinen einer Zahl mit einem Betrag größer als 2 jetzt einfach mal die „Abbruchanzahl“ nennen. Nachstehend haben wir mal für eine Auflösung von 31 Zeilen à 31 Pixel alle Abbruchanzahlen für diejenigen Pixel dargestellt, die nicht zur Mandelbrotmenge gehören:
Man sieht gut, wie die Abbruchanzahlen in der Nähe der (schwarz dargestellten) Mandelbrotmenge deutlich zunehmen. Am äußeren Bildrand haben wir ziemlich viele Pixel, mit einer Abbruchanzahl im Bereich 1 bis 3. Für diese Pixel ist demnach also schon nach ein bis drei Iterationen (=Durchläufe durch unseren Transformator) klar, dass sie nicht zur Mandelbrotmenge gehören. Im Grenzbereich zur Mandelbrotmenge brauchen wir dagegen teilweise bis zu 35 Iterationen (wie etwa ober- und unterhalb des „Kopfes” zu sehen), um die zugehörigen Pixel aus der Mandelbrotmenge ausschließen zu können.
Auf jeden Fall haben wir jetzt nicht mehr nur einfach gleichförmig weiße Pixel sondern weiße Pixel mit ganz unterschiedlichen Abbruchanzahlen. Diese Beobachtung machen wir uns jetzt dahingehend zunutze, dass wir den jeweiligen Abbruchanzahlen einfach bestimmte Farben zuordnen – und zwar etwa gemäß folgender Tabelle:
Unser obiges Bild würde damit wie folgt aussehen:
Aha – es tut sich langsam was! Man sieht hier schon recht gut, nach welchem Prinzip die Farbdarstellungen der Mandelbrotmenge erzeugt werden: offenbar wird es auf diese Weise in der Nähe der Mandelbrotmenge immer heller, und auch der Grenzbereich tritt jetzt viel deutlicher und differenzierter hervor. Außerdem zeigen sich im Grenzbereich jetzt plötzlich ganz eigene Strukturen, die ansonsten im bisherigen „Einheitsweiß” untergegangen wären.
Mit diesen Erkenntnissen ausgestattet, kommen wir jetzt wieder zurück zu unserer obigen Visualisierung mit ihren 500 Zeilen à 1.000 Pixeln und färben sie auf vergleichbare Weise – also in Abhängigkeit von ihrer jeweiligen Abbruchanzahl – ein:
Aaahhh – jetzt kommen wir langsam ins Geschäft. Allmählich sieht das Ganze doch schon so aus, wie wir es aus dem Teaser-Video im ersten Beitrag dieser Serie kennen. Wir scheinen also auf dem richtigen Weg zu sein.
Tatsächlich werden in der Praxis viele unterschiedliche Verfahren verwendet, um die Farben geschickt auf die verschiedenen Abbruchanzahlen zu verteilen. Eines dieser Verfahren versucht etwa, möglichst viele graduelle Farbabstufungen zwischen den wenigen vorgewählten Farben zu berechnen und diese gleichmäßig auf alle im jeweiligen Bild vorkommenden Abbruchanzahlen zu verteilen (also etwa 1 bis 35 in unserem obigen 31×31-Erläuterungsbeispiel). Dadurch sollen die harten Grenzen zwischen den einzelnen Farben aufgelöst werden, so dass möglichst glatte Farbverläufe entstehen. Das eben gezeigte hochauflösende Bild würde mit dieser Art der „Farbenglättung” in etwa so erscheinen:
Das ist doch schon gleich wieder ein ganzes Stück besser, oder?
Eine andere beliebte Vorgehensweise ist das fortwährende Wiederholen der gewählten Farbskala. Hätte man zum Beispiel 10 Farben vorgegeben, so werden diese zunächst auf die Abbruchanzahlen 1 bis 10 verteilt. Für die Pixel mit der Abbruchanzahl 11 fängt man dann gerade wieder mit der ersten Farbe an und verteilt die vorhandene Farbskala erneut auf alle Abbruchanzahlen von 11 bis 20. Dasselbe macht man für 21 bis 30, 31 bis 40, und so weiter. Der Vorteil dieser Herangehensweise ist, dass man viel stärkere Kontraste erhält und die filigranen Strukturen des Grenzbereichs dadurch viel besser erkennbar werden. Unser eben betrachtetes Beispiel würde mit dieser Methode wie folgt dargestellt werden:
Natürlich kann man diese Farbwiederholung mit der zuvor erwähnten Farbenglättung kombinieren, was für unser Beispiel in etwa zu folgendem Ergebnis führen würde:
Es gibt noch viele andere Verfahren zur möglichst geschickten Verteilung der vorgegebenen Farben. Einige von ihnen versuchen beispielsweise, den Großteil der vorhanden Farben auf die Nähe des Grenzbereiches zu verteilen, damit dort mehr Farbdifferenzierungen entstehen, so dass also nicht so viele Farben für die großen undifferenzierten Gebiete außerhalb der Menge „verschwendet” werden.
Wirklich bedeutsam werden aber all diese Überlegungen erst dann, wenn man sich die Details der Grenzbereiche genauer ansehen will, denn erst dann macht es einen erheblichen Unterschied, ob man die dort anzutreffenden unglaublich komplexen Strukturen besser oder schlechter erkennen kann.
Aber wie macht man das eigentlich? Wie kann man sich beliebig kleine Ausschnitte der Mandelbrotmenge im Detail darstellen lassen?
Eintauchen
Will man sich Details der Mandelbrotmenge genauer ansehen – also quasi in die Menge hineinzoomen – dann muss man unser oben beschriebenes Visualisierungsverfahren einfach für einen kleineren Bereich der Mandelbrotmenge anwenden. Erinnern wir uns: wir hatten für unser obiges Lehrbeispiel auf der reellen Achse den Bereich von -2 bis 2 und auf der imaginären Achse den Bereich von -1 bis 1 gewählt.
Genauso gut könnten wir doch aber einen sehr viel kleineren Bereich unserer Menge vorwählen. Zum Beispiel auf der reellen Achse den Bereich von -0,27249999999999974 bis -0,21977499999999983 und auf der imaginären Achse den Bereich von 0,6608750000000001 bis 0,6345125000000001:
Das entspricht etwa dem in folgender Darstellung gelb umrandeten Bereich der gesamten Mandelbrotmenge – also schon ein ziemlich kleiner Ausschnitt:
Wendet man auf diesen Bereich unser Visualisierungsverfahren an, so erhält man bei einer Auflösung von 600 Zeilen à 1.200 Pixel und einer einigermaßen geschickten Verteilung der Farben auf die jeweiligen Abbruchanzahlen das folgende Ergebnis:
Kommt Leute, das ist doch echt spektakulär oder? Ich meine, das muss man sich jetzt gerade nochmals klar machen: wir sehen hier nichts anderes als einen Ausschnitt der komplexen Ebene in dem zu jedem Punkt durch entsprechende Einfärbung dargestellt wird, ob er zur Mandelbrotmenge gehört (dann ist er schwarz) oder nach wievielen Durchläufen des Mandelbrot-Transformators man ansonsten festgestellt hat, dass er es nicht tut (was durch entsprechende Farbgebung des Pixels dargestellt wird). Diese fantastischen Strukturen hat sich kein Künstler ausgedacht. Sie stecken einzig und alleine in der Logik der zugrunde liegenden Mathematik. Sorry, aber ich finde das einfach nur grandios.
Übrigens: warum dabei derart komplexe und (wie ich zumindest finde) unfassbar ästhetische Muster zustande kommen, ist bis heute tatsächlich nur teilweise erforscht.
Natürlich kann man sich nach dem hier dargestellten Prinzip im Grunde jeden beliebig kleinen Ausschnitt der Mandelbrotmenge darstellen lassen. Man muss den reellen und imaginären Bereich einfach entsprechend vorwählen und seinen Computer nach dem hier beschriebenen Verfahren rechnen lassen. Das obige Titelbild dieses Beitrags zeigt einen auf diese Weise visualisierten Bereich. Und es zeigt auch, wie irrsinnig komplex und dennoch strukturiert die Mandelbrotmenge bzw. ihr Grenzbereich ist. Und nochmal: alle diese Muster stecken zwingend in der einfachen Formel („Eingangszahl mit sich selbst multiplizieren, Testzahl hinzuaddieren und das Ganze wieder als Eingangszahl verwenden”), die wir für unseren Transformator verwenden. Wahnsinn!
Genau genommen
Das mit den beliebig kleinen Ausschnitten ist allerdings in der Praxis nicht ganz so einfach. Es gibt im Wesentlichen zwei Probleme, auf die man stößt, wenn man sich immer kleinere Ausschnitte der Mandelbrotmenge ansehen will – also immer tiefer in ihren Formenreichtum eindringen will. Dazu muss zunächst einmal klar sein, dass unser Mandelbrot-Transformator nichts weiter als eine didaktische Veranschaulichung eines Prozesses ist, der in der Realität natürlich Teil eines Berechnungsvorgangs innerhalb eines Computerprogramms ist.
Solche Berechnungen führen Computer üblicherweise mit sogenannten „Gleitkommazahlen” aus. Das sind im Wesentlichen Dezimalzahlen, wie wir sie in meinem Beitrag zu den Reellen Zahlen kennengelernt haben. Allerdings sind Gleitkommazahlen so aufgebaut, dass sie einerseits sehr kleine Zahlen (und zwar mit hoher Genauigkeit), andererseits aber auch sehr große Zahlen (dann allerdings mit geringer Genauigkeit) darstellen können. Dennoch kann eine Gleitkommazahl in den heute üblichen Rechnerarchitekturen lediglich bis zu 16 Stellen der darzustellenden Zahl erfassen. Immerhin können diese 16 Stellen aber um bis zu rund 1000 mit „0” aufgefüllte Stellen vom Komma entfernt sein:
Insbesondere kann man damit also grundsätzlich schon sehr kleine Zahlen darstellen. Und doch: diese Zahlen sind letztlich nur anhand von rund 16 Stellen voneinander unterscheidbar.
Das Erste der beiden oben angesprochenen Probleme besteht jetzt darin, dass sich die winzigen Unterschiede zwischen den Zahlen, die durch benachbarte Pixel repräsentiert werden, beim Hineinzoomen in die Mandelbrotmenge wegen der Grenzen der Genauigkeit üblicher Gleitkommazahlen über kurz oder lang einfach nicht mehr erkennen lassen. Benachbarte Pixel scheinen somit alle für dieselbe Zahl zu stehen und man sieht in der Farbdarstellung dementsprechend nur noch einen einfarbigen Einheitsbrei.
Das zweite Problem ist der Umstand, dass die unterschiedlichen Abbruchanzahlen bei immer kleineren Abständen zwischen den Pixeln erst nach einer sehr großen Anzahl von Iterationen zutage treten. Betrachten wir dazu mal die Zahl 0,25+0×i – also die Zahl 0,25. Sie gehört tatsächlich zur Mandelbrotmenge und befindet sich in der Mitte des in folgendem Bild der Mandelbrotmenge dargestellten roten Kreises:In entsprechender Vergrößerung sieht der zugehörige Bildbereich ungefähr so aus, wobei die 0,25 wiederum rot eingekreist ist:
Genau genommen ist die 0,25 die größte reelle Zahl (also die größte Zahl mit einem imaginären Anteil von 0), die noch Element der Mandelbrotmenge ist. Jede reelle Zahl, die größer ist als 0,25 – und sei es auch nur ein klitzekleines Bisschen – ist demzufolge nicht mehr in der Mandelbrotmenge enthalten.
Schauen wir uns jetzt doch mal die Abbruchanzahlen (also die Anzahl an Transformatordurchläufen, bis zum ersten Mal eine Zahl mit einem Betrag größer als 2 erscheint) für verschiedene (reelle) Zahlen in der Nähe von 0,25 an:
Wir sehen hier unten die 0,251, dann die 0,2501, dann die 0,25001 usw. bis zur 0,250000000001. Offenbar sind diese Zahlen zunehmend näher an der 0,25, trotzdem aber alle noch ein winziges Bisschen größer als 0,25, so dass sie gemäß unseren obigen Ausführungen nicht in der Mandelbrotmenge enthalten sind. Links sehen wir eine Skala, die in 500.000er-Schritten von 0 bis 3.500.000 (dreieinhalb Millionen) läuft. Die orangen Punkte entlang der blauen Linie zeigen nun die Abbruchanzahlen zu den unten aufgelisteten Nachbarn unserer 0,25. Sind es bei 0,251 noch knapp 100, so sind es bei 0,2500001 schon knapp 1.000, bei 0,25000000001 knapp eine Million und bei 0,250000000001 schon über drei Millionen Trafo-Durchläufe. Je näher man also der Mandelbrotmenge kommt, desto höhere Abbruchanzahlen erhält man. Das war ja auch schon bei unserem 31×31-Lehrbeispiel ganz gut zu erkennen – wenngleich nicht so extrem krass wie hier.
Das bedeutet aber, dass entsprechend viele Iterationen sind nötig sind, um nebeneinander liegenden Punkten in großer Nähe zur Mandelbrotmenge verschiedene Farben zuordnen zu können. Würde man etwa die maximale Zahl an Iterationen auf eine Million begrenzen (was ja nicht gerade wenig ist), so käme man bei Zahlen rund um unsere 0,250000000001 (für die wir ja über drei Millionen Durchläufe benötigen, um festzustellen, dass sie nicht zur Mandelbrotmenge gehört) immer zuerst an dieses vorgegebene Maximum und damit zu dem Ergebnis, dass die Zahlen allesamt scheinbare Elemente der Mandelbrotmenge seien. Eine farbliche Unterscheidung zwischen all den Zahlen in unmittelbarer Nähe unserer 0,250000000001 wäre demnach nicht mehr möglich, denn alle erschienen als vermeintliche Elemente der Mandelbrotmenge gleichermaßen in tiefem Schwarz.
Welche drastischen Auswirkungen die Wahl der maximalen Iterationen haben kann, soll an folgendem Beispiel illustriert werden:
Es zeigt den Ausschnitt der Mandelbrotmenge in unmittelbarer Nähe zu unserer legendären 0,25, nämlich denjenigen zwischen den reellen Zahlen 0,2508571069945988 (linker Rand) und 0,25085723659336423 (rechter Rand) bzw. den imaginären Zahlen 0,00004638390046295605 (unterer Rand) und 0,000046481099537030607 (oberer Rand) mit einer Auflösung von 900 Zeilen à 1.200 Pixeln. Die maximale Anzahl an Iterationen ist dabei auf 2.000 begrenzt. Daher erscheint der größte Teil des Bildes in Mandelbrotmengen-Schwarz.
Was passiert aber, wenn wir die maximale Anzahl an Iterationen um den Faktor 10 (also auf 20.000) erhöhen? Dann erhalten wir plötzlich für genau denselben Ausschnitt das folgende Bild:
Ein Hammer, oder? Der eben noch weitgehend schwarze Berich erscheint nun in umwerfender Komplexität und es zeigt sich, das sich eine leicht verzerrte Kopie des Apfelmännchens selbst in diesem eben noch pechschwarzen Nichts versteckt hatte. Solche Kopien erscheinen übrigens immer und immer wieder, wenn man nur lange genug im Grenzbereich des Apfelmännchens herumsucht. Sie werden „Satelliten” oder manchmal auch salopp „Minibrote” genannt und sind immer durch die dünne, verästelte Struktur in ihrem „Hintern” mit dem Hauptkörper der Mandelbrotmenge verbunden.
Wir sehen also: will man in die Mandelbrotmenge hineinzoomen und sich ihre wundersam reichhaltigen und endlos komplexen Muster ansehen, so geht das nur um den Preis einer ständig steigenden Anzahl von Durchläufen durch unseren Transformator – und zwar für jedes einzelne Pixel. So hat etwa die Herstellung des Teaser-Videos aus dem ersten Beitrag dieser Serie – wie in dessen Titeleinblendung unschwer zu erkennen ist – für die letzten Bilder der gigantischen Zoom-Sequenz bis zu 750.000.000 Iterationen pro Pixel benötigt. Das sind 750 Millionen Durchläufe durch unseren Transformator für einen einzigen mickrigen Bildpunkt der über einer Million Punkte pro Bild!
Ausgebremst
Es liegt auf der Hand, dass für derartige Berechnungen selbst bei modernen Rechnersystemen eine erhebliche Menge Rechenzeit erforderlich ist. Aber es ist nicht nur die eben beschriebene Notwendigkeit der zunehmend wachsenden Anzahl an maximalen Iterationen, durch welche die Darstellung kleinerer Ausschnitte der Mandelbrotmenge erheblich verlangsamt wird. Will man nämlich dem zuerst geschilderten Problem mit der begrenzten Genauigkeit der Zahlendarstellung beikommen, so geht das letztlich nur, indem man die fest eingebaute Zahlendarstellung des gegebenen Rechners ignoriert und sich stattdessen seine eigene Gleitkomma-Arithmetik programmiert. Das ist auch durchaus möglich und – ehrlich gesagt – bereits mit Programmierkenntnissen aus den ersten Semestern eines klassischen Informatikstudiums problemlos zu stemmen. Damit kann man also letztlich einen nahezu beliebigen Genauigkeitsgrad für das Rechnen mit Zahlen in Dezimaldarstellung erreichen.
Ey Aldä – wenn gipps Lözzung für Prroblem, warum stressu uns damit?
Naja, ich habe ja nicht gesagt, dass diese Lösung wirklich der Weisheit letzter Schluss ist. Wahr ist halt leider auch, dass eine solche „programmierte” Zahlendarstellung unfassbar viel langsamer arbeitet, als die fest im Rechner eingebaute Arithmetik. Diese ist nämlich auf absolut brachiale Performance getrimmt. So kann etwa ein typischer Hauptprozessor aus Intels Core-i7-Serie (also genau so einer, wie er in Eurem Laptop oder Tischrechner tickt) locker um die 100 Milliarden Gleitkommaoperationen pro Sekunde ausführen. HUNDERT MILLIARDEN Gleitkommamultiplikationen in EINER SEKUNDE! Ist das nicht abgefahren? So ein Ding tickt vollkommen unmerklich in Eurem Rechner und keiner macht sich eigentlich klar, was für eine enorme Leistungsfähigkeit in so einem Chip steckt.
Programmiert man sich hingegen seine eigene Gleitkomma-Arithmetik, so benötigt man für jede damit zu berechnende Multiplikation hunderte – wenn nicht gar tausende – von Arbeitstakten unseres Hauptprozessors. Das wäre ungefähr so, als würde ich nicht direkt mit meinem Auto fahren, sondern stattdessen mit der Drehung der Räder meines Autos einen Stromgenerator antreiben wollen, dessen Strom eine Spule erhitzt, die wiederum den Kessel einer Dampfmaschine aufheizt, mit der ein Propeller angetrieben wird, dessen Rückstoß mich dann letzten Endes zum Rollen bringt:
Es liegt auf der Hand, dass auf diesem Wege fast die gesamte Vortriebsenergie meines Autos auf der Strecke bleibt. Auf vergleichbar drastische Weise würde die Rechenleistung meines Computers vergeudet, wenn anstelle der eingebauten Arithmetik eine selbst programmierte verwendet würde.
Kurz: wenn man mit Hilfe selbst programmierter Arithmetik eine erhöhte Genauigkeit erzielen möchte, erkauft man sich diese durch eine extreme Verlangsamung der zugehörigen Berechnungen.
Dieser Effekt zusammen mit dem zuvor diskutierten Phänomen, dass man immer mehr Iterationen pro Pixel berechnen muss, wenn man die Details kleinster Ausschnitte der Mandelbrotmenge erkennen können möchte, führt bedauerlicher Weise dazu, dass die Berechnung solcher Ausschnitte in aller Regel sehr viel Zeit in Anspruch nimmt. Sicher: die Computer unserer Zeit warten mit einer noch vor wenigen Jahren absolut unvorstellbaren Rechenleistung auf. So bringen es Spezialprozessoren, wie sie heute in modernen Grafikkarten verbaut werden, ohne mit der Wimper zu zucken gut und gerne auf über 10 Billionen Gleitkommaoperationen pro Sekunde! Und dennoch: zoomt man weit genug in die Mandelbrotmenge hinein, so ist es am Ende nur eine Frage der Zeit, bis man so tief vorgedrungen ist, dass auch die schnellsten Prozessoren kleinlaut in die Knie gehen und man dann seeehr lange auf sein hübsches Mandelbrot-Bild wartet. Wenn wir uns dazu nochmals das obige Abbruchanzahlen-Diagramm ansehen, wird nämlich deutlich, dass sich allein die Anzahl an mindest-Iterationen pro hundertfacher Erhöhung der Vergrößerungsstufe schon verzehnfacht:
So sieht man bei 0,250000001 einen kleinen grünen Strich bis zum darüber gelegenen gelben Punkt, der bei rund 100.000 Iterationen liegt. Bei 0,25000000001 sind es hingegen zehn Striche derselben Länge bis zum zugehörigen gelben Punkt bei ca. 1.000.000 Iterationen. Dasselbe gilt für das Verhältnis zwischen 0,2500000001 und 0,250000000001: bei ersterem haben wir etwas über 300.000 Iterationen (ein lila Strich), bei zweiterem über 3.000.000 Iterationen (zehn Striche derselben Länge). Und bei alledem ist das Problem mit der Rechengenauigkeit noch gar nicht berücksichtigt.
In der Praxis führt das dazu, dass die Allermeisten der am Markt erhältlichen Programme/Apps zur Darstellung der Mandelbrotmenge ab einer gewissen Vergrößerungsstufe einfach nicht mehr weiterrechnen. Man gelangt also gefühlt an eine Art Ende der Reise in die Tiefen des Apfelmännchens. Diejenigen Programme, die dennoch ein weiteres Hineinzoomen erlauben, werden ab dann erheblich langsamer, so dass einem auch ohne künstliches Ende der Zoomerei irgendwann schlichtweg die Geduld ausgeht.
Und doch: es gibt da ein paar gallische Dörfer unter den Mandelbrotmengen-Visualisierungsprogrammen, die es trotzdem schaffen, extreme Zoom-Stufen zu berechnen. Dazu nutzen sie den Umstand aus, dass die Unterschiede in den Abbruchanzahlen zwischen benachbarten Pixeln bei höheren Vergrößerungsstufen in der Regel nur sehr klein sind. Man kann also aus den Ausgabewerten unseres Transformators für ein bestimmtes Pixel mit relativ geringem Aufwand die Ausgabewerte der benachbarten Pixel bestimmen. Für diese Berechnung genügt dann die Genauigkeit der eingebauten Gleitzahlarithmetik unseres Computers. Mit derartigen Verfahren wird somit erreicht, dass man sich die vollständige Berechnung der allermeisten Pixel innerhalb eines Bildes sparen kann. Stattdessen ermittelt man ihre Färbung aus den Werten einiger weniger Referenz-Pixel. Man muss also nur noch diese wenigen Referenz-Pixel auf die ungeliebte Hardcore-Art berechnen – der Rest geht dann erstaunlich schnell.
Wer auf sowas kommt und warum er das tut? Ey Leute, Ihr habt ja keine Ahnung, wie echte Nerds ticken. Wer will denn schon mit Freunden quatschen oder sich gar in der undankbaren Jagd nach dem anderen Geschlecht aufreiben? Sperrt uns Nerds lieber mit unserem Rechner in ein dunkles Kämmerlein, schiebt uns zweimal am Tag eine Pizza und ein paar Cola-Dosen unterm Türschlitz durch – und schon flutscht das mit den Programmen, die die Welt nicht braucht.
Fazit
In diesem Beitrag haben wir erfahren, wie man die legendären Visualisierungen der Mandelbrotmenge tatsächlich berechnen kann. Wir haben gesehen, dass man dafür die einzelnen Pixel seines Displays durchgeht und zu jedem dieser Pixel den Mandelbrot-Transformator laufen lässt. Die dafür voreinzustellende Zahl ergibt sich dabei aus dem jeweils gewählten Ausschnitt der komplexen Ebene und der Lage des gerade betrachteten Pixels innerhalb dieses Ausschnitts.
Weiter haben wir gesehen, dass wir dabei nicht nur unterscheiden, ob unser Pixel einer Zahl entspricht, die zur Mandelbrotmenge gehört, oder nicht. Vielmehr schauen wir uns für diejenigen Pixel, die nicht zur Mandelbrotmenge gehören, genauer an, nach wie vielen Transformator-Durchläufen (Iterationen) wir zum ersten Mal den verräterischen Ausgabewert mit einem Betrag größer als 2 erhalten. Diese Anzahl an Durchläufen – wir hatten sie „Abbruchanzahl” genannt – bestimmt dann die Farbe für unser Pixel. Dabei haben wir festgestellt, dass man umso höhere Abbruchanzahlen erhält, je näher man dem Grenzbereich zur Mandelbrotmenge kommt.
Schließlich haben wir gelernt, dass die Betrachtung immer kleinerer Ausschnitte der Mandelbrotmenge zu einem immer weiter zunehmenden Rechenaufwand führt, da wir einerseits zur Differenzierung der Pixel-Einfärbung immer mehr Iterationen zulassen müssen, andererseits aber auch den Genauigkeitseinschränkungen der fest eingebauten Arithmetik unseres Computers beikommen müssen, indem wir unsere eigene Gleitkomma-Arithmetik programmieren, was aber dummerweise mit extrem gesteigertem Rechenaufwand einhergeht.
Die gute Nachricht: mit frei erhältlichen Programmen zur visuellen Erforschung der Mandelbrotmenge kann man sich dennoch sehr viele Bereiche der Mandelbrotmenge erschließen und sich von der faszinierenden Ästhetik dieser Darstellungen geradezu berauschen lassen. Das allerdings schauen wir uns im nächsten Beitrag mal etwas genauer an. Da zeige ich Euch dann mal ein paar spektakuläre Bilder und Zoom-Sequenzen und werde zudem auf frei erhältliche Software verweisen, mit der Ihr Euch selbst auf Forschungsreise in die Tiefen der Mandelbrotmenge begeben könnt.
Alles Liebe
Daniel