цикл математической формулы, пока два значения не равны - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь работать над сложным математическим уравнением, и часть его включает циклические значения до тех пор, пока они не станут чем-то конкретным.

Вот моя попытка:

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 формула, используемая для вычисления E1, выполняется снова, на этот раз E1 становится E0 и вычисляется новый E1.Это должно повторяться до тех пор, пока разница между E1 и E0 не станет 0.001.

Как видите, я запутался, как программировать это, поэтому любая помощь будет принята с благодарностью.Я думаю, что это правильный путь, но этот текущий код, кажется, просто повторяет те же значения.В соответствии с запросом вот оригинальный код:

Вот математическая формула, которую я пытаюсь закодировать:

Сначала вычислите эксцентричную аномалию, E, из M, среднюю аномалию, и eэксцентричностьВ первом приближении do (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 голосов
/ 25 октября 2018

Вы не сравниваете для точного равенства, когда используете переменные типа double.Вы должны забыть об этом слове в контексте с плавающей точкой.Два числа с плавающей точкой могут быть действительно близки к равным, но не равны.Вам следует использовать небольшое значение эпсилона для сравнения с их абсолютной разницей, когда оно меньше, вы можете сказать, что числа достаточно близки, чтобы вы могли сказать, что они считаются равными для вашего варианта использования.,Например, вы можете использовать такую ​​конструкцию:

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

, где, например, EPS = 0.001.

0 голосов
/ 25 октября 2018

Вы можете почти напрямую перевести ваше описание в код 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...