Mercury analemma

11 Sep 2026
by ignat

Для построения этого трехмерного графика (параметрической кривой) проще всего использовать язык Python с библиотекой Matplotlib. Поскольку координата

    \[z = t\]

, график показывает, как меняются

    \[x\]

и

    \[y\]

с ростом высоты

    \[z\]

.

Ниже представлен готовый код, который построит трехмерную линию на отрезке

    \[t \in [-3; 3]\]

:

import numpy as np
import matplotlib.pyplot as plt
#from templates.core import Vector3D # Необязательно, стандартный matplotlib справится

# Задаем диапазон изменения параметра t от -3 до 3
t = np.linspace(-3, 3, 1000)

# Вычисляем координаты x, y, z по заданным формулам
x = t**5 - 5*t**3 + 4*t
y = 5*t**4 - 20*t**2 + 16
z = t

# Создаем трехмерный график
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# Строим кривую
ax.plot(x, y, z, label='Параметрическая кривая', color='b', lw=2)

# Настраиваем подписи осей
ax.set_xlabel('Ось X')
ax.set_ylabel('Ось Y')
ax.set_zlabel('Ось Z (t)')
ax.set_title('Трехмерный график кривой на отрезке [-3; 3]')
ax.grid(True)
ax.legend()

# Отображаем график
plt.show()

Ключевые точки графика на этом отрезке:

  • Начало отрезка (

        \[t = -3\]

    ):
    кривая начинается в точке

        \[(-120; 241; -3)\]

    .
  • Пересечение центра (

        \[t = 0\]

    ):
    кривая проходит через точку

        \[(0; 16; 0)\]

    . В этой точке координата

        \[x\]

    имеет корень, так как

        \[x(t) = t(t-1)(t+1)(t-2)(t+2)\]

    .
  • Конец отрезка (

        \[t = 3\]

    ):
    кривая заканчивается в точке

        \[(120; 241; 3)\]

    .
import numpy as np

t = np.linspace(-3, 3, 100)
x = t**5 - 5*t**3 + 4*t
y = 5*t**4 - 20*t**2 + 16
z = t

print(f"t=-3: x={x[0]}, y={y[0]}, z={z[0]}")
print(f"t=0: x={x[50]}, y={y[50]}, z={z[50]}")
print(f"t=3: x={x[-1]}, y={y[-1]}, z={z[-1]}")

Чтобы добавить аксиальное ускорение вдоль оси Z, координата z больше не должна быть просто линейной функцией времени t (

    \[z = t\]

). При равноускоренном движении координата зависит от квадрата времени.

Так как отрезок задан как

    \[t \in [-3; 3]\]

, возведение в чистый квадрат

    \[t^{2}\]

уничтожит знак (весь график уйдет в положительную полуось Z). Чтобы сохранить направление движения от отрицательных значений к положительным и добавить ускорение, мы используем функцию

    \[z = t \cdot \vert{}t\vert{}\]

(или

    \[z = \text{sign}(t) \cdot t^2\]

). В этом случае скорость изменения z будет линейно расти с ростом t, что физически и является постоянным аксиальным ускорением.

Вот обновленный код для вашего файла Cheb.py:

Что изменилось в графике:

  • В районе t = 0 (центр графика) витки кривой по оси Z станут визуально более плотными, так как скорость изменения z там минимальна.
  • Ближе к краям отрезка (

        \[t \to \pm 3\]

    ) кривая на графике начнет растягиваться вдоль оси Z, наглядно демонстрируя аксиальное ускорение.

    \[z = e^t\]

или движение из состояния покоя

    \[z = \frac{at^2}{2}\]

), напишите начальные условия, и мы мгновенно скорректируем уравнение.

В теоретической механике и астродинамике понятие аксиального ускорения применительно к расчету перигелия чаще всего рассматривается в двух контекстах: как радиальное ускорение

    \[a_{r}\]

(направленное по оси к силовому центру) или как возмущающее ускорение, вызывающее смещение (прецессию) перигелия. [1, 2]

Прецессия перигелия планет.

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


1. Расчет расстояния до перигелия через радиальное (аксиальное) ускорение (Уравнение Бине)

Если под аксиальным ускорением понимается центральное ускорение

    \[a_{r}\]

, направленное к началу координат, форма орбиты и точка перигелия определяются через дифференциальное уравнение Бине: [1]

    \[\frac{d^{2}u}{d\theta ^{2}}+u=-\frac{a_{r}}{h^{2}u^{2}}\]

Где:

  •     \[u = \frac{1}{r}\]

    — обратный радиус-вектор (расстояние до центра).
  •     \[\theta \]

    — полярный угол (истинная аномалия).
  •     \[h = r^2 \dot{\theta} = \text{const}\]

    — удельный угловой момент (секториальная скорость).
  •     \[a_{r}\]

    — функция аксиального (радиального) ускорения. [1, 2, 3]

Поиск перигелия:
В точке перигелия расстояние r минимально, а значит, величина u максимальна. В этой точке первая производная зануляется:

    \[\frac{du}{d\theta} = 0\]

.

Для классического ньютоновского ускорения

    \[a_r = -\frac{GM}{r^2} = -GMu^2\]

уравнение Бине дает решение:

    \[u(\theta )=\frac{GM}{h^{2}}(1+e\cos \theta )\]

Отсюда расстояние до перигелия (

    \[r_{p}\]

) выражается через параметры движения:

    \[r_{p}=\frac{h^{2}}{GM(1+e)}=a(1-e)\]


Где a — большая полуось, e — эксцентриситет орбиты. [1, 2]


2. Расчет смещения (прецессии) перигелия через релятивистское ускорение

Если траектория совершает вековое вращение (как у Меркурия), к классическому ускорению добавляется релятивистская аксиальная поправка из Общей теории относительности (ОТО):

    \[a_{\text{corr}}=-\frac{3GMh^{2}}{c^{2}r^{4}}\]

Подстановка этого ускорения в модифицированное уравнение Бине дает уравнение Эйнштейна для избыточного смещения перигелия за один оборот (в радианах): [1]

    \[\Delta \phi =\frac{6\pi GM}{c^{2}a(1-e^{2})}\]

Где c — скорость света, M — масса звезды, G — гравитационная постоянная. [1]


3. Расчет «перигелия» (ближайшей точки) для вашей 3D-кривой

Если мы вернемся к вашей математической модели, где x(t) и y(t) задают движение на плоскости, а

    \[z(t) = t \cdot \vert{}t\vert{}\]

задает аксиальное ускорение вдоль оси Z, то аналогом перигелия является точка, где трехмерное расстояние R(t) до центра координат минимально.

Квадрат расстояния до центра:

    \[R^{2}(t)=x^{2}(t)+y^{2}(t)+z^{2}(t)\]

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

    \[R^{2}(t)=(t^{5}-5t^{3}+4t)^{2}+(5t^{4}-20t^{2}+16)^{2}+(t\cdot |{}t|{})^{2}\]

Чтобы найти точное значение t, при котором объект находится в «перигелии», нужно взять производную по времени и приравнять её к нулю:

    \[\frac{d(R^{2})}{dt}=0\]

Поскольку аналитически раскрывать степень

    \[t^{10}\]

сложно, эту точку минимума на отрезке [-3; 3] находят численно в том же скрипте Python.

Для расчета смещения перигелия (прецессии орбиты) через дополнительное аксиальное (радиальное) ускорение в небесной механике используются уравнения в возмущениях Ньютона (или уравнения Гаусса).

Математические уравнения смещения перигелия

Если на тело, движущееся по орбите Кеплера, действует малое дополнительное аксиальное ускорение R, направленное строго по радиус-вектору от центра масс, скорость изменения аргумента перигелия

    \[\omega \]

(угла, задающего положение перигелия в пространстве) описывается уравнением:

    \[\frac{d\omega }{dt}=-\frac{\sqrt{1-e^{2}}}{e\cdot v_{k}}\cdot R\cdot \cos \theta \]

Где:

  • e — эксцентриситет орбиты.
  •     \[\theta \]

    — истинная аномалия (угол тела относительно текущего перигелия).
  •     \[v_k = \sqrt{\frac{\mu}{p}}\]

    — характерная кеплерова скорость (

        \[\mu = GM\]

    — гравитационный параметр, p — фокальный параметр орбиты).

Если такое аксиальное ускорение вызвано эффектами ОТО (релятивистское ускорение Ньютона-Эйнштейна

    \[R = -\frac{3\mu h^2}{c^2 r^4}\]

), то интегрирование по периоду дает знаменитую формулу векового смещения перигелия за один оборот:

    \[\Delta \omega =\frac{6\pi \mu }{c^{2}a(1-e^{2})}\]


Python-скрипт для визуализации в 3D

Ниже представлен скрипт, который интегрирует уравнения движения Ньютона с добавлением сильного релятивистского аксиального ускорения. Это позволяет наглядно увидеть в 3D, как орбита (в данном случае, похожая на орбиту Меркурия, но с преувеличенным эффектом для видимости) совершает прецессию, смещая свой перигелий с каждым витком.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# 1. Константы и параметры модели (значения масштабированы для наглядности)
mu = 1.0        # Гравитационный параметр (G * M)
c = 15.0        # Искусственно заниженная скорость света (для усиления эффекта смещения)
alpha = 3.0 * mu / c**2  # Коэффициент релятивистского аксиального ускорения

# 2. Функция правых частей дифференциальных уравнений (движение в 3D)
def orbit_equations(t, state):
    x, y, z, vx, vy, vz = state
    r = np.sqrt(x**2 + y**2 + z**2)
    
    # Расчет удельного углового момента h^2 (в 3D через векторное произведение)
    h2 = (y*vz - z*vy)**2 + (z*vx - x*vz)**2 + (x*vy - y*vx)**2
    
    # Основное Ньютоновское ускорение
    a_newton = -mu / r**3
    
    # Дополнительное аксиальное возмущающее ускорение (ОТО)
    a_rel = -alpha * h2 / r**5
    
    # Полное ускорение
    ax = (a_newton + a_rel) * x
    ay = (a_newton + a_rel) * y
    az = (a_newton + a_rel) * z
    
    return [vx, vy, vz, ax, ay, az]

# 3. Начальные условия (небольшой наклон орбиты к плоскости XY для 3D эффекта)
r0 = [1.0, 0.0, 0.1]     # Начальное положение близко к перигелию
v0 = [0.0, 0.85, 0.05]   # Начальная скорость
initial_state = r0 + v0

# Интегрирование по времени (примерно 5 полных оборотов)
t_span = (0, 45)
t_eval = np.linspace(t_span[0], t_span[1], 2000)

solution = solve_ivp(orbit_equations, t_span, initial_state, t_eval=t_eval, rtol=1e-9, atol=1e-9)

# 4. Поиск точек перигелия для их подсветки на графике
x_sol, y_sol, z_sol = solution.y[0], solution.y[1], solution.y[2]
radii = np.sqrt(x_sol**2 + y_sol**2 + z_sol**2)

# Локальные минимумы расстояния (точки перигелия)
perihelion_idx = [i for i in range(1, len(radii)-1) if radii[i] < radii[i-1] and radii[i] < radii[i+1]]

# 5. Визуализация траектории в 3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# Строим саму орбиту
ax.plot(x_sol, y_sol, z_sol, label='Прецессирующая орбита', color='royalblue', lw=1.5)

# Подсвечиваем смещающиеся точки перигелия
ax.scatter(x_sol[perihelion_idx], y_sol[perihelion_idx], z_sol[perihelion_idx], 
           color='red', s=40, zorder=5, label='Смещение перигелия')

# Центральное притягивающее тело
ax.scatter([0], [0], [0], color='orange', s=150, label='Солнце')

# Настройки отображения
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D траектория смещения перигелия под действием аксиального ускорения')
ax.legend()
ax.grid(True)

# Установка равных пропорций осей для корректного отображения формы орбиты
max_range = np.array([x_sol.max()-x_sol.min(), y_sol.max()-y_sol.min(), z_sol.max()-z_sol.min()]).max() / 2.0
mid_x = (x_sol.max()+x_sol.min()) * 0.5
mid_y = (y_sol.max()+y_sol.min()) * 0.5
mid_z = (z_sol.max()+z_sol.min()) * 0.5
ax.set_xlim(mid_x - max_range, mid_x + max_range)
ax.set_ylim(mid_y - max_range, mid_y + max_range)
ax.set_zlim(mid_z - max_range, mid_z + max_range)

plt.show()

Как это работает на графике:

  1. Вы увидите замкнутую «розу» из эллипсов (незамкнутую траекторию).
  2. Красные точки наглядно отметят перигелии (ближайшие к Солнцу участки). Из-за аксиального ускорения каждая последующая красная точка смещается по углу, формируя прецессию орбиты.

Axial Precession in the General Theory of Relativity Solution

Орбитальная механика

Introduction to orbital mechanics: conic sections

Величина

    \[1 - e^2\]

(где e — эксцентриситет эллипса) сама по себе не равна никакой площади, так как это безразмерное число, равное квадрату отношения малой полуоси b к большой полуоси a (

    \[1 - e^2 = \frac{b^2}{a^2}\]

). [1]

Однако с помощью этой величины можно выразить площадь эллипса S:

    \[S=\pi ab=\pi a^{2}\sqrt{1-e^{2}}\]


Где:

  • a — большая полуось эллипса.
  •     \[\pi a^2\]

    — площадь круга, построенного на большой оси как на диаметре. [1]

Круговая скорость на расстоянии перигелия (

    \[v_{kp}\]

) — это скорость, которую должно было бы иметь тело, чтобы двигаться по идеальной круговой орбите радиуса

    \[r_{p}\]

, равного перигелийному расстоянию эллиптической орбиты. [1]

Она рассчитывается по стандартной формуле первой космической скорости для данного расстояния: [1]

    \[v_{kp}=\sqrt{\frac{GM}{r_{p}}}\]

Где:

  • G — гравитационная постоянная.
  • M — масса центрального тела (например, Солнца).
  •     \[r_{p}\]

    — расстояние в перигелии, которое выражается через большую полуось a и эксцентриситет e как

        \[r_p = a(1-e)\]

    . [1]

Связь с реальной скоростью в перигелии

Настоящая (эллиптическая) скорость тела в перигелии (

    \[v_{p}\]

) всегда больше круговой скорости для этой точки. Они связаны между собой через эксцентриситет орбиты e следующим соотношением: [1, 2]

    \[v_{p}=v_{kp}\cdot \sqrt{1+e}=\sqrt{\frac{GM}{a}}\cdot \sqrt{\frac{1+e}{1-e}}\]

Для круговой орбиты e = 0, и тогда реальная скорость в точности равна круговой. Для вытянутых орбит реальная скорость превышает круговую в

    \[\sqrt{1+e}\]

раз. [1, 2]

Круговая скорость на расстоянии афелия (

    \[v_{ka}\]

) — это скорость, которую имело бы тело при движении по круговой орбите радиуса

    \[r_{a}\]

, равного афелийному расстоянию.

Она вычисляется по формуле:

    \[v_{ka}=\sqrt{\frac{GM}{r_{a}}}\]

Где:

  • G — гравитационная постоянная.
  • M — масса центрального тела.
  •     \[r_{a}\]

    — расстояние в афелии, которое связано с большой полуосью a и эксцентриситетом e как

        \[r_a = a(1+e)\]

    .

Отношение круговых скоростей

Отношение круговой скорости в перигелии к круговой скорости в афелии равно корню квадратному из отношения расстояний в афелии и перигелии, что выражается через эксцентриситет как:

    \[\frac{v_{kp}}{v_{ka}}=\sqrt{\frac{1+e}{1-e}}\]

Вывод формулы:

  1. Запишем формулы для обеих скоростей:

        \[v_{kp}=\sqrt{\frac{GM}{r_{p}}},\quad v_{ka}=\sqrt{\frac{GM}{r_{a}}}\]

  2. Поделим

        \[v_{kp}\]

    на

        \[v_{ka}\]

    (при этом гравитационный параметр GM сократится):

        \[\frac{v_{kp}}{v_{ka}}=\frac{\sqrt{\frac{GM}{r_{p}}}}{\sqrt{\frac{GM}{r_{a}}}}=\sqrt{\frac{r_{a}}{r_{p}}}\]

  3. Подставим выражения через эксцентриситет (

        \[r_p = a(1-e)\) и \(r_a = a(1+e)\]

    ):

        \[\frac{v_{kp}}{v_{ka}}=\sqrt{\frac{a(1+e)}{a(1-e)}}=\sqrt{\frac{1+e}{1-e}}\]

Важное замечание: Интересно, что это отношение точно совпадает с отношением реальной максимальной скорости в перигелии (

    \[v_{p}\]

) к реальной минимальной скорости в афелии (

    \[v_{a}\]

) для эллиптической орбиты, хотя природа этого совпадения кроется в законе сохранения момента импульса (

    \[v_p \cdot r_p = v_a \cdot r_a\]

).

Minecraft Edu © 2026