使用Runge Kutta算法解决微分方程组时遇到问题。到目前为止,我已经将二阶PDE重写为一组两个耦合方程式,其中
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个步骤后整个算法变得不稳定。
有人知道这种认识在技术上是否正确吗? 谢谢!
答案 0 :(得分:0)
答案 1 :(得分:0)
两件事:
Runge-Kutta 一般不稳定。它比欧拉更“稳定”。根据微分方程的条件和dt
,它可能还不够。较小的dt
有帮助吗?
我在t
和f
的定义中忽略了g
的概念。假设L1
中的L2
和t
不一致,您最好通过f
和g
。像f(t,L1,L2)
一样。这会强制您考虑那些系数计算,您现在需要相应地传递另一个t'
。这将导致在中点评估L1和L2。
答案 2 :(得分:0)
在k4, l4
的计算中,您使用k1, l1
来计算评估ODE函数的状态,而该方法需要使用k3, l3
。此错误将减少方法的顺序,可能为2,并且错误对步长的依赖性将反映出来。