OdeSolver#
- class scipy.integrate.OdeSolver(fun, t0, y0, t_bound, vectorized, support_complex=False)[source]#
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)。
- 参数:
- fun可调用对象
系统的右侧项:状态
y
在时间t
的时间导数。调用签名是fun(t, y)
,其中t
是一个标量,y
是一个形状为len(y) = len(y0)
的 ndarray。fun
必须返回与y
相同形状的数组。详见 vectorized。- t0浮点数
初始时间。
- y0类数组, 形状 (n,)
初始状态。
- t_bound浮点数
边界时间 — 积分不会超过此时间。它也决定了积分的方向。
- 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’ 方法更快地进行雅可比矩阵的有限差分近似,但对于其他方法会导致执行速度变慢。在某些情况下(例如len(y0)
很小),它也可能导致 ‘Radau’ 和 ‘BDF’ 的整体执行速度变慢。- support_complex布尔值, 可选
是否应支持复数域中的积分。通常由派生求解器类的功能决定。默认为 False。
- 属性:
- n整数
方程数量。
- status字符串
求解器的当前状态:‘running’(运行中)、‘finished’(已完成)或 ‘failed’(失败)。
- t_bound浮点数
边界时间。
- direction浮点数
积分方向:+1 或 -1。
- t浮点数
当前时间。
- yndarray
当前状态。
- t_old浮点数
上一时间。如果尚未执行任何步骤,则为 None。
- step_size浮点数
上次成功步骤的大小。如果尚未执行任何步骤,则为 None。
- nfev整数
系统右侧项评估次数。
- njev整数
雅可比评估次数。
- nlu整数
LU 分解次数。
方法
计算最后成功步骤的局部插值。
step
()执行一次积分步骤。