BDF vs隐式Runge Kutta时间步进


16

有什么理由为什么要在BDF时间步长上选择高阶隐式Runge Kutta(IMRK)?对于我而言,BDF似乎容易得多,因为阶段IMRK需要每个时间步q线性求解。BDF和IMRK的稳定性似乎是有争议的。我找不到任何比较/对比隐式时间步进器的资源。qq

如果有帮助,最终目标是为我选择对流扩散PDE的高阶隐式时间步进器。

Answers:


34

是的,由于某种原因,没有太多的资源。长期以来,标准的转到是“仅使用BDF方法”。出于一些历史原因,这一口号是一成不变的:因为一个Gear的代码是第一个广泛使用的刚性求解器,而另一个MATLAB套件没有/不包括隐式RK方法。但是,这种启发式方法并不总是正确的,从测试中我会说通常是错误的。让我详细解释。

BDF方法的固定成本很高

BDF方法中的自适应时间步长和自适应顺序具有很高的成本。必须重新计算系数,或者需要将值插值到不同的时间。要使当前的BDF代码在这里做得更好,已经有很多工作要做(有两个著名的“表单”用于实现尝试以不同的方式处理此问题),但这实际上只是一个非常困难的软件工程问题。因此,实际上大多数BDF代码都是Gear原始代码的后代:Gear的,vode,lsoda,Sundial的CVODE,甚至DAE求解器DASKR和DASSL都是同一代码的后代。

这意味着,如果您的问题“太小”,那么高固定成本确实很重要,并且隐式RK方法会做得更好。

高阶BDF方法对于复杂特征值非常不稳定

BDF方法使您可以控制最大阶数并使其更加保守,这是有原因的:高阶BDF方法甚至不能很好地处理“中等大小”的复杂特征值。因此,在这些情况下,为了保持稳定,他们必须放弃订单。这就是为什么六阶BDF方法在技术上是稳定的,但却经常被忽略的原因,因为即使是五阶也存在问题(而六阶的稳定性甚至更低)。A稳定最高只能达到2阶,因此它总是可以回退到那里,但是步进是错误主导的。

因此,在非平凡问题上使用BDF代码时,您不会一直获得5阶。振荡导致其顺序下降。

BDF方法的启动成本很高

自动启动的BDF方法的启动成本很高。它们从小的Euler步长开始,然后从小的BDF-2步长开始,依此类推。对于更短的积分时间,这具有非常不可忽略的效果。如果您经常停下来,例如要处理事件,这将严重损害代码的效率。这就是为什么你很少,如果看不到大量的事件处理或延迟方程的情况下使用多步法(延迟方程重新启动在每个足够高的顺序不连续性,这是在每个传播为每延迟时间τ一世ττ

作为多步方法的BDF方法具有最佳的缩放比例

但这就是BDF方法所追求的:它们可最佳扩展。这是因为它们的函数调用最少。这错误地导致了您应该“始终默认使用BDF方法”的想法(出于稳定性和效率的原因,上述原因并非总是如此),但这确实意味着,如果函数调用足够昂贵,则BDF方法将是最好的。通常,这意味着对于足够大和足够刚性的PDE离散化,BDF方法将是最有效的。就是说,“足够大”非常依赖于问题,我发现PDE离散化在使用最多1000个空间变量的方法(YMMV)中表现更好。唯一知道的方法就是测试。Fradau

有哪些基准可用?

就易于获得的工作精度图而言,Hairer的书和DiffEqBenchmarks(如下所述)可能是最好的。Hairer求解常微分方程II在154和155页上有许多工作精度图。出于上述原因,他选择的问题的结果与我上面所述的相符:如果不存在问题,则隐式RK将更有效。 “足够大”。还要注意的另一件有趣的事情是,Rodas在误差较高的情况下,高阶Rosenbrock方法在他的许多测试中(例如)radau5是最有效的,而隐式RK 在误差较低的情况下是最有效的。但是他的测试问题主要不是大型PDE的离散化,因此请考虑以上几点。

您如何测试/基准测试?

我喜欢使用Julia中的DifferentialEquations.jl进行测试(免责声明:我是开发人员之一)。这是朱莉娅。编程语言应该在这里真正得到注释。请记住,随着函数调用成本的增加,BDF方法会更好。在R / MATLAB / Python中,用户函数是优化求解器实际必须使用的唯一R / MATLAB / Python代码:如果您使用的是SciPy或Sundials包装器,则除了传递的函数外,所有的都是C / Fortran代码。这意味着,在动态语言(不是Julia)中,BDF方法比通常的方法要好,因为函数调用没有经过优化(这可能是Shampine包含ode15s在MATLAB套件中,但没有隐式RK方法的原因) 。

FODEProblem

@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())

其中第一个使用Sundials CVODE(BDF方法),第二个使用Hairer radau(隐式RK)。

对于任何一个ODEProblem,您都可以使用基准测试工具来查看不同算法如何针对不同的自适应容差进行缩放。一些结果发布在DiffEqBenchmarks.jl上。例如,在ROBER问题(由3个刚性ODE组成的系统)上,您可以看到Sundials实际上是不稳定的并且以足够高的容差发散(而其他方法收敛得很好),显示了上面有关稳定性问题的注释。在Van Der Pol问题上,您可以看到更多的问题。我有很多东西还没有发布,但是直到我完成一些更高阶的Rosenbrock方法(Rodas是这些的Fortran版本)之后,我才能了解到。

(注意:那些严格的基准需要更新。其中之一,由于某些原因ODE.jl的方法有所不同,因此文本需要更新...)

推断方法和RKC

也有类似的推论方法seulex,用于解决严峻的问题。这些是“无限自适应阶数”,但这仅意味着当您正在寻找非常低的误差时(例如,寻求在低于1e-10或低于此水平时解决刚性问题,在这种情况下,您可能可以使用显式方法),它们在位置上是非对称的。。但是,在大多数情况下,它们的效率不高,应避免使用。

Runge-Kutta Chebyschev是一种显式方法,它也可以解决您应考虑的严峻问题。我还没有将它包装在DifferentialEquations.jl中,所以我自己也没有任何确凿的证据证明它是如何公平的。

需要考虑的其他方法:刚性PDE的专用方法

应该注意一下,对于中小型的刚性问题,可以轻松地计算Jacobian公式时,高阶Rosenbrock方法的确能做得很好,甚至好很多倍。但是,对于某些PDE,我认为对流扩散问题属于此类,Rosenbrock可能会失去一些精度。此外,他们需要非常准确的雅可比行列式以保持其准确性。在Julia中,这很容易,因为解算器带有符号和自动差分功能,对机器epsilon可能是正确的。但是,像MATLAB这样的东西ode23s可能会有问题,因为这些实现使用有限差分。对于BDF和隐式RK方法,雅可比行列式中的误差会导致收敛速度变慢,而对于Rosenbrock,由于它们不是隐式方程,而是其中存在雅可比行列式的RK方法,因此只会失去准确性。

要查看的其他方法是指数RK方法,指数时差(ETD),隐式积分因子(IIF)和指数Rosenbrock方法。前三个利用了以下事实:在许多PDE离散化中,

üŤ=一种ü+Fü

一种一种üË一种一种

一种Ĵü+GüĴF=Ĵü+G

其他方法:最新创作

完全隐式的方法显然适用于刚性方程。如果PDE不够大,则无法有效地“并行化空间”以充分利用HPC。相反,您可以创建时间并行离散化,这些时间离散化是完全隐式的,因此对于刚性方程式非常有用,但可以并行化以充分利用硬件。XBraid是使用这种技术的求解器,主要方法是PFFAST和超现实方法。DifferentialEquations.jl正在开发一种工作原理类似的神经网络方法。

同样,当您没有足够大的空间离散化来有效地并行化,但又有可用的并行计算资源时,这是最佳选择。

结论:用一粒盐渐近考虑

ΔŤ,他们将是最有效的(所以,如果你正在寻找一个非常精确的解决方案,是的!)。但是,几乎没有人真正在有效的政权中工作,这就是为什么人们通常不再使用外推方法的原因。这是一个警告:用一粒盐渐近考虑

BDF方法渐近是最好的,但是在大多数情况下,您可能并没有采用这种方法。但是,如果空间离散化具有足够的点,则BDF方法可以在空间中有效地进行并行化(通过并行化线性求解),并且函数调用最少,因此将达到最佳效果。但是,如果您的PDE离散化不够大,请仔细查看隐式RK,Rosenbrock,指数RK等方法。使用像DifferentialEquations.jl这样的软件套件,可以轻松地在不同方法之间进行交换,这对于您了解哪种方法最适合您的问题领域非常有帮助,因为在许多情况下,它无法事先知道。

[如果您有任何示例问题要添加到测试套件中,请随时帮助您。我想为此保留非常全面的资源。我希望“很快”拥有可运行笔记本电脑形式的所有Hairer基准,并希望代表科学领域的其他问题。感谢您的帮助!]


3
这是一个非常详细的回复,我需要研究一些新的方向!非常感谢您的宝贵时间。
user107904

3
最好在此论坛上对任何问题的最佳答案!
Wolfgang Bangerth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.