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)
設定。
- f可呼叫物件
註解
以下列出可用的積分器。 可以使用
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
目前變數值。
方法
提取積分的返回碼,以便在積分失敗時實現更好的控制。
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)設定在每個成功的積分步驟呼叫的可呼叫物件。
檢查積分是否成功。