太阳系项目,C ++。无法获得负加速度(行星不会绕回来)

时间:2014-04-04 19:22:00

标签: c++ model simulation physics orbit

首先,我使用非常接近欧拉方法的东西来计算我的星球位置。我知道这不是最准确的方法,但我一直在努力使用速度verlet近一周,并且不能让它工作。我的问题是我不能让我的星球围绕太阳环回来,x或y位置不断增加。任何帮助表示赞赏!谢谢! 这是我的代码:

void updatePosition(CelestialObject object1, CelestialObject object2 )

{ // -----------------------------X calculations-----------------------------------
    //calc force
    float forceX = forceFuncX(object1.getX(), object2.getX(),object1.getY(), object2.getY(), object1.getMass(), object2.getMass());`

    //accel calc
    float AX = accelerationFuncX(forceX,object1.getX(), object2.getX(),object1.getMass());
    agk::PrintC("Accel X: "); 
    float AXprint = AX*dt;
    agk::Print(AXprint);

    //velocity
    float VX  = object1.getVX();
    VX = VX + AX*dt;
    agk::PrintC("Velocity X: ");
    agk::Print(VX);

    //positionCalc
    float X = object1.getX();
    X = X + VX*dt;
    agk::PrintC("Position X: ");
    agk::Print(X);

    //-------------------------Y calculations------------------------------------
    //force
    float forceY = forceFuncY(object1.getX(), object2.getX(),object1.getY(), object2.getY(), object1.getMass(), object2.getMass());

    //accel
    float AY = accelerationFuncY(forceY,object1.getY(),object2.getY(), object1.getMass()); //y
    agk::PrintC("Accel Y: ");
    float AYprint = AY*dt;
    agk::Print(AYprint);

    //velocity
    float VY = object1.getVY();
    VY = VY + AY*dt;
    agk::PrintC("Velocity Y: ");
    agk::Print(VY);

    //position
    float Y = object1.getY();
    Y = Y + VY*dt;
    agk::PrintC("Position Y: ");
    agk::Print(Y);

    object1.setPosition(X, Y);
    agk::CreateParticles(X,Y);
}

这里是它所调用的功能:

double forceFuncX(float object1x,float object2x,float object1y, float object2y, double mass1, double mass2)
{
    float d = object1x - object2x;
    float r = sqrt(pow(object2x - object1x,2) + pow(object2y-object1y,2));;
    //float r = sqrt(pow(object1x-object2x,2)+pow(object1y-object2y,2));
    //double F = (G*(mass1*mass2))/pow(d,2);
    float F = (G*(mass1*mass2))/(r*r);

    return F;
}


double forceFuncY(float object1x,float object2x,float object1y, float object2y, double mass1, double mass2)
{
    float d = object1y - object2y;
    float r = sqrt(pow(object2x - object1x,2) + pow(object2y-object1y,2));;
    //float r = sqrt(pow(object1x-object2x,2)+pow(object1y-object2y,2));
    //double F = (G*(mass1*mass2))/pow(d,2);
    float F = (G*(mass1*mass2))/(r*r);

    return F;
}

float accelerationFuncX(float force, float object1x, float object2x, double mass) //gives the acceleration of an object
{
    float accel = (force*(object2x-object1x))/mass;
    return accel;
}

float accelerationFuncY(float force, float object1y, float object2y, double mass)
{
    float accel =(force*(object2y-object1y))/mass;
    return accel;
}

2 个答案:

答案 0 :(得分:1)

由于您使用的是笛卡尔坐标系,因此您应该发现沿x的力在某些配置中是正的,而在某些配置中是负的,在y上是相同的。特别地,力F是指向远离行星质心的向量,朝向围绕其旋转的太阳的质量中心。所以代码有两个问题:

  1. 你返回Fy和F​​x,两者总是正的并且等于两个物体之间的引力:F = G * m1 * m2 / r ^ 2。但是F是力矢量的长度。力矢量的Fx和Fy分量将类似于Fx = - F cos alpha和Fy = - F sin alpha,其中alpha是行星相对于x轴的角度。例如,如果alpha = 0,并且sun位于坐标系的中心(x = y = 0),那么Fx = -F(因为行星处于正x,而太阳处于x = 0,因此力指向负值X)。

  2. 加速度a是F / m,而你有vec F *(delta x)/ m,其中vec F是力 vector ,delta x是行星之间的x距离和太阳。 a与力矢量方向相同。所以你应该有像ax = Fx / m1和ay = Fy / m1这样的东西,如果你想计算m1质量的加速度(比方说,行星)。

  3. 基于上述内容修复代码应该很简单,所以我会留给你做,但如果不清楚只发表评论。

答案 1 :(得分:0)

要避免使用角度并使用三角函数向前和向后转换角度,请使用矢量力

  

F =(Fx,Fy)= - (x,y)* G * m1 * m2 / r ^ 3.

此外,使用教程"Moving Stars Around"来参考实现各种辛和不那么辛的整合方法,并使用Hairer-etal.的论文来了解它背后的理论和历史。