In diesem Beitrag zu Matplotlib wird gezeigt, wie der Lorenz Attraktor visuell dargestellt werden kann. Dieser Attraktor ist das Resultat eines dynamischen Systems, das von dem Meteorologen Edward Lorenz entdeckt wurde. (Link zur Beschreibung). Sehen wir uns zunächst die Grafik an.
Wie zu erkennen ist, handelt es sich um eine 3D Darstellung. Jeder Punkt des Attraktors wird mit Hilfe von drei Differentialgleichungen berechnet, die die Änderungen der Koordinaten im Raum beschreiben. Das von Lorenz beschriebene System dient als Modellierung für Zustände in der Erdatmosphäre.
Folgende gewöhnliche Differentialgleichungen beschreiben den Lorenz Attraktor:
Zum Zeichnen der Darstellung importieren wir im ersten Schritt die benötigten Module.
1 2 3 4 |
# Module importieren import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D |
Anschließend legen wir mehrere Konstanten fest. Wir benötigen eine Schrittweite (step
), einen Wert für die Anzahl an Schritten (numSteps
) und die Werte a
, b
und c
für die Berechnung der Differentialgleichungen.
Nachdem wir drei Arrays für die x, y, und z Position initialisiert haben, benötigen wir noch drei geeignete Startwerte für diese Positionen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Schrittweite und Anzahl der Schritte definieren step = 0.01 numSteps = 10000 # Konstanten für Berechnung der Ableitungen definieren a, b, c = 10, 28, 8/3 # Arrays für x, y und z Werte initialisieren x = np.zeros(numSteps+1) y = np.zeros(numSteps+1) z = np.zeros(numSteps+1) # Starwerte festlegen x[0], y[0], z[0] = 1.0, 1.0, 1.0 |
In einer for Schleife werden nun die Koordinaten des Attarktors berechnet. Da dabei in jedem Schritt auf die jeweils nächsten Stellen in den Arrays zugegriffen wird, wird die Schleife eine Stelle vor dem Ende der Arrays beendet. Inklusive dem Startwert befinden sich 10001 Positionen in jedem der drei Arrays. Die Berechnung jeder neuen Koordinate beruht auf der aktuellen Position (x[i], y[i], z[i]
), der Schrittweite (step
) sowie der Änderung der Position, die durch die Differentialgleichungen beschrieben wird.
1 2 3 4 5 |
# x, y und z Positionen berechnen for i in range(numSteps): x[i+1] = x[i] + (step * (a * (y[i] - x[i]))) y[i+1] = y[i] + (step * (b * x[i] - y[i] - x[i] * z[i])) z[i+1] = z[i] + (step * (x[i]*y[i] - c*z[i])) |
Nachdem alle Werte vorhanden sind, wird eine neue Figur (figure
) erzeugt und die Darstellung als 3D Projektion definiert (projection='3d'
). Mit dem Befehl plot()
zeichnen wir die Grafik und übergeben dabei die drei Arrays mit den x, y und z Positionen. Die Linienbreite (lw
) wird auf auf 1.0 gesetzt. Abschließend wird das Diagramm beschriftet und das Bild angezeigt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Figur erzeugen figure = plt.figure() # 3D Projektion aktivieren axes = figure.gca(projection='3d') # Diagramm beschriften axes.plot(x, y, z, lw=1.0) axes.set_xlabel("X Achse") axes.set_ylabel("Y Achse") axes.set_zlabel("Z Achse") axes.set_title("Lorenz Attraktor") # Bild anzeigen plt.show() |
Das Beispiel kann mit folgendem Befehl ausgeführt werden:
python3 matplotlib_lorenz.py
Das komplette Beispiel herunterladen: matplotlib_lorenz.zip
Hinterlasse jetzt einen Kommentar