0

まず、オイラー法に非常に近いものを使用して惑星の位置を計算しています。これが最も正確な方法ではないことはわかっていますが、ベロシティ ベルレットを使用して 1 週間近く取り組んできましたが、機能させることができません。私の問題は、惑星を太陽の周りにループバックさせることができないことです.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;
}
4

2 に答える 2

0

角度を使用して三角関数で前後に変換することを避けるには、ベクトル力を使用します。

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

また、チュートリアル「Moving Stars Around」を使用して、さまざまなシンプレクティックおよび非シンプレクティック統合法のリファレンス実装と、Hairer-etal による論文を使用してください。その背後にある理論と歴史のために。

于 2014-04-07T21:58:35.193 に答える