scipy.integrate.

LSODA#

class scipy.integrate.LSODA(fun, t0, y0, t_bound, first_step=None, min_step=0.0, max_step=inf, rtol=0.001, atol=1e-06, jac=None, lband=None, uband=None, vectorized=False, **extraneous)[源]#

具有自动刚度检测和切换功能的 Adams/BDF 方法。

这是 ODEPACK [1] 中 Fortran 求解器的封装。它在非刚性 Adams 方法和刚性 BDF 方法之间自动切换。该方法最初在 [2] 中详细说明。

参数:
fun可调用对象

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

t0浮点数

初始时间。

y0类数组, 形状 (n,)

初始状态。

t_bound浮点数

边界时间 - 积分不会超过此时间。它也决定了积分的方向。

first_step浮点数或 None,可选

初始步长。默认值为 None,表示算法应自动选择。

min_step浮点数,可选

允许的最小步长。默认值为 0.0,即步长不受限制,完全由求解器决定。

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。

jacNone 或 可调用对象,可选

系统右侧关于 y 的雅可比矩阵。雅可比矩阵的形状为 (n, n),其元素 (i, j) 等于 d f_i / d y_j。该函数将以 jac(t, y) 的形式调用。如果为 None(默认),则雅可比矩阵将通过有限差分近似。通常建议提供雅可比矩阵,而不是依赖于有限差分近似。

lband, uband整数或 None

定义雅可比带宽的参数,即 jac[i, j] != 0 仅当 i - lband <= j <= i + uband 时。设置这些参数要求您的 jac 例程以紧凑格式返回雅可比矩阵:返回的数组必须有 n 列和 uband + lband + 1 行,其中写入了雅可比对角线。具体来说,jac_packed[uband + i - j , j] = jac[i, j]。相同的格式用于 scipy.linalg.solve_banded(请查看示例)。这些参数也可以与 jac=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 允许使用 ‘Radau’ 和 ‘BDF’ 方法更快地进行雅可比的有限差分近似,但会导致此求解器的执行速度变慢。

属性:
n整数

方程数量。

status字符串

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

t_bound浮点数

边界时间。

direction浮点数

积分方向:+1 或 -1。

t浮点数

当前时间。

yndarray

当前状态。

t_old浮点数

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

nfev整数

右侧求值次数。

njev整数

雅可比求值次数。

方法

dense_output()

计算最后成功步骤的局部插值。

step()

执行一个积分步骤。

参考文献

[1]

A. C. Hindmarsh, “ODEPACK, A Systematized Collection of ODE Solvers,” IMACS Transactions on Scientific Computation, Vol 1., pp. 55-64, 1983.

[2]

L. Petzold, “Automatic selection of methods for solving stiff and nonstiff systems of ordinary differential equations”, SIAM Journal on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148, 1983.