【问题标题】:loop a math formula until two values are equal循环一个数学公式,直到两个值相等
【发布时间】:2018-10-26 08:15:31
【问题描述】:

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

这是我的尝试:

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 之间的差大于0.001,则用于计算@987654327 的公式@ 再次完成,这次 E1 变为 E0 并计算出新的 E1。这应该重复,直到E1E0 之间的差异为0.001

如您所见,我对如何编程感到困惑,因此我们将不胜感激。我认为,这是正确的道路,但当前的代码似乎只是在重复相同的值。 这里要求的是原始代码:

这是我要编写的数学公式:

首先,从平均异常 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 度)。

【问题讨论】:

  • 什么是小e?我没有看到它用任何值初始化或传递到您的方法中。如果您尝试使用欧拉数,那不是。运行程序时会发生什么?
  • 请至少引用原始公式,并正确定义变量。

标签: java math


【解决方案1】:

当您使用double 类型变量时,您不会比较精确相等。你应该忘记浮点上下文中的那个词。两个浮点数可以非常接近但不相等。您应该使用较小的 epsilon 值与它们的绝对差异进行比较,当它较小时,您可以说这些数字足够接近,因此您可以说它们被认为是相等的,您的使用 -案子。例如,您可以使用这样的构造:

if(Math.abs(E1 - E0) < EPS){
   //you can assume they are equal
}

例如在你的情况下EPS = 0.001

【讨论】:

    【解决方案2】:

    你几乎可以直接将你的描述翻译成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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2023-01-14
      相关资源
      最近更新 更多