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) 方法进行系统 rhs 评估,这样函数评估的次数 (nfev) 将被自动跟踪。

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

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

  9. 按照惯例,用于计算雅可比矩阵的有限差分近似的函数评估不应计入 nfev,因此在计算雅可比矩阵的有限差分近似时,请使用 fun_single(self, t, y)fun_vectorized(self, t, y)

参数:
funcallable

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

t0float

初始时间。

y0array_like, shape (n,)

初始状态。

t_boundfloat

边界时间——积分不会超出它。它也决定了积分的方向。

vectorizedbool

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

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

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

vectorized=True 设置为 ‘Radau’ 和 ‘BDF’ 方法可以通过更快的有限差分逼近雅可比矩阵,但会导致其他方法的执行速度变慢。在某些情况下(例如,小的 len(y0)),它还可能导致 ‘Radau’ 和 ‘BDF’ 的整体执行速度变慢。

support_complexbool, optional

是否应支持复数域中的积分。通常由派生的求解器类功能确定。默认为 False。

属性:
nint

方程数量。

statusstring

求解器的当前状态:“running”、“finished” 或 “failed”。

t_boundfloat

边界时间。

directionfloat

积分方向:+1 或 -1。

tfloat

当前时间。

yndarray

当前状态。

t_oldfloat

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

step_sizefloat

最后一个成功步骤的大小。如果尚未执行任何步骤,则为 None。

nfevint

系统 rhs 评估的次数。

njevint

雅可比矩阵评估的次数。

nluint

LU 分解的次数。

方法

dense_output()

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

step()

执行一个积分步骤。