Гравитационные маневры
Гравитационные маневры представляют собой технологию, используемую космическими миссиями для изменения орбиты и скорости космических аппаратов с минимальными затратами энергии. Эта техника включает в себя использование силы гравитации планет или других небесных тел для увеличения скорости космического аппарата при его прохождении вблизи этих объектов. Гравитационные маневры позволяют не только эффективно управлять траекторией полета, но и значительно увеличивать дальность путешествий, что особенно актуально для межпланетных миссий. Правильное планирование таких маневров может сократить время полета и сократить затраты на топливо, что делает их важным инструментом в астрономии и исследовании космоса.
Что такое гравитационный манёвр?
Гравитационный манёвр — это придание космическому аппарату нужных величины и направления за счёт энергии небесного тела.
Первый в истории такой манёвр был совершён советской межпланетной станцией Луна-3 в 1959 году. Под действием гравитации Луны её орбитальная плоскость сместилась. Это позволило аппарату вернуться к Земле по нужной траектории, пролетев по возвращении над наблюдательными станциями.
«Вояджер-2», покинувший землю в 1977 году, сократил за счёт гравитационных манёвров у Юпитера, Сатурна и Урана срок полёта к Нептуну на 18 лет (по сравнению с полётом по гомановской траектории).
Как это работает?
На рисунке представлена схема манёвра. Здесь вектора v0 и v- скорости космического аппарата в гелиоцентрической СО до попадания в сферу гравитационного влияния планеты и после её преодоления. Bектора v'0 и v' — те же скорости, но в СО планеты. Вектор u — скорость планеты.
Космический аппарат, попав в поле тяжести планеты, сначала ускоряется, а затем покидая её, тормозится. При этом скорость аппарата относительно планеты после того, как он покинет сферу её влияния, останется по модулю равной изначальной: |v'0 |= |v'|
Направление её однако поменяется. Из-за этого скорость космического аппарата в гелиоцентрической СО:
изменит не только направление, но и величину.
Таким образом аппарат использует энергию планеты для придания своей скорости нужной величины и направления.
График изменения модуля скорости, построенный программой на языке Python, показывает более детально, как изменяется модуль скорости аппарата в процессе взаимодействия с небесным телом.
Математическое описание движения космического аппарата в процессе совершения гравитационного манёвра.
Перейдем в систему отсчета, связанную с планетой. Чтобы тело в конечном итоге преодолело гравитационное поле планеты, оно должно двигаться по гиперболе (в предельном случае — по параболе). Причём сама планета находится в одном из её фокусов. По свойству гиперболы, разность между расстояниями от некоторой её точки до её фокусов одинакова для всех точек гиперболы. Приравняем эти разности для точки X и для точки, бесконечно удалённой от планеты:
Запишем закон сохранения энергии:
И закон сохранения момента импульса:
Решив систему из этих уравнений (где ℓ — прицельная дальность), получим:
Прицельная дальность не может быть меньше эффективного радиуса планеты (прицельной дальности, при которой аппарат коснётся поверхности земли). Поэтому предельный случай:
Чтобы найти эффективный радиус, вновь воспользуемся законом сохранения энергии и законом сохранения момента импульса:
Решив систему, получим:
где v2 — вторая космическая скорость планеты:
Воспользовавшись полученным соотношением, можно найти максимальный угол отклонения как функцию скорости сближения с планетой:
Модуль вектора изменения скорости равен:
Подставив в это выражение значение угла и продифференцировав, получим, что максимальный модуль вектора приращения скорости достигается при скорости сближения:
где v1 — первая космическая скорость для данной планеты. Аппарат при этом отклонится от первоначальной траектории в СО планеты на 60 градусов.
Ниже в таблице приведены значения максимального приращения скорости для тел солнечной системы (в км/c).
Меркурий | 3, 01 | Юпитер | 42,73 |
Венера | 7,33 | Сатурн | 25,62 |
Земля | 7,91 | Уран | 15,18 |
Луна | 1,68 | Нептун | 16,73 |
Марс | 3,56 | Плутон | 1,09 |
Код.
import matplotlib.pyplot as plt
import numpy as np
# Constants
G = 6.67430e-11 # Gravitational constant
M_p = 5.972e24 # Mass of the planet (in kg)
M_s = 1000 # Mass of the spacecraft (in kg)
r_p = 6.371e6 # Radius of the planet (in meters)
# Initial conditions
x_p, y_p = 0, 0 # Initial coordinates of the planet
v_px, v_py = 0, 0.5e3 # Initial velocity of the planet
x_s, y_s = 3 * r_p, -4 * r_p # Initial position of the spacecraft
v_x, v_y = -7e3, 3e3 # Initial velocity of the spacecraft (tuned for hyperbolic orbit)
dt = 10 # Time step (in seconds)
num_steps = 785 # Number of steps for the simulation
# Lists to store trajectory data, speed, and distance
x_trajectory, y_trajectory = [], []
x_planet_trajectory, y_planet_trajectory = [], []
speed, distance = [], []
# Calculate initial distance between planet and spacecraft
initial_distance = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)
for _ in range(num_steps):
r = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)
if r <= r_p:
print("Crash! The spacecraft has collided with the planet.")
break
# Gravitational acceleration
a_x = -G * M_p * (x_s - x_p) / r**3
a_y = -G * M_p * (y_s - y_p) / r**3
# Update velocities
v_x += a_x * dt
v_y += a_y * dt
# Update positions
x_s += v_x * dt
y_s += v_y * dt
x_p += v_px * dt
y_p += v_py * dt
# Store trajectory data
x_trajectory.append(x_s)
y_trajectory.append(y_s)
x_planet_trajectory.append(x_p)
y_planet_trajectory.append(y_p)
# Calculate and store speed and distance
speed.append(np.sqrt(v_x**2 + v_y**2))
distance.append(r)
# Plotting the trajectory of the spacecraft and planet
plot_limit = 2 * initial_distance # Set plot limit to 2 times the initial distance
# Trajectory plot
fig1, ax1 = plt.subplots(figsize=(10, 10))
ax1.plot(x_trajectory, y_trajectory, label='Spacecraft Trajectory')
ax1.plot(x_planet_trajectory, y_planet_trajectory, label='Planet Trajectory', linestyle='--')
ax1.plot(x_p, y_p, 'ro', markersize=10, label='Planet') # Planet
ax1.plot(x_trajectory[0], y_trajectory[0], 'go', markersize=8, label='Start Point') # Start point of the spacecraft (dynamic)
ax1.set_aspect('equal', adjustable='box')
ax1.set_xlabel('X coordinate (m)')
ax1.set_ylabel('Y coordinate (m)')
ax1.set_title('Trajectory of the Spacecraft with Moving Planet (Hyperbolic)')
ax1.set_xlim(-plot_limit, plot_limit) # Set x-axis limits
ax1.set_ylim(-plot_limit, plot_limit) # Set y-axis limits
ax1.grid(True) # Add grid for better visualization
ax1.legend()
# Speed plot
fig2, ax2 = plt.subplots(figsize=(10, 5))
time = np.arange(0, len(speed) * dt, dt)
ax2.plot(time, speed)
ax2.axhline(speed[0], color='r', linestyle='--', label=f'Начальная скорость: {speed[0]:.2f} м/с')
ax2.axhline(speed[-1], color='g', linestyle='--', label=f'Конечная скорость: {speed[-1]:.2f} м/с')
ax2.set_xlabel('Время (c)')
ax2.set_ylabel('Скорость (м/с)')
ax2.set_title('Зависимость скорости космического аппарата от времени')
plt.minorticks_on()
plt.grid(True)
plt.grid(which = 'minor' , color="grey", alpha=0.25)
ax2.legend() # Add legend to the plot
# Distance plot
fig3, ax3 = plt.subplots(figsize=(10, 5))
ax3.plot(time, distance)
ax3.set_xlabel('Time (s)')
ax3.set_ylabel('Distance (m)')
ax3.set_title('Distance Between Spacecraft and Planet Over Time')
ax3.grid(True) # Add grid for better visualization
plt.show()
Объяснение кода.
1. Константы и начальные условия
G = 6.67430e-11 # Гравитационная постоянная в м^3 кг^-1 с^-2
M_p = 5.972e24 # Масса планеты в килограммах
M_s = 1000 # Масса космического аппарата в килограммах
r_p = 6.371e6 # Радиус планеты в метрах
G: Универсальная гравитационная постоянная.
M_p: Масса планеты, в данном случае Земли.
M_s: Масса космического аппарата.
r_p: Радиус планеты.
2. Начальные позиции и скорости
x_p, y_p = 0, 0 # Начальные координаты планеты
v_px, v_py = 0, 0.5e3 # Начальная скорость планеты
x_s, y_s = 3 * r_p, -4 * r_p # Начальная позиция космического аппарата
v_x, v_y = -7e3, 3e3 # Начальная скорость космического аппарата
x_p, y_p: Начальные координаты планеты.
v_px, v_py: Начальные компоненты скорости планеты.
x_s, y_s: Начальная позиция космического аппарата, относительно центра планеты.
v_x, v_y: Начальные компоненты скорости космического аппарата, настроенные для гиперболической орбиты.
3. Параметры моделирования
dt = 10 # Временной шаг в секундах
num_steps = 785 # Количество шагов моделирования
dt: Временной шаг для каждого итерации моделирования.
num_steps: Общее количество шагов моделирования.
4. Инициализация хранения данных
x_trajectory, y_trajectory = [], []
x_planet_trajectory, y_planet_trajectory = [], []
speed, distance = [], []
x_trajectory, y_trajectory: Списки для хранения позиций космического аппарата во времени.
x_planet_trajectory, y_planet_trajectory: Списки для хранения позиций планеты во времени.
speed: Список для хранения скорости космического аппарата.
distance: Список для хранения расстояния между космическим аппаратом и планетой.
5. Вычисление начального расстояния
initial_distance = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)
6. Основной цикл моделирования
for _ in range(num_steps):
r = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)
if r <= r_p:
print("Crash! The spacecraft has collided with the planet.")
break
r: Текущее расстояние между космическим аппаратом и планетой.
Если r меньше или равно радиусу планеты, моделирование останавливается, указывая на столкновение.
7. Гравитационное ускорение
pythonCopy
a_x = -G * M_p * (x_s - x_p) / r**3
a_y = -G * M_p * (y_s - y_p) / r**3
a_x, a_y: Компоненты гравитационного ускорения, действующего на космический аппарат со стороны планеты.
8. Обновление скоростей
v_x += a_x * dt
v_y += a_y * dt
9. Обновление позиций
x_s += v_x * dt
y_s += v_y * dt
x_p += v_px * dt
y_p += v_py * dt
Обновляет позиции как космического аппарата, так и планеты с использованием их скоростей и временного шага.
10. Сохранение данных
x_trajectory.append(x_s)
y_trajectory.append(y_s)
x_planet_trajectory.append(x_p)
y_planet_trajectory.append(y_p)
speed.append(np.sqrt(v_x**2 + v_y**2))
distance.append(r)
11. Построение графиков
График траектории
fig1, ax1 = plt.subplots(figsize=(10, 10))
ax1.plot(x_trajectory, y_trajectory, label='Spacecraft Trajectory')
ax1.plot(x_planet_trajectory, y_planet_trajectory, label='Planet Trajectory', linestyle='--')
ax1.plot(x_p, y_p, 'ro', markersize=10, label='Planet') # Планета
ax1.plot(x_trajectory[0], y_trajectory[0], 'go', markersize=8, label='Start Point') # Начальная точка космического аппарата
ax1.set_aspect('equal', adjustable='box')
ax1.set_xlabel('Координата X (м)')
ax1.set_ylabel('Координата Y (м)')
ax1.set_title('Траектория космического аппарата с движущейся планетой (гиперболическая)')
ax1.set_xlim(-plot_limit, plot_limit) # Установить пределы по оси X
ax1.set_ylim(-plot_limit, plot_limit) # Установить пределы по оси Y
ax1.grid(True) # Добавить сетку для лучшей визуализации
ax1.legend()
fig1, ax1: Создает фигуру и ось для графика траектории.
Строит траектории космического аппарата и планеты.
Отмечает начальную позицию космического аппарата и планеты.
График скорости
fig2, ax2 = plt.subplots(figsize=(10, 5))
time = np.arange(0, len(speed) * dt, dt)
ax2.plot(time, speed)
ax2.axhline(speed[0], color='r', linestyle='--', label=f'Начальная скорость: {speed[0]:.2f} м/с')
ax2.axhline(speed[-1], color='g', linestyle='--', label=f'Конечная скорость: {speed[-1]:.2f} м/с')
ax2.set_xlabel('Время (с)')
ax2.set_ylabel('Скорость (м/с)')
ax2.set_title('Зависимость скорости космического аппарата от времени')
plt.minorticks_on()
plt.grid(True)
plt.grid(which = 'minor', color="grey", alpha=0.25)
ax2.legend()
fig2, ax2: Создает фигуру и ось для графика скорости.
Строит график скорости космического аппарата во времени.
Добавляет горизонтальные линии для обозначения начальной и конечной скоростей космического аппарата.
График расстояни
fig3, ax3 = plt.subplots(figsize=(10, 5))
ax3.plot(time, distance)
ax3.set_xlabel('Время (с)')
ax3.set_ylabel('Расстояние (м)')
ax3.set_title('Расстояние между космическим аппаратом и планетой во времени')
ax3.grid(True) # Добавить сетку для лучшей визуализации
fig3, ax3: Создает фигуру и ось для графика расстояния.
Строит график расстояния между космическим аппаратом и планетой во времени.
Замечание: время полета подбирался таким образом, чтобы данный график имел вид параболы, где концы имели одинаковыми значениями.
Резюме
Этот код моделирует и визуализирует динамику космического аппарата в гравитационном поле движущейся планеты. Путем итеративного обновления скоростей и позиций и построения данных, он позволяет понять поведение траектории космического аппарата, его скорости и расстояния от планеты во времени.
Графики.
Вывод.
Мы смогли объяснить процесс гравитационного маневра с точки зрения физики и математики. Также написали код, который подтвердил нашу теорию.