为什么 DifferentialEquations.jl 中的画面和显式求解器?

Why both tableau and explicit solver in DifferentialEquations.jl?

我正在查看 DifferentialEquations.jl 包。在 DiffEqDevTools/src/ode_tableaus.jl 我可以看到画面 MidpointRK4.

但我也可以在中看到这些方案的显式代码 OrdinaryDiffEq/src/integrators/fixed_timestep_integrators.jl.

我有点期待一些代码使用画面而不是那里 作为显式求解器。

我不知道如何检查画面是否被使用。 我尝试删除 OrdinaryDiffEq.jl 但我的示例不会 运行.

这表明正在使用显式代码。但在 那么为什么画面会存在呢?

是的,在大多数情况下不使用画面。事实上,只有在使用 ExplicitRK(tableau=...) 方法时才会使用画面。您可以在 DiffEqDevTools' tests 中看到对每一个的收敛测试,但除此之外它们通常不被使用。

这是因为基于画面的实现往往效率不高。摆脱因使用指向常量的指针而导致的间接寻址对运行时具有可衡量的影响。当然,在用户的 f 极其昂贵的渐近极限中,实现细节无关紧要,但大多数真实世界的案例都不在该极限内,正如真实基准所证明的那样(在该极限下,您应该使用多步骤方法aynways)。因此,有最有效的 Runge-Kutta 方法的硬编码版本和硬编码的高阶插值方案,因为这些是主力方法,应该获得最大效率。

那么为什么会有这些画面呢?我认为需要注意的是 DifferentialEquations.jl 不仅仅是一个使用微分方程的软件包,它还是一个用于开发和测试新方法的软件包。 the testing features in the devdocs 证明了这一点。对于具有更高效实现的算法,tableaus 仍然具有开发用途,因为 tableaus 都具有相同的实现,因此这提供了一种简单的科学方法来确定方法之间的真正效率。拥有画面不仅可以比较效率,还可以使用绘图方法比较稳定区域:

plot(constructRK4())

This large tableau library was used to comb through all of the RK methods and create modernized choices. I posted some haphazard notes written about it, and documented some parts more extensively in a CompSci SO post。这些都是用开发工具做的实验。

最后,DifferentialEquations.jl 确实是独一无二的,因为它不仅仅是您之前看到的内容的重新实现。与之前相比的一个明显变化是,选择的顺序 4/5 Runge-Kutta 方法不是 MATLAB 中的 Dormand-Prince 对 DP5 或 SciPy(这只是一个 dopri5 包装器),而是一种现代算法:Tsit5() 方法。这是因为这种更新的方法在理论上可以在计算成本为偶数时实现更低的错误,并且开发工具证实了这一点。 DifferentialEquations.jl 中的其他独特之处是 its adaptivity for stochastic differential equations, high-order methods for delay differential equations 等,并且还有更多的研究即将到来(私人存储库中的东西直到发布)。由于相关的开发套件,其中大部分成为可能(或至少很容易做到)。

所以我认为这清楚地表明 DifferentialEquations.jl 的哲学不同于其他 languages/libraries 中的微分方程组。在其他套件中,如 MATLAB 或 SciPy,大部分时间的目标是为您提供一些通常有用的基本方法。效率不一定是目标(一个很好的例子是 Shampine 有意识地选择在 MATLAB 中不使用高阶 RK 方法),包装“标准”实现通常就足够了(SciPy 只是包装器)。简单性和标准对这些软件套件很有意义。

但 DifferentialEquations.jl 的重点是开发处理现代计算困难方程的新方法,并使用这些新方法解决以前无法解决的问题。因为这个不同的侧重点,所以有一些选择是不同的。例如,在这里拥有大量 methods/implementations 是很好的,因为它允许用户和方法研究人员比较算法并找出如何不断改进它们和选择(我邀请用户测试他们问题的表格方法并查看一些晦涩的 RK 方法是否运行良好)。我关心确保最有效的研究工具可用,并通过向用户提供默认设置和建议来处理复杂性。如果文档中的建议有任何不清楚的地方,请提出一个问题,以便我们讨论如何改进文档。但我认为引导用户“正确”选择方法是一个文档问题,而不是一个应该限制设计、功能或效率的问题。

我将在不久的将来的一些博客文章中介绍 DifferentialEquations.jl 的哲学,但这就是它的要点。我不认为这是一个 SO 问题,因为这对我来说更像是一个个人问题,为什么我保留已知的低效方法(尽管不推荐!),我希望这能提供一个有用的答案。