右Runge Kutta第四种方法?

时间:2015-11-16 17:36:33

标签: c++ vector runge-kutta

我有这个runge kutta代码。但是,有人提到我的做法是错误的。我真的不明白他为什么这么做,所以这里的任何人都可以暗示为什么这种方式是错的?

    Vector3d r = P.GetAcceleration();

    Vector3d s = P.GetAcceleration() + 0.5*m_dDeltaT*r;

    Vector3d t = P.GetAcceleration() + 0.5*m_dDeltaT*s;

    Vector3d u = P.GetAcceleration() + m_dDeltaT*t;

    P.Velocity += m_dDeltaT * (r + 2.0 * (s + t) + u) / 6.0);

==== EDIT ====

Vector3d存储坐标x,y,z。

GetAcceleration返回每个x,y和z的加速度。

2 个答案:

答案 0 :(得分:1)

你有一些加速功能

a(p,q) where p=(x,y,z) and q=(vx,vy,vz)

您可以通过RK4解决的订单1系统是

dotp = q
dotq = a(p,q)

RK方法的各个阶段涉及状态向量的偏移

k1p = q
k1q = a(p,q)

p1 = p + 0.5*dt*k1p
q1 = q + 0.5*dt*k1q
k2p = q1
k2q = a(p1,q1)

p2 = p + 0.5*dt*k2p
q2 = p + 0.5*dt*k2q
k3p = q2
k3q = a(p2,q2)

等。您可以为每个步骤调整点P的状态向量,保存原始坐标,也可以使用P的临时副本来计算k2, k3, k4

答案 1 :(得分:0)

您还没有定义自己的方法,但是向我跳出来的是您将结果与输入混合在一起。由于Runge-Kutta是一种计算y_(n + 1)= y_n + h sum(b_i k_i)的方法,我希望你的解决方案能够保持你的_n项在右边,而你的(n + 1)项左边。这不是你正在做的事情。相反,s (n + 1)依赖于r_(n + 1)而不是s_(n + 1)上的r_n,t_(n + 1),依此类推。您尝试限制使用的变量数时会出现错误。

考虑到这一点,您能指出程序生成的计算的实际中间值,并将它们与预期的中间值进行比较吗?