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

时间:2013-11-08 16:53:52

标签: c system pde runge-kutta

使用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个步骤后整个算法变得不稳定。

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

3 个答案:

答案 0 :(得分:0)

只是一个猜测,因为您没有说出您使用的dt值:尽可能保持较小,因为

  

局部截断误差大约为O(h ^ 5),而总累积误差为O(h ^ 4)。

(引自this维基百科文章,dt扮演h角色)。

答案 1 :(得分:0)

两件事:

Runge-Kutta 一般不稳定。它比欧拉更“稳定”。根据微分方程的条件dt,它可能还不够。较小的dt有帮助吗?

我在tf的定义中忽略了g的概念。假设L1中的L2t不一致,您最好通过fg。像f(t,L1,L2)一样。这会强制您考虑那些系数计算,您现在需要相应地传递另一个t'。这将导致在中点评估L1和L2。

答案 2 :(得分:0)

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