Я хотел бы создать программное обеспечение для орбитальной механики с нуля. Я чувствую, что это был бы отличный способ изучить шаги, необходимые для вычисления различных элементов кеплеровской орбиты объекта, построения орбит и предсказания, где объект будет находиться в будущем.
В частности, я хочу начать с вычисления кепларианских элементов. Входными данными, которые я бы дал программе, были векторы положения и скорости, а также время. Эти входные векторы будут относиться к центру Земли, поэтому мне также может понадобиться выполнить передачу координат, если я хочу использовать определенное место на поверхности в качестве точки отсчета.
Я видел математику для расчета элементов орбиты Кеплера из этой книги , и я знаю, что за эти годы было разработано много программного обеспечения для их расчета, но мне трудно совместить их. Математика в книге немного сбивает с толку, и я думаю, что мне было бы легче понять, если бы я увидел шаги, «записанные» на языке программирования.
Даны центрированные на Земле, инерциальные (ECI) положение и векторы скорости а также , вы можете напрямую решить для классических орбитальных элементов следующим образом (сначала алгоритмы, а затем псевдокод внизу):
Сначала найдите угловой момент
тогда вектор узла
Тогда вектор эксцентриситета равен
а также .
Удельная механическая энергия
Если , тогда
В настоящее время,
И вам нужно будет сделать следующие проверки: Если , тогда ,
Если , тогда , а также
Если , тогда .
Обратите внимание, что в некоторых случаях вы столкнетесь с проблемами (особенностями): круговые орбиты ( ), и экваториальные орбиты ( ), особенно. В этих случаях вы обычно вводите новую, менее хлопотную переменную, например, среднюю долготу или истинную долготу перигея.
h=cross(r,v)
nhat=cross([0 0 1],h)
evec = ((mag(v)^2-mu/mag(r))*r-dot(r,v)*v)/mu
e = mag(evec)
energy = mag(v)^2/2-mu/mag(r)
if abs(e-1.0)>eps
a = -mu/(2*energy)
p = a*(1-e^2)
else
p = mag(h)^2/mu
a = inf
i = acos(h(3)/mag(h))
Omega = acos(n(1)/mag(n))
if n(2)<0
Omega = 360-Omega
argp = acos(dot(n,evec)/(mag(n)*e))
if e(3)<0
argp = 360-argp
nu = acos(dot(evec,r)/(e*mag(r))
if dot(r,v)<0
nu = 360 - nu
Примечание : это следует из метода, изложенного в «Основах астродинамики и приложений » Вальядо, 2007.
a
? Я смотрю на это эталонное изображение .n^
? Что такое K^
? Что такое μ
? Что такое r
и чем отличается r⃗
? А как насчет v
и v⃗
? Что такое p
?h_K
и n_I
?Первый ключ к выяснению этого — правильная система координат. Для таких вещей обычно используются две системы координат. Это фиксированные кадры с центрированием на земле ( ECEF ) и кадры с центрированием на земле (ECI). В полночь эти две точки точно совпадают, но в другое время они расходятся в зависимости от вращения Земли. ECEF лучше всего работает для вещей на Земле (если вы не двигаетесь, у вас должна быть нулевая скорость. ECEF принимает это во внимание, скорость ECI заставит вас двигаться вместе с вращением Земли), ECI лучше всего работает для вещей на орбите (орбитальное движение). объекты не заботятся о вращении Земли, по крайней мере, физике все равно). Убедитесь, что системы координат правильные!
Итак, у вас есть положение и скорость в координатах ECI, что вы делаете? Есть отличная статья , описывающая весь процесс, конечные формулы которой я скопирую сюда. Есть также несколько хороших источников здесь , здесь и здесь . Я настоятельно рекомендую внимательно их прочитать. Неопределенность гораздо сложнее, так что давайте просто предположим, что вы в совершенстве знаете скорость и положение. В частности, 6 классических элементов Кеплариана — это эксцентриситет (е), наклон (i), прямое восхождение восходящего узла ( ), аргумент перигея ( ), большая полуось (а) и время прохождения перигея ( ).
Я должен упомянуть, что я в первую очередь следую методу определения орбиты Лапласа , существует конкурирующая методология, известная как метод Гаусса. Но в конце концов дело дошло до расшифровки кода Matlab .
Большая полуось
; % большая полуось
Эксцентриситет
L = [rs(2,:).*vs(3,:) - rs(3,:).*vs(2,:);...
rs(3,:).*vs(1,:) - rs(1,:).*vs(3,:);...
rs(1,:).*vs(2,:) - rs(2,:).*vs(1,:)]; %angular momentum
% полуширокая прямая кишка
наклон
Аргументы Перицентра
Долгота восходящего узла
Время прохождения перигея:
OrbitalPy имеет удобную elements_from_state_vector
функцию, которая делает именно это:
https://github.com/RazerM/orbital/blob/0.7.0/orbital/utilities.py#L252
Вы можете проверить, что математика такая же, как в ответе пользователя 29.
h.z
с h.y
и [0, 0, 1]
с [0, 1, 0]
?
Стью
пользователь6972
RickNZ