Гравитационные маневры

от автора

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

Что такое гравитационный манёвр?

Гравитационный манёвр — это придание космическому аппарату нужных величины и направления за счёт энергии небесного тела.

Первый в истории такой манёвр был совершён советской межпланетной станцией Луна-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)
  • initial_distance: Вычисляет начальное расстояние между космическим аппаратом и планетой по формуле Евклидова расстояния.

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: Создает фигуру и ось для графика расстояния.

  • Строит график расстояния между космическим аппаратом и планетой во времени.

  • Замечание: время полета подбирался таким образом, чтобы данный график имел вид параболы, где концы имели одинаковыми значениями.

Резюме

Этот код моделирует и визуализирует динамику космического аппарата в гравитационном поле движущейся планеты. Путем итеративного обновления скоростей и позиций и построения данных, он позволяет понять поведение траектории космического аппарата, его скорости и расстояния от планеты во времени.

Графики.

Вывод

Мы смогли объяснить процесс гравитационного маневра с точки зрения физики и математики. Также написали код, который подтвердил нашу теорию.


ссылка на оригинал статьи https://habr.com/ru/articles/873928/