Quadratic Map Attraktoren zeichnen mit Matplotlib

In diesem Beitrag zu Matplotlib befassen wir uns mit dem Zeichnen von Quadratic Map Attraktoren. Es handelt sich dabei um eine Gruppe von seltsamen Attraktoren, die von Julien C. Sprott bekannt gemacht wurden (Link zur Webseite). Das Zeichnen dieser Attraktoren erfolgt mit Hilfe zweier Polynome der Ordnung 2. Grades.

Die Form dieser Attraktoren hängt stark von den jeweiligen Parametern ab. Aus diesem Grund werden wir mehrere Varianten mit unterschiedlichen Parametern zeichnen. Eine mögliche Variante ist nachfolgend abgebildet.

Quadratic Map Attraktor GIIETPIQRRUL

Zur Erstellung von Quadratic Map Attraktoren sind folgende Formeln notwendig.

Gleichungen Quadratic Map Attraktor

Der Wert der nächsten Gliedes in der Folge ermittelt sich aus einem quadratischen Polynom. Dazu werden die Werte der aktuellen Position (xn und yn) benötigt. Zusätzlich sind Werte für 12 Konstanten (a1 – a12) erforderlich.

Um verschiedene Parametersätze praktisch testen zu können, hat Julien C. Sprott die Werte von -1,2 bis +1,3 im Abstand von 0,1 als Buchstaben des lateinischen Alphabets codiert. Jede Variante kann somit durch eine Kette von zwölf Buchstaben beschrieben werden. Die oben gezeigte Variante ist des Ergebnis der Zeichenkette „GIIETPIQRRUL„. Der erste Parameter (G = a1) hat laut Codierung den Wert -0,6, der zweite (I=a2) den Wert -0.4 usw. Verschiedene Beispiele und deren Zeichencode können unter diesem Link zu Wolfram Alpha gefunden werden.

Zur Umsetzung des Programms binden wir zuerst die notwendigen Module ein. Als Stil unserer Plots wählen wir 'seaborn'.

Im nächsten Schritt implementieren wir die Zeichencodierung von Sprott als Python Dictionary (coeff). Dabei werden den Buchstaben A-Z die entsprechenden Werte zugewiesen. Zusätzlich definieren wir die Funktion get_coefficient(), um für jede Variante die zugeordneten Zahlenwerte zu ermitteln zu können. Diese Funktion gibt in unserem Beispiel eine Liste mit jeweils zwölf Koeffizienten zurück.

Wir benötigen eine Funktion, die die zuvor beschriebenen Formeln umsetzt. Dazu definieren wir qardratic_map(). Als Parameter dienen die aktuellen und y Positionen sowie eine Liste (c) mit den Koeffizienten. Die Funktion gibt die neu berechneten Werte für x und y zurück.

Als Nächstes legen wir eine Liste mit Zeichenketten (qmaps) an, von denen bekannt ist, dass sie ansprechende Darstellungen von Quadratic Map Attraktoren erzeugen (Link zu diversen Beispielen). Wir definieren die Anzahl von Berechnungsschritten (numSteps) und initialisieren die Arrays für die x und y Werte.

Wir haben nun alle Voraussetzungen um in einer Schleife alle neun Varianten unseres Attraktors zu zeichnen und als PNG auszugeben.

Im ersten Schritt ermitteln wir die Parameter aus der Zeichenkette und speichern die Liste in c ab. Dann initialisieren wir die Startwerte für die Arrays (X und Y). Mit Hilfe einer for Schleife berechnen wir die festgelegte Anzahl an Punkten. In jedem Schritt wird die Funktion qardratic_map() aufgerufen und dabei werden die aktuellen x und y Werte sowie die Koeffizienten Liste übergeben. Die Punkte werden mit einem Streudiagramm (englisch: scatter plot) visualisiert. Wir beschriften das Diagramm und geben das Bild im PNG Format aus. Es ist wichtig, das aktuelle Diagramm mit plt.cla() zu löschen. Es würde sonst zu einer Überlagerung der nachfolgenden Grafiken kommen. Da die Ausgabe der Bilder mehrere Sekunden in Anspruch nimmt, geben wir aus, welches Bild gerade bearbeitet wird und wie viele insgesamt erstellt werden.

Nach Ausführung von python3 matplotlib_quad_map_attraktor.py erhalten wir folgende Ausgabe:

Bild Nr. 1 von 9 erzeugt - GIIETPIQRRUL
Bild Nr. 2 von 9 erzeugt - GLXOESFTTPSV
Bild Nr. 3 von 9 erzeugt - UWACXDQIGKHF
Bild Nr. 4 von 9 erzeugt - VBWNBDELYHUL
Bild Nr. 5 von 9 erzeugt - EYYMKTUMXUVC
Bild Nr. 6 von 9 erzeugt - ENWUQSLHYSAT
Bild Nr. 7 von 9 erzeugt - GOSXRBRCBSPM
Bild Nr. 8 von 9 erzeugt - IFVQJFOOLVDV
Bild Nr. 9 von 9 erzeugt - CVQKGHQTPHTE

Im Ordner, in dem sich das Skript befindet, liegen nun 9 Bilder im PNG Format, welche verschiedene Varianten von Quadratic Map Attraktoren zeigen.

Das erste Bild befindet sich am Beginn des Artikels. Die restlichen Bilder sind nachfolgend (nicht in der Reihenfolge der Erstellung) dargestellt.

Das komplette Beispiel herunterladen: matplotlib_quad_map_attraktor.zip

Quadratic_Map_Attraktor_VBWNBDELYHUL

Quadratic_Map_Attraktor_UWACXDQIGKHFQuadratic_Map_Attraktor_IFVQJFOOLVDVQuadratic_Map_Attraktor_GOSXRBRCBSPMQuadratic_Map_Attraktor_GLXOESFTTPSVQuadratic_Map_Attraktor_EYYMKTUMXUVCQuadratic_Map_Attraktor_ENWUQSLHYSATQuadratic_Map_Attraktor_CVQKGHQTPHTE

Über Anton Neururer 31 Artikel
Ich bin Programmierer und Blogger. Themen die mich besonders interessieren sind Python, C++ und Javascript. Des Weiteren befasse ich mich mit Fraktalen.

Hinterlasse jetzt einen Kommentar

Kommentar hinterlassen