Dieser Beitrag zu Matplotlib zeigt, wie der so genannte Rössler Attraktor gezeichnet werden kann. Dieser seltsame Attraktor ist nach dem deutschen Biochemiker Otto E. Rössler benannt (Link zum Wikipedia Eintrag). Werfen wir einen Blick auf die Darstellung dieses dynamischen Systems.
Dieser Attraktor wir durch die folgenden Differentialgleichungen beschrieben:
Um die Grafik zu zeichnen, binden wir in unserem Python Skript zunächst die erforderlichen Module ein. Wir benötigen Numpy, Pyplot und Axes3D aus dem mpl_toolkits Modul.
1 2 3 4 |
# Module importieren import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D |
Um die einzelnen x, y und z Positionen zu berechnen, definieren wir die Funktion roessler()
. Dieser Funktion übergeben wir die aktuellen Positionen (x
, y
und z
) sowie drei Konstanten (a
, b
und c
), die für die korrekte Ermittlung der Änderungen der Positionen (dx
, dy
und dz
) notwendig sind.
1 2 3 4 5 6 |
# Funktion zur Berechnung des Rössler Attraktors def roessler(x, y, z, a=0.2, b=0.2, c=5.7): dx = -(y + z) dy = x + a * y dz = b + z * (x - c) return dx, dy, dz |
Wir legen die Schrittweite (dt
) und die Anzahl an Schritten (numSteps
) fest. Des Weiteren erzeugen wir drei Arrays, um die berechneten Positionen aufzunehmen. Wir definieren zusätzlich Startpositionen für die ersten Werte für x, y und z.
1 2 3 4 5 6 7 8 9 10 11 |
# Schrittweite und Anzahl der Schritte definieren dt = 0.01 numSteps = 20000 # 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] = (0, 0, 0) |
Wir berechnen nun in einer Schleife alle Koordinaten des Attraktors. Da wir in jedem Schritt auf die Stelle i+1
der Arrays zugreifen, wurden die Arrays mit einem zusätzlichen Wert initialisiert. Zur Berechnung wird die zuvor definierte Funktion roessler()
in jedem Durchlauf mit den aktuellen x, y und z Werten aufgerufen.
1 2 3 4 5 6 |
# x, y und z Positionen Schrittweise berechnen for i in range(numSteps): dx, dy, dz = roessler(X[i], Y[i], Z[i]) X[i + 1] = X[i] + (dx * dt) Y[i + 1] = Y[i] + (dy * dt) Z[i + 1] = Z[i] + (dz * dt) |
Wir erzeugen eine neue Figur und setzen die Perspektive auf 3D. Abschließend beschriften wir das Diagramm und zeigen das Bild an.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Figur erzeugen und 3D Projektion aktivieren fig = plt.figure() ax = fig.gca(projection='3d') # Diagram beschriften ax.plot(X, Y, Z, lw=0.5) ax.set_xlabel("X Achse") ax.set_ylabel("Y Achse") ax.set_zlabel("Z Achse") ax.set_title("Rössler Attraktor") # Bild anzeigen plt.show() |
Das Skript kann (unter Linux) mit folgendem Befehl ausgeführt werden:
python3 matplotlib_roessler.py
Das komplette Beispiel herunterladen: matplotlib_roessler.zip
Hinterlasse jetzt einen Kommentar