循环一个数学公式,直到两个值相等

时间:2018-10-25 15:35:00

标签: java math

我正在尝试处理一个复杂的数学方程式,其中一部分涉及循环值,直到它们之间有特定的区别。

这是我的尝试:

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。这应该重复直到E1E1之间的差为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度)。

2 个答案:

答案 0 :(得分:0)

您几乎可以将您的描述直接转换为Java代码:只要E1E00.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