我有一个问题,使用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
有帮助吗?
我在您对f
和g
的定义中缺少t
的概念.假设L1
和L2
不是恒定的t
您最好通过 f
和 g
传递它。喜欢f(t,L1,L2)
.这迫使您考虑这些系数计算,您现在需要相应地传递另一个t'
。这将导致在中点评估L1和L2。
在计算k4, l4
时,您使用k1, l1
来计算计算 ODE 函数的计算状态,而该方法需要使用 k3, l3
。此错误将减少方法的顺序(可能为 2),并且错误对步长的依赖性将反映这一点。