【问题标题】:Exploding Runge Kutta Method爆炸龙格库塔法
【发布时间】: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


【解决方案1】:

您的 rk4 代码看起来正确。但仅适用于标量微分方程。

您肯定拥有的是一个维数大于 1 的耦合微分方程系统。在这里,您必须以向量形式应用积分方法。即x,y,vx,vy组合成一个4维(相位)状态向量,系统函数为向量值,k1,...k4为向量等。

作为高级说明,time &lt;= duration 对在重复 time+=timeStep; 中累积的舍入误差很敏感。最好使用time &lt;= duration-timeStep/2time 在循环末尾接近duration


阅读已关闭的上一个问题的代码,我发现您对微分方程的概念有疑问。您不应该在 RK4 实现中使用欧拉步骤的结果作为加速。没有空气摩擦的弹道运动系统是

dotx = vx
doty = vy
dotvx = 0
dotvy = -g

你必须以矢量形式实现

eqn(t, [x,y,vx,vy]) // where X = array of double of dimension 4
   { return [vx,vy,0,-g]; }

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多