数值求解大型非线性 ODE 系统:我需要考虑什么才能确定使用哪个求解器?

计算科学 非线性方程
2021-12-04 06:21:32

我更喜欢不需要使用专有工具(如 Matlab)的建议。我知道 Python 生态系统的两个 ODE 求解选项:

  1. PyDSTool(Dopri、Radau、其他 Runge-Kutta 方法以及任何scipy.integrate.ode可以访问的方法)
  2. scipy.integrate来自 Fortran 库的scipy.integrate.odeint使用——求解器根据问题的刚度决定是使用 Adams 方法还是 BDF 方法;dopri5 和 dopri853 也可用,以及一些用于复杂 ODE 系统的求解器)lsodaodepack

我喜欢 Python,因为我现在可以编写 C 速度代码,并结合使用由Cython等包提供的 Python 到 C 编译器的 Python 灵活性。另外,一切都是开源的!

在我与 PyDSTool 开发人员的早期对话中,我知道他提出 Radau 可能特别适用于非线性、僵硬的 ODE 问题——而且 PyDSTool 包含的纯 C 实现肯定会比scipy.integrate标准 ODE 求解器快得多. 我当时并不能很好地理解他,仅仅是因为我缺乏数学背景(我是一名数学本科生,最近从工科转来)。您能否评论一下这样的问题 - 特别是,我需要确定我的问题的哪些特征才能找出最适合我的非线性 ODE 系统的求解器?

1个回答

考虑问题的刚性、非线性的强度、任何模型的非平滑性以及所需的精度。比较方法的标准方法是使用“工作精度”图(CPU 时间与误差的对数图,每种方法都有一条线)。Hairer 和 Wanner 的书籍包括对一系列问题的方法的全面比较。您可以通过查看他们书中哪些方法适用于哪些问题(针对棘手问题的第 2 卷)或查找对与您的问题类似的问题进行此类比较的论文来获得一些见解。