以计算方式求解开普勒方程

我试图解决开普勒方程,作为在给定时间内找到轨道体的真实异常的一个步骤。事实证明,开普勒的方程很难解决,维基百科页面使用微积分描述了这个过程。好吧,我不知道微积分,但我知道解决方程涉及无数个集合,这些集合产生了与正确答案越来越接近的近似值。 我无法从数学上看到如何计算这个,所以我希望有更好数学背景的人可以帮助我。我怎么能在计算上解决这个野兽? FWIW,我正在使用F# - 我可以计算出这个等式所需的其他元素,只是这部分我遇到了麻烦。 我也对接近时间,近点距离和离心率的真实异常的方法持开放态度     
已邀请:
你可以检查一下,用
Carl Johansen
在C#中实现
Represents a body in elliptical orbit about a massive central body
这是代码中的注释   在这种背景下真正的异常是   身体和太阳之间的角度。   对于椭圆轨道,它有点   棘手。期间的百分比   完成仍然是一个关键的输入,但我们   还需要申请Kepler's   方程式(基于偏心率)   确保我们扫除平等   同等地区。这个   方程式是超验的(即不能   以代数方式解决)所以我们   要么必须使用近似值   等式或用数值方法求解。   我的实现使用   Newton-Raphson迭代得到一个   非常好的近似答案(通常   在2或3次迭代中)。     
这篇报告: 求解开普勒方程的一种实用方法http://murison.alpheratz.net/dynamics/twobody/KeplerIterations_summary.pdf 展示了如何使用迭代计算方法解决开普勒方程。将它翻译成您选择的语言应该相当简单。 您可能也会发现这很有趣。这是一个ocaml程序,其中一部分声称包含一个Kepler方程求解器。由于F#属于ML系列语言(如ocaml),这可能是一个很好的起点。     
我想在这里放一个回复,以防这个页面被其他寻找类似材料的人找到。 以下是在Adobe的After Effects软件中作为“表达式”编写的,所以它是javascriptish,虽然我有一个不同的应用程序的Python版本(电影院4d)。这个想法是一样的:迭代地执行牛顿的方法,直到达到任意精度。 请注意,我不会以任何方式将此代码作为示例或有效的方式发布,只是发布我们在截止日期前生成的代码以完成特定任务(即根据开普勒定律将行星移动到焦点周围,并且准确地执行此操作)。我们不会为了生活而编写代码,因此我们也不会将其用于批评。快速&什么是最后期限。 在After Effects中,任何“表达式”代码都会执行一次 - 对于动画中的每一帧。这限制了在实现许多算法时可以做的事情,因为无法轻松地处理全局数据(其他用于开普勒运动的算法使用交互式更新的速度向量,这是我们无法使用的方法)。代码留下的结果是对象在该时刻的[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];
    

要回复问题请先登录注册