我正在尝试求解复杂的微分方程组。这些方程是刚性的,因此我需要使用一种可以处理复杂的 ODE 和刚度切换的方法。我已经使用
odeintw
(
link
) 来解决我的问题,但是我还需要事件处理。
我尝试使用
solve_ivp
和 | 来解决问题||,但是评估花费了不合理的时间。
BDF
是否有一个现有的框架,例如
,它允许我使用
odeintw
和
solve_ivp
方法来求解复杂的微分方程?或者有什么方法可以用
LSODA
来实现事件处理?
odeintw
?
不幸的是,没有简单的方法可以使用
solve_ivp
的事件检测功能直接与
odeintw
一起使用。
solve_ivp
是为实值 ODE 设计的,而
odeintw
专门用于复值 ODE。
但是,有一些选项可以探索以解决的问题:
- 将的复值 ODE 系统转换为实值系统:
-可以通过将实部和虚部视为单独的变量,将的复值 ODE 系统转换为等效的实值系统。例如,如果的复变量为
z = x + iy
,可以将其重写为两个实变量
x
和
y
,其中
dz/dt = f(z,t)
变为:
dx/dt = Re(f(x + iy, t))
dy/dt = Im(f(x + iy, t))
-这个新的实值系统现在可以使用
solve_ivp
及其事件检测功能来解决。
-
缺点:
此方法可能会增加系统的大小和复杂性,从而可能影响性能。
-
手动实现事件检测,同时使用
odeintw
:
-可以通过在每个时间步长后检查事件条件来手动实现事件检测。
-将的集成时间跨度划分为更小的子步长,并使用
odeintw
在每个子步长上求解 ODE。
-在每个子步长之后,检查的事件条件是否已满足。如果是,则找到了该事件。可能需要使用插值来估计事件发生的精确时间。
-
缺点:
此方法需要更多的手动工作,并且可能不像
solve_ivp
的事件检测机制那样高效或准确。
- 探索其他具有复值 ODE 支持和事件检测的 ODE 求解器:
- JiTCODE :JiTCODE(https://jitcode.readthedocs.io/)是一个 Python 包,它允许即时编译 ODE 系统,包括复值系统,并支持事件检测。 - PyDSTool :PyDSTool(https://www.pydstool.org/)是一个更通用的动态系统工具箱,它支持复值 ODE 和事件。 -这些工具可能提供更直接的方法来处理的特定问题。
选择最佳方法取决于的特定问题、性能要求和编码偏好。如果性能至关重要,并且需要强大的事件检测功能,则将的系统转换为实值系统并使用
solve_ivp
可能是最有效的选择。但是,如果的问题需要特别适合于复值 ODE 的
odeintw
,那么手动实现事件检测或探索其他工具(如 JiTCODE 或 PyDSTool)可能是更合适的方法。