ENG Новый сайт

Расширенный поиск
[ Новые сообщения · Пользователи · Правила ]
  • Страница 1 из 1
  • 1
Помощь в математической модели
GV_FiQstДата: Пятница, 27.11.2015, 00:19 | Сообщение # 1
Строитель Миров
Группа: Команда SE
Украина
Сообщений: 1062
Награды: 3
Статус: Offline
Всех приветствую! Давненько я не был на этом сайте :(
У меня есть проблема которую я не могу никак решить, поэтому я решил попросить помощи в специалиста, который эту проблему решил в своем проекте (Space Engine). Проблема моя заключается в построении модели движения объекта вокруг барицентра по сильно вытянутой эллиптической орбите. Пишу я игру на Android просто, как говорится, для фана. Игра простая 2D, поэтому координаты (х,у). С круговой орбитой все просто, координаты точки на таком коле считаю по формуле:
Код
x = r*sin(α)
y = r*cos(α)

где α - средняя или истинная аномалия. для круговой орбиты эти параметры идентичны
r - радиус круга или большая полуось объекта

для элиптической орбиты все сложнее. формулу немного переработал и вышло:
Код
r = a * (1 - e2) / (1 + e*cos(α)) //e2 - е квадрат
x = r*sin(α)
y = r*cos(α)

где е - эксцентриситет
a - большая полуось
α - истинная аномалия

Такая формула заработала, нарисовала мне эллипс с фокусом в точке (0, 0).


И тут у меня тупик. Проблема вот в чем: когда как с круговой орбитой меняю истинную аномалию объекта на одинаковое значение у меня выходит, что в перицентре объект движется медленнее, а в апоцентре быстрее. И я понимаю в чем проблема, просто нельзя использовать истинную аномалию в этих случаях. Надо использовать среднюю аномалию. Но я никак не смог связать два параметра аналитическим уравнением, чтобы при данной средней аномалии найти истинную.

Нашел вот что:
Уравнение Кеплера:
Код
E - e*sin(E) = M

где E - эксцентрическая аномалия
M - средняя аномалия

Также, на англ. вики нашел ф-лу:
Код
cos(E) = (e + cos(U))/(1 + e*cos(U))
sin(E) = (sqrt(1 - e2) * sin(U))/(1 + e*cos(U))

где U - истинная аномалия
sqrt(х) - квадратный корень из х.

Из этих двух формул видно что можно из средней аномалии найти истинную, но я никак не могу этого добиться... Помоги-те SpaceEngineer. Может я совсем неправильно все делаю, или как. Как вы считаете декартовые координаты планеты в SE? Заранее благодарен wink
Прикрепления: 2066827.jpg (25.0 Kb)


AMD Phenom II X2 555 3200 MHz;
RAM 4GB 1333 Hz;
ATI Radeon HD 5670 1024 Mb;
ОС Win 7 tabulorasa edition 32 bit


Сообщение отредактировал GV_FiQst - Пятница, 27.11.2015, 00:35
SpaceEngineerДата: Пятница, 27.11.2015, 01:03 | Сообщение # 2
Автор Space Engine
Группа: Администраторы
Российская Федерация
Сообщений: 5547
Награды: 55
Статус: Offline
Цитата GV_FiQst ()
Из этих двух формул видно что можно из средней аномалии найти истинную, но я никак не могу этого добиться...

Просто формулой тут не отделаться. Уравнение Кеплера надо решать численными методами. Например, для малых эксцентриситетов можно воспользоваться простейшим методом Ньютона. Достаточно всего 5 итераций:

Код

        double E = M;
        double E0;
        for (int i=0; i<5; ++i)
        {
            E0 = E;
            E = M + Eccentricity * sin(E0);
            if (fabs(E-E0) <= 1.0e-6) break;
        }


Для больших e этот метод сходится медленно, и лучше использовать другой. Вообще в сети полно литературы по этой теме.


GV_FiQstДата: Пятница, 27.11.2015, 01:20 | Сообщение # 3
Строитель Миров
Группа: Команда SE
Украина
Сообщений: 1062
Награды: 3
Статус: Offline
Цитата SpaceEngineer ()
Код

E - эксцентрическая аномалия?

Этот способ работает для е < 0.2? Тогда он не очень мне подходит ведь я хочу сделать астероиды, в которых 0,6 < e < 0.8.

Цитата SpaceEngineer ()
Вообще в сети полно литературы по этой теме.

Искал, гуглил, ломал голову. В сети, да, есть некоторые формулы, но я не нашел того что мне надо sad


AMD Phenom II X2 555 3200 MHz;
RAM 4GB 1333 Hz;
ATI Radeon HD 5670 1024 Mb;
ОС Win 7 tabulorasa edition 32 bit
GV_FiQstДата: Пятница, 27.11.2015, 01:53 | Сообщение # 4
Строитель Миров
Группа: Команда SE
Украина
Сообщений: 1062
Награды: 3
Статус: Offline
Спасибо вам! smile Я ввел этот способ для нахождения эксцентрической аномалии и по формуле
Код
u = acos((cos(eccAnomaly) - e) / (1 - e*cos(eccAnomaly)));

нашел истинную аномалию!! Все работает как я хочу!


AMD Phenom II X2 555 3200 MHz;
RAM 4GB 1333 Hz;
ATI Radeon HD 5670 1024 Mb;
ОС Win 7 tabulorasa edition 32 bit


Сообщение отредактировал GV_FiQst - Пятница, 27.11.2015, 01:57
  • Страница 1 из 1
  • 1
Поиск:

>