找到开普勒方程的解 (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)的主要内容,如果未能解决你的问题,请参考以下文章