scipy.integrate.

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 von scipy.integrate.odeint verwendet wird.

Parameter:
faufrufbar f(t, y, *f_args)

Rechte Seite der Differentialgleichung. t ist eine Skalare, y.shape == (n,). f_args wird durch Aufruf von set_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_args wird durch Aufruf von set_jac_params(*args) gesetzt.

Attribute:
tfloat

Aktuelle Zeit.

yndarray

Aktuelle Variablenwerte.

Methoden

get_return_code()

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.

erfolgreich()

Prüft, ob die Integration erfolgreich war.

Siehe auch

odeint

ein Integrator mit einer einfacheren Schnittstelle, basierend auf lsoda aus ODEPACK

quad

zum Finden der Fläche unter einer Kurve

Hinweise

Verfügbare Integratoren sind unten aufgeführt. Sie können über die Methode set_integrator ausgewä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_integrator der Klasse ode

  • atol : 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_integrator wie 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_integrator der Klasse ode

  • atol : 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        ]