在 C 中使用 Runge Kutta 求解二阶偏微分方程系统



我有一个问题,使用Runge Kutta算法解决微分方程组。到目前为止,我已经将二阶偏微分方程重写为一组两个耦合方程,其中

    f(L1,L2) = L2
    g(L1,L2) = A*(B*L1-C*L2-D)

是两个方程,A、B、C 和 D 是常数。为了获得下一步的值,我为每个时间步长 dt 进行了如下操作:

    k1 = f(L1,L2)
    l1 = g(L1,L2)
    k2 = f(L1 + 0.5 * dt * k1,L2 + 0.5 * dt * l1 )
    l2 = g(L1 + 0.5 * dt * k1,L2 + 0.5 * dt * l1 )
    k3 = f(L1 + 0.5 * dt * k2,L2 + 0.5 * dt * l2 )
    l3 = g(L1 + 0.5 * dt * k2, L2 + 0.5 * dt * l2 )
    k4 = f(L1 + dt * k1,L2 +  dt * l1 )
    l4 = g(L1 + dt * k1,L2 + dt * l1 ) 

其中,我使用当前时间步长的 L1 和 L2 的值并迭代计算系数。

结果,我通过对最后的系数求和和加权来得到 L1 和 L2。我的问题是,整个算法在 4 个时间步后变得不稳定。

有谁知道这种认识在技术上是否正确?谢谢!

只是一个猜测,因为你没有说你使用什么值dt:尽可能保持小,因为

局部截断误差为 O(h^

5) 量级,而总累积误差量级为 O(h^4)。

(引自这篇维基百科文章,DT扮演H角色)。

两件事:

龙格-库塔总体上不稳定。它只是比欧拉的"更稳定"。根据微分方程的条件和dt它可能还不够。较小的dt有帮助吗?

我在您对fg的定义中缺少t的概念.假设L1L2不是恒定的t您最好通过 fg 传递它。喜欢f(t,L1,L2).这迫使您考虑这些系数计算,您现在需要相应地传递另一个t'。这将导致在中点评估L1和L2。

在计算k4, l4时,您使用k1, l1来计算计算 ODE 函数的计算状态,而该方法需要使用 k3, l3 。此错误将减少方法的顺序(可能为 2),并且错误对步长的依赖性将反映这一点。

相关内容

  • 没有找到相关文章

最新更新