scipy.integrate.

OdeSolver#

class scipy.integrate.OdeSolver(fun, t0, y0, t_bound, vectorized, support_complex=False)[源代码][源代码]#

ODE 求解器的基类。

为了实现一个新的求解器,你需要遵循以下指南:

  1. 构造函数必须接受基类中列出的参数(如下所示)以及特定于求解器的任何其他参数。

  2. 构造函数必须接受任意多余的参数 **extraneous,但使用 common.warn_extraneous 函数警告这些参数是无关的。不要将这些参数传递给基类。

  3. 求解器必须实现一个私有方法 _step_impl(self),该方法将求解器推进一步。它必须返回元组 (success, message),其中 success 是一个布尔值,指示步骤是否成功,而 message 是一个字符串,包含步骤失败时的描述,否则为 None。

  4. 求解器必须实现一个私有方法 _dense_output_impl(self),该方法返回一个覆盖最后一个成功步骤的 DenseOutput 对象。

  5. 求解器必须在属性部分列出以下属性。请注意,t_oldstep_size 会自动更新。

  6. 使用 fun(self, t, y) 方法进行系统右侧的评估,这样函数评估的次数 (nfev) 将被自动跟踪。

  7. 为了方便,一个基类提供了 fun_single(self, t, y)fun_vectorized(self, t, y) 分别用于以非向量化和向量化的方式评估右端项(无论构造函数中的 fun 是如何实现的)。这些调用不会增加 nfev

  8. 如果一个求解器使用雅可比矩阵和LU分解,它应该记录雅可比矩阵的评估次数(njev)和LU分解的次数(nlu)。

  9. 按照惯例,用于计算雅可比矩阵有限差分近似的函数求值不应计入 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 分解的次数。

方法

dense_output()

计算上一个成功步骤上的局部插值。

step()

执行一个积分步骤。