Language agnostic 求解开普勒';s方程的计算

Language agnostic 求解开普勒';s方程的计算,language-agnostic,astronomy,Language Agnostic,Astronomy,我正在努力解决这个问题,这是迈向成功的一步。但事实证明,开普勒方程很难求解,维基百科网页上也有。嗯,我不懂微积分,但我知道解这个方程需要无穷多个集合,这些集合会产生越来越接近正确答案的近似值 我从数学的角度看不出如何进行计算,所以我希望有更好的数学背景的人能帮助我。我如何通过计算解决这个问题 FWIW,我用的是F#-,我可以计算出这个方程所需的其他元素,这就是我遇到麻烦的部分 在给定时间、近点距离和偏心率的情况下,我也愿意采用近似真实异常的方法 求解开普勒方程的实用方法 演示如何使用迭代计算方法

我正在努力解决这个问题,这是迈向成功的一步。但事实证明,开普勒方程很难求解,维基百科网页上也有。嗯,我不懂微积分,但我知道解这个方程需要无穷多个集合,这些集合会产生越来越接近正确答案的近似值

我从数学的角度看不出如何进行计算,所以我希望有更好的数学背景的人能帮助我。我如何通过计算解决这个问题

FWIW,我用的是F#-,我可以计算出这个方程所需的其他元素,这就是我遇到麻烦的部分

在给定时间、近点距离和偏心率的情况下,我也愿意采用近似真实异常的方法

求解开普勒方程的实用方法

演示如何使用迭代计算方法求解开普勒方程。将其翻译成您选择的语言应该相当简单



您可能还会发现它是一个ocaml程序,其中一部分声称包含开普勒方程求解器。由于F#属于ML语言家族(与ocaml一样),这可能提供了一个很好的起点。

您可以检查一下

表示围绕一个巨大的中心天体在椭圆轨道上运行的天体

下面是代码中的注释

在这种情况下,真正的异常是 身体和太阳之间的角度。 对于椭圆轨道,它有点 棘手的期间的百分比 完成仍然是一个关键输入,但我们 还需要应用开普勒定律 方程式(基于偏心率) 确保我们平等地扫荡 在相同的时间区域。这 等式是超越的(不能) (用代数方法求解)所以我们 或者必须使用近似值 方程或用数值方法求解。 我的实现使用 牛顿-拉斐逊迭代法 非常好的近似答案(通常是 在2或3次迭代中)


想把一个答复放在这里,以防这个页面被其他寻找类似材料的人找到

以下内容是在Adobe的After Effects软件中作为“表达式”编写的,因此它是javascriptish,尽管我为另一个应用程序(cinema 4d)提供了Python版本。想法是一样的:反复执行牛顿的方法,直到达到某种任意精度

请注意,我并没有以任何方式发布此代码作为示例或有意义的高效代码,只是发布了我们在截止日期前为完成特定任务而生成的代码(即,根据开普勒定律将行星围绕焦点移动,并准确地执行此操作)。我们不以写代码为生,所以我们也不发表这篇评论。快速和肮脏是什么满足期限

在After Effects中,任何“表达式”代码都会执行一次—对于动画中的每一帧。这限制了人们在实现许多算法时所能做的,因为无法轻松地处理全局数据(其他开普勒运动算法使用交互更新的速度向量,这是我们无法使用的方法)。代码留下的结果是对象在该时刻的[x,y]位置(在内部,这是帧编号),代码将附加到时间轴上对象层的位置元素

这段代码是由在上找到的材料演变而来的,并在这里提供给下一个家伙

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];
pi=Math.pi;
函数EccAnom(ec,am,dp,_maxiter){
//ec=偏心率,am=平均异常,
//dp=小数位数
pi=Math.pi;
i=0;
δ=数学功率(10,-dp);
变量E,F;
//优化预测的一些尝试

如果(ecdelta)和(很有趣,但我不使用F#if与java一起使用,那么我可以帮助但仍在学习它。@我添加了一个语言不可知标记。我不介意从伪代码或其他语言转换。好吧,开普勒方程似乎与我所研究的光学方程有很大不同。仍然,必须工作。这可能需要很多时间ed QA:,,你的编辑是对的,我找到了开普勒方程解算器。谢谢你,太棒了!再举一个例子,我可以检查一下。我不得不接受这个答案,这个例子很容易理解,效果也很好。循环
while(Math.Abs(E_old-E_new)>epsilon)
将始终在第一次迭代时结束,因为前一行是
E_old=E_new
。如果我错了,请纠正我。