现在我有一个使用 Crank-Nicholson 算法的代码,但我想我想转向更高阶的时间步算法。我知道 Crank-Nicholson 算法在我想工作的领域是稳定的,但我担心其他一些算法可能不是。
我知道如何计算算法的稳定区域,但这可能有点痛苦。有人知道关于抛物线 PDE 的大量时间步长算法的稳定性特性的任何好的参考吗?
现在我有一个使用 Crank-Nicholson 算法的代码,但我想我想转向更高阶的时间步算法。我知道 Crank-Nicholson 算法在我想工作的领域是稳定的,但我担心其他一些算法可能不是。
我知道如何计算算法的稳定区域,但这可能有点痛苦。有人知道关于抛物线 PDE 的大量时间步长算法的稳定性特性的任何好的参考吗?
非常简短的回答:要获得全面的参考,您无法击败Hairer and Wanner 第二卷。
简短回答:这里有一些 MATLAB 脚本,用于在给定系数的情况下绘制线性多步法或Runge-Kutta 方法的稳定区域。您还可以使用 Python 包nodepy(免责声明:这是我的包,它不是最精美的软件,但绘制稳定区域是它做得很好的一件事)。绘制稳定区域的说明在这里。
更长的答案:这里有三类您可能感兴趣的方法。
-stable methods,其中复平面的所有左半部分都位于稳定区域。最著名的例子是反向欧拉(一阶)和隐式梯形方法(这是 Crank-Nicholson 使用的)。对于这些方法,您无需了解稳定区域的详细信息;只要您的空间离散化的特征值位于左半平面,您将具有无条件稳定性(无步长限制)。由于第二道达尔奎斯特障碍,如果你想要高阶和-稳定。此类方法的一些示例是 Gauss-Legendre、Radau 和 Lobatto 方法。所有这些都是完全隐含的,因此相当昂贵。
-stable 方法,其中包括左半平面中的一个扇区,包括所有负实轴。其中最突出的是后向微分(BDF) 方法和一种称为“数值微分公式”的变体,它们在 MATLAB 的ode15s()
. 只要您的空间离散化的特征值位于该扇区中,这些都是无条件稳定的,因此您唯一需要了解的关于稳定区域的信息就是角度,您可以在任何关于 ODE 求解器的参考资料中找到它(例如,LeVeque的第 175 页)。
显式方法,这将只包括负实轴上的有限区间。有一些特殊的“稳定”显式方法(特别是Runge-Kutta-Chebyshev 方法)具有较大的负实轴稳定区域,适用于轻度刚性问题,但通常不适用于抛物线问题。这篇论文是该文献的一个很好的入口,其中包含大量有关稳定区域的信息。
我一直假设您只对绝对稳定性感兴趣。对于抛物线问题,您可能需要一个-stable 方法也是如此,但检查起来很简单- 方法的稳定性。
更新:如果您真的需要了解有关此主题的所有信息,请获取Dekker 和 Verwer 的专着。它是对单边 Lipschitz 常数、对数范数和几个更深层次的稳定性概念等概念的现有最佳介绍之一。它已绝版,但您通常可以在亚马逊上找到二手副本(有偿!)
我个人最喜欢的是 John Strikwerda 的书,“Finite Difference Schemes and Partial Differential Equations”。
他使用傅里叶分析对稳定性理论进行了很好的处理。我只有第一版,他没有介绍稳定区域的概念。根据 SIAM 网站,第二版增加了这个材料。