我正在求解一个线性方程组,,数值。我使用流行的 Euler 和Runge-Kutta (RK) 方法完成了这项工作。我注意到两者在解析解的准确性上存在很大差异。这是什么原因?
为什么 Runge-Kutta 和 Euler 的方法如此不同?
首先,您可以提到您使用的 RK 方法。这里简单介绍一下RK方法和Euler方法,工作原理,各有优缺点。
欧拉法
欧拉方法是一阶方法。这是一种直接的方法,可以根据当前点的变化率估计下一个点,并且易于编码。这是一个单步方法。值得注意的是,Forward Euler 方法对于空间去离散化中的无阻尼振荡系统(例如弹簧质量系统或波动方程)是无条件不稳定的。对于复杂的问题和/或边界条件,它可能会失败。它可以用于基本的数值分析。这种方法不常用于空间离散化,但有时用于时间离散化。对于双曲微分方程,不推荐使用这种方案,因为它更具扩散性。该方案与网格细化的收敛顺序非常差。将欧拉方法扩展到高阶方法是简单而直接的。
RK方法:
Runge-Kutta 方法实际上是一系列以特定风格派生的方案。您可以参考此链接以了解 RK 方法的基本概念: http ://web.mit.edu/10.001/Web/Course_Notes/Differential_Equations_Notes/node5.html
前向 Euler 方法实际上是最简单的 RK 方法(1 阶段,一阶)。高阶精确 RK 方法是多阶段的,因为它们涉及在当前和下一个离散时间值处或之间的多个步骤的斜率计算。因变量的下一个值是通过基于解的泰勒级数近似对这些多个阶段进行加权平均来计算的。该加权平均值中的权重是通过求解非线性代数方程得出的,该方程是通过消除泰勒级数中的误差项而形成的。如果不使用符号工具进行计算,开发高阶 RK 方法既乏味又困难。
最流行的 RK 方法是 RK4,因为它在精度顺序和计算成本之间提供了良好的平衡。RK4 是最高阶的显式龙格-库塔方法,它需要与精度顺序相同的步数(即 RK1=1 阶段,RK2=2 阶段,RK3=3 阶段,RK4=4 阶段,RK5= 6 阶段, ... ..)。超过四阶 RK 方法的计算成本相对更高。
回答
通常 Euler 方法的误差高于高阶 RK 方法(RK2、RK3 等),因为与 Euler 方法相比,高阶方法的截断误差较小。
在一些数值方法的初级文献中,松散地提到高阶方法(例如,RK4)比低阶方法(例如,欧拉方法)产生的错误更少。大多数时候这是正确的,但并非总是如此。此属性取决于您考虑的网格和初始条件以及微分方程。
如果微分方程的精确解是阶多项式,则将通过个 Runge-Kutta 方法精确求解。例如,如果解是一条线,则正向欧拉将是精确的。如果解是 4 次或更小的多项式,则 RK4 将是精确的。
对于粗网格,RK4 方法中的初始“绝对最大差值误差”等于(或)高于欧拉方法,并且随着相对于 网格较短波的问题的细化网格而减小。因为 RK4 方法的收敛速度大于欧拉。请注意,网格的粗细度完全基于微分方程、初始条件和数值方案。请参阅以下链接了解更多详情。虽然这是基于微分的,但只要“数值积分”是稳定的,我们就可以在时间数值积分和微分之间进行相对比较。
如果你有足够的时间,你可以在你的代码中用不同的微分方程、不同数量的欧拉和 RK4 来尝试这个实验。与可以找出方案的收敛顺序。
请原谅我添加了一个我也一样的答案,但我无法抗拒包含来自 Press 等人的此页面:“C 中的数字食谱”:
基本上,它们具有不同精度水平的原因在于它们的派生方式。(我假设向前)欧拉方法是一阶的,可以通过多种方式导出。最容易来自泰勒定理。在该方法中,仅保留二阶项,从而使误差成为一阶。
另一方面,Runge kutta 方法是分阶段的,并且具有非常特别地选择的系数来“消除”几个阶数的误差项。Rk4 是四阶,因为零阶、一阶、二阶、三阶误差项通过级系数的选择抵消。这些系数的推导不是很困难,如果您有兴趣看到它,可能可以在维基百科上找到。