【发布时间】:2015-01-19 02:33:52
【问题描述】:
我一直在尝试构建一个 Runge Kutta 四阶积分器来模拟简单的弹丸运动。我的代码如下
double rc4(double initState, double (*eqn)(double,double),double now,double dt)
{
double k1 = eqn(initState,now);
double k2 = eqn(initState + k1*dt/2.0,now + dt/2.0);
double k3 = eqn(initState + k2*dt/2.0,now + dt/2.0);
double k4 = eqn(initState + k3*dt, now + dt);
return initState + (dt/6.0) * (k1 + 2*k2 + 2*k3 + k4);
}
这是在一个while循环中调用的
while (time <= duration && yPos >=0)
{
xPos = updatePosX(xPos,vx,timeStep);
yPos = updatePosY(yPos,vy,timeStep);
vx = rc4(vx,updateVelX,time,timeStep);
vy = rc4(vy,updateVelY,time,timeStep);
cout << "x Pos: " << xPos <<"\t y Pos: " << yPos << endl;
time+=timeStep;
myFile << xPos << " " << yPos << " " << vx << " " << vy << endl;
}
但是,与应该发生的情况相反,我的结果只是爆炸了。这是怎么回事?
【问题讨论】:
-
你的意思是调用
rc4(updateVelX, vx, time, timeStep)而不是`rc4(vx, updateVelX, time, timeStep)(注意前两个参数的反转)? -
是的,我想使用时间步长更新
-
我已尝试修复如上所示的代码,但仍然遇到同样的问题。
-
“爆炸”是什么意思?无限循环?没有足够的代码来了解发生了什么。持续时间在哪里初始化? updatePos 函数?
-
持续时间由输入初始化。我的意思是更新正电子函数爆炸了。完整代码请见stackoverflow.com/questions/28013383/…
标签: c++ bash physics projectile runge-kutta