找到开普勒方程的解 (iOS) (swift)

Posted

技术标签:

【中文标题】找到开普勒方程的解 (iOS) (swift)【英文标题】:find a solution to Kepler's equation (iOS) (swift) 【发布时间】:2016-07-21 05:39:00 【问题描述】:

我正在编写代码以找到开普勒方程的解 (E):

E - e*sin(E) = M

所有的角度都用弧度表示, M = 3.52821, e = 0.016714

这些是步骤:

    第一个猜测,把 E = Eo = M 求 O = E - e*sin(E) - M 的值 如果 |O| 0.000006,继续第 4 步 求 delta_E = O/(1-e*sin(E)) 取新值 E1 = E - delta_E,转到第 2 步 E的现值是解,在真值的0.000006以内正确

但是,我不知道如何编写这些步骤的代码(swift),请帮助我。

感谢@NSNoob

我终于找到解决办法了!!!

let M = 3.52821
var e = 0.016714
var E = M
var O = E - (e * sin(E)) - M

while (abs(O) > 0.000006) 
    var Delta_E = O / (1-(e*cos(E)))
    E = E - Delta_E
    O = E - (e * sin(E)) - M


print(E)

【问题讨论】:

【参考方案1】:

首先对您的问题进行一些更正,您显然忘记提及了,我不得不寻找here。

E0 = M

E = E1 on next iteration if solution not found

关于技术术语,E 这里称为偏心异常,M 称为平均异常。其中eps 是精密直径。另外,根据分享的文章,E=e

同样在 swift 中,我们对变量和常量使用驼峰式命名约定,但在这里我尝试使用您的名称,以便您可以理解代码。

现在回到正题,以下方法将使用递归为您完成:

func solveKeplersEquationForParamas(M:Double)->Void

    let E:Double = M
    let eps:Double = 0.000006
    let AbsoluteValueOfO:Double = getAbsoluteValueOfO(E, M: M,eps: eps)
    print(NSString(format:"Answer is:%f", AbsoluteValueOfO))




func getAbsoluteValueOfO(E:Double,M:Double,eps:Double) -> Double 
    var SinOFE: Double = Double(sin(E))
    SinOFE = E*SinOFE
    var E1 = E;
    let O = E - SinOFE - M

    var AbsoluteValueOfO = fabs(O)
    if AbsoluteValueOfO > eps 
        print("Solution not found. go to step 4");
        let denom = 1-E*sin(E)
        let absDenom = fabs(denom)
        if absDenom>0
            let deltaE = O/denom
            E1 = E-deltaE
            AbsoluteValueOfO = getAbsoluteValueOfO(E1, M: M, eps: eps)
        
        else
            print("Denom became 0, Can't divide by zero Denom is:%f",denom);
            return AbsoluteValueOfO
        

    
    else if AbsoluteValueOfO < eps || AbsoluteValueOfO == eps
        print("Solution found. Returning the value");
        print(NSString(format:"Value of E is:%f", E1))
    
    return AbsoluteValueOfO

像这样在操场上运行:

solveKeplersEquationForParamas(3.094763)

操场输出:

注意:这是您提到的步骤的 Swift 解决方案。步骤中的任何错误均由您负责。

【讨论】:

其实我在操场上试过这个,但是没有得到我想要的E值 我将我的 M 值设置为“M = 3.52821”并运行它,但出现错误 @JonahThePoo 然后你应该澄清这些步骤,因为正如我指出的那样,它们不正确,我只是按照你提到的步骤进行操作,即用户给出的平均异常值等于 E0。 E=E0。每股收益是 0.000006。 E=e。然后取 E - Esin(E) - M 的绝对值。如果值 sin(E))。你重复这个过程,直到你得到一个落在 @JonahThePoo 是的,对于 3.52821,它运行了 8000 多次,之后程序停止,我想是由于执行过载 是的,你是对的!我为我的不清楚道歉,我想找到 E 的正确值,即 O

以上是关于找到开普勒方程的解 (iOS) (swift)的主要内容,如果未能解决你的问题,请参考以下文章

怎么用C语言解多元一次方程?需要得到最合适的解。

一阶线性微分方程

编写一个程序,求二元一次方程组的解

《Linear Algebra and Its Application》-线性方程组的解

matlab微分方程的解?

用c语言编程求线性方程组的解