Fraktale: Mandelbrot - Julia - Newton

Berechnung der Fraktale

Diese Beschreibung dient gleichzeitig als Einführung in das Java-Programm, mit dem die gezeigten Bilder berechnet wurden. Die kursiv geschriebenen Bezeichnungen werden dort verwendet.

1. Verfahren

Betrachtet werden soll das Verhalten der Folge F(c): zn+1 = f(zn,c), z0 = c für eine kompakte Menge von komplexen Zahlen c. Die Folge kann gegen einen oder mehrere Werte konvergieren, für einzelne Werte undefiniert sein, oder beschränkt bleiben. Die Konvergenzpunkte nennt man Attraktoren der Funktion f, wobei auch die Flucht ins Unendliche darunter subsummiert wird.

Die Berechnung der Folge ist zu beenden, wenn ein Abbruchkriterium erfüllt ist. Dies kann die Feststellung sein, dass ein Attraktor oder eine maximale Schrittzahl erreicht wird, denn für die Berechnung per Computer muss sowohl die ausgewählte Zahlenmenge als auch die Zahl der Iterationsschritte beschränkt sein.

Will man die ausgewählte Zahlenmenge auf einem Bildschirm grafisch darstellen, so kann man jedem Bildpunkt (Pixel) eine ausgewählte Zahl zuordnen, die den Mittelpunkt des Quadrats bildet, das der Bildpunkt repräsentiert. Die Berechnung soll sich dabei immer auf ein ausgewähltes Quadrat der komplexen Ebene beschränken.

Folgende Angaben sind daher für die Berechnung notwendig:

Das Ergebnis ist ein quadratisches Bild, wobei jeder Pixel einen berechneten Punkt des ausgewählten Quadrats darstellt und die gewählte Farbe des Pixels das Ergebnis der Berechnung charakterisiert.

Zu berechnen sind:

Der bisher dargestellte Berechnungsrahmen ist unabhängig von der Gestalt des jeweiligen Fraktals. Nur die Funktion f, das Kriterium K und die grafische Darstellung des Ergebnisses ist speziell für jedes einzelne Fraktal zu berechnen. Dies gilt jedoch nicht für die Ausgabe der Farbwerte in eine Ergebnisdatei, für die ein einheitliches Verfahren (BMP) verwendet werden soll.

2. Die Fraktale

Die Berechnungen sollen für folgende Fraktale durchgeführt werden:

Das Mandelbrot-Fraktal

Die Menge der c, für die in der Folge
F(c): zn+1 = zn2 + c, z0 = c, |zn| < 2 für alle n bleibt, ergibt die Mandelbrot-Menge.
Der Attraktor dieser Menge (im Unendlichen) wird für alle c erreicht, bei denen der Abstand von zn zum Nullpunkt den Wert 2 überschreitet. Bei Abbruch der Iteration ist entweder n < maxIt und state = 1 oder n = maxIt und state = 0.
Der Rand der Mandelbrot-Menge ist das Mandelbrot-Fraktal.

Das Julia-Fraktal eines Punktes cfix

Die Menge der c, für die in der Folge
F(c): zn+1 = zn2 + cfix, z0 = c, |zn| < 2 für alle n bleibt, ergibt die Julia-Menge des Punktes cfix, wenn cfix aus der Mandelbrot-Menge gewählt wurde.
Der Attraktor dieser Menge (im Unendlichen) wird für alle c erreicht, bei denen der Abstand von zn zum Nullpunkt den Wert 2 überschreitet. Bei Abbruch der Iteration ist entweder n < maxIt und state = 1 oder n = maxIt und state = 0.
Der Rand der Julia-Menge ist das Julia-Fraktal.

 

Für jedes maxIt, das man wählt, erhält man eine Menge, die größer ist, als die eigentliche Mandelbrot- oder Julia-Menge. Man sollte den Wert so wählen, dass sich das sichtbare Ergebnis nicht mehr von dem mit einem größeren maxIt berechneten unterscheiden lässt. Dies ist aber an den Grenzen der Berechenbarkeit mit dem PC nicht immer machbar.

 

Newton-Fraktale

Die Funktion f(z) = z - P(z)/P'(z) beschreibt ein Näherungsverfahren zur Bestimmung der Nullstellen von P(z). Es sollen Polynome P(z) = z3+uz2+vz+w mit ganzzahligen Koeffizienten u, v und w betrachtet werden:

Mt P'(z) = 3z2+2uz+v wird f(z) = (2z3+uz2-w)/(3z2+2uz+v) und mit derFolge F(c): zn+1 = (2zn3+uzn2-w)/(3zn2+2zn+v), z0 = c

erhält man dort, wo sie konvergiert, bis zu drei verschiedene Nullstellen von P(z) als Attraktoren.

Für alle zu berechnenden Werte c wird die Folge F(c) entweder gegen eine Nullstelle konvergieren, oder die Iteration ist nach maxit Schritten abzubrechen.  Die Nullstellen werden in der Reihenfolge ihres Auftretens nummeriert und state erhält  die Nummer als Wert. Im Falle des Abbruchs wird state = 0 gesetzt.

Bildet man für Polynome mit drei verschiedenen Nullstellen die drei Mengen von Werten c, bei denen F(c) gegen den gleichen Attraktor strebt, so bilden die Ränder dieser Mengen das Newton-Fraktal für das Polynom P(z).

3. Berechnung der Fraktale mit Java

Die komplexen Zahlen werden als Objekte der Klasse Comp definiert. Sie werden als Paar (re, im) vom Typ double dargestellt.

Der Berechnungsrahmen zur Herstellung des Fraktal-Bildes wird in der Klasse FracPic erstellt. Die Berechnung eines Iterationspunktes erfolgt zunächst in der Klasse MandelFrac für das Mandelbrot-Fraktal. Dabei ist die Klasse so gestaltet, dass sie für die anderen Fraktale erweitert werden kann und nur noch wenige Methoden überschrieben werden müssen.

Die Eingabdaten in der Datei input.txt werden in der Klasse FracInput verarbeitet, die Berechnung aufgerufen und die Ergebnisdaten ausgegeben. Standardmäßig wird für die Berechnung der Fraktale centre = 0 + 0 i und length = 4 gesetzt. numofPix wird auf das Intervall 100 <= numofPix <= 2000 beschränkt.

Das Ergebnis ist eine BMP-Datei erzeugt durch die Klasse Bmp. Für die BMP-Datei ist ein Dateikopf auszugeben, der die Form der Ausgabe bestimmt. Im Dateikopf wurde festgelegt, dass pro Pixel 3 Bytes für die RGB-Farben vorgesehen werden und die Breite des Bildes ein Vielfaches von 4 zu sein hat. Die Ausgabe wird pro Bildzeile gepuffert. In der gewählten Form der BMP-Ausgabe wird die zuletzt berechnete Zeile des Bildes zuerst ausgegeben; daher beginnt die Berechnung in der linken unteren Ecke des Quadrats.

Die verwendeten Farbwerte werden über eine Farbtafel definiert, die in der Klasse FracCols berechnet wird.

Mit Hilfe einer Internetseite werden die Eingabedaten im Dialog erstellt, die Berechnung ausgeführt und das Ergebnis dargestellt. Bei allen Fraktalen wird die Berechnung von interessanten Fraktalausschnitten ermöglicht.

3.1. Mandelbaum-Fraktal
Die Abfrage für das Kriterium K ist statt |zn| > 2: islastC(z): z.re2 + z.im2 > 4, um eine Berechnung der Quadratwurzel zu vermeiden.
Für die Darstellung der Bildpunkte werden die Iterationsanzahlen in Farbwerte umgerechnet. Dabei soll die durch persönliche Vorlieben entstandene Auswahl von Farben unabhängig von der Berechnung in der Klasse MandelFrac erfolgen. Die Wahl der Farben erfolgt in der Klasse FracCols. Die Farben der Farbtafel werden als Zahlenwerte getrennt nach R-, G- und B-Farbwerten gespeichert. Für die Mandelbaum- und die Julia-Fraktale wurden für die ersten 10 Tsd. Iterationsschritte ebenso viele Farbtöne in der Klasse FracCols festgelegt. Diese Anzahl wurde festgelegt, um Teilfraktale bis zur Grenze der Genauigkeit der Gleitkomma-Rechnung des PC berechnen zu können. Die Farbänderungen wurden mit steigenden Iterationszahlen erheblich verlangsamt, um die auftretenden Strukturen noch angemessen darstellen zu können.
Die folgende Farbtafel zeigt die 10 Tsd. Farben, jeweils Tsd. Farben pro Zeile:


Die Mandelbrot-Menge selbst (state = 0) wird dunkelblau dargestellt, Iterationszahlen über 10 Tsd. hellgelb.

3.2. Julia-Fraktal
Die Berechnung ist mit der des Mandelbrot-Fraktals fast identisch. Es ist nur an einer Stelle c durch cfix zu ersetzen, was durch Überschreiben einer elementaren Methode und Erweiterung der Klasse MandelFrac zur Klasse JuliaFrac erfolgt. Bei der Eingabe ist zusätzlich der Wert von cfix festzulegen. Die Darstellung der Ausgabe kann ebenfalls übernommen werden. Es wurde jedoch noch ein Kompressionsfaktor für die Farbtafel colFac >= 1 eingeführt, um Berechnungen zu Punkten außerhalb der Mandelbrot-Menge farbiger erscheinen zu lassen.

Für die Berechnung eines Ausschnitts eines Mandelbaum- oder Julia-Fraktals mit 1 Mill. Pixeln und 10 Tsd. Iterationen bei allen Pixeln benötigte der PC mit Windows 10 und Prozessor Intel Core I3 9100F 4x3,6 GHz etwa 37 Sek. Für die Berechnung des Apfelmännchens mit 1 Mill. Pixeln reichen maximal 150 Iterationen pro Pixel aus. Dafür werden 0,125 Sek. benötigt.

3.3. Newton-Fraktal 
Für die Newton-Fraktale sind die Funktion f, das Kriterium K und die Ausgabe des Pixelwertes neu zu formulieren. Bei F(c) wird c nur als Startwert benötigt. In der neu formulierten Funktion f(z,c) kann c daher als Hilfsvariable für die Berechnung des Funktionswertes benutzt werden. Die Klasse entsteht durch Erweiterung der Klasse MandelFrac zu NewtonFrac. Die Farben in der Klasse FracCols sind anders als bisher zu wählen. Sie bestehen für Punkte c, die verschiedene Attraktoren erreichen, aus drei Grundfarben, die gemäß der Iterationsanzahl durch verschiedene Helligkeitstöne verändert werden. Hier sind 30 verschiedene Helligkeitstöne vorgesehen. Bereiche, in denen die Berechnung nicht konvergiert, werden dunkelblau dargestellt.

Für die Berechnung eines Newton-Fraktals mit 1 Mill. Pixeln werden bei maximal 50 Iterationen pro Pixel etwa 0,1 Sek. benötigt.