我正在尝试处理一个复杂的数学方程式,其中一部分涉及循环值,直到它们之间有特定的区别。
这是我的尝试:
public void EccentricAnomaly(double M) {
double E = M + e;
if (e > 0.06) {
E0 = E;
double anglesInRadianE = Math.toRadians(E0);
double E1 = E0 - (E0 - e * Math.sin(angleInRadiansE) - M / (1 - e * Math.cos(angleINRadianE)));
if (E1-E0 !=0.001) {
E1 = E0;
E1 = E0 - (E0 - e * Math.sin(angleInRadiansE) - M / (1 - e * Math.cos(angleINRadianE)));
}
v = Math.cos(E1) - e;
x = Math.sqrt(e);
} else {
v = Math.cos(E) - e;
}
问题在于,如果先前计算中的e
大于0.06
,则会计算E1
,但如果与E0
之间的差大于{{ 1}}用于计算0.001
的公式再次完成,这次E1
变成E1
并计算出新的E0
。这应该重复直到E1
和E1
之间的差为E0
。
如您所见,我对如何对此程序感到困惑,因此将不胜感激。我认为这是正确的方法,但是当前代码似乎只是在重复相同的值。 根据要求,这里是原始代码:
这是我要编写的数学公式:
首先,根据M(平均异常)和e(偏心率)计算偏心距E。作为第一近似,做(E和M的弧度): E = M + e * sin(M)*(1.0 + e * cos(M)) 如果偏心率e小于约0.05-0.06,则此近似值足够准确。如果偏心率较大,则设置E0 = E,然后使用此迭代公式(以弧度表示的E和M): E1 = E0-(E0-e * sin(E0)-M)/(1-e * cos(E0)) 对于每个新的迭代,将E0替换为E1。迭代直到E0和E1足够靠近(大约0.001度)。
答案 0 :(得分:0)
您几乎可以将您的描述直接转换为Java代码:只要E1
和E0
比0.001
更远,请重新计算E1
:
while(Math.abs(E1 - E0) > 0.001) {
E0 = E1;
E1 = E0 -( E0 - e* Math.sin(angleInRadiansE)-M / (1 - e * Math.cos(angleINRadianE));
}
答案 1 :(得分:0)
在使用double
类型变量时,您不进行完全相等的比较。您应该在浮点上下文中忘记该词。两个浮点数可以真正接近相等但不相等。您应该使用一个较小的epsilon值来与它们的绝对偏差进行比较,当它较小时,您可以说数字足够接近,这样您就可以说它们在您的使用中被认为是相等的,案件。例如,您可以使用以下构造:
if(Math.abs(E1 - E0) < EPS){
//you can assume they are equal
}
例如,在您的情况下,EPS = 0.001
。