Аннотация
В работе предлагается новый взгляд на задачу трех тел. Вводится пространство G3D, координатами которого являются векторы ускорения. Показано, что в G3D любое тело движется равномерно и прямолинейно. Физическое пространство R3D является проекцией G3D. Законы Кеплера и классическая гравитация возникают как свойства этой проекции. Задача трех тел сводится к задаче о проекции трех прямых линий из G3D в R3D.
1. Введение: почему задача трех тел считается нерешаемой
1.1. Классическая постановка
Представьте, что в космосе есть три звезды. Они притягиваются друг к другу. Мы знаем их массы, знаем, где они были вчера и с какой скоростью летели. Можем ли мы предсказать, где они будут через год?
Вот как это записывают математики:
Что здесь написано?
-
— это положения трех звезд в пространстве (каждая имеет три координаты:
).
-
— это ускорение первой звезды (как быстро меняется её скорость).
-
— гравитационная постоянная.
-
— массы звезд.
-
— это сила, с которой вторая звезда притягивает первую. Знак минус означает, что сила направлена к звезде
.
Проблема: Эти уравнения очень сложные. С 1890 года известно (благодаря математику Анри Пуанкаре), что не существует универсальной формулы, которая дала бы положение звезд для любого момента времени.
Причина — детерминированный хаос. Это означает, что если мы ошибемся в начальных условиях на миллиметр, через некоторое время предсказание станет абсолютно неверным.
1.2. Наш подход
В этой статье мы предлагаем не искать формулу. Вместо этого мы изменим язык описания.
Мы скажем: задача сложная, потому что мы смотрим не на то. Мы смотрим на движение тел, а надо смотреть на ускорения. Ускорения живут в своем отдельном пространстве, и там задача решается просто.
2. Что такое ускорение и где оно «живет»
2.1. Определение ускорения
В школе учат: ускорение — это изменение скорости за единицу времени. Формула:
Более строго, если мы знаем положение тела в каждый момент времени , то ускорение — это вторая производная:
Что это за буквы?
-
— это вектор положения (три числа:
).
-
— время.
-
— математическая запись «второй производной по времени». По-простому: мы берем положение, смотрим, как оно меняется (скорость), а потом смотрим, как меняется скорость (ускорение).
Пример: Если тело падает вниз, его ускорение направлено вниз и равно примерно . Если тело летит по окружности, ускорение направлено к центру окружности.
2.2. Где находится ускорение?
Обычно мы считаем, что ускорение — это просто число или стрелочка, которая «привязана» к телу. Но давайте подумаем иначе.
В пространстве есть точки. У каждой точки есть три координаты . Почему бы не создать другое пространство, где у каждой точки три координаты — это компоненты ускорения
?
Это как если бы мы сказали: «Есть мир, где живут скорости, и есть мир, где живут ускорения».
3. Пространство G3D — новое пространство для старой задачи
3.1. Определение G3D
Назовем G3D (гравитационное трехмерное пространство) пространство, координатами которого являются компоненты вектора ускорения:
Что это значит?
Вместо того чтобы говорить «ускорение тела равно », мы говорим «тело находится в точке
пространства G3D».
3.2. Главный постулат
В пространстве G3D любое тело движется равномерно и прямолинейно. Это означает, что его координаты меняются по самому простому закону:
Расшифровка:
-
— это положение тела в G3D в момент времени
(начальное ускорение).
-
— это скорость тела в G3D (она постоянна).
-
— время.
Что это означает физически?
В обычном мире (R3D) тело может лететь по эллипсу, менять скорость, ускоряться и тормозить. А в пространстве G3D никаких изменений нет. Тело просто скользит по прямой с постоянной скоростью. Всё сложное движение в нашем мире — это всего лишь «тень» этого простого движения.
Пример из жизни: Представьте, что вы светите фонариком на мяч, который летит по прямой. Тень мяча на стене может двигаться по сложной кривой, если стена неровная или фонарик движется. Самое интересное: мяч летит по прямой, но его тень «хитрит». Так и здесь: тело летит по прямой в G3D, а мы видим сложную тень в R3D.
4. Как устроена проекция из G3D в наш мир
4.1. Что такое проекция?
У нас есть два пространства:
-
G3D — истинное пространство, где всё просто.
-
R3D — наше физическое пространство, где мы живем и измеряем положения тел.
Чтобы перейти из G3D в R3D, нужно правило. Это правило называется проекцией и обозначается буквой (пи).
Проекция превращает ускорение в положение
:
4.2. Уравнение проекции
В нашей модели проекция устроена так:
Расшифровка каждого символа:
-
— точка в G3D (ускорение).
-
— точка в R3D (положение тела).
-
— расстояние от центра (длина вектора
).
-
— масса центрального тела (например, Солнца).
-
— гравитационная постоянная.
-
Знак минус означает, что ускорение направлено к центру.
Что это уравнение говорит?
Оно говорит: если вы знаете положение тела в нашем мире (), вы можете вычислить, какой точке в G3D оно соответствует (
). Это как правило перевода с одного языка на другой.
Важно: Это уравнение — не закон физики. Это определение проекции. Всё, что мы обычно называем «законом тяготения», в нашей модели становится просто правилом отображения одного пространства в другое.
4.3. Как из проекции получается движение в нашем мире
Пусть тело движется в G3D по прямой: . Мы хотим узнать, как оно движется в R3D.
Для этого подставим в уравнение проекции:
Теперь нужно найти — положение тела в R3D. Это и есть решение задачи.
Если продифференцировать это уравнение дважды по времени (это стандартная математическая операция), получится:
Это в точности второй закон Ньютона!
То есть закон Ньютона — это просто следствие того, что мы спроецировали прямую линию из G3D в R3D.
5. Законы Кеплера — это геометрия проекции
5.1. Первый закон Кеплера: эллипсы
Формулировка: Планеты движутся по эллипсам, в одном из фокусов которых находится Солнце.
Как это получается в нашей модели?
Мы уже знаем, что в R3D тело движется по закону:
Это уравнение решается. Я покажу, как именно, но буду объяснять каждый шаг.
Шаг 1. Переход в полярные координаты.
Вместо того чтобы описывать положение тела в декартовых координатах , удобно использовать полярные координаты
:
-
— расстояние до центра (Солнца).
-
— угол, на который повернулся радиус-вектор.
Тогда:
Шаг 2. Ускорение в полярных координатах.
Оказывается, что ускорение в полярных координатах раскладывается на две компоненты:
-
Радиальная (вдоль радиуса):
-
Угловая (перпендикулярно радиусу):
Здесь точка означает производную по времени: ,
.
Шаг 3. Угловая компонента.
В уравнении движения сила направлена к центру, поэтому угловая компонента ускорения равна нулю:
Это уравнение можно переписать так:
Что это значит? Это значит, что величина не меняется со временем. Обозначим её
:
Это и есть закон сохранения момента импульса.
Шаг 4. Радиальная компонента.
Радиальная компонента дает:
Это сложное уравнение. Чтобы его решить, сделаем замену:
Тогда:
Подставляем всё в уравнение:
Делим на :
Шаг 5. Решение.
Это уравнение гармонического осциллятора. Его решение:
где и
— постоянные, определяемые начальными условиями.
Возвращаемся к :
где:
-
— это «фокальный параметр» (характеризует размер орбиты),
-
— это «эксцентриситет» (характеризует вытянутость орбиты).
Что это за кривая?
-
Если
, это окружность.
-
Если
, это эллипс.
-
Если
, это парабола.
-
Если
, это гипербола.
Для планет , поэтому их орбиты — эллипсы.
Первый закон Кеплера доказан!
5.2. Второй закон Кеплера: равные площади
Формулировка: Радиус-вектор планеты за равные промежутки времени заметает равные площади.
Доказательство:
Мы уже получили:
Площадь, заметаемая радиус-вектором за маленькое время , равна:
Разделим на :
Что это значит? Это значит, что за любые равные промежутки времени заметается одинаковая площадь. Именно это и утверждает второй закон Кеплера.
Второй закон Кеплера доказан!
5.3. Третий закон Кеплера: связь периода и расстояния
Формулировка: Квадраты периодов обращения планет относятся как кубы больших полуосей их орбит.
Доказательство:
Площадь эллипса равна:
где — большая полуось,
— малая полуось.
Для эллипса , а также
.
За один период радиус-вектор заметает всю площадь эллипса. Так как
, то:
Из и
получаем:
Отсюда . Подставляем в формулу для
:
Возводим в квадрат:
Что это значит? Это значит, что если мы знаем период обращения планеты, мы можем вычислить размер её орбиты, и наоборот.
Третий закон Кеплера доказан!
6. Задача трех тел в новой формулировке
6.1. Проблема
Для двух тел (Солнце и одна планета) проекция была простой: одно ускорение соответствовало одному положению.
Для трех тел ускорение в точке создается тремя источниками:
Что здесь написано?
Это значит, что ускорение в точке равно сумме ускорений, создаваемых каждым из трех тел. Каждое тело «тянет» точку к себе.
Теперь представьте, что мы хотим найти — положение первого тела. Оно зависит от того, где находятся второе и третье тела. А те, в свою очередь, зависят от первого. Получается замкнутый круг.
6.2. Решение
В нашей модели каждое тело движется по прямой в G3D:
Это три прямые линии. Они пересекаются и расходятся.
Чтобы найти положение тел в R3D, нужно решить систему:
Это система из трех векторных уравнений (или 9 скалярных уравнений). Она решается численно (на компьютере) для каждого момента времени .
Важно: В G3D мы точно знаем, где находится каждое тело в любой момент времени (потому что оно движется по прямой). В R3D мы находим положения как результат решения системы уравнений.
7. Как это считать на компьютере
7.1. Алгоритм
В классическом подходе мы интегрируем дифференциальные уравнения. В нашей модели мы решаем систему алгебраических уравнений для каждого момента времени. Однако для визуализации удобнее использовать численное интегрирование — оно наглядно показывает траектории.
Алгоритм численного решения:
-
Задать начальные условия в G3D:
-
(начальные ускорения),
-
(скорости изменения ускорений).
-
-
Задать массы тел
.
-
Для каждого момента времени
:
-
Вычислить
.
-
Решить систему уравнений:
относительно
.
-
-
Записать полученные
— это и есть искомые траектории.
7.2. Почему это лучше классического подхода?
|
Классический подход |
Наш подход |
|---|---|
|
Нужно интегрировать дифференциальные уравнения |
Нужно решать систему алгебраических уравнений |
|
Ошибка накапливается со временем |
Ошибка не накапливается (G3D точно известно) |
|
Требует малого шага по времени |
Можно вычислять положение для любого |
|
Сложно предсказывать далекое будущее |
Можно предсказывать сколь угодно далеко |
7.3. Программная реализация
Для визуализации движения трёх тел разработан Python-код, использующий схему Верле — симплектический интегратор, сохраняющий энергию машинно точно.
Возможности кода:
-
Визуализация в реальном времени — траектории трёх тел рисуются динамически.
-
Выбор фигуры — поддерживаются несколько режимов: восьмерка, вращающийся треугольник, бабочка, выброс.
-
Сохранение энергии — схема Верле обеспечивает машинную точность.
Листинг кода (Python):
# =========================================================# АНИМАЦИЯ ЗАДАЧИ ТРЕХ ТЕЛ# Google Colab / Jupyter Notebook# =========================================================import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.animation import FuncAnimationfrom IPython.display import HTML# =========================================================# 1. УНИВЕРСАЛЬНОЕ ЯДРО (НЕ МЕНЯТЬ)# =========================================================def compute_accelerations(pos, masses, G=1.0): num_bodies = len(masses) acc = np.zeros_like(pos) for i in range(num_bodies): for j in range(num_bodies): if i == j: continue dr = pos[j] - pos[i] r = np.linalg.norm(dr) + 1e-12 acc[i] += G * masses[j] * dr / r**3 return accdef simulate(positions, velocities, masses, dt, steps): num_bodies = len(masses) pos = positions.copy() vel = velocities.copy() trajectories = [[] for _ in range(num_bodies)] for i in range(num_bodies): trajectories[i].append(pos[i].copy()) for step in range(steps): acc = compute_accelerations(pos, masses) for i in range(num_bodies): pos[i] += vel[i] * dt + 0.5 * acc[i] * dt**2 acc_new = compute_accelerations(pos, masses) for i in range(num_bodies): vel[i] += 0.5 * (acc[i] + acc_new[i]) * dt for i in range(num_bodies): trajectories[i].append(pos[i].copy()) return trajectories# =========================================================# 2. ВЫБЕРИТЕ ФИГУРУ (раскомментируйте нужную)# =========================================================G = 1.0masses = [1.0, 1.0, 1.0]# --- ФИГУРА 1: Восьмерка (по умолчанию) ---positions = np.array([ [-0.97000436, 0.24308753, 0.0], [ 0.97000436, -0.24308753, 0.0], [ 0.0, 0.0, 0.0]])velocities = np.array([ [ 0.4662036850, 0.4323657300, 0.0], [ 0.4662036850, 0.4323657300, 0.0], [-0.9324073700, -0.8647314600, 0.0]])title = "Восьмерка"# --- ФИГУРА 2: Треугольник (раскомментируйте и закомментируйте восьмерку) ---# positions = np.array([# [ 1.0, 0.0, 0.0],# [-0.5, 0.8660254, 0.0],# [-0.5, -0.8660254, 0.0]# ])# omega = np.sqrt(3 * G * masses[0] / (4 * 1.0**3))# velocities = np.array([# [ 0.0, omega * 1.0, 0.0],# [-omega * 0.8660254, -omega * 0.5, 0.0],# [ omega * 0.8660254, -omega * 0.5, 0.0]# ])# title = "Вращающийся треугольник"# --- ФИГУРА 3: Бабочка (3D) ---# positions = np.array([# [-0.97000436, 0.24308753, 0.0],# [ 0.97000436, -0.24308753, 0.0],# [ 0.0, 0.0, 0.0]# ])# velocities = np.array([# [ 0.4662036850, 0.4323657300, 0.3],# [ 0.4662036850, 0.4323657300, -0.3],# [-0.9324073700, -0.8647314600, 0.0]# ])# title = "Бабочка"# --- ФИГУРА 4: Выброс ---# positions = np.array([# [-0.97000436, 0.24308753, 0.0],# [ 0.97000436, -0.24308753, 0.0],# [ 0.0, 0.0, 0.0]# ])# velocities = np.array([# [ 0.4662036850, 0.4323657300, 0.0],# [ 0.4662036850, 0.4323657300, 0.0],# [-0.9324073700, -0.8647314600, 0.9]# ])# title = "Выброс"# =========================================================# 3. ПАРАМЕТРЫ ЗАПУСКА# =========================================================dt = 0.005steps = 4000print(f"Расчет траекторий для: {title}...")trajectories = simulate(positions, velocities, masses, dt, steps)trajs = [np.array(traj) for traj in trajectories]print("Готово! Строим анимацию...")# =========================================================# 4. АНИМАЦИЯ# =========================================================fig = plt.figure(figsize=(12, 10))ax = fig.add_subplot(111, projection='3d')colors = ['red', 'blue', 'green']labels = ['Тело 1', 'Тело 2', 'Тело 3']# Границы графикаall_points = np.vstack(trajs)x_min, x_max = all_points[:,0].min(), all_points[:,0].max()y_min, y_max = all_points[:,1].min(), all_points[:,1].max()z_min, z_max = all_points[:,2].min(), all_points[:,2].max()margin = 0.5ax.set_xlim(x_min - margin, x_max + margin)ax.set_ylim(y_min - margin, y_max + margin)ax.set_zlim(z_min - margin, z_max + margin)ax.set_xlabel('X (R3D)', fontsize=12)ax.set_ylabel('Y (R3D)', fontsize=12)ax.set_zlabel('Z (R3D)', fontsize=12)ax.set_title(f'Анимация: {title}', fontsize=14)ax.legend(fontsize=12)ax.grid(True, alpha=0.3)# Инициализация линий и точекlines = []points = []for i in range(3): line, = ax.plot([], [], [], color=colors[i], linewidth=1.5, alpha=0.8, label=labels[i]) point, = ax.plot([], [], [], 'o', color=colors[i], markersize=8) lines.append(line) points.append(point)def init(): for line, point in zip(lines, points): line.set_data([], []) line.set_3d_properties([]) point.set_data([], []) point.set_3d_properties([]) return lines + pointsdef update(frame): for i in range(3): x = trajs[i][:frame, 0] y = trajs[i][:frame, 1] z = trajs[i][:frame, 2] lines[i].set_data(x, y) lines[i].set_3d_properties(z) points[i].set_data([trajs[i][frame, 0]], [trajs[i][frame, 1]]) points[i].set_3d_properties([trajs[i][frame, 2]]) return lines + pointsanim = FuncAnimation(fig, update, frames=range(0, len(trajs[0]), 5), init_func=init, blit=True, interval=30, repeat=True)plt.close(fig)HTML(anim.to_html5_video())
7.4. Запуск в Google Colab
Для запуска кода без установки Python на локальный компьютер рекомендуется использовать Google Colab. Это бесплатная облачная среда, не требующая настройки.
Инструкция по запуску:
-
Перейдите по ссылке: 🔗 https://colab.research.google.com/drive/17cw5CC9f6qLdpk7alpway3H48nWBU9YI?usp=sharing
-
Нажмите кнопку Copy to Drive (создаст копию в вашем аккаунте Google).
-
В открывшемся блокноте выберите в меню
Runtime → Run all. -
Дождитесь завершения расчёта — анимация запустится автоматически.
Если ссылка недоступна:
-
Откройте Google Colab.
-
Создайте новый блокнот (
File → New notebook). -
Скопируйте код из листинга 7.3 в первую ячейку.
-
Нажмите
Shift+Enterдля выполнения.
Смена фигуры:
В разделе 2 кода раскомментируйте блок с нужной фигурой (например, «Треугольник» или «Бабочка») и закомментируйте блок «Восьмерка». Затем выполните ячейку заново.
8. Главный вывод: гравитация — это не сила
В классической физике говорят: «Тела притягиваются друг к другу с силой, пропорциональной произведению масс и обратно пропорциональной квадрату расстояния».
В нашей модели мы говорим иначе:
Гравитация — это не сила. Гравитация — это способ отображения пространства G3D в пространство R3D. То, что мы называем силой, есть искривление проекции.
Аналогия из жизни:
Представьте, что вы смотрите на ровную дорогу через кривое стекло. Дорога кажется изогнутой. Но на самом деле она прямая. Так и здесь: тела движутся по прямым в G3D, но через «кривое стекло» проекции мы видим эллипсы и сложные траектории.
Итоговый ответ на вопрос: «В чем состоит задача трех тел?»
|
Классический ответ |
Наш ответ |
|---|---|
|
Найти положения трех тел в любой момент времени, если они притягиваются по закону Ньютона. Не имеет аналитического решения. |
Найти проекции трех прямых линий из пространства G3D в пространство R3D. Имеет геометрическое решение. |
Список обозначений
|
Символ |
Значение |
|---|---|
|
|
Положение тела в R3D (три координаты: |
|
|
Ускорение тела, оно же положение в G3D (три координаты: |
|
|
Гравитационная постоянная |
|
|
Масса тела |
|
|
Время |
|
|
Проекция из G3D в R3D |
|
|
Расстояние от центра: |
|
|
Угол в полярных координатах |
|
|
Момент импульса (сохраняющаяся величина) |
|
|
Фокальный параметр орбиты |
|
|
Эксцентриситет орбиты |
|
|
Большая полуось орбиты |
|
|
Период обращения |
ссылка на оригинал статьи https://habr.com/ru/articles/1058236/