LSODA#
- 类 scipy.integrate.LSODA(fun, t0, y0, t_bound, first_step=空, min_step=0.0, max_step=inf, rtol=0.001, atol=1e-06, jac=空, lband=空, uband=空, vectorized=假, **extraneous)[源代码]#
Adams/BDF 方法,带自动刚度检测和切换。
这是来自 ODEPACK 中 Fortran 求解器的包装器 [1]。它会自动在非刚性 Adams 方法和刚性 BDF 方法之间切换。该方法最初在 [2] 中详细介绍。
- 参数:
- fun可调用
系统右端:状态
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
,这意味着算法应该选择。- min_stepfloat,可选
允许的最小步长。默认为 0.0,即不限制步长,由求解器单独确定。
- 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 的组件具有不同的刻度,通过传递形状为 (n,) 的数组_like,为 atol 的不同组件设置不同的 atol 值可能是有益的。 rtol 的默认值为 1e-3, atol 的默认值为 1e-6。- jac无,或可调用,可选
关于
y
的系统右手边的雅可比矩阵。雅可比矩阵的形状为 (n, n),其元素 (i, j) 等于d f_i / d y_j
。该函数将被调用为jac(t, y)
。如果为 None(默认值),雅可比矩阵将通过有限差分近似。通常建议实际提供雅可比矩阵,而不是依赖有限差分近似。- lband, uband整数或 None
定义雅可比矩阵带宽的参数,即
jac[i, j] != 0 only for 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
一起使用以减少有限差分估计的雅可比矩阵元素的数量。- 矢量化bool,可选
是否能以矢量化方式调用fun。对于此解算器,建议设为 False(默认值)。
如果
vectorized
是 False,则fun 总是会被以形状为(n,)
的y
调用,其中n = len(y0)
。如果
vectorized
是 True,则可以以形状为(n, k)
的y
来调用fun,其中k
是一个整数。在这种情况下,fun 的行为必须为fun(t, y)[:, i] == fun(t, y[:, i])
(即返回数组的每一列都是与y
的一列相对应的状态的时间导数)。设置
vectorized=True
可通过方法“Radau”和“BDF”更快速地进行雅可比的有限差分逼近,但会导致该求解器的执行速度变慢。
参考
[1]A. C. Hindmarsh,“ODEPACK,ODE求解器的系统化集合,”IMACS科学计算事务,第1卷,第55-64页,1983年。
[2]L. Petzold,“自动选择方法来求解常微分方程的刚性和非刚性系统”,SIAM科学与统计计算杂志,第4卷,第1号,第136-148页,1983年。
- 属性:
- nint
方程式数。
- statusstring
求解器的当前状态:“运行中”、“已完成”或“失败”。
- t_boundfloat
边界时间。
- directionfloat
积分方向:+1或-1。
- tfloat
当前时间。
- yndarray
当前状态。
- t_oldfloat
前一时间。如果尚未进行任何步骤,则为无。
- nfevint
右手边评估次数。
- njevint
雅可比评估次数。
方法
计算最近成功步骤上的局部插值器。
step
()执行一个积分步骤。