开发特定问题的 ODE 求解器有哪些技巧?

计算科学 软件
2021-12-12 00:34:03

我有一个描述化学反应的刚性 ODE 的小型系统。右手边相当复杂,雅可比也一样。这个方程将在不同的初始条件下多次求解。鉴于我已经选择了一种面向刚度的方法,创建比某些现有求解器更有效的代码是否真的可行?例如,是否值得尝试通过循环展开或其他方式为我的小型系统优化 LU 分解?

这个线程中给出了一些一般性的想法,但也许有一些关于刚性 ODE 解决方案的提示?

更新:只有三个方程。我正在使用 Fortran 并比较了 RADAU(隐式 RK)、RODAS(Rosenbrock)和 DLSODE(BDF 方法)代码的效率。RODAS 似乎工作得更快一些。

1个回答

我假设您已经验证了您的系统是僵硬的?否则,您可能会因使用隐式求解器而付出巨大的性能损失。

我建议的下一件事是从您正在使用的 ODE 求解器中收集更多数据。通常这种数据在一些额外的输出变量中可用,或者通过打开某种详细的输出标志来获得。

  1. 解中时间步的总数。
  2. 最小和最大时间步长。
  3. 解中时间步更改的次数。
  4. 雅可比行列式更新和分解的次数。

你说你的 RHS 很复杂,所以我猜你的问题可能是非常非线性的。该算法会改变时间步长,要么是因为问题非常非线性,算法难以获得收敛解,要么是因为它没有满足指定的精度要求(你是否尝试过不同的精度容差?)雅可比格式和分解的数量,这些例程可能是优化的候选者。

您可能想要实现一个简单的固定时间步长反向欧拉求解器,并查看求解时间与现成的求解器相比如何。

最后,如果您能够从上述实验中了解您的 ODE 系统的特征,您可以尝试分析您的代码。如果您在 Linux 上运行,您可以使用 gprof 或 valgrind/callgrind ( http://valgrind.org/docs/manual/cl-manual.html ) 来获取有关时间花费的数据。