7

与えられた時間で周回する物体の真の異常を見つけるためのステップとして、ケプラーの方程式を解こうとしています。しかし、ケプラーの方程式は解くのが難しいことが判明し、ウィキペディアのページでは微積分を使用したプロセスが説明されています。微積分はわかりませんが、方程式を解くには無限の数の集合が必要であり、正解にますます近づく近似が生成されることは理解しています。

数学を見てもこれを計算的に行う方法がわからないので、数学のバックグラウンドが優れている人が助けてくれることを望んでいました。この獣を計算的に解くにはどうすればよいでしょうか?

FWIW、私は F# を使用しています -- そして、この方程式に必要な他の要素を計算できます。問題を抱えているのはこの部分だけです。

私はまた、与えられた時間、近点距離、および離心率を考慮して真の異常を近似する方法にもオープンです

4

3 に答える 3

8

この紙:

ケプラー方程式を解くための実用的な方法
http://murison.alpheratz.net/dynamics/twobody/KeplerIterations_summary.pdf

反復計算法を使用してケプラー方程式を解く方法を示します。選択した言語に翻訳するのはかなり簡単です。


これも興味深いかもしれません。 これは ocaml プログラムであり、その一部にはケプラー方程式ソルバーが含まれていると主張されています。F# は (ocaml と同様に) 言語の ML ファミリーに属しているため、これは良い出発点となる可能性があります。

于 2011-03-13T06:08:53.747 に答える
3

このページが同様の資料を探している他の誰かによって見つけられた場合に備えて、ここに返信をドロップしたかった。

以下は、AdobeのAfter Effectsソフトウェアで「式」として記述されているため、別のアプリ(cinema 4d)用のPythonバージョンがありますが、javascriptishです。考え方は同じです。任意の精度に達するまで、ニュートン法を繰り返し実行します。

私はこのコードを模範的または意味のある効率的なものとして投稿しているのではなく、特定のタスクを達成するために期限に作成したコードを投稿していることに注意してください(つまり、ケプラーの法則に従って惑星を焦点の周りに移動し、正確に実行します)。私たちは生計を立てるためのコードを書かないので、批評のためにこれを投稿することもありません。クイック&ダーティは締め切りに間に合うものです。

After Effectsでは、「式」コードはアニメーションの1フレームごとに1回実行されます。これは、グローバルデータを簡単にアドレス指定できないため、多くのアルゴリズムを実装するときに実行できることを制限します(ケプラー運動の他のアルゴリズムは、相互に更新された速度ベクトルを使用します。これは、使用できなかったアプローチです)。コードが残す結果は、その瞬間のオブジェクトの[x、y]位置(内部的には、これはフレーム番号です)であり、コードは、上のオブジェクトレイヤーの位置要素にアタッチされることを目的としています。タイムライン。

このコードは、http://www.jgiesen.de/kepler/kepler.htmlにある資料から発展したものであり、次の人のためにここで提供されています。

pi = Math.PI;
function EccAnom(ec,am,dp,_maxiter) { 
// ec=eccentricity, am=mean anomaly,
// dp=number of decimal places
    pi=Math.PI;
    i=0; 
    delta=Math.pow(10,-dp); 
    var E, F; 

    // some attempt to optimize prediction
    if (ec<0.8) {
        E=am;
    } else {
       E= am + Math.sin(am);
    }
    F = E - ec*Math.sin(E) - am; 
    while ((Math.abs(F)>delta) && (i<_maxiter)) {
        E = E - F/(1.0-(ec* Math.cos(E) )); 
        F = E - ec * Math.sin(E) - am; 
        i = i + 1;
    } 
    return Math.round(E*Math.pow(10,dp))/Math.pow(10,dp);
} 
function TrueAnom(ec,E,dp) { 
    S=Math.sin(E); 
    C=Math.cos(E); 
    fak=Math.sqrt(1.0-ec^2);

    phi = 2.0 * Math.atan(Math.sqrt((1.0+ec)/(1.0-ec))*Math.tan(E/2.0));
    return Math.round(phi*Math.pow(10,dp))/Math.pow(10,dp);
} 
function MeanAnom(time,_period) {
    curr_frame  = timeToFrames(time);
    if (curr_frame <= _period) {
        frames_done = curr_frame;
        if (frames_done < 1) frames_done = 1;
    } else {
        frames_done = curr_frame % _period;
    }
    _fractime = (frames_done * 1.0 ) / _period;
    mean_temp   = (2.0*Math.PI) * (-1.0 * _fractime);
    return mean_temp;
}
//==============================
// a=semimajor axis, ec=eccentricity, E=eccentric anomaly 
// delta = delta digits to exit, period = per., in frames
//----------------------------------------------------------
_eccen      = 0.9;              
_delta      = 14;
_maxiter    = 1000;                 
_period     = 300;          
_semi_a     = 70.0;
_semi_b     = _semi_a * Math.sqrt(1.0-_eccen^2); 
_meananom = MeanAnom(time,_period);
_eccentricanomaly = EccAnom(_eccen,_meananom,_delta,_maxiter);
_trueanomaly = TrueAnom(_eccen,_eccentricanomaly,_delta);
r = _semi_a * (1.0 - _eccen^2) / (1.0 + (_eccen*Math.cos(_trueanomaly)));
x = r * Math.cos(_trueanomaly);
y = r * Math.sin(_trueanomaly);
_foc=_semi_a*_eccen;
[1460+x+_foc,540+y];
于 2012-08-11T12:29:07.243 に答える
2

これをチェックして、C#で実装することができますCarl Johansen

Represents a body in elliptical orbit about a massive central body

これがコードからのコメントです

この文脈での真近点角は、体と太陽の間の角度です。楕円軌道の場合、少し注意が必要です。完了した期間のパーセンテージは依然として重要な入力ですが、同じ時間に同じ領域をスイープすることを保証するために、(離心率に基づく)ケプラーの方程式を適用する必要もあります。この方程式は超越的であるため(つまり、代数的に解くことはできません)、近似方程式を使用するか、数値法で解く必要があります。私の実装では、ニュートン-ラフソン反復を使用して、優れた近似解を取得します(通常、2回または3回の反復で)。

于 2011-03-13T06:30:55.850 に答える