OdeSolver#
- class scipy.integrate.OdeSolver(fun, t0, y0, t_bound, vectorized, support_complex=False)[源代码][源代码]#
ODE 求解器的基类。
为了实现一个新的求解器,你需要遵循以下指南:
构造函数必须接受基类中列出的参数(如下所示)以及特定于求解器的任何其他参数。
构造函数必须接受任意多余的参数
**extraneous,但使用 common.warn_extraneous 函数警告这些参数是无关的。不要将这些参数传递给基类。求解器必须实现一个私有方法 _step_impl(self),该方法将求解器推进一步。它必须返回元组
(success, message),其中success是一个布尔值,指示步骤是否成功,而message是一个字符串,包含步骤失败时的描述,否则为 None。求解器必须实现一个私有方法 _dense_output_impl(self),该方法返回一个覆盖最后一个成功步骤的
DenseOutput对象。求解器必须在属性部分列出以下属性。请注意,
t_old和step_size会自动更新。使用 fun(self, t, y) 方法进行系统右侧的评估,这样函数评估的次数 (nfev) 将被自动跟踪。
为了方便,一个基类提供了 fun_single(self, t, y) 和 fun_vectorized(self, t, y) 分别用于以非向量化和向量化的方式评估右端项(无论构造函数中的 fun 是如何实现的)。这些调用不会增加 nfev。
如果一个求解器使用雅可比矩阵和LU分解,它应该记录雅可比矩阵的评估次数(njev)和LU分解的次数(nlu)。
按照惯例,用于计算雅可比矩阵有限差分近似的函数求值不应计入 nfev 中,因此在计算雅可比矩阵的有限差分近似时,请使用 fun_single(self, t, y) 或 fun_vectorized(self, t, y)。
- 参数:
- 有趣可调用
系统右侧:状态
y在时间t的导数。调用签名是fun(t, y),其中t是一个标量,y是一个 ndarray,且len(y) = len(y0)。fun必须返回一个与y形状相同的数组。更多信息请参见 vectorized。- t0浮动
初始时间。
- y0类数组, 形状 (n,)
初始状态。
- t_bound浮动
边界时间 — 整合不会超过这个时间。它还决定了整合的方向。
- 矢量化布尔
fun 是否可以以矢量化方式调用。默认为 False。
如果
vectorized为 False,fun 将总是以形状为(n,)的y被调用,其中n = len(y0)。如果
vectorized为 True,fun 可能会被调用,参数y的形状为(n, k),其中k是一个整数。在这种情况下,fun 必须表现得使得fun(t, y)[:, i] == fun(t, y[:, i])``(即返回数组的每一列是对应于 ``y的每一列的状态的时间导数)。设置
vectorized=True允许通过 ‘Radau’ 和 ‘BDF’ 方法更快地进行有限差分近似雅可比矩阵,但对于其他方法会导致执行速度变慢。在某些情况下(例如len(y0)较小时),它也可能导致 ‘Radau’ 和 ‘BDF’ 的整体执行速度变慢。- 支持复杂bool, 可选
是否支持在复杂领域中的集成。通常由派生的求解器类能力决定。默认值为 False。
- 属性:
- n整数
方程的数量。
- 状态字符串
求解器的当前状态:’运行中’、’已完成’ 或 ‘失败’。
- t_bound浮动
边界时间。
- 方向浮动
集成方向:+1 或 -1。
- t浮动
当前时间。
- yndarray
当前状态。
- t_old浮动
上次时间。如果没有进行任何步骤,则为 None。
- 步长浮动
最后一次成功步骤的大小。如果还没有进行任何步骤,则为 None。
- nfev整数
系统右侧评估的次数。
- njev整数
雅可比矩阵的求值次数。
- nlu整数
LU 分解的次数。
方法
计算上一个成功步骤上的局部插值。
step()执行一个积分步骤。