软问题:求解常微分方程的好库是什么?

计算科学 软件
2021-12-05 21:38:56

我知道一些:

a) R 项目

b)英特尔® 常微分方程求解器库

但是,我想知道哪些是由专业物理学家和数学家开发的最好的工具。我问的原因是我想自己从头开始构建一个 ODE 求解器,但我想在开始之前了解最先进的技术。

4个回答

一般来说,我会说以下开源工具往往(大致)是同类最佳的,按以下顺序排列:

  • PETSc 已将许多 ODE 求解器作为其时间步长例程 TS 的一部分。实现了许多积分器,包括 ARKIMEX、EIMEX、Rosenbrock-W、Crank-Nicolson、后向 Euler、几种 Runge-Kutta 方法(包括经典的 4-5 变体和 SSP 方案)、一般线性方法和一个接口到 SUNDIALS 中的 CVODE,这是一种 BDF 方法。它也是一个高度可扩展的并行库,具有消息传递和 GPU 编程功能,尽管我没有使用过 GPU 方面的东西。他们目前正在努力尝试使用线程。PETSc 用 C 语言编写,具有 Fortran 和 Python 接口;对于隐式方法,可以使用多种非线性求解器、线性求解器、非线性预条件子和线性预条件子。PETSc 荣获 R&D 100 奖,并拥有我所知道的科学代码的最佳开发实践。但是,它非常复杂。它包括大量示例和大型手册,以及良好的邮件列表。大量 PDE 工具和框架建立在 PETSc 之上,包括许多有限元代码。
  • Trilinos 在其 Rythmos 包中实现了前向 Euler、后向 Euler、显式 Runge-Kutta、隐式 Runge-Kutta 和 BDF 方法。它是用 C++ 编写的,也是并行实现的。与 PETSc 一样,Trilinos 也包含线性和非线性求解器,以及一些预处理器。Trilinos 往往需要对其生态系统进行更多“买入”,并且比 PETSc 更像是一个框架。
  • SUNDIALS 目前实现了 BDF 方法和 Adams-Bashforth 方法。它是用可读性很强的 C 代码编写的,并包含一些示例。它包含串行和并行实现,内部开发版本增加了线程和 ARKIMEX 方法。我对这段代码非常熟悉,如果你想使用积分器而不需要学习庞大的框架,SUNDIALS 是一个合理的选择。但是,我发现他们的开发实践令人沮丧。他们很少发布,如果您在他们发布的代码中发现错误(其中有很多),他们可能已经在内部修复了它,而没有让他们的邮件列表知道。代码没有正式的公共存储库,但如果您深入研究,您可以找到非正式的 Git 存储库。如果他们发布补丁,补丁格式是相当非正式的,patch. 在过去的一年里,他们的邮件列表也黑了几个月(披露:我和 SUNDIALS 的作者在同一个机构工作,所以我敦促他们修复这个疏忽)。请谨慎使用此代码。还有一个官方的 MATLAB 接口,一个官方的 Fortran 接口,以及一些其他语言的非官方接口,比如 Python。
  • 那里有许多 Fortran 代码,例如 Ernst Hairer 的实现(DOPRI5 - 显式 Runge-Kutta 4(5) 方法,DOP853 - 显式 Runge-Kutta 8(5,3) 方法,RADAU - Radau 搭配,RODAS - Rosenbrock 方法)、SUNDIALS 相关代码的旧版本(VODE、DASPK)和非常古老的刚性求解器(DASAC、DASSL)。其中一些已经封装在 Python 中(通过 SciPy),其中一些已经移植到其他语言。其中大多数是严格的序列代码,但它们是值得信赖的实现。

我不愿推荐 MATLAB,因为尽管 MATLAB 求解器通常都很好,但它们只能与专有的 MATLAB 一起使用。如果您有 MATLAB 可用,那么在使用串行代码方面可以很好地学习它们。其中一些基于我提到的 Fortran 代码。如果您无法访问 MATLAB,则很难使用求解器代码(我相信您仍然可以找到它,但您将无法执行它)。您应该能够试验我上面提到的所有开源代码,而不必担心许可问题。

如果您使用的是 C++,odeintboost 库似乎快速且易于使用: http: //www.boost.org/doc/libs/1_56_0/libs/numeric/odeint/doc/html/index.htmlboost库被称为高质量的软件包并且被广泛使用。

本例所示,它们还有一个ode45-like 积分器。

Matlab 有不错的 ODE 求解器。ode45很受欢迎(四阶龙格-库塔),但显然还有更多。例如,请参见此处

我已经使用八度有一段时间了。它是 Matlab 的开源表亲,它有许多不错的求解器 lsode 用于 odes 和 daspk 用于 DAE 是我使用的,它们非常好。