scipy.integrate.

BDF#

class scipy.integrate.BDF(fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, first_step=None, **extraneous)[原始碼]#

基於後向微分公式的隱式方法。

這是一種變階方法,其階數會自動在 1 到 5 之間變化。BDF 演算法的一般框架在 [1] 中描述。此類別實作了準恆定步長,如 [2] 中所解釋。恆定步長 BDF 的誤差估計策略在 [3] 中推導出來。使用修改公式 (NDF) [2] 的精度增強也已實作。

可以應用於複數域。

參數:
fun可呼叫物件(callable)

系統的右側:狀態 y 在時間 t 的時間導數。呼叫簽名為 fun(t, y),其中 t 是純量,而 y 是具有 len(y) = len(y0) 的 ndarray。fun 必須傳回與 y 相同形狀的陣列。有關更多資訊,請參閱 vectorized

t0float

初始時間。

y0array_like,形狀 (n,)

初始狀態。

t_boundfloat

邊界時間 - 積分不會超出此時間繼續進行。它也決定了積分的方向。

first_stepfloat 或 None,選用

初始步長。預設值為 None,表示演算法應自行選擇。

max_stepfloat,選用

允許的最大步長。預設值為 np.inf,即步長不受限制,僅由求解器決定。

rtol, atolfloat 和 array_like,選用

相對和絕對容差。求解器保持局部誤差估計值小於 atol + rtol * abs(y)。此處 rtol 控制相對精度(正確位數),而 atol 控制絕對精度(正確小數位數)。為了達到所需的 rtol,請將 atol 設定為小於可以從 rtol * abs(y) 預期的最小值,以便 rtol 主導允許的誤差。如果 atol 大於 rtol * abs(y),則不保證正確位數。相反地,為了達到所需的 atol,請設定 rtol,使 rtol * abs(y) 始終小於 atol。如果 y 的分量具有不同的尺度,則為不同的分量設定不同的 atol 值可能有利,方法是為 atol 傳遞形狀為 (n,) 的 array_like。預設值為 rtol 的 1e-3 和 atol 的 1e-6。

jac{None, array_like, sparse_matrix, 可呼叫物件(callable)},選用

系統右側對於 y 的 Jacobian 矩陣,此方法需要。Jacobian 矩陣的形狀為 (n, n),其元素 (i, j) 等於 d f_i / d y_j。有三種定義 Jacobian 的方式

  • 如果為 array_like 或 sparse_matrix,則假定 Jacobian 為常數。

  • 如果為可呼叫物件,則假定 Jacobian 取決於 t 和 y;在必要時將呼叫為 jac(t, y)。對於 'Radau' 和 'BDF' 方法,傳回值可能是稀疏矩陣。

  • 如果為 None(預設值),則 Jacobian 將透過有限差分法近似。

通常建議提供 Jacobian,而不是依賴有限差分近似。

jac_sparsity{None, array_like, sparse matrix},選用

定義 Jacobian 矩陣的稀疏結構,用於有限差分近似。其形狀必須為 (n, n)。如果 jac 不是 None,則會忽略此引數。如果 Jacobian 在行中只有少數非零元素,則提供稀疏結構將大大加快計算速度 [4]。零條目表示 Jacobian 中對應的元素始終為零。如果為 None(預設值),則假定 Jacobian 為密集矩陣。

vectorizedbool,選用

是否可以向量化方式呼叫 fun。預設值為 False。

如果 vectorized 為 False,則始終使用形狀為 (n,)y 呼叫 fun,其中 n = len(y0)

如果 vectorized 為 True,則可以使用形狀為 (n, k)y 呼叫 fun,其中 k 為整數。在這種情況下,fun 的行為必須使得 fun(t, y)[:, i] == fun(t, y[:, i])(即,傳回陣列的每列都是與 y 的列對應的狀態的時間導數)。

設定 vectorized=True 允許此方法更快地進行 Jacobian 的有限差分近似,但在某些情況下(例如,小的 len(y0))可能會導致整體執行速度變慢。

參考文獻

[1]

G. D. Byrne, A. C. Hindmarsh, “用於常微分方程式數值解的多重演算法”,ACM Transactions on Mathematical Software,第 1 卷,第 1 期,第 71-96 頁,1975 年 3 月。

[2] (1,2)

L. F. Shampine, M. W. Reichelt, “THE MATLAB ODE SUITE”,SIAM J. SCI. COMPUTE.,第 18 卷,第 1 期,第 1-22 頁,1997 年 1 月。

[3]

E. Hairer, G. Wanner, “解常微分方程式 I:非剛性問題”,第 III.2 節。

[4]

A. Curtis, M. J. D. Powell, 和 J. Reid, “關於稀疏 Jacobian 矩陣的估計”,Journal of the Institute of Mathematics and its Applications,13,第 117-120 頁,1974 年。

屬性:
nint

方程式數量。

statusstring

求解器的目前狀態:「running」、「finished」或「failed」。

t_boundfloat

邊界時間。

directionfloat

積分方向:+1 或 -1。

tfloat

目前時間。

yndarray

目前狀態。

t_oldfloat

先前時間。如果尚未執行任何步驟,則為 None。

step_sizefloat

上次成功步驟的大小。如果尚未執行任何步驟,則為 None。

nfevint

右側的評估次數。

njevint

Jacobian 的評估次數。

nluint

LU 分解的次數。

方法

dense_output()

計算最後成功步驟的局部內插值。

step()

執行一個積分步驟。