Apfelmännchen: Schönheit im Chaos
Fractals: Ausdruck einer Revolution im naturwissenschaftlichen Weltbild, sichtbar gemacht auf dem Bildschirm. Was es damit auf sich hat, wie sie entstehen und wie man sie auf dem C 128 erzeugen kann, zeigt Ihnen dieser Artikel.
Als Beispiel für die Anwendung von Mehrfarbengrafik auf unserem C 128 behandeln wir ein Thema, das in den letzten Jahren zunehmend an Bedeutung gewonnen hat: die sogenannten Fractals. Durch Rekursion (dieser Begriff wird gleich noch erklärt) meist sehr einfacher mathematischer Beziehungen lassen sich mit Hilfe des Computers Bilder von überraschender Schönheit erzeugen. Der Computer und die neuesten Erkenntnisse der angewandten Mathematik als Instrumente der bildenden Kunst? Versuchen Sie es selbst!
Die Realität ist fractal!
Bevor wir uns die Praxis ansehen - Rezepte dafür sind häufig zu finden [1][6] - sollten wir uns etwas mit der Bedeutung der Fractals befassen. Daß solch ein Gebilde nämlich als Computerkunst unsere ästhetische Ader anspricht, ist eigentlich nicht mehr als ein erfreulicher Nebeneffekt. In Wahrheit sind diese hübschen Bilder ein Ausdruck des derzeitigen Wandels im naturwissenschaftlichen Weltbild, der von vielen Zeitgenossen geradezu als Revolution empfunden wird. Das erfordert eine Erklärung:
Prinzipiell existieren in der Natur zwei gegenläufige Tendenzen: eine zerstreuende (dissipative) und eine ordnende. Letztere findet ihren Ausdruck beispielsweise in der Regelmäßigkeit von Kristallen oder Planetensystemen. Die klassische Physik versucht seit Jahrtausenden alles Weltgeschehen von diesem Denkansatz (die Ordnung der Dinge zu ergründen) her zu erklären. Durch Idealisieren und Abstrahieren wurden Theorie und Experiment zum mächtigen Gebäude der Naturwissenschaften zusammengefügt.
Relativ neu im Vergleich dazu ist die Untersuchung der anderen - der zerstreuenden - Tendenz. Sie findet ihren ersten Ausdruck in der sogenannten Molekularkinetik (Stichworte dazu sind Entropie und Wärmetod) und ihren derzeitigen Höhepunkt in der modernen Quantentheorie. Hier arbeitet der Naturwissenschaftler mit dem Instrumentarium der Statistik und Wahrscheinlichkeitsrechnung. Vielerorts herrscht aber die Meinung, daß man - wenn die Materie bis in die grundlegenden Bausteine erkannt sei - prinzipiell auch diese Bereiche der Natur mit den Mitteln einer erweiterten klassischen Physik beschreiben kann (das Wort »Klassisch« ist hier etwas gewagt, weil zu dieser Art Physik auch die Erkenntnisse der Relativitätstheorie gehören würden).
Eine Basis des naturwissenschaftlichen Denkens ist der sogenannte Determinismus: Jede Wirkung hat ihre Ursache. Der Glaube, daß man - kennt man nur alle Einflußgrößen und physikalischen Zusammenhänge und verfügt man über ausreichende Rechenkapazität - jedes Ereignis vorherberechnen kann, ist so alt wie unsere Kultur. Daher der Gebrauch des Wortes »klassisch«, denn auch die Relativitätstheorie bricht nicht mit dem Glauben an Ursache-Wirkungs-Ketten. Diese Basis ist in jüngster Zeit erschüttert worden durch die Erkenntnisse zweier Arbeitsgebiete der modernen Naturwissenschaft, die auf den ersten Blick nicht viel miteinander zu tun haben.
Der Begriff der »Ursache« einer Wirkung wird in der modernen Elementarteilchenphysik (in der S-Matrix-Theorie) in Frage gestellt [5]. Von der anderen Seite sägt B.Mandelbrot am Fundament des Determinismus: Er arbeitet am Thema »Extreme und unvorhersagbare Unregelmäßigkeiten von Naturphänomenen in Physik, Soziologie und Biologie«. Gleichzeitig ein Mittel zur Beschreibung und ein Ausdruck solcher Unregelmäßigkeiten in der Natur sind die Fractals. Mit der Verleihung der Barnard-Medaille 1985 durch die Nationale Akademie der Wissenschaften der Vereinigten Staaten ist die Bedeutung seiner Arbeiten für die Wissenschaft deutlich geworden: Frühere Preisträger sind beispielsweise Albert Einstein, Niels Bohr und Werner Heisenberg [4].
Was sind Fractals?
Drei Ansätze zum Verständnis von Fractals werden wir nun kennenlernen: Einen geometrischen, einen, der mit der Dynamik von Wachstumsprozessen zusammenhängt und schließlich noch einen mathematischen Ansatz.
Fractals und Geometrie. Mandelbrot hat einmal erklärt: »Die Natur hat der klassischen Geometrie ein Schnippchen geschlagen. Denn Wolken sind eben keine Kugeln, Berge keine Kegel, Inseln keine Kreise und Baumstämme keine Zylinder. Ebenso bewegt sich ein Blitz nicht auf einer Geraden. Und die Oberfläche der Planeten ist nicht glatt.« (Zitiert in [4]). Es ergibt sich die Notwendigkeit, eine neue Geometrie anzuwenden, eine Geometrie der Natur.
Objekte dieser Geometrie werden durch rekursive Methoden (wir kommen wirklich bald zur Erklärung, was das eigentlich ist) gewonnen. Sie haben merkwürdige Eigenschaften. So gibt es Kurven, die eine kleine Fläche umranden und dennoch unendlich lang sind. Die Unendlichkeit drückt sich darin aus, daß man bei immer genaueren Hinsehen immer kompliziertere Strukturen erkennt. Der Begriff der Dimension (Erinnern Sie sich: Ein Punkt ist ein Gebilde mit 0 Dimensionen- er hat keine Ausdehnung. Eine Linie gehört zur ersten Dimension, ihre Ausdehnung läßt sich als Länge angeben. Eine Fläche ist zweidimensional, weil wir von Länge und Breite reden können. Körper sind dreidimensionale Objekte, bei denen noch die Höhe eine Rolle spielt.), dieser Begriff der Dimensionen also gerät ins Wanken: Die Objekte der neuen Geometrie sind beispielsweise nicht mehr eindimensional, aber noch nicht zweidimensional (oder aber nicht mehr zwei- und noch nicht dreidimensional). Sie haben eine gebrochene, nicht ganzzahlige Dimensionalität. Daher der Name Fractal, vom lateinischen »frangere«, was brechen heißt.
Insekten und Fractals
Ein Beispiel für fractale Geometrie nennt Fricker [4]: Ein britisches Forschungsteam hat die Oberfläche von gewissen Pflanzen untersucht und dafür die (fractale) Dimension 2.79 bestimmt. Die Folgerung daraus klärt einen Widerspruch: Werden diese Pflanzen von zehnfach kleineren Insekten als ursprünglich bevölkert, dann nimmt deren Zahl nicht - wie man erwarten sollte - um das Hundertfache, sondern um etwa das Sechshundertfache zu. Den Grund dafür erklärt die Rechnung mit Fractals: 102.79 = 617, anstelle von 102 = 100.
Fractals und Wachstumsdynamik. Die Gesetze des exponentiellen Wachstums sind schon seit langem bekannt. Am Beispiel der Bevölkerungsexplosion sollen sie kurz erklärt werden. Wenn X(n) die Bevölkerung im Jahr n ist und p die jährliche Zuwachsrate, dann ergibt sich für die Bevölkerung im Jahr n+1 die Beziehung:
X(n + 1) = (1 + p)*X(n)
Will man nun die Bevölkerungszahl im Jahr n+2 erfahren, dann setzt man in diese Gleichung anstelle von X(n) nun X(n + 1) ein. Für das Jahr n+3 setzt man X(n+2) ein und so fort. Es ergibt sich eine immer steiler steigende Kurve, wenn man die Bevölkerungszahlen X(i) gegen die jeweiligen Jahreszahlen i grafisch darstellt: die Bevölkerungsexplosion.
Was wir bei diesem Beispiel gemacht haben, nennt man Rekursion. Das Ergebnis einer Berechnung wurde jedesmal wieder zurückgeführt in die Gleichung. »recurrere« ist lateinisch und bedeutet »zurücklaufen«.
Nun ist es nicht erst seit dem Bericht des Club of Rome bekannt, daß gewisse Einflußfaktoren - beispielsweise ein Mangel an Rohstoffen oder Nahrung - dem Wachstum Grenzen setzen. Ein belgischer Naturwissenschaftler namens Verhulst hat schon in der Mitte des vorigen Jahrhunderts ein Wachstumsgesetz entdeckt, das einen Ausdruck p*(1-a*X(n)) verwendete. In völlig anderen Zusammenhängen spielt dieser Ausdruck in der modernen Wissenschaft eine wichtige Rolle (Laserphysik, Evolutionstheorie, turbulente Strömung von Medien). Entwickelt man diese Beziehung rekursiv, dann kann - in Abhängigkeit von den jeweiligen Parametern und nach genügend häufigen Schritten - dreierlei geschehen: - Exponentielles Wachstum (wie schon gehabt)
- Zurückgehen der Ergebnisse bis auf Null oder einen jeweiligen Grenzwert
- Dazwischen aber gibt es merkwürdige Verhaltensweisen. Man kann bei bestimmten Ausgangswerten ein Oszillieren der Ergebnisse beobachten, das mehr oder weniger regelmäßig erfolgt [3] und stark von dem exakten Wert der Wachstumsrate abhängt. Schon eine klitzekleine Änderung der Ausgangsbedingungen kann entscheiden über einen völlig anderen Verlauf der Wachstumskurven.
Dieses Grenzdasein ist untrennbar mit Fractals verbunden. Auf welche Weise, das soll uns der nächste Abschnitt zeigen. Interessant in dem Zusammenhang ist es, daß die bisher erwähnten Anspielungen auf Fractals ebenfalls immer Grenzen betrafen: Die Oberfläche einer Pflanze, die Umrandung einer Fläche, die schmale Linie zwischen exponentiellem Wachstum einerseits und Abfallen auf Null andererseits...
Ein einfacher mathematischer Weg zu Fractals: B.Mandelbrot [9,10] hat eine Anzahl Funktionen untersucht, von denen eine der vorhin gezeigten Wachstumsfunktion ähnelt:
X(n + 1) = X(n)2 + C
Wir nehmen also einen beliebigen Wert X(n), quadrieren ihn und addieren einen konstanten Wert C. Wieder setzen wir das Ergebnis X(n+1) als X(n) neu ein und beobachten, wie sich bei fortgeführter Iteration (also weiteren Rekursionen) der berechnete Wert verhält.
Wenn C = 0 ist, ist die Situation relativ einfach:
Falls wir mit einem X-Wert kleiner als 1 beginnen, ergibt sich durch Quadrieren ein noch kleinerer Wert und bei weiterer Rekursion nähert sich das Ergebnis schließlich der Null.
Wenn wir dagegen einen Startwert größer als 1 wählen, dann ist sein Quadrat noch größer und sehr schnell strebt das Ergebnis gegen Unendlich.
Man nennt diese Zahlen, gegen die jeweils die Ergebnisse tendieren »Attraktoren« [3]. So haben wir im bisher betrachteten Fall die Attraktoren 0 und Unendlich. Jeder dieser Attraktoren besitzt Einflußsphären: Zu 0 gehören alle X-Anfangswerte deren Absolutbetrag kleiner als 1 ist, zu Unendlich gehören alle anderen Anfangswerte. Die Zahlen 1 und -1 bilden Grenzen der Einflußsphären.
Wählen wir nun einen anderen Wert für die Konstante C, beispielsweise C=1. Beginnt man nun mit X=0, dann erhält man der Reihe nach:
0, 1, 2, 5, 26, 677,...
Welchen Startwert für X wir auch immer wählen (probieren Sie es mal aus!), jedesmal entwickelt sich das Ergebnis nach wenigen Schritten zur Unendlichkeit hin. Ein Attraktor ist verlorengegangen!
Nehmen wir nun mal den Wert -1 für die Konstante C und starten mit X=1, dann finden wir diese Ergebnisreihe:
1, 0, -1, 0, -1, 0, -1, 0, ...
Die Werte pendeln hin und her um einen periodischen Attraktor, der seinen Einflußbereich auf die X-Startwerte zwischen -1.618 und +1.618 ausdehnt. Versuchen wir beispielsweise den Startwert .5, dann ergibt sich:
.5, -.75, -.4375, -.8086, -.346, -.880, -.2253, etc.
Alle anderen Startwerte tendieren schnell zur Unendlichkeit: Beispielsweise beim Startwert 3: 3, 8, 63, 3968, ...
Wir haben demnach nun wieder 2 Attraktoren, von denen einer ein periodischer ist und der andere die Unendlichkeit.
Probieren Sie dieses Spiel noch etwas durch mit verschiedenen Konstanten C und Startwerten X. Sie werden immer finden, daß ein Attraktor unendlich ist. Für C-Werte zwischen -2 und 0.25 gibt es dann noch einen 2. Attraktor, der entweder ein einfacher oder ein periodischer ist oder aber ein merkwürdig chaotischer [3].
Wir sehen schon, daß mit dieser einfachen mathematischen Gleichung allerhand Interessantes anzustellen ist. Um nun zur grafischen Darstellung dieser Zusammenhänge zu gelangen - denn das sind die Fractals, wie Sie sie in Abbildungen sehen -, werden wir noch eine besondere Art von Zahlen kennenlernen, die uns wesentlich mehr Möglichkeiten bietet.
Komplexe Zahlen
Keine Angst, es wird jetzt nicht plötzlich abgehoben in die höheren Sphären der Mathematik. Komplexe Zahlen sind nämlich im Grunde genommen ganz einfach zu verstehen. Ihre Einführung ergab sich aus der Wurzelrechnung. Eine Quadratwurzel wie √4 ist ja definiert als die Zahl, die mit sich selbst multipliziert das Argument der Wurzel ergibt. In unserem Beispiel ist das Argument die 4 und 2*2 ist 4, somit ist die Quadratwurzel von 4 eine 2. Weitere Beispiele:
3 = √9
1 = √1
aber auch -3 = √9, weil auch
(-3)*(-3)=9 gilt. Probleme werden Sie haben, wenn Sie auf Ihrem Computer mal versuchen, die Aufgabe PRINT SQR(-2) zu lösen. Es gibt keine Zahl aus dem normalen Zahlenbereich, die mit sich selbst malgenommen eine negative Zahl ergibt. Der Computer steigt mit einer Fehlermeldung aus. Auch die Menschen sind bei dieser Fragestellung lange Zeit »ausgestiegen«. Irgendwann (das war im 17. Jahrhundert) kam aber mal jemand auf die Idee, eine neue Sorte von Zahlen einzuführen , die sogenannten imaginären Zahlen, deren einfachstes Glied die Zahl i ist. Dabei sollte i = √-1 sein. Man kann tatsächlich damit rechnen und manches Mal ergeben sich aus solchen Rechnungen wieder unsere gewohnten Zahlen, wenn nämlich einmal i2 auftritt, welches -1 ist:
i = √-1
i2 = -1
Noch etwas komplizierter wird das mit den sogenannten komplexen Zahlen. Die sind zusammengesetzt aus einem Realteil (das sind unsere normalen Zahlen) und einem Imaginärteil (also einem Teil, in dem i eine Rolle spielt). Solche Zahlen sehen immer so aus:
\[\begin{array}{rccc} z = & a &+& b*i \\ & \text{Realteil} & & \text{Imaginärteil} \end{array}\]
Mit solchen komplexen Zahlen kann man auch wunderbar rechnen, was Ihnen an der Addition gezeigt werden soll:
(2 + 3i) + (4-i) = 6 + 2i
Sie sehen, man behandelt einfach beide Teile gesondert (2+4=6), berechnet die Summe des Realteils und (3i-i= 2i) die des Imaginärteils). Alle Rechenarten sind jedenfalls möglich, nur wir werden sie hier nicht zeigen.
Zwei Begriffe spielen für unsere weiteren Absichten noch eine Rolle. Zunächst dreht es sich dabei um den Betrag einer komplexen Zahl. Wenn wir von der komplexen Zahl z = a + bi ausgehen, dann ist |z| = SQR(a2 + b2) ihr Betrag.
Zum zweiten soll noch eine Methode zur grafischen Darstellung komplexer Zahlen vorgestellt werden, die der berühmte Mathematiker Gauß entwickelt hat: die Gauß'sche Zahlenebene. In Bild 1 ist das Prinzip erläutert:

Auf den ersten Blick sieht das aus wie ein normales Koordinatensystem. Bei näheren Hinsehen erkennen Sie, daß in der horizontalen Achse der Realteil, in der vertikalen aber der Imaginärteil einer komplexen Zahl erfaßt wird. Jeder komplexen Zahl entspricht nun ein Punkt auf dieser Ebene.
Noch eine kleine Bemerkung zur sicher bei Ihnen auftretenden Frage, was man denn um Himmels willen mit diesen merkwürdigen Zahlen anfangen kann. Fragen Sie doch mal einen Ingenieur oder einen Elektrotechniker oder einen Physiker etc.
Damit haben wir nun fast alles erforderliche Rüstzeug, um Fractals erzeugen zu können.
Die Mandelbrot-Menge
Erinnern wir uns an die Gleichungen, die wir vorhin für eine mathematische Einführung in die Fractals gebraucht haben. Auch hier verwenden wir nun solch eine Beziehung:
m = z2 + c
Hier ist allerdings z eine komplexe Variable (wir verwenden im folgenden dafür z = x + yi) und c eine komplexe Konstante (im folgenden ist dann c=a+bi).
Ausführlich geschrieben haben wir dann die Gleichung:
m = (x+yi)2 + (a+bi)
Auch hier arbeiten wir rekursiv, setzen also jedes Ergebnis wieder als neues z in die Gleichung ein.
Wir beginnen mit z=0, wobei dann x und y gleich 0 sind. Setzt man das in die Gleichung ein, dann erhält man: m1 = z2 + c = c
Der zweite Schritt setzt anstelle von z nun c ein: m2 = c2 + c
Nun wird die Sache interessant. Im 3. Schritt folgt nämlich:
m3 = (c2 + c)2 + c
Sie sehen jetzt zweierlei: Zum einen wird die Angelegenheit im weiteren Verlauf schnell unübersehbar und zum zweiten können Sie sich sicher vorstellen, daß -je nach dem Wert von c - schnell große Werte als Ergebnis auftreten werden. Jedes Ergebnis m kann man als Punkt auf der Gauß-Ebene darstellen. Die meisten Zahlen für c allerdings werden bald zu Ergebnissen führen, die aus jedem im noch so großen Maßstab gezeichneten Gauß-System heraus ihren Weg zur Unendlichkeit antreten.
Probieren wir das mal mit einem c aus (2): c = 1 + 1i. In der Reihenfolge der Ergebnisse finden sich dann:
m1 = 1 + 1i
m2 = 1 + 3i
m3 = -7 + 7i
m4 = 1 - 97i
m5 = -9407 - 193i
m6 = 88454401 + 3631103i
Allerdings steigen nicht bei allen c-Werten die Ergebnisse über alle Grenzen. Einige existieren, bei denen auch beliebig häufige Iteration immer noch zu endlichen Zahlen führt. Die Menge dieser C-Werte nennt man die Mandelbrot-Menge, nach ihrem Entdecker B.Mandelbrot. Das ist die Figur, die in der grafischen Darstellung das »Apfelmännchen« ergibt.
Wenn also der Realteil von C etwa zwischen -2 und +0.5, der Imaginärteil etwa zwischen -1.25 und +1.25 liegt, dann hat man gute Chancen, auch nach extrem vielen Iterations-Schritten noch endliche Ergebnisse zu erhalten, denn C liegt dann innerhalb der Mandelbrotmenge.
Ist C so gewählt, daß es außerhalb dieses Bereiches darzustellen ist (die Darstellungsebene ist eine Gauß-Zahlenebene!), dann streben die Ergebnisse schon nach mehr oder weniger Iterationen gegen Unendlich.
Die Trennzone aber zwischen diesen beiden Möglichkeiten hat fractalen Charakter. Dazu werden wir gleich noch kommen. Wir wollen uns nun die ganze Materie unter programmtechnischen Gesichtspunkten ansehen.
Programm zum Abschätzen der Mandelbrotmenge
Dewdney [2] erwähnt, daß die Iterationstheorie uns einen untrüglichen Maßstab in die Hand gibt, der uns erkennen läßt, wann eine Rekursion zum Attraktor Unendlich führt. Mit Hilfe des Betrages unserer Ergebnisse ist das möglich: Wenn nämlich dieser Betrag irgendwann einmal größer als 2 wird, dann treibt bald danach auch das Ergebnis gegen Unendlich.
Entwickeln wir also zunächst ein kleines Programm, das uns die Ergebnisse der Iterationen und ihren Betrag - das ist nämlich die Entfernung vom Nullpunkt des Koordinatensystems, in dem wir die Mandelbrotmenge gesehen haben - berechnen hilft. Dazu bringen wir zuerst einmal unsere Ausgangsgleichung in eine computergerechte Form:
Diese Gleichung hieß ja:
m = z2 + c
und dabei waren die Zahlen z und c komplex:
z = x + yi
c = a + bi
Ausgeschrieben hieße dann unsere Gleichung:
m = (x+yi)2 + (a+bi)
Daraus folgt durch Umformung:
\[\begin{array}{rccc} m = & (x^2 - y^2 + a) &+& (2xy + b)i \\ & \text{Realteil} & & \text{Imaginärteil} \end{array}\]
Wir definieren nun zwei Funktionen. Für die Berechnung des jeweiligen Realteils ist das
FN R(V) = X*X - Y*Y + A
und für die Berechnung des Imaginärteils
FN I(V) = 2*X*Y + B
Jede neue Iteration erfordert nun nur noch die Einsetzung des Ergebnisses in z, also die Zuweisungen:
R = FN R(V):X = R
I = FN I(V):Y = I
Dabei ist übrigens V lediglich eine Dummy-Variable. Zur Berechnung des Betrages brauchen wir noch die Beziehung:
D = SQR(R↑2 + I↑2)
Das Programm »MANDELBROT1« (Listing 1) übernimmt all diese Aufgaben und druckt Ihnen auf dem Bildschirm folgende Angaben aus: Iterationszahl, Real- und Imaginärteil des jeweiligen Ergebnisses und schließlich den Betrag. Probieren Sie nun mal eine Reihe von Kombinationen durch. Für den Anfang raten wir Ihnen, für X und Y 0 einzusetzen. Sie bewegen sich dann nämlich im System der Mandelbrotmenge, wie es Bild 2 zeigt.

Beim Ausprobieren finden Sie Punkte für C, die sehr schnell zu einem Betrag größer als 2 führen. Das sind diejenigen, die sich außerhalb des »Apfelmännchens« befinden. Andere C-Werte brauchen anscheinend unendlich lange dazu. Hier haben wir dann mit einiger Sicherheit Elemente der Mandelbrotmenge vorliegen. Dazwischen aber liegen Bereiche für C, bei denen der Betrag lange Zeit braucht, bis er größer als 2 wird. Das ist wieder ein Grenzbereich, der fractalen Charakter aufweist. Wie fractaler Charakter aussehen kann, wird uns nun das nächste Programm zeigen.
Das Zeichnen von Fractals
Das Ausprobieren mit dem Programm »MANDELBROT1» könnte uns auch der Computer abnehmen. Wir schreiben ein Programm »MANDELBROT2« (siehe Listing 2), das alle Kombinationen für C (also die Kombinationen für den Realteil und den Imaginärteil) innerhalb gegebener Grenzen selbst ausführt.
Dazu brauchen wir vier Eingaben, nämlich die Unter- und die Obergrenzen des Realteils sowie des Imaginärteils, innerhalb derer C variiert werden soll. Dann müssen wir uns eine sinnvolle Form der Ergebnisausgabe überlegen. Wir wählen - wie Sie sich nun schon denken können - eine grafische Ausgabe, die unsere Multicolorgrafikfähigkeit ausnutzt.
Auf dem Bildschirm wird ein Koordinatensystem definiert, dessen Y-Achse die Imaginärachse einer Gauß-Ebene ist (und vom kleinsten zum größten Imaginärteil von C reicht). Die X-Achse soll die Variation des Realteils von C ausdrücken und geht daher vom vorher eingegebenen unteren zum oberen Realteil von C. Alle Punkte dieser Gaußebene entsprechen dann verschiedenen Konstanten C (siehe Bild 3).

Das Programm »MANDELBROT2« führt nun für jeden Wert C die Iterationen durch und prüft dabei jedesmal, ob der Betrag des Ergebnisses schon 2 überschreitet. Ist das der Fall, merkt es sich die Anzahl der Schritte bis dahin. Andernfalls folgen weitere Rekursionen bis zu einer vorher angegebenen maximalen Iterationsanzahl. Ist bis zu dieser höchsten Iterationszahl der Betrag immer noch nicht 2, dann wird das dazu gehörige C als schwarzer Punkt eingezeichnet. Dieser Wert C liegt dann in der Mandelbrotmenge. Alle anderen C werden in einer Farbe gezeichnet, die mit der Anzahl der Iterationen zusammenhängt.
Hätten wir bei einer maximalen Iterationszahl von 100 auch 100 verschiedene Farben zur Verfügung, dann wäre unser Problem schon gelöst. Auf diese Weise werden beispielsweise auf größeren Grafik-Computern die Bilder von Fractals erzeugt. Wir sind da leider etwas eingeschränkt auf nur vier Farben, von denen wir eine (zum Beispiel Schwarz) schon für die Punkte aus der Mandelbrotmenge vergeben haben. Um eine sichtbare Struktur zu erzeugen, wiederholen wir in einer bestimmten Reihenfolge die verbleibenden drei Farben. Wir bedienen uns dazu einer Funktion, die leider nicht zum Basic-Wortschatz unseres Basic 7.0 gehört: der modulo-Funktion.
Wie wirkt diese Funktion? Sehen wir uns das am Beispiel von modulo(3) einmal an. Das Ergebnis ist immer der Rest, der bei Division
durch 3 übrigbleibt:
Zahl modulo(3) davon
3 0
4 1
5 2
6 0
7 1 etc.
Wir können uns solch eine
modulo-Funktion definieren durch:
DEF FN MD(X) = X - INT(X/D)*D
Hier ist D der Divisor, in unserem Beispiel also die Zahl 3. X ist dann die Zahl, mit der die modulo-Funktion arbeiten soll. In Zeile 4 des Programmes finden Sie diese Funktion, die in Zeile 310 zum Zeichnen benutzt wird. Einige weitere Erklärungen zum Programm:
Die Zeilen 1 bis 4 enthalten alle benötigten Variablen. Sie sind hier so angeordnet, daß die am häufigsten gebrauchten möglichst weit vorne stehen. Der Basic-Interpreter findet sie dann schneller. In 120 bis 160 werden alle Eingaben verlangt:
RU,RO = unterer und oberer Rand des Realteils von C. Innerhalb dieser Grenzen wird dann C variiert.
IU,IO = dasselbe für den Imaginärteil von C.
NMAX = Das ist die maximale Iterationszahl. Man muß bedenken, daß von dieser Zahl die Zeichendauer ganz entscheidend abhängt. Im schlimmsten Fall müssen 160*200*NMAX Iterationen ausgeführt werden, bei NMAX = 100 also schon 3,200,000 Schleifendurchläufe! Das wäre allerdings nur dann der Fall, wenn die gesamte Zeichenebene innerhalb der Mandelbrotmenge läge.
F1,F2,F3,F4 = Das sind die Farben, in denen unsere Abbildung erstrahlen soll. Dabei ist
F1 die Farbe, die mit COLOR3 ins Mehrfarbenregister geschrieben wird,
F2 wird mit COLOR2 in das andere Mehrfarbenregister geschrieben,
F3 landet mittels COLOR1 in dem Register für die aktuelle Vordergrundfarbe und
F4 bestimmt den Rand und die Hintergrundfarbe. In der Farbe F4 wird dann auch die Mandelbrotmenge selbst gezeichnet.
Nach all diesen Eingaben wird in den FAST-Modus geschaltet (sollten Sie zwei Bildschirme verwenden, dann können Sie in den Zeilen 110 und 400 statt GRAPHIC0 ein GRAPHIC5 einsetzen und so den Textbetrieb weiter verfolgen). Zeile 180 berechnet die Schrittweiten der Variation des Real- und des Imaginärteils von C. Es folgt eine Dreifachschleife: Ganz außen wird die Vertikale (also der Imaginärteil) durch die Variable U durchgezählt. Innerhalb dieser Schleife liegt die Schleife für die Horizontale mit dem Schleifenzähler V. Die eigentliche Iteration geschieht in der inneren DO... LOOP-Schleife. Zwei Ausstiegsbedingungen sind vorgegeben: In Zeile 250 wird der Betrag des Ergebnisses als Quadrat (wegen der schnelleren Rechnung) abgefragt. Übersteigt dieser den Wert 22 = 4, dann ist die Schleife beendet. Die andere Abbruchbedingung befindet sich in Zeile 290, wo die Anzahl der Iterationen verglichen wird mit der maximalen (vorher eingegebenen) Schrittzahl. Je nach dem Ausstieg aus dieser inneren Schleife wird dann in Zeile 310 ein Punkt gezeichnet. Als Farbquelle dient das durch modulo(3) errechnete Register.
Der Rest des Programmes dient zum Abspeichern des errechneten Bildes.
Das Zeichnen von Fractals ist eine Geduldsprobe: Je nach Anzahl der Iterationen und ausgesuchtem Gauß-Ebenen-Abschnitt müssen Sie mit der Blockade Ihres Computers für zwei bis acht Stunden rechnen! Was wäre da zu tun? Die einzige Lösung ist das Programmieren in Maschinensprache. Weil wir zur Berechnung allerlei Operationen mit Fließkommazahlen brauchen, ist das nur sinnvoll unter Verwendung von Interpreter-Routinen zu programmieren. Die Schöpfer der C 128-Firmware sind leider sehr zurückhaltend mit Informationen, so daß ein Programm, das auf diese Interpreter-Routinen zugreift, noch etwas auf sich warten lassen muß. Für den C 64-Modus hat G.Pehland in der Zeitschrift 64'er (Ausgabe 11/1985,S.80) ein schönes Programm veröffentlicht. Besitzer des C 128 können dieses Programm noch erheblich beschleunigen, indem sie im C 64-Modus auf doppelte Geschwindigkeit schalten. Das ist möglich durch folgende POKEs: POKE 53296,1=schnell POKE 53296,0=normal
Im Programm von G. Pehland müßten diese POKEs wie folgt angeordnet werden:
Zeile 1141 vor dem Befehl SYS CL umschalten auf doppelte Geschwindigkeit und Zeile 1150 nach dem Befehl SYS BG zurückschalten auf normale Geschwindigkeit. Trotz dieser Beschleunigungsmaßnahmen ist auch hier das Zeichnen von Fractals noch eine arge Geduldsprobe.
Pehlands Programm verwendet übrigens einen etwas anderen Algorithmus zum Fractal-Zeichnen, weshalb sein Apfelmännchen umgedreht auf dem Bildschirm erscheint. Eine feine Sache - die Sie auch leicht in unser Programm »MANDELBROT2« einbauen können - ist die Möglichkeit, Ausschnitte eines fertigen Bildes festzulegen für ein weiteres Bild. Pehland verwendet dazu zwei Sprites, die mittels der Cursortasten an die linke obere und die rechte untere Ecke des gewünschten Ausschnittes gesteuert werden. Nach Tastendruck rechnet der Computer die Spriteposition um in Koordinaten der Gauß-Ebene.
Ein komplettes »Apfelmännchen« (Bild 2) dient hauptsächlich zur Übersicht. Sie erhalten es durch die Eingaben:
RU = -2
RO = 0.5
IU = -1.25
IO = 1.25
Viel interessanter aber ist der Grenzbereich der (schwarz gezeichneten) Mandelbrotmenge. Je stärker die Vergrößerung des Ausschnittes wird, desto mehr Einzelheiten sind auf dem Bild zu finden. Die Anzahl der Iterationen drückt sich in der Feinheit der Details aus. Je höher sie gewählt wird, desto mehr Einzelheiten zeigt das Bild. Allerdings sind uns durch die karge Auflösung (160 mal 200 Bildpunkte) schnell Grenzen gesetzt. Wählen wir eine zu hohe Anzahl von Iterationen, dann wird das Bild überladen und Informationen werden zugedeckt.
Weniger Iterationen zeigen also oft mehr Information. Die optimale Schrittzahl zu finden, ist eine Sache des Ausprobierens.
»Schiefe« Mandelbrotmengen ergeben sich, wenn wir uns überlegen, welchen speziellen Algorithmus wir zur Erzeugung gewählt haben und diesen dann etwas verallgemeinern. Im Gegensatz zu »MANDELBROT1«, haben wir in »MANDELBROT2« stillschweigend X und Y (also den Realteil und den Imaginärteil der Variablen in unserer Ausgangsgleichung m = (x+yi)2 + (a+bi) ) auf den Wert 0 festgelegt. Wir haben aber schon in »MANDELBROT1« erkennen können, daß sich die Verhältnisse völlig verändern, wenn X und Y andere Werte annehmen. Bauen wir in »MANDELBROT2« noch ein: 135 INPUT"X,Y= ";XR,YI und ändern Zeile 240 um in 240 N%=0:R=XR:I=YI:D=0 dann schaffen wir uns neue Einflußmöglichkeiten. Die »Apfelmännchen«, die wir damit erzeugen, sehen verzerrt aus oder sind häufig gar nicht mehr zu erkennen (Bild 4).

Verwenden Sie doch mal folgende Parameter:
RU = -2;RO = 0.5;IU = -1.25;IO = 1.25
X = 0.1;Y = 0.5
Iterationszahl 100 beziehungsweise die Parameter aus Bild 5:

RU = -.57;RO = 0.7;IU = -1.5;IO = 1
X = -0.6;Y = 0.7
Iterationszahl 100
Die Erforschung der Randgebiete dieser jetzt entstehenden verzerrten Mandelbrotmengen dürfte allerlei interessante neue Bilder ergeben. Und nun viel Spaß beim Ausprobieren neuer Kombinationen, von denen es unendlich viele gibt und einen widerstandsfähigen Computer, der den Rund-um-die-Uhr-Betrieb nicht übelnimmt!
(H.Ponnath/og)LITERATUR:
[1] G.Pehland:Bilder aus einer anderen Dimension; 64er, Ausg.11(1985)S.80
[2] A.K.Dewdney:Computer-Kurzweil; Spektrum der Wissenschaft, Ausg.10(1985) S.8
[3] H.-O.Peitgen,P.H.Richter: The Beauty of Fractals, Berlin/Heidelberg/New York/ Tokyo 1985, Springer-Verlag (Vorabinformation)
[4] F.Fricker: Barnard-Medaille für Benoit Mandelbrot; Spektrum der Wissenschaft, Ausg.11(1985)S.14
[5] F.Capra: Wendezeit; Bern/München/Wien 1985, Scherz-Verlag
[6] K.Klotz: Computergrafik zum Nachmachen; CHIP, Ausg.10(1984)S.38
[7] M.L.Prueitt: Art and the Computer; New York 1984, Mc-Graw-Hill
[8] J.D.Foley,A. van Dam: Fundamentals of interactive Computer Graphics; Reading.Mass. 1984, Addison-Wesley
[9] B.B.Mandelbrot: Fractals:Form, Chance, and Dimension; San Francisco 1977, Freeman
[10] B.B.Mandelbrot: The Fractal Geometry of Nature; San Francisco, Freeman
10 rem *** programm mandelbrot 1 *** 20 trap190 30 x=0:y=0:a=0:b=0:n=0:r=0:i=0:d=0:v=0 40 def fn r(v) = x*x-y*y+a 50 def fn i(v) = 2*x*y+b 60 print chr$(147) chr$(17) "mandelbrot-algorithmus" 70 print chr$(17) chr$(17) "m = (x+y*i)^2 + (a+b*i)" chr$(17) 80 input"a,b";a,b:input"x,y";x,y 90 print chr$(147) "iteration","realteil","imag.teil","betrag":print 100 r = fn r(v):i = fn i(v) 110 printn,r,i 120 do 130 :x=r:y=i 140 :r = fn r(v):i = fn i(v):n=n+1:d=sqr(r*r+i*i) 150 :printn,r,i,d 160 ::getkeya$:if a$="_" then exit 170 loop 180 end 190 if er = 15 then print"ergebnis ist auf dem weg zur unendlichkeit" 200 end
1 n%=0:nm%=0:x=0:y=0:r=0:i=0:d=0:v=0:u=0:a=0:b=0:da=0:db=0 2 iu=0:io=0:ru=0:ro=0:f1%=1:f2%=1:f3%=1:f4%=1 3 a$="":b$="" 4 def fn md(x)=x-int(x/3)*3 10 rem ********************************* 20 rem * * 30 rem * programm zur grafischen * 40 rem * darstellung von * 50 rem * * 60 rem *m a n d e l b r o t m e n g e n* 70 rem * * 80 rem * heimo ponnath hamburg 1985 * 90 rem * * 100 rem********************************* 110 color0,1:color4,1:color5,6:graphic3,1:graphic0,1 120 print:print:print:print chr$(18)"mandelbrotmengen als grafik"chr$(146) 130 print:print:print"parameter der gaussebene:":input"ru,ro,iu,io=";ru,ro,iu,io 140 print:print:print"maximale iterationen:":input"nmax=";nm% 150 print:print:print"farben nach steigendem n:":input"f1,f2,f3,f4=";f1%,f2%,f3%,f4% 160 print:print:print"es wird jetzt eine ganze weile dauern!!" 170 sleep5:graphic3:fast:color0,f4%:color4,f4%:color1,f3%:color2,f2%:color3,f1% 180 da=(ro-ru)/159:db=(io-iu)/199 190 b=iu-db 200 for u=0 to 199 210 :b=b+db:a=ru-da 220 :for v=0 to 159 230 ::a=a+da 240 ::n%=0:r=0:i=0:d=0 250 ::do while d<4 260 :::x=r:y=i 270 :::r=x*x-y*y+a:i=2*x*y+b:d=r*r+i*i 280 :::n%=n%+1 290 ::::if n%=nm% then exit 300 ::loop 310 ::if n%=nm% then draw0,v,u:else draw(fnmd(n%))+1,v,u 330 nextv:nextu 340 slow 390 getkeya$:ifa$<>"_"then390 400 graphic0:print:print"bild abspeichern?(j/n)" 410 getkeya$:if a$="j" then begin 420 :input"bildname";b$ 430 :bsave(b$),onb0,p7168top16383 440 bend 450 end