-4

我有这个 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);

====编辑====

Vector3d 存储坐标,x,y,z。

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

4

2 回答 2

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

于 2015-11-16T18:59:40.567 回答
0

你还没有定义你的方法,但让我大吃一惊的是你把你的结果和你的输入混合在一起。由于 Runge-Kutta 是一种计算 y_(n+1) = y_n + h sum(b_i k_i) 的方法,我希望您的解决方案将 _n 项保留在右侧,将(n+1) 项保留在左侧. 这不是你在做什么。相反,s (n+1) 依赖于 r_(n+1) 而不是 r_n,t_(n+1) 依赖于 s_(n+1),依此类推。在您尝试限制正在使用的变量数量时,这有一种错误的味道。

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

于 2015-11-16T17:56:49.860 回答