ode#
- class scipy.integrate.ode(f, jac=None)[Quelle]#
Eine generische Schnittstellenklasse für numerische Integratoren.
Löse ein Gleichungssystem \(y'(t) = f(t,y)\) mit (optionalem)
jac = df/dy.Hinweis: Die ersten beiden Argumente von
f(t, y, ...)sind in umgekehrter Reihenfolge der Argumente der Systemdefinitionsfunktion, die vonscipy.integrate.odeintverwendet wird.- Parameter:
- faufrufbar
f(t, y, *f_args) Rechte Seite der Differentialgleichung. t ist eine Skalare,
y.shape == (n,).f_argswird durch Aufruf vonset_f_params(*args)gesetzt. f sollte eine Skalare, ein Array oder eine Liste zurückgeben (kein Tupel).- jacaufrufbar
jac(t, y, *jac_args), optional Jakobische Matrix der rechten Seite,
jac[i,j] = d f[i] / d y[j].jac_argswird durch Aufruf vonset_jac_params(*args)gesetzt.
- faufrufbar
- Attribute:
- tfloat
Aktuelle Zeit.
- yndarray
Aktuelle Variablenwerte.
Methoden
Extrahiert den Rückgabecode der Integration, um eine bessere Kontrolle bei fehlgeschlagener Integration zu ermöglichen.
integrate(t[, step, relax])Findet y=y(t), setzt y als Anfangsbedingung und gibt y zurück.
set_f_params(*args)Zusätzliche Parameter für die vom Benutzer bereitgestellte Funktion f festlegen.
set_initial_value(y[, t])Setzt Anfangsbedingungen y(t) = y.
set_integrator(name, **integrator_params)Setzt den Integrator nach Namen.
set_jac_params(*args)Zusätzliche Parameter für die vom Benutzer bereitgestellte Funktion jac festlegen.
set_solout(solout)Legt eine aufzurufende Funktion fest, die bei jedem erfolgreichen Integrationsschritt aufgerufen wird.
Prüft, ob die Integration erfolgreich war.
Siehe auch
Hinweise
Verfügbare Integratoren sind unten aufgeführt. Sie können über die Methode
set_integratorausgewählt werden.“vode”
Reellwertiger Differentialgleichungs-Löser mit variablen Koeffizienten, mit Implementierung mit festem Leitkoeffizienten. Er bietet eine implizite Adams-Methode (für nicht-steife Probleme) und eine Methode basierend auf Rückwärtsdifferenzformeln (BDF) (für steife Probleme).
Quelle: http://www.netlib.org/ode/vode.f
Warnung
Dieser Integrator ist nicht re-entrant. Sie können nicht zwei
ode-Instanzen gleichzeitig mit dem "vode"-Integrator verwenden.Dieser Integrator akzeptiert die folgenden Parameter in der Methode
set_integratorder Klasseodeatol : float oder Sequenz absolute Toleranz für die Lösung
rtol : float oder Sequenz relative Toleranz für die Lösung
lband : None oder int
uband : None oder int Bandbreite der Jakobischen Matrix, jac[i,j] != 0 für i-lband <= j <= i+uband. Das Setzen dieser erfordert, dass Ihre jac-Routine die Jakobische Matrix im gepackten Format zurückgibt, jac_packed[i-j+uband, j] = jac[i,j]. Die Dimension der Matrix muss (lband+uband+1, len(y)) sein.
method: ‘adams’ oder ‘bdf’ Welcher Löser verwendet werden soll, Adams (nicht steif) oder BDF (steif)
with_jacobian : bool Diese Option wird nur berücksichtigt, wenn der Benutzer keine Jakobische Funktion bereitgestellt hat und nicht (durch Setzen von band) angegeben hat, dass die Jakobische Matrix bandförmig ist. In diesem Fall gibt with_jacobian an, ob die Iterationsmethode des Korrekturschritts des ODE-Lösers eine Akkorditeration mit einer intern generierten vollen Jakobischen Matrix oder eine funktionale Iteration ohne Jakobische Matrix ist.
nsteps : int Maximale Anzahl von (intern definierten) Schritten, die bei einem einzigen Aufruf des Lösers zulässig sind.
first_step : float
min_step : float
max_step : float Grenzwerte für die vom Integrator verwendeten Schrittgrößen.
order : int Maximale Ordnung, die vom Integrator verwendet wird, order <= 12 für Adams, <= 5 für BDF.
“zvode”
Reellwertiger Differentialgleichungs-Löser mit variablen Koeffizienten und fester Leitkoeffizientenimplementierung. Er bietet eine implizite Adams-Methode (für nicht-steife Probleme) und eine Methode basierend auf Rückwärtsdifferenzformeln (BDF) (für steife Probleme).
Quelle: http://www.netlib.org/ode/zvode.f
Warnung
Dieser Integrator ist nicht re-entrant. Sie können nicht zwei
ode-Instanzen gleichzeitig mit dem "zvode"-Integrator verwenden.Dieser Integrator akzeptiert die gleichen Parameter in der Methode
set_integratorwie der "vode"-Löser.Hinweis
Bei Verwendung von ZVODE für ein steifes System sollte es nur für den Fall verwendet werden, in dem die Funktion f analytisch ist, d.h. wenn jedes f(i) eine analytische Funktion jedes y(j) ist. Analytizität bedeutet, dass die partielle Ableitung df(i)/dy(j) eine eindeutige komplexe Zahl ist, und diese Tatsache ist entscheidend für die Art und Weise, wie ZVODE die dichten oder bandförmigen linearen Systeme löst, die im steifen Fall auftreten. Für ein komplexes steifes ODE-System, bei dem f nicht analytisch ist, ist es wahrscheinlich, dass ZVODE Konvergenzfehler aufweist, und für dieses Problem sollte stattdessen DVODE auf das äquivalente reelle System (in den reellen und imaginären Teilen von y) angewendet werden.
“lsoda”
Reellwertiger Differentialgleichungs-Löser mit variablen Koeffizienten, mit fester Leitkoeffizientenimplementierung. Er bietet automatische Methodenwechsel zwischen der impliziten Adams-Methode (für nicht-steife Probleme) und einer Methode basierend auf Rückwärtsdifferenzformeln (BDF) (für steife Probleme).
Quelle: http://www.netlib.org/odepack
Warnung
Dieser Integrator ist nicht re-entrant. Sie können nicht zwei
ode-Instanzen gleichzeitig mit dem "lsoda"-Integrator verwenden.Dieser Integrator akzeptiert die folgenden Parameter in der Methode
set_integratorder Klasseodeatol : float oder Sequenz absolute Toleranz für die Lösung
rtol : float oder Sequenz relative Toleranz für die Lösung
lband : None oder int
uband : None oder int Bandbreite der Jakobischen Matrix, jac[i,j] != 0 für i-lband <= j <= i+uband. Das Setzen dieser erfordert, dass Ihre jac-Routine die Jakobische Matrix im gepackten Format zurückgibt, jac_packed[i-j+uband, j] = jac[i,j].
with_jacobian : bool *Nicht verwendet.*
nsteps : int Maximale Anzahl von (intern definierten) Schritten, die bei einem einzigen Aufruf des Lösers zulässig sind.
first_step : float
min_step : float
max_step : float Grenzwerte für die vom Integrator verwendeten Schrittgrößen.
max_order_ns : int Maximale Ordnung, die im nicht-steifen Fall verwendet wird (Standard 12).
max_order_s : int Maximale Ordnung, die im steifen Fall verwendet wird (Standard 5).
max_hnil : int Maximale Anzahl von Meldungen, die eine zu kleine Schrittgröße melden (t + h = t) (Standard 0)
ixpr : int Ob zusätzliche Ausgaben bei Methodenwechseln erzeugt werden sollen (Standard False).
“dopri5”
Dies ist eine explizite Runge-Kutta-Methode der Ordnung (4)5 von Dormand & Prince (mit Schrittgrößenkontrolle und dichter Ausgabe).
Autoren
E. Hairer und G. Wanner Universität Genf, Dept. Mathematik CH-1211 Genf 24, Schweiz E-Mail: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch
Dieser Code wird in [HNW93] beschrieben.
Dieser Integrator akzeptiert die folgenden Parameter in der Methode set_integrator() der ode-Klasse
atol : float oder Sequenz absolute Toleranz für die Lösung
rtol : float oder Sequenz relative Toleranz für die Lösung
nsteps : int Maximale Anzahl von (intern definierten) Schritten, die bei einem einzigen Aufruf des Lösers zulässig sind.
first_step : float
max_step : float
safety : float Sicherheitsfaktor für die neue Schritterwahl (Standard 0.9)
ifactor : float
dfactor : float Maximaler Faktor, um den die Schrittgröße bei einem Schritt erhöht/verringert werden kann.
beta : float Beta-Parameter für stabilisierte Schrittgrößenkontrolle.
verbosity : int Schalter für die Ausgabe von Meldungen (< 0 für keine Meldungen).
“dop853”
Dies ist eine explizite Runge-Kutta-Methode der Ordnung 8(5,3) von Dormand & Prince (mit Schrittgrößenkontrolle und dichter Ausgabe).
Optionen und Referenzen sind die gleichen wie bei "dopri5".
Referenzen
[HNW93]E. Hairer, S.P. Norsett und G. Wanner, Solving Ordinary Differential Equations i. Nonstiff Problems. 2. Auflage. Springer Series in Computational Mathematics, Springer-Verlag (1993)
Beispiele
Ein zu integrierendes Problem und die entsprechende Jakobische Matrix
>>> from scipy.integrate import ode >>> >>> y0, t0 = [1.0j, 2.0], 0 >>> >>> def f(t, y, arg1): ... return [1j*arg1*y[0] + y[1], -arg1*y[1]**2] >>> def jac(t, y, arg1): ... return [[1j*arg1, 1], [0, -arg1*2*y[1]]]
Die Integration
>>> r = ode(f, jac).set_integrator('zvode', method='bdf') >>> r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0) >>> t1 = 10 >>> dt = 1 >>> while r.successful() and r.t < t1: ... print(r.t+dt, r.integrate(r.t+dt)) 1 [-0.71038232+0.23749653j 0.40000271+0.j ] 2.0 [0.19098503-0.52359246j 0.22222356+0.j ] 3.0 [0.47153208+0.52701229j 0.15384681+0.j ] 4.0 [-0.61905937+0.30726255j 0.11764744+0.j ] 5.0 [0.02340997-0.61418799j 0.09523835+0.j ] 6.0 [0.58643071+0.339819j 0.08000018+0.j ] 7.0 [-0.52070105+0.44525141j 0.06896565+0.j ] 8.0 [-0.15986733-0.61234476j 0.06060616+0.j ] 9.0 [0.64850462+0.15048982j 0.05405414+0.j ] 10.0 [-0.38404699+0.56382299j 0.04878055+0.j ]