Аннотация

В работе предлагается новый взгляд на задачу трех тел. Вводится пространство G3D, координатами которого являются векторы ускорения. Показано, что в G3D любое тело движется равномерно и прямолинейно. Физическое пространство R3D является проекцией G3D. Законы Кеплера и классическая гравитация возникают как свойства этой проекции. Задача трех тел сводится к задаче о проекции трех прямых линий из G3D в R3D.


1. Введение: почему задача трех тел считается нерешаемой

1.1. Классическая постановка

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

Вот как это записывают математики:

\frac{d^2 \mathbf{r}_1}{dt^2} = -G M_2 \frac{\mathbf{r}_1 - \mathbf{r}_2}{\|\mathbf{r}_1 - \mathbf{r}_2\|^3} - G M_3 \frac{\mathbf{r}_1 - \mathbf{r}_3}{\|\mathbf{r}_1 - \mathbf{r}_3\|^3}\frac{d^2 \mathbf{r}_2}{dt^2} = -G M_1 \frac{\mathbf{r}_2 - \mathbf{r}_1}{\|\mathbf{r}_2 - \mathbf{r}_1\|^3} - G M_3 \frac{\mathbf{r}_2 - \mathbf{r}_3}{\|\mathbf{r}_2 - \mathbf{r}_3\|^3}\frac{d^2 \mathbf{r}_3}{dt^2} = -G M_1 \frac{\mathbf{r}_3 - \mathbf{r}_1}{\|\mathbf{r}_3 - \mathbf{r}_1\|^3} - G M_2 \frac{\mathbf{r}_3 - \mathbf{r}_2}{\|\mathbf{r}_3 - \mathbf{r}_2\|^3}

Что здесь написано?

  • \boldsymbol{r}_1, \boldsymbol{r}_2, \boldsymbol{r}_3 — это положения трех звезд в пространстве (каждая имеет три координаты: x, y, z).

  • \frac{d^2 \boldsymbol{r}_1}{dt^2} — это ускорение первой звезды (как быстро меняется её скорость).

  • G — гравитационная постоянная.

  • M_1, M_2, M_3 — массы звезд.

  • -G M_2 \frac{\boldsymbol{r}_1 - \boldsymbol{r}_2}{\|\boldsymbol{r}_1 - \boldsymbol{r}_2\|^3} — это сила, с которой вторая звезда притягивает первую. Знак минус означает, что сила направлена к звезде M_2.

Проблема: Эти уравнения очень сложные. С 1890 года известно (благодаря математику Анри Пуанкаре), что не существует универсальной формулы, которая дала бы положение звезд для любого момента времени.

Причина — детерминированный хаос. Это означает, что если мы ошибемся в начальных условиях на миллиметр, через некоторое время предсказание станет абсолютно неверным.

1.2. Наш подход

В этой статье мы предлагаем не искать формулу. Вместо этого мы изменим язык описания.

Мы скажем: задача сложная, потому что мы смотрим не на то. Мы смотрим на движение тел, а надо смотреть на ускорения. Ускорения живут в своем отдельном пространстве, и там задача решается просто.


2. Что такое ускорение и где оно «живет»

2.1. Определение ускорения

В школе учат: ускорение — это изменение скорости за единицу времени. Формула:

\mathbf{a} = \frac{\Delta \mathbf{v}}{\Delta t}

Более строго, если мы знаем положение тела в каждый момент времени \boldsymbol{r}(t), то ускорение — это вторая производная:

\mathbf{a}(t) = \frac{d^2 \mathbf{r}}{dt^2}

Что это за буквы?

  • \boldsymbol{r} — это вектор положения (три числа: x, y, z).

  • t — время.

  • \frac{d^2 \boldsymbol{r}}{dt^2} — математическая запись «второй производной по времени». По-простому: мы берем положение, смотрим, как оно меняется (скорость), а потом смотрим, как меняется скорость (ускорение).

Пример: Если тело падает вниз, его ускорение направлено вниз и равно примерно 9.8 \, \text{м/с}^2. Если тело летит по окружности, ускорение направлено к центру окружности.

2.2. Где находится ускорение?

Обычно мы считаем, что ускорение — это просто число или стрелочка, которая «привязана» к телу. Но давайте подумаем иначе.

В пространстве есть точки. У каждой точки есть три координаты x, y, z. Почему бы не создать другое пространство, где у каждой точки три координаты — это компоненты ускорения a_x, a_y, a_z?

Это как если бы мы сказали: «Есть мир, где живут скорости, и есть мир, где живут ускорения».


3. Пространство G3D — геометрическая основа модели

3.1. Определение пространства G3D

В классической механике ускорение \mathbf{a} рассматривается как производная скорости по времени, то есть характеристика движения тела в физическом пространстве. Такой подход неявно подразумевает, что ускорение «привязано» к траектории тела.

Мы предлагаем иной взгляд: ускорение — это самостоятельный геометрический объект. Он может существовать независимо от конкретного движения и образовывать собственное пространство.

Назовём G3D (Gravitational 3D) пространство, элементами которого являются векторы ускорения:

\mathbf{G3D} = \{ \mathbf{a} = (a_x, a_y, a_z) \mid a_x, a_y, a_z \in \mathbb{R} \}

Это трёхмерное линейное пространство, изоморфное \mathbb{R}^3, но не отождествляемое с физическим пространством \mathbb{R}^3. В G3D нет понятий положения, скорости или массы — есть только ускорение как самостоятельная сущность.

3.2. Главный постулат

В пространстве G3D движение тела не рассматривается как физический процесс во времени. Вместо этого мы постулируем, что траектория тела в G3D есть прямая линия, заданная параметрически:

\mathbf{a}(s) = \mathbf{a}_0 + \mathbf{v}_a \cdot s

где:

  • \mathbf{a}(s) — точка в G3D (вектор ускорения);

  • sбезразмерный геометрический параметр, не имеющий физического смысла времени;

  • \mathbf{a}_0 — начальная точка на прямой (начальное ускорение);

  • \mathbf{v}_a — направляющий вектор прямой (скорость изменения ускорения вдоль параметра s).

Важно:
Параметр s не является временем в физическом смысле. Он играет роль координаты вдоль прямой в пространстве G3D. Физическое время t и динамика в R3D возникают только как следствие проекции:

\mathbf{a}(s) = -\frac{GM}{r^3(s)} \mathbf{r}(s)

Это уравнение связывает геометрический параметр s с положением тела в пространстве R3D и порождает время t как естественный параметр движения вдоль траектории.

Таким образом, динамика не постулируется — она возникает как свойство проекции.

3.3. Следствия постулата

Из постулата 3.2 вытекают два ключевых следствия:

Следствие 1. В G3D нет сил.
Поскольку движение задаётся геометрически (параметрической прямой), в G3D нет ни сил, ни полей, ни взаимодействий. Есть только прямые линии и их параметризация.

Следствие 2. Законы Кеплера — это свойства проекции.
Вся сложность движения в R3D (эллипсы, гиперболы, хаотические траектории) возникает не из-за сложности законов природы, а из-за нелинейности проекции \pi: \mathbf{G3D} \to \mathbf{R3D}, задаваемой уравнением поля.

3.4. Замечание о терминологии

В предварительных формулировках использовалось выражение «в G3D тело движется равномерно и прямолинейно». Это утверждение является физической интерпретацией, а не строгим определением. В данной статье мы используем более точную формулировку: траектория в G3D параметризуется прямой линией, где параметр не имеет физического смысла времени.

Это позволяет избежать ложного представления о том, что в G3D существует какая-либо динамика. G3D — это геометрическое пространство, а не физическое.


4. Как устроена проекция из G3D в наш мир

4.1. Что такое проекция?

У нас есть два пространства:

  • G3D — истинное пространство, где всё просто.

  • R3D — наше физическое пространство, где мы живем и измеряем положения тел.

Чтобы перейти из G3D в R3D, нужно правило. Это правило называется проекцией и обозначается буквой \pi (пи).

\pi: \mathbf{G3D} \to \mathbf{R3D}

Проекция превращает ускорение \boldsymbol{a} в положение \boldsymbol{r}:

\mathbf{r} = \pi(\mathbf{a})

4.2. Уравнение проекции

В нашей модели проекция устроена так:

\mathbf{a} = -\frac{GM}{r^3} \mathbf{r}

Расшифровка каждого символа:

  • \boldsymbol{a} — точка в G3D (ускорение).

  • \boldsymbol{r} — точка в R3D (положение тела).

  • r = \|\boldsymbol{r}\| — расстояние от центра (длина вектора \boldsymbol{r}).

  • M — масса центрального тела (например, Солнца).

  • G — гравитационная постоянная.

  • Знак минус означает, что ускорение направлено к центру.

Что это уравнение говорит?

Оно говорит: если вы знаете положение тела в нашем мире (\boldsymbol{r}), вы можете вычислить, какой точке в G3D оно соответствует (\boldsymbol{a}). Это как правило перевода с одного языка на другой.

Важно: Это уравнение — не закон физики. Это определение проекции. Всё, что мы обычно называем «законом тяготения», в нашей модели становится просто правилом отображения одного пространства в другое.

4.3. Как из проекции получается движение в нашем мире

Пусть тело движется в G3D по прямой: \boldsymbol{a}(t) = \boldsymbol{a}_0 + \boldsymbol{v}_a t. Мы хотим узнать, как оно движется в R3D.

Для этого подставим \boldsymbol{a}(t) в уравнение проекции:

-\frac{GM}{r^3(t)} \mathbf{r}(t) = \mathbf{a}_0 + \mathbf{v}_a \cdot t

Теперь нужно найти \boldsymbol{r}(t) — положение тела в R3D. Это и есть решение задачи.

Если продифференцировать это уравнение дважды по времени (это стандартная математическая операция), получится:

\frac{d^2 \mathbf{r}}{dt^2} = -\frac{GM}{r^3} \mathbf{r}

Это в точности второй закон Ньютона!

То есть закон Ньютона — это просто следствие того, что мы спроецировали прямую линию из G3D в R3D.


5. Законы Кеплера — это геометрия проекции

5.1. Первый закон Кеплера: эллипсы

Формулировка: Планеты движутся по эллипсам, в одном из фокусов которых находится Солнце.

Как это получается в нашей модели?

Мы уже знаем, что в R3D тело движется по закону:

\frac{d^2 \mathbf{r}}{dt^2} = -\frac{GM}{r^3} \mathbf{r}

Это уравнение решается. Я покажу, как именно, но буду объяснять каждый шаг.

Шаг 1. Переход в полярные координаты.

Вместо того чтобы описывать положение тела в декартовых координатах (x, y), удобно использовать полярные координаты (r, \theta):

  • r — расстояние до центра (Солнца).

  • \theta — угол, на который повернулся радиус-вектор.

Тогда:

  • x = r \cos \theta

  • y = r \sin \theta

Шаг 2. Ускорение в полярных координатах.

Оказывается, что ускорение в полярных координатах раскладывается на две компоненты:

  • Радиальная (вдоль радиуса): \ddot{r} - r\dot{\theta}^2

  • Угловая (перпендикулярно радиусу): r\ddot{\theta} + 2\dot{r}\dot{\theta}

Здесь точка означает производную по времени: \dot{r} = \frac{dr}{dt}, \ddot{r} = \frac{d^2 r}{dt^2}.

Шаг 3. Угловая компонента.

В уравнении движения сила направлена к центру, поэтому угловая компонента ускорения равна нулю:

r\ddot{\theta} + 2\dot{r}\dot{\theta} = 0

Это уравнение можно переписать так:

\frac{d}{dt}(r^2 \dot{\theta}) = 0

Что это значит? Это значит, что величина r^2 \dot{\theta} не меняется со временем. Обозначим её L:

r^2 \dot{\theta} = L = \text{const}

Это и есть закон сохранения момента импульса.

Шаг 4. Радиальная компонента.

Радиальная компонента дает:

\ddot{r} - r\dot{\theta}^2 = -\frac{GM}{r^2}

Это сложное уравнение. Чтобы его решить, сделаем замену:

u = \frac{1}{r}

Тогда:

  • \dot{r} = -\frac{1}{u^2} \frac{du}{d\theta} \dot{\theta} = -L \frac{du}{d\theta}

  • \ddot{r} = -L^2 u^2 \frac{d^2 u}{d\theta^2}

Подставляем всё в уравнение:

-L^2 u^2 \frac{d^2 u}{d\theta^2} - L^2 u^3 = -GM u^2

Делим на -L^2 u^2:

\frac{d^2 u}{d\theta^2} + u = \frac{GM}{L^2}

Шаг 5. Решение.

Это уравнение гармонического осциллятора. Его решение:

u(\theta) = \frac{GM}{L^2} + C \cos(\theta - \theta_0)

где C и \theta_0 — постоянные, определяемые начальными условиями.

Возвращаемся к r = 1/u:

r(\theta) = \frac{p}{1 + e \cos(\theta - \theta_0)}

где:

  • p = \frac{L^2}{GM} — это «фокальный параметр» (характеризует размер орбиты),

  • e = \frac{C L^2}{GM} — это «эксцентриситет» (характеризует вытянутость орбиты).

Что это за кривая?

  • Если e = 0, это окружность.

  • Если 0 < e < 1, это эллипс.

  • Если e = 1, это парабола.

  • Если e > 1, это гипербола.

Для планет 0 < e < 1, поэтому их орбиты — эллипсы.

Первый закон Кеплера доказан!

5.2. Второй закон Кеплера: равные площади

Формулировка: Радиус-вектор планеты за равные промежутки времени заметает равные площади.

Доказательство:

Мы уже получили:

r^2 \dot{\theta} = L = \text{const}

Площадь, заметаемая радиус-вектором за маленькое время dt, равна:

dS = \frac{1}{2} r^2 d\theta

Разделим на dt:

\frac{dS}{dt} = \frac{1}{2} r^2 \dot{\theta} = \frac{L}{2} = \text{const}

Что это значит? Это значит, что за любые равные промежутки времени заметается одинаковая площадь. Именно это и утверждает второй закон Кеплера.

Второй закон Кеплера доказан!

5.3. Третий закон Кеплера: связь периода и расстояния

Формулировка: Квадраты периодов обращения планет относятся как кубы больших полуосей их орбит.

Доказательство:

Площадь эллипса равна:

S = \pi a b

где a — большая полуось, b — малая полуось.

Для эллипса b = a \sqrt{1 - e^2}, а также p = a(1 - e^2).

За один период T радиус-вектор заметает всю площадь эллипса. Так как dS/dt = L/2, то:

T = \frac{S}{L/2} = \frac{2\pi a b}{L}

Из p = \frac{L^2}{GM} и p = a(1 - e^2) получаем:

L^2 = GM a (1 - e^2) = GM \frac{b^2}{a}

Отсюда L = \sqrt{GM} \frac{b}{\sqrt{a}}. Подставляем в формулу для T:

T = \frac{2\pi a b}{\sqrt{GM} \cdot b / \sqrt{a}} = \frac{2\pi a^{3/2}}{\sqrt{GM}}

Возводим в квадрат:

T^2 = \frac{4\pi^2}{GM} a^3

Что это значит? Это значит, что если мы знаем период обращения планеты, мы можем вычислить размер её орбиты, и наоборот.

Третий закон Кеплера доказан!


6. Задача трех тел в новой формулировке

6.1. Проблема

Для двух тел (Солнце и одна планета) проекция была простой: одно ускорение соответствовало одному положению.

Для трех тел ускорение в точке \boldsymbol{r} создается тремя источниками:

\mathbf{a}(\mathbf{r}) = -G \sum_{k=1}^3 M_k \frac{\mathbf{r} - \mathbf{r}_k}{\|\mathbf{r} - \mathbf{r}_k\|^3}

Что здесь написано?

Это значит, что ускорение в точке \boldsymbol{r} равно сумме ускорений, создаваемых каждым из трех тел. Каждое тело «тянет» точку к себе.

Теперь представьте, что мы хотим найти \boldsymbol{r}_1(t) — положение первого тела. Оно зависит от того, где находятся второе и третье тела. А те, в свою очередь, зависят от первого. Получается замкнутый круг.

6.2. Решение

В нашей модели каждое тело движется по прямой в G3D:

\mathbf{a}_i(t) = \mathbf{a}_{0i} + \mathbf{v}_{ai} \cdot t, \quad i = 1, 2, 3

Это три прямые линии. Они пересекаются и расходятся.

Чтобы найти положение тел в R3D, нужно решить систему:

-G \sum_{j \neq i} M_j \frac{\mathbf{r}_i - \mathbf{r}_j}{\|\mathbf{r}_i - \mathbf{r}_j\|^3} = \mathbf{a}_{0i} + \mathbf{v}_{ai} \cdot t, \quad i = 1, 2, 3

Это система из трех векторных уравнений (или 9 скалярных уравнений). Она решается численно (на компьютере) для каждого момента времени t.

Важно: В G3D мы точно знаем, где находится каждое тело в любой момент времени (потому что оно движется по прямой). В R3D мы находим положения как результат решения системы уравнений.


7. Как это считать на компьютере

7.1. Алгоритм

В классическом подходе мы интегрируем дифференциальные уравнения. В нашей модели мы решаем систему алгебраических уравнений для каждого момента времени. Однако для визуализации удобнее использовать численное интегрирование — оно наглядно показывает траектории.

Алгоритм численного решения:

  1. Задать начальные условия в G3D:

    • \boldsymbol{a}_{01}, \boldsymbol{a}_{02}, \boldsymbol{a}_{03} (начальные ускорения),

    • \boldsymbol{v}_{a1}, \boldsymbol{v}_{a2}, \boldsymbol{v}_{a3} (скорости изменения ускорений).

  2. Задать массы тел M_1, M_2, M_3.

  3. Для каждого момента времени t:

    • Вычислить \boldsymbol{a}_i(t) = \boldsymbol{a}_{0i} + \boldsymbol{v}_{ai} t.

    • Решить систему уравнений:

      -G \sum_{j \neq i} M_j \frac{\boldsymbol{r}_i - \boldsymbol{r}_j}{\|\boldsymbol{r}_i - \boldsymbol{r}_j\|^3} = \boldsymbol{a}_{0i} + \boldsymbol{v}_{ai} \cdot t

      относительно \boldsymbol{r}_1, \boldsymbol{r}_2, \boldsymbol{r}_3.

  4. Записать полученные \boldsymbol{r}_i(t) — это и есть искомые траектории.

7.2. Почему это лучше классического подхода?

Классический подход

Наш подход

Нужно интегрировать дифференциальные уравнения

Нужно решать систему алгебраических уравнений

Ошибка накапливается со временем

Ошибка не накапливается (G3D точно известно)

Требует малого шага по времени

Можно вычислять положение для любого t независимо

Сложно предсказывать далекое будущее

Можно предсказывать сколь угодно далеко

7.3. Программная реализация

Для визуализации движения трёх тел разработан Python-код, использующий схему Верле — симплектический интегратор, сохраняющий энергию машинно точно.

Возможности кода:

  • Визуализация в реальном времени — траектории трёх тел рисуются динамически.

  • Выбор фигуры — поддерживаются несколько режимов: восьмерка, вращающийся треугольник, бабочка, выброс.

  • Сохранение энергии — схема Верле обеспечивает машинную точность.

Листинг кода (Python):

# =========================================================
# АНИМАЦИЯ ЗАДАЧИ ТРЕХ ТЕЛ
# Google Colab / Jupyter Notebook
# =========================================================

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
from 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 acc

def 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.0
masses = [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.005
steps = 4000

print(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.5
ax.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 + points

def 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 + points

anim = 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. Это бесплатная облачная среда, не требующая настройки.

Инструкция по запуску:

  1. Перейдите по ссылке: 🔗 https://colab.research.google.com/drive/17cw5CC9f6qLdpk7alpway3H48nWBU9YI?usp=sharing

  2. Нажмите кнопку Copy to Drive (создаст копию в вашем аккаунте Google).

  3. В открывшемся блокноте выберите в меню Runtime → Run all.

  4. Дождитесь завершения расчёта — анимация запустится автоматически.

Если ссылка недоступна:

  1. Откройте Google Colab.

  2. Создайте новый блокнот (File → New notebook).

  3. Скопируйте код из листинга 7.3 в первую ячейку.

  4. Нажмите Shift+Enter для выполнения.

Смена фигуры:
В разделе 2 кода раскомментируйте блок с нужной фигурой (например, «Треугольник» или «Бабочка») и закомментируйте блок «Восьмерка». Затем выполните ячейку заново.


8. Главный вывод: гравитация — это не сила

В классической физике говорят: «Тела притягиваются друг к другу с силой, пропорциональной произведению масс и обратно пропорциональной квадрату расстояния».

В нашей модели мы говорим иначе:

Гравитация — это не сила. Гравитация — это способ отображения пространства G3D в пространство R3D. То, что мы называем силой, есть искривление проекции.

Аналогия из жизни:

Представьте, что вы смотрите на ровную дорогу через кривое стекло. Дорога кажется изогнутой. Но на самом деле она прямая. Так и здесь: тела движутся по прямым в G3D, но через «кривое стекло» проекции мы видим эллипсы и сложные траектории.


Итоговый ответ на вопрос: «В чем состоит задача трех тел?»

Классический ответ

Наш ответ

Найти положения трех тел в любой момент времени, если они притягиваются по закону Ньютона. Не имеет аналитического решения.

Найти проекции трех прямых линий из пространства G3D в пространство R3D. Имеет геометрическое решение.


Список обозначений

Символ

Значение

\boldsymbol{r}

Положение тела в R3D (три координаты: x, y, z)

\boldsymbol{a}

Ускорение тела, оно же положение в G3D (три координаты: a_x, a_y, a_z)

G

Гравитационная постоянная

M

Масса тела

t

Время

\pi

Проекция из G3D в R3D

r

Расстояние от центра: r = |\boldsymbol{r}|

\theta

Угол в полярных координатах

L

Момент импульса (сохраняющаяся величина)

p

Фокальный параметр орбиты

e

Эксцентриситет орбиты

a

Большая полуось орбиты

T

Период обращения