【问题标题】:Solar System Project, C++. Can't get negative accelerations(planet won't loop back around)太阳系项目,C++。无法获得负加速度(行星不会环回)
【发布时间】:2014-04-04 19:22:00
【问题描述】:

首先,我使用非常接近欧拉方法的方法来计算我的星球的位置。我知道这不是最准确的方法,但我一直在努力使用velocity 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;
}

【问题讨论】:

  • 没有详细阅读代码——假设你的函数是正确的——我担心浮点错误会让你的星球脱离轨道。
  • 能否提供一个最小版本的CelestialObject 类和一个非常简单的驱动程序?例如,不清楚您是否假设初始速度为零。此外,计算了速度,但似乎没有更新它们对应的CelestialObject。是这个问题吗?
  • 感谢您注意到我没有更新速度。无论如何,希望这是你想要的一些信息CelestialObjectCelestialObject(int index, string filename,float pX, float pY, float VX, float VY, float AX, float AY, double mass);我的构造函数和CelestialObject earth(EARTH_INDEX,"abdSolarSystem/earth.png", 1000, 1000, 0,200,0,0,1000);
  • 你的加速功能是否正确?给定 F = m * a;并且a = F/m,两个物体之间的距离在哪里进入方程?
  • minimal complete example 真的很有帮助。

标签: c++ model simulation physics orbital-mechanics


【解决方案1】:

由于您使用的是笛卡尔坐标系,您应该会发现沿 x 的力在某些配置中为正,而在其他配置中为负,并且沿 y 相同。特别是,力 F 是一个矢量,它从行星的质心指向它绕行的太阳的质心。所以代码有两个问题:

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

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

根据以上内容修复您的代码应该很简单,因此我将由您自行完成,但如果不清楚,请发表评论。

【讨论】:

    【解决方案2】:

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

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

    另外,使用教程"Moving Stars Around" 参考实现各种辛和非辛积分方法,并使用Hairer-etal. 的论文了解其背后的理论和历史。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2012-08-06
      • 1970-01-01
      • 2012-05-17
      • 2023-04-04
      相关资源
      最近更新 更多