scipy.integrate.

BDF#

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可调用对象

系统的右手边:状态的时间导数 y 在时间 t 的时候。调用签名是 fun(t, y),其中 t 是标量,y 是数组,并且 len(y) = len(y0)fun 必须返回一个与 y 具有相同形状的数组。有关更多信息,请参阅 vectorized

t0浮点

初始时间。

y0数组形式,形状为 (n,)

初始状态。

t_bound浮点

边界时间——合并不会在该边界之外继续。它还确定了合并的方向。

first_step浮点或 None,可选

初始步长。默认值为 None,这意味着算法会自行选择。

max_step浮点,可选

允许的最大步长。默认值为 np.inf,即步长不受限制,且完全由求解器决定。

rtol, atol浮点和数组形式,可选

相对和绝对容差。求解器可保留局部误差估计值低于 atol + rtol * abs(y)。其中,rtol 控制相对精度(正确位数),而 atol 控制绝对精度(正确小数位数)。要实现所需 rtol,请将 atol 设置为比 rtol * abs(y) 所能得到的最小值更小,以便 rtol 占主导地位出现允许出现的误差。如果 atol 大于 rtol * abs(y),则无法保证正确位数。相反,要实现所需的 atol,请设置 rtol,使其使 rtol * abs(y) 一直小于 atol。如果 y 组件具有不同比例,则传入形状为 (n,) 的 array_like 设置不同组件的不同 atol 值可能会有帮助,以获取 atol。对于 rtol,默认值为 1e-3,对于 atol,默认值为 1e-6。

jac{None, array_like, sparse_matrix, callable}, 可选

系统右侧相对于 y 的雅可比矩阵,此方法要求使用此矩阵。雅可比矩阵形状为 (n, n),且其元素 (i, j) 等于 d f_i / d y_j。定义雅可比分三种方式

  • 如果是 array_like 或 sparse_matrix,则认为雅可比不变。

  • 如果是 callable,则认为雅可比取决于 t 和 y;它将按需要调用作为 jac(t, y)。对于“Radau”和“BDF”方法,返回值可能是稀疏矩阵。

  • 如果是 None(默认值),则将通过有限差分逼近雅可比。

通常建议提供雅可比而不是依靠有限差分逼近。

jac_sparsity{None, array_like, sparse matrix}, 可选

定义有限差分逼近的雅可比矩阵的稀疏性结构。其形状必须为 (n, n)。如果 jac 不为 None,则忽略此参数。如果雅可比中 每个 行的非零元素很少,提供稀疏性结构将极大地加快计算速度 [4]。零条目表示雅可比中对应的元素始终为零。如果为 None(默认值),则认为雅可比很稠密。

vectorized布尔值,可选

是否可以通过矢量化方式调用fun。默认值为 False。

如果vectorized为 False,则始终使用y(形状为(n,),其中n = len(y0))调用fun

如果vectorized为 True,则可以使用y(形状为(n, k),其中k为一个整数)调用fun。在这种情况下,fun的行为必须使得fun(t, y)[:, i] == fun(t, y[:, i])(即,返回数组的每一列对应于y的一列状态的时间导数)。

通过此方法设置vectorized=True可以较快地近似雅可比行列式的有限差分,但在某些情况下(例如len(y0)较小)整体执行速度会更慢。

参考文献

[1]

G. D. Byrne,A. C. Hindmarsh,“求解常微分方程组的 Polyalgorithm”,ACM 数学软件事务,第 1 卷,第 1 号,第 71-96 页,1975 年 3 月。

[2] (1,2)

L. F. Shampine,M. W. Reichelt,“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,“关于稀疏雅可比矩阵的估计”,数学及其应用研究所杂志,13,第 117-120 页,1974 年。

属性:
nint

方程数。

status字符串

求解器的当前状态:‘running’,‘finished’ 或 ‘failed’。

t_bound浮点

边界时间。

direction浮点数

积分方向:+1 或 -1。

t浮点数

当前时间。

yndarray

当前状态。

t_old浮点数

上一个时间。如果尚未采取步骤,则为无。。

step_size浮点数

最近成功步骤的大小。如果尚未采取步骤,则为无。

nfevint

右手边评估次数。

njevint

雅可比矩阵评估次数。

nluint

LU 分解次数。

方法

dense_output 的()

根据上一次成功进行的步长计算一个局部中插值。

step()

执行一个积分步长。