scipy.integrate.

ode#

class scipy.integrate.ode(f, jac=None)[source]#

數值積分器的通用介面類別。

解方程式系統 \(y'(t) = f(t,y)\),具有(可選)jac = df/dy

注意f(t, y, ...) 的前兩個參數順序與 scipy.integrate.odeint 所使用的系統定義函數中的參數順序相反。

參數:
f可呼叫物件 f(t, y, *f_args)

微分方程式的右側。 t 是一個純量,y.shape == (n,)f_args 通過呼叫 set_f_params(*args) 設定。f 應返回純量、陣列或列表(而非元組)。

jac可呼叫物件 jac(t, y, *jac_args), 選項性

右側的 Jacobian 矩陣,jac[i,j] = d f[i] / d y[j]jac_args 通過呼叫 set_jac_params(*args) 設定。

另請參閱

odeint

一個基於 ODEPACK 中 lsoda 的更簡單介面之積分器

quad

用於尋找曲線下面積

註解

以下列出可用的積分器。 可以使用 set_integrator 方法選擇。

“vode”

實數值變係數常微分方程式求解器,具有固定前導係數實現。 它提供了隱式 Adams 方法(用於非剛性問題)和基於向後微分公式 (BDF) 的方法(用於剛性問題)。

來源:http://www.netlib.org/ode/vode.f

警告

此積分器不可重入。 您不能同時使用兩個使用 “vode” 積分器的 ode 實例。

此積分器在 set_integrator 方法中接受以下參數 ode 類別

  • atol : float 或序列 解的絕對容差

  • rtol : float 或序列 解的相對容差

  • lband : None 或 int

  • uband : None 或 int Jacobian 帶寬,jac[i,j] != 0 for i-lband <= j <= i+uband。 設定這些需要您的 jac 常式以壓縮格式返回 Jacobian 矩陣,jac_packed[i-j+uband, j] = jac[i,j]。 矩陣的維度必須為 (lband+uband+1, len(y))。

  • method: ‘adams’ 或 ‘bdf’ 要使用的求解器,Adams(非剛性)或 BDF(剛性)

  • with_jacobian : bool 僅當使用者未提供 Jacobian 函數且未指示(通過設定任一帶寬)Jacobian 矩陣為帶狀矩陣時,才會考慮此選項。 在這種情況下,with_jacobian 指定 ODE 求解器校正步驟的迭代方法是使用內部產生的完整 Jacobian 矩陣進行弦迭代,還是不使用 Jacobian 矩陣進行函數迭代。

  • nsteps : int 在一次呼叫求解器期間允許的最大(內部定義)步數。

  • first_step : float

  • min_step : float

  • max_step : float 積分器使用的步長限制。

  • order : int 積分器使用的最大階數,Adams 的階數 <= 12,BDF 的階數 <= 5。

“zvode”

複數值變係數常微分方程式求解器,具有固定前導係數實現。 它提供了隱式 Adams 方法(用於非剛性問題)和基於向後微分公式 (BDF) 的方法(用於剛性問題)。

來源:http://www.netlib.org/ode/zvode.f

警告

此積分器不可重入。 您不能同時使用兩個使用 “zvode” 積分器的 ode 實例。

此積分器在 set_integrator 中接受與 “vode” 求解器相同的參數。

註解

當對剛性系統使用 ZVODE 時,它應僅用於函數 f 是解析函數的情況,也就是說,當每個 f(i) 都是每個 y(j) 的解析函數時。 解析性意味著偏導數 df(i)/dy(j) 是一個唯一的複數,並且這個事實對於 ZVODE 在剛性情況下求解出現的稠密或帶狀線性系統的方式至關重要。 對於 f 非解析的複數剛性 ODE 系統,ZVODE 很可能發生收斂失敗,對於這個問題,應該改為在等效的實數系統(在 y 的實部和虛部中)上使用 DVODE。

“lsoda”

實數值變係數常微分方程式求解器,具有固定前導係數實現。 它提供了隱式 Adams 方法(用於非剛性問題)和基於向後微分公式 (BDF) 的方法(用於剛性問題)之間的自動方法切換。

來源:http://www.netlib.org/odepack

警告

此積分器不可重入。 您不能同時使用兩個使用 “lsoda” 積分器的 ode 實例。

此積分器在 set_integrator 方法中接受以下參數 ode 類別

  • atol : float 或序列 解的絕對容差

  • rtol : float 或序列 解的相對容差

  • lband : None 或 int

  • uband : None 或 int Jacobian 帶寬,jac[i,j] != 0 for i-lband <= j <= i+uband。 設定這些需要您的 jac 常式以壓縮格式返回 Jacobian 矩陣,jac_packed[i-j+uband, j] = jac[i,j]。

  • with_jacobian : bool 未使用。

  • nsteps : int 在一次呼叫求解器期間允許的最大(內部定義)步數。

  • first_step : float

  • min_step : float

  • max_step : float 積分器使用的步長限制。

  • max_order_ns : int 非剛性情況下使用的最大階數(預設值 12)。

  • max_order_s : int 剛性情況下使用的最大階數(預設值 5)。

  • max_hnil : int 報告步長太小(t + h = t)的最大訊息數(預設值 0)

  • ixpr : int 是否在方法切換時產生額外列印(預設值 False)。

“dopri5”

這是 Dormand & Prince 的 (4)5 階顯式 Runge-Kutta 方法(具有步長控制和密集輸出)。

作者

E. Hairer and G. Wanner Universite de Geneve, Dept. de Mathematiques CH-1211 Geneve 24, Switzerland e-mail: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch

此程式碼在 [HNW93] 中描述。

此積分器在 ode 類別的 set_integrator() 方法中接受以下參數

  • atol : float 或序列 解的絕對容差

  • rtol : float 或序列 解的相對容差

  • nsteps : int 在一次呼叫求解器期間允許的最大(內部定義)步數。

  • first_step : float

  • max_step : float

  • safety : float 新步長選擇的安全係數(預設值 0.9)

  • ifactor : float

  • dfactor : float 在一步中增加/減少步長的最大因子

  • beta : float 用於穩定步長控制的 Beta 參數。

  • verbosity : int 用於列印訊息的開關(< 0 表示沒有訊息)。

“dop853”

這是 Dormand & Prince 的 8(5,3) 階顯式 Runge-Kutta 方法(具有步長控制和密集輸出)。

選項和參考文獻與 “dopri5” 相同。

參考文獻

[HNW93]

E. Hairer, S.P. Norsett and G. Wanner, Solving Ordinary Differential Equations i. Nonstiff Problems. 2nd edition. Springer Series in Computational Mathematics, Springer-Verlag (1993)

範例

要積分的問題和對應的 Jacobian 矩陣

>>> 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]]]

積分

>>> 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        ]
屬性:
tfloat

目前時間。

yndarray

目前變數值。

方法

get_return_code()

提取積分的返回碼,以便在積分失敗時實現更好的控制。

integrate(t[, step, relax])

找到 y=y(t),將 y 設定為初始條件,並返回 y。

set_f_params(*args)

為使用者提供的函數 f 設定額外參數。

set_initial_value(y[, t])

設定初始條件 y(t) = y。

set_integrator(name, **integrator_params)

依名稱設定積分器。

set_jac_params(*args)

為使用者提供的函數 jac 設定額外參數。

set_solout(solout)

設定在每個成功的積分步驟呼叫的可呼叫物件。

successful()

檢查積分是否成功。