找到开普勒方程的解 (iOS) (swift)
find a solution to Kepler's equation (iOS) (swift)
我正在编写代码来寻找开普勒方程的解 (E):
E - e*sin(E) = M
并且所有角度都以弧度表示,
M = 3.52821,
e = 0.016714
这些是步骤:
- 先猜,设E = Eo = M
- 求 O = E - e*sin(E) - M 的值
- 如果|O| <= 0.000006,转到第 6 步
如果|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)
首先,对你的问题进行了一些你显然忘记提及的更正,我不得不寻找 here。
E0 = M
E = E1 on next iteration if solution not found
关于专业术语,这里的E
叫做Eccentric Anomaly,M
叫做mean Anomaly。其中 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):
E - e*sin(E) = M
并且所有角度都以弧度表示, M = 3.52821, e = 0.016714
这些是步骤:
- 先猜,设E = Eo = M
- 求 O = E - e*sin(E) - M 的值
- 如果|O| <= 0.000006,转到第 6 步 如果|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)
首先,对你的问题进行了一些你显然忘记提及的更正,我不得不寻找 here。
E0 = M
E = E1 on next iteration if solution not found
关于专业术语,这里的E
叫做Eccentric Anomaly,M
叫做mean Anomaly。其中 eps
是精密直径。另外,根据共享文章
同样在 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解决方案。如有步骤错误,责任自负。