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

系统的右侧:状态 y 在时间 t 的时间导数。调用签名是 fun(t, y),其中 t 是标量,y 是一个 len(y) = len(y0) 的 ndarray。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` 的分量具有不同的尺度,则通过为 atol 传递形状为 `(n,)` 的类数组对象,为不同分量设置不同的 atol 值可能会有益。默认值 *rtol* 为 1e-3,*atol* 为 1e-6。

jac{None, 类数组对象, 稀疏矩阵, 可调用对象},可选

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

  • 如果为类数组对象或稀疏矩阵,则雅可比矩阵假定为常数。

  • 如果为可调用对象,则雅可比矩阵假定依赖于 `t` 和 `y`;必要时将以 jac(t, y) 形式调用。对于 ‘Radau’ 和 ‘BDF’ 方法,返回值可能是稀疏矩阵。

  • 如果为 None(默认),雅可比矩阵将通过有限差分近似。

通常建议提供雅可比矩阵,而不是依赖有限差分近似。

jac_sparsity{None, 类数组对象, 稀疏矩阵},可选

定义雅可比矩阵用于有限差分近似的稀疏结构。其形状必须是 `(n, n)`。如果 jac 不为 None,则忽略此参数。如果雅可比矩阵的*每*行只有少数非零元素,提供稀疏结构将大大加快计算速度 [4]。零项意味着雅可比矩阵中相应的元素始终为零。如果为 None(默认),则假定雅可比矩阵是稠密的。

vectorized布尔值,可选

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

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

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

vectorized=True 设置为 True 可以让此方法更快地进行雅可比矩阵的有限差分近似,但在某些情况下(例如 len(y0) 较小)可能会导致整体执行速度变慢。

属性:
n整数

方程数量。

status字符串

求解器的当前状态:‘运行中’、‘已完成’ 或 ‘失败’。

t_bound浮点数

边界时间。

direction浮点数

积分方向:+1 或 -1。

t浮点数

当前时间。

yndarray

当前状态。

t_old浮点数

上一个时间点。如果尚未进行任何步进,则为 None。

step_size浮点数

上一次成功步进的步长。如果尚未进行任何步进,则为 None。

nfev整数

右侧评估次数。

njev整数

雅可比矩阵评估次数。

nlu整数

LU 分解次数。

方法

dense_output()

计算上一次成功步进的局部插值函数。

step()

执行一次积分步进。

参考文献

[1]

G. D. Byrne, A. C. Hindmarsh, “A Polyalgorithm for the Numerical Solution of Ordinary Differential Equations”, ACM Transactions on Mathematical Software, Vol. 1, No. 1, pp. 71-96, March 1975。

[2] (1,2)

L. F. Shampine, M. W. Reichelt, “THE MATLAB ODE SUITE”, SIAM J. SCI. COMPUTE., Vol. 18, No. 1, pp. 1-22, January 1997。

[3]

E. Hairer, G. Wanner, “Solving Ordinary Differential Equations I: Nonstiff Problems”, Sec. III.2。

[4]

A. Curtis, M. J. D. Powell, and J. Reid, “On the estimation of sparse Jacobian matrices”, Journal of the Institute of Mathematics and its Applications, 13, pp. 117-120, 1974。