odeint#
- scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0, tfirst=False)[Quelle]#
Integrieren Sie ein System von gewöhnlichen Differentialgleichungen.
Hinweis
Für neuen Code verwenden Sie bitte
scipy.integrate.solve_ivp, um eine Differentialgleichung zu lösen.Löst ein System von gewöhnlichen Differentialgleichungen mit lsoda aus der FORTRAN-Bibliothek odepack.
Löst das Anfangswertproblem für steife oder nicht steife Systeme von Differentialgleichungen erster Ordnung
dy/dt = func(y, t, ...) [or func(t, y, ...)]
wobei y ein Vektor sein kann.
Hinweis
Standardmäßig sind die Argumente der ersten beiden Argumente von func in umgekehrter Reihenfolge zu den Argumenten in der Systemdefinitionsfunktion, die von der Klasse
scipy.integrate.odeund der Funktionscipy.integrate.solve_ivpverwendet wird. Um eine Funktion mit der Signaturfunc(t, y, ...)zu verwenden, muss das Argument tfirst aufTruegesetzt werden.- Parameter:
- funccallable(y, t, …) oder callable(t, y, …)
Berechnet die Ableitung von y nach t. Wenn die Signatur
callable(t, y, ...)ist, muss das Argument tfirst aufTruegesetzt werden. func darf die Daten in y nicht ändern, da es sich um eine Ansicht der intern vom ODE-Solver verwendeten Daten handelt.- y0array
Anfangsbedingung für y (kann ein Vektor sein).
- tarray
Eine Sequenz von Zeitpunkten, für die y gelöst werden soll. Der Anfangswertpunkt sollte das erste Element dieser Sequenz sein. Diese Sequenz muss monoton steigend oder monoton fallend sein; wiederholte Werte sind zulässig.
- argstuple, optional
Zusätzliche Argumente, die an die Funktion übergeben werden sollen.
- Dfuncallable(y, t, …) oder callable(t, y, …)
Gradient (Jacobi-Matrix) von func. Wenn die Signatur
callable(t, y, ...)ist, muss das Argument tfirst aufTruegesetzt werden. Dfun darf die Daten in y nicht ändern, da es sich um eine Ansicht der intern vom ODE-Solver verwendeten Daten handelt.- col_derivbool, optional
True, wenn Dfun Ableitungen spaltenweise definiert (schneller), andernfalls sollte Dfun Ableitungen zeilenweise definieren.
- full_outputbool, optional
True, wenn ein Wörterbuch mit optionalen Ausgaben als zweite Ausgabe zurückgegeben werden soll
- printmessgbool, optional
Ob die Konvergenzmeldung gedruckt werden soll
- tfirstbool, optional
Wenn True, müssen die ersten beiden Argumente von func (und Dfun, falls gegeben)
t, yanstelle des Standardwertsy, tsein.Hinzugefügt in Version 1.1.0.
- Rückgabe:
- yarray, shape (len(t), len(y0))
Array, das den Wert von y für jeden gewünschten Zeitpunkt in t enthält, mit dem Anfangswert y0 in der ersten Zeile.
- infodictdict, nur zurückgegeben, wenn full_output == True
Wörterbuch mit zusätzlichen Auskunftsinformationen
Schlüssel
Bedeutung
„hu“
Vektor der Schrittgrößen, die für jeden Zeitschritt erfolgreich verwendet wurden
„tcur“
Vektor mit dem erreichten t-Wert für jeden Zeitschritt (wird immer mindestens so groß sein wie die Eingangszeiten)
„tolsf“
Vektor der Toleranz-Skalierungsfaktoren, größer als 1.0, berechnet, wenn eine zu hohe Genauigkeit angefordert wurde
„tsw“
Zeitpunkt t des letzten Methodenwechsels (angegeben für jeden Zeitschritt)
„nst“
kumulative Anzahl der Zeitschritte
„nfe“
kumulative Anzahl der Funktionsauswertungen für jeden Zeitschritt
„nje“
kumulative Anzahl der Jacobi-Matrix-Auswertungen für jeden Zeitschritt
„nqu“
ein Vektor der Methodenordnungen für jeden erfolgreichen Schritt
„imxer“
Index der Komponente mit dem größten Betrag im gewichteten lokalen Fehlervektor (e / ewt) bei einem Fehlerereignis, sonst -1
„lenrw“
die Länge des benötigten Double-Work-Arrays
„leniw“
die Länge des benötigten Integer-Work-Arrays
„mused“
ein Vektor von Methodenindikatoren für jeden erfolgreichen Zeitschritt: 1: Adams (nicht steif), 2: BDF (steif)
- Andere Parameter:
- ml, muint, optional
Wenn einer davon nicht None oder nicht-negativ ist, wird angenommen, dass die Jacobi-Matrix bandförmig ist. Diese geben die Anzahl der unteren und oberen Nicht-Null-Diagonalen in dieser bandförmigen Matrix an. Für den bandförmigen Fall sollte Dfun eine Matrix zurückgeben, deren Zeilen die Nicht-Null-Bänder enthalten (beginnend mit der untersten Diagonalen). Daher sollte die Rückgabematrix jac von Dfun die Form
(ml + mu + 1, len(y0))haben, wennml >=0odermu >=0. Die Daten in jac müssen so gespeichert werden, dassjac[i - j + mu, j]die Ableitung deri-ten Gleichung nach derj-ten Zustandsvariable enthält. Wenn col_deriv True ist, muss die Transponierte dieser jac zurückgegeben werden.- rtol, atolfloat, optional
Die Eingabeparameter rtol und atol bestimmen die vom Solver durchgeführte Fehlerkontrolle. Der Solver kontrolliert den Vektor e der geschätzten lokalen Fehler in y gemäß einer Ungleichung der Form
max-norm von (e / ewt) <= 1, wobei ewt ein Vektor positiver Fehlergewichte ist, der alsewt = rtol * abs(y) + atolberechnet wird. rtol und atol können entweder Vektoren gleicher Länge wie y oder Skalare sein. Standardwert ist 1.49012e-8.- tcritndarray, optional
Vektor von kritischen Punkten (z. B. Singularitäten), bei denen die Integration sorgfältig erfolgen sollte.
- h0float, (0: vom Solver bestimmt), optional
Die Schrittgröße, die beim ersten Schritt versucht werden soll.
- hmaxfloat, (0: vom Solver bestimmt), optional
Die maximal zulässige absolute Schrittgröße.
- hminfloat, (0: vom Solver bestimmt), optional
Die minimal zulässige absolute Schrittgröße.
- ixprbool, optional
Ob zusätzliche Ausgaben bei Methodenwechseln generiert werden sollen.
- mxstepint, (0: vom Solver bestimmt), optional
Maximale Anzahl von (intern definierten) Schritten, die für jeden Integrationspunkt in t zulässig sind.
- mxhnilint, (0: vom Solver bestimmt), optional
Maximale Anzahl der gedruckten Meldungen.
- mxordnint, (0: vom Solver bestimmt), optional
Maximale Ordnung, die für die nicht steife (Adams) Methode zulässig ist.
- mxordsint, (0: vom Solver bestimmt), optional
Maximale Ordnung, die für die steife (BDF) Methode zulässig ist.
Siehe auch
Beispiele
Die Differentialgleichung zweiter Ordnung für den Winkel theta eines Pendels, das der Schwerkraft mit Reibung ausgesetzt ist, kann geschrieben werden als
theta''(t) + b*theta'(t) + c*sin(theta(t)) = 0
wobei b und c positive Konstanten sind und ein Apostroph (’) eine Ableitung bezeichnet. Um diese Gleichung mit
odeintzu lösen, müssen wir sie zuerst in ein System von Gleichungen erster Ordnung umwandeln. Durch Definition der Winkelgeschwindigkeitomega(t) = theta'(t)erhalten wir das Systemtheta'(t) = omega(t) omega'(t) = -b*omega(t) - c*sin(theta(t))
Sei y der Vektor [theta, omega]. Wir implementieren dieses System in Python wie folgt:
>>> import numpy as np >>> def pend(y, t, b, c): ... theta, omega = y ... dydt = [omega, -b*omega - c*np.sin(theta)] ... return dydt ...
Wir gehen davon aus, dass die Konstanten b = 0.25 und c = 5.0 sind.
>>> b = 0.25 >>> c = 5.0
Für Anfangsbedingungen nehmen wir an, dass das Pendel fast senkrecht steht mit theta(0) = pi - 0.1 und sich anfangs in Ruhe befindet, also omega(0) = 0. Dann ist der Vektor der Anfangsbedingungen:
>>> y0 = [np.pi - 0.1, 0.0]
Wir werden eine Lösung an 101 gleichmäßig verteilten Abtastpunkten im Intervall 0 <= t <= 10 erzeugen. Unser Zeitarray ist also:
>>> t = np.linspace(0, 10, 101)
Rufen Sie
odeintauf, um die Lösung zu erzeugen. Um die Parameter b und c an pend zu übergeben, übergeben wir sie mit dem Argument args anodeint.>>> from scipy.integrate import odeint >>> sol = odeint(pend, y0, t, args=(b, c))
Die Lösung ist ein Array der Form (101, 2). Die erste Spalte ist theta(t) und die zweite ist omega(t). Der folgende Code zeichnet beide Komponenten auf.
>>> import matplotlib.pyplot as plt >>> plt.plot(t, sol[:, 0], 'b', label='theta(t)') >>> plt.plot(t, sol[:, 1], 'g', label='omega(t)') >>> plt.legend(loc='best') >>> plt.xlabel('t') >>> plt.grid() >>> plt.show()