我正在查看DifferentialEquations.jl包。在DiffEqDevTools/src/ode_tableaus.jl中,我可以看到Midpoint和RK4的表格。
但我也可以在OrdinaryDiffEq/src/integrators/fixed_timestep_integrators.jl中看到这些方案的显式代码。
我希望一些代码可以使用tableaux,而不是有一个显式的求解器。
我不知道如何检查这张表是否被使用。我尝试移除OrdinaryDiffEq.jl,但是我的示例无法运行。
这意味着正在使用显式代码。但在这种情况下,为什么会有这样的画面呢?
发布于 2017-05-02 08:14:54
是的,在大多数情况下不使用桌面。实际上,只有当您使用ExplicitRK(tableau=...)方法时,才会使用表。您可以在DiffEqDevTools试验中看到其中每一个的收敛测试,但除此之外,通常不使用它们。
之所以出现这种情况,是因为基于表格的实现往往效率不高。消除使用指向常量的指针所造成的间接影响对运行时有可测量的影响。当然,在用户的f非常昂贵的渐近极限中,实现细节并不重要,但是大多数实际情况都没有达到这个极限,这一点可以从实际基准(在这个限制中,您应该使用多步方法)来证明。因此,有硬编码版本的最有效的Runge方法与硬编码的高阶插值方案,因为这些是工作的方法,并应获得最大的效率。
那么为什么这些桌子会存在呢?我认为需要注意的是,DifferentialEquations.jl不仅仅是用于使用微分方程的软件包,也是用于开发和测试新方法的软件包。devdocs中的测试特性证明了这一点。对于实现效率更高的算法,由于各表都具有相同的实现方式,因此仍然具有开发用途,从而为确定方法间的真实效率提供了一种简便、科学的方法。拥有图表不仅允许比较效率,而且还可以使用情节菜谱来比较稳定性区域:
plot(constructRK4())

这个大图片库被用来梳理所有的RK方法并创建现代化的选择。我贴了一些随意的便条和在CompSci这样的文章中更广泛地记录了一些部分。这些都是使用开发工具进行的实验。
最后,DifferentialEquations.jl确实是独一无二的,因为它不仅仅是您以前看到的东西的重新实现。一个明显的变化是,选择4/5 Runge的方法不是像MATLAB或SciPy那样的休眠王子对SciPy(这只是一个dopri5包装器),而是一种现代算法:Tsit5()方法。这是因为这种较新的方法在理论上达到了较低的误差,当计算费用相等时,devtools证实了这一点。DifferentialEquations.jl中的其他独特之处是随机微分方程的自适应性、时滞微分方程的高阶方法等,还有更多的研究即将到来(在发布之前,私人存储库中的内容)。由于有了相关的开发套件,其中大多数都成为可能(或者至少很容易做到)。
因此,我认为这表明,DifferentialEquations.jl的哲学显然不像其他语言/库中的微分方程套件。在其他套件中,如MATLAB或SciPy,大多数情况下目标是给您一些基本的方法,这些方法通常是有用的。效率不一定是目标(这方面的一个很好的例子是Shampine有意识地选择在MATLAB中不使用高阶RK方法),而包装“标准”实现通常是足够好的(SciPy只是包装器)。对于这些软件套件来说,简单性和标准是有意义的。
但是DifferentialEquations.jl的重点是开发处理现代计算困难方程的新方法,并使用这些新方法来解决以前不可行的问题。因为这个不同的焦点,有一些选择是不同的。例如,这里有大量的方法/实现池是很好的,因为它允许用户和方法研究人员比较不同的算法,并找出如何不断地改进它们和选择(我请用户测试表方法的问题,看看是否有一些模糊的RK方法做得很好)。我关心的是确保最有效的研究工具是可用的,并通过向用户提供缺省值和建议来处理复杂性。如果文档中有不清楚的部分建议,请打开一个问题,这样我们就可以讨论如何改进文档。但我认为,引导用户“纠正”方法选择是文档问题,而不是限制设计、功能或效率的问题。
我将在不久的将来的博客文章中讨论DifferentialEquations.jl的哲学,但这是它的主旨。我不认为这是一个太多的问题,因为这更多的是一个个人的问题,我问为什么我保持已知的低效方法(虽然不是推荐的!),我希望这能给出一个信息丰富的答案。
https://stackoverflow.com/questions/43731862
复制相似问题