Отличный ответ @Julio описывает угол траектории полета и объясняет, что это угол между тангенциальным направлением (перпендикулярным радиальному вектору к центральному телу) и текущим вектором скорости.
Сначала я попытался получить угол из этого выражения, но это явно неправильно, так как является четной функцией, и угол может идти от к :
Я интегрировал орбиты для GM ( ) и СМА ( ) единицы и стартовые расстояния от 0,2 до 1,8. Это делает период всегда . Когда я рисую результат своей функции, я получаю слишком много покачиваний.
Какое выражение я могу использовать, чтобы получить правильную гамму угла траектории полета, начиная с векторов состояния?
Пересмотренный python для ошибочной части был бы оценен, но, конечно, не обязателен для ответа.
def deriv(X, t):
x, v = X.reshape(2, -1)
acc = -x * ((x**2).sum())**-1.5
return np.hstack((v, acc))
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint as ODEint
halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]
T = twopi
time = np.linspace(0, twopi, 201)
a = 1.0
rstarts = 0.2 * np.arange(1, 10)
vstarts = np.sqrt(2./rstarts - 1./a) # from vis-viva equation
answers = []
for r, v in zip(rstarts, vstarts):
X0 = np.array([r, 0, 0, v])
answer, info = ODEint(deriv, X0, time, full_output= True)
answers.append(answer.T)
gammas = []
for a in answers:
xx, vv = a.reshape(2, 2, -1)
dotted = ((xx*vv)**2).sum(axis=0)
rabs, vabs = [np.sqrt((thing**2).sum(axis=0)) for thing in (xx, vv)]
gamma = np.arccos(dotted/(rabs*vabs)) - halfpi
gammas.append(gamma)
if True:
plt.figure()
plt.subplot(4, 1, 1)
for x, y, vx, vy in answers:
plt.plot(x, y)
plt.plot(x[:1], y[:1], '.k')
plt.plot([0], [0], 'ok')
plt.title('y vs x')
plt.subplot(4, 1, 2)
for x, y, vx, vy in answers:
plt.plot(time, x, '-b')
plt.plot(time, y, '--r')
plt.title('x (blue) y (red, dashed)')
plt.xlim(0, twopi)
plt.subplot(4, 1, 3)
for x, y, vx, vy in answers:
plt.plot(time, vx, '-b')
plt.plot(time, vy, '--r')
plt.title('vx (blue) vy (red), dashed')
plt.xlim(0, twopi)
plt.subplot(4, 1, 4)
for gamma in gammas:
plt.plot(time, gamma)
plt.title('gamma?')
plt.xlim(0, twopi)
plt.show()
Это проблема, которая преследует группы людей, очень хорошо осведомленных об орбитальной динамике, но которые учились по разным учебникам: есть два разных определения «угла траектории полета»!!
В дополнение к , угол между тангенциальным направлением и вектором скорости, есть , угол между радиальным направлением и вектором скорости. Люди часто говорят «угол траектории полета», не говоря, какое определение они используют . Сбивает с толку! (Я только что заметил, что диаграмма в ответе Хулио также показывает )
Если вы работаете с вместо того , дан кем-то
который идет от 0 ("прямо вверх") до ("прямо вниз"). С использованием , "прямо вверх" это и "прямо вниз" , так что преобразование к ты просто вычитаешь из :
Это эквивалентно
Я не знаком с языком, который вы использовали для своих расчетов и графиков, поэтому я не смотрел ваш алгоритм, чтобы понять, почему «слишком много покачиваний».
Я нашел ошибку в скрипте, это было из-за моего "доморощенного" точечного продукта. У меня был лишний квадрат:
dotted = ((xx*vv)**2).sum(axis=0) # WRONG
dotted = (xx*vv).sum(axis=0) # Correct
Итак, используя это плюс отличные разъяснения @TomSpilker, я использовал следующие два метода для расчета гаммы:
Способ 1:
Способ 2:
Альтернативный метод грубой силы для двойной проверки:
Операция по модулю действительно нужна только в компьютерной программе, поскольку каждая тета получается из отдельной операции arctan2:
gammas_1, gammas_2 = [], []
for a in answers:
xx, vv = a.reshape(2, 2, -1)
dotted = (xx*vv).sum(axis=0)
rabs, vabs = [np.sqrt((thing**2).sum(axis=0)) for thing in (xx, vv)]
gamma_1 = np.arcsin(dotted/(rabs*vabs)) # Per Tom Spilker's answer Eq. 3
theta_r = np.arctan2(xx[1], xx[0])
theta_v = np.arctan2(vv[1], vv[0])
theta_tanj = theta_r + halfpi
gamma_2 = theta_tanj - theta_v
gamma_2 = np.mod(gamma_2 + pi, twopi) - pi
gammas_1.append(gamma_1)
gammas_2.append(gamma_2)
plt.figure()
plt.subplot(2, 1, 1)
for gamma_1 in gammas_1:
plt.plot(time, gamma_1)
plt.title('gammas_1', fontsize=16)
plt.subplot(2, 1, 2)
for gamma_2 in gammas_2:
plt.plot(time, gamma_2)
plt.title('gammas_2', fontsize=16)
пользователь20636