中点algorithm – 错误C ++

我目前正在用我的中点algorithmfind一个问题,我已经给出了一个计算中点algorithm的公式,但似乎不正确的轨道。 目标是获得更精确的欧拉方法版本,以创建一个更接近所有帧时间的轨道。 由于欧拉方法会根据不同的帧速率导致一些不准确的轨道。

在这里输入图像说明

1st use Euler's method to approximate half - way position / velocity : position after half frame = current position + half frame time * current velocity velocity after half frame = current velocity + half frame time * current acceleration Calculate forces at half - way position to get half - way acceleration Then use Euler's method again with updated info : position next frame = current position + frame time * halfway velocity velocity next frame = current velocity + frame time * halfway acceleration 

在这里输入图像说明 该方法使第二个球向右下方无限移动。

algorithm

 void midpointmethod(CVector3& position, CVector3& velocity, CVector3& centre, float updateTime) { CVector3 accel = OrbitAcceleration(position, Length(velocity), centre); //position = position + updateTime / 2 * velocity * updateTime; //velocity = velocity * updateTime / 2 * accel.Length() * updateTime; CVector3 halfpos = position + (updateTime / 2) * velocity; CVector3 halfveloc = velocity + (updateTime / 2) * accel; // calculate forces ? CVector3 halfwayaccel = accel / 2; CVector3 posnexf = position + updateTime * halfveloc; CVector3 velosnexf = velocity + updateTime * halfwayaccel; position = posnexf; velocity = velosnexf; } 

我很高兴你能解决你的问题。 中点algorithm比轨道标准Euler更精确,它是一个二阶algorithm,但它仍然存在随着时间的推移获得能量的问题(这意味着由于数值的不精确性,你的轨道物体将离地球更近或更远)这可能需要一段时间取决于你的时间步骤)。 我认为一个更好的algorithm是“半隐式”欧拉,它将保持系统中的能量,并允许更好的轨道。 这是一个很好的资源: https : //www.youtube.com/watch?v = kxWBXd7ujx0 。 或者,如果你能够忽略速度,Verletalgorithm对于轨道也是很好的。 干杯:)

我想这是一个评论,但我没有足够的代表…

提出这个问题,这是相当微不足道的,我误解了半途加速的价值,实际上并没有得到两点之间的中途加速,而是一个没有回到球场的不同点。

 CVector3 halfpos = position + (updateTime / 2) * velocity; CVector3 halfveloc = velocity + (updateTime / 2) * accel; // calculate forces ? CVector3 halfwayaccel = OrbitAcceleration(halfpos, Length(halfveloc), centre); CVector3 posnexf = position + updateTime * halfveloc; CVector3 velosnexf = velocity + updateTime * halfwayaccel; position = posnexf; velocity = velosnexf;