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

Самое главное уравнение‑это уравнение поля Эйнштейна в общей теории относительности (Источник [1]):

R_{\mu\nu} - \frac{1}{2} R g_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu}.

Где:

R_{\mu\nu}
  • ​ — тензор Риччи,

  • R — скалярная кривизна,

g_{\mu\nu}
  • ​ — метрический тензор,

  • Λ — космологическая постоянная,

T_{\mu\nu}
  • ​ — тензор энергии‑импульса (материя/поля),

  • G, c — гравитационная постоянная и скорость света соответственно.

Точные решения уравнения Эйнштейна (Источник [2] ) в частных случаях при наложении симметрий называются метриками. Перечислим некоторые из них:

1) Метрика Шварцшильда в координатах Шварцшильда (статическая, сферически‑симметричная чёрная дыра, без заряда и вращения)(Источник [3]):

ds^2 = -\left(1 - \frac{r_s}{r}\right) c^2 dt^2 + \left(1 - \frac{r_s}{r}\right)^{-1} dr^2 + r^2 \left(d\theta^2 + \sin^2\theta\, d\phi^2\right)

где

r_s = \frac{2GM}{c^2}

Радиус Шварцшильда (радиус горизонта событий).

Написав код для визуализации,

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Параметры
M = 1.0  # Масса чёрной дыры (в условных единицах)
rs = 2 * M  # Радиус Шварцшильда

# Сетка координат
r = np.linspace(rs, 10, 200)
theta = np.linspace(0, 2*np.pi, 200)
R, Theta = np.meshgrid(r, theta)

# Параболоид Фламма: z ~ sqrt(r - rs)
# Это упрощённая модель для визуализации кривизны
Z = 2 * np.sqrt(R - rs)

# Переход к декартовым координатам
X = R * np.cos(Theta)
Y = R * np.sin(Theta)

# Построение графика
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.9, edgecolor='none')

# Горизонт событий (окружность радиуса rs)
circle_theta = np.linspace(0, 2*np.pi, 100)
circle_x = rs * np.cos(circle_theta)
circle_y = rs * np.sin(circle_theta)
circle_z = np.zeros_like(circle_x)
ax.plot(circle_x, circle_y, circle_z, color='red', linewidth=3, label='Горизонт событий')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z (кривизна)')
ax.set_title('Метрика Шварцшильда')
ax.legend()

plt.tight_layout()
plt.show()

получим:

Метрика Шварцшильда
Метрика Шварцшильда
Искривление радиальной координаты
Искривление радиальной координаты

Сингулярность в метрике Шварцшильда точечная.

2) Метрика Керра в координатах Бойера‑Линдквиста(Источник [4]) (для вращающейся чёрной дыры):

\begin{align}     ds^2 ={}& -\left(1 - \frac{2Mr}{\rho^2}\right) dt^2      - \frac{4Mar\sin^2\theta}{\rho^2} \, dt\, d\phi      + \frac{\rho^2}{\Delta} \, dr^2 \notag \\     &+ \rho^2 \, d\theta^2      + \left(r^2 + a^2 + \frac{2Ma^2r\sin^2\theta}{\rho^2}\right)\sin^2\theta \, d\phi^2, \end{align}

Где:

\rho^2 = r^2 + M^2a^2\cos^2\theta, \quad\Delta = r^2 - 2Mr + M^2a^2a = J/(Mc)

‑параметр вращения.

M, J‑ масса и момент импульса чёрной дыры.

В этой метрике радиус горизонта событий:

r_+ = M + \sqrt{M^2 - a^2}

Радиус статической границы (эргосферы):

r_{\text{erg}}(\theta) = M + \sqrt{M^2 - a^2\cos^2\theta}

Напишем на Python код для визуализации:

import numpy as np
import plotly.graph_objects as go

M = 1.0
a = 0.9  # почти экстремальная чёрная дыра

def r_erg_theta(theta):
    return M + np.sqrt(M**2 - a**2 * np.cos(theta)**2)

r_h = M + np.sqrt(M**2 - a**2)

theta = np.linspace(0, np.pi, 100)
phi = np.linspace(0, 2*np.pi, 100)
THETA, PHI = np.meshgrid(theta, phi)

# Эргосфера в сферических координатах -> декартовы
r_e_grid = r_erg_theta(THETA)
X_e = r_e_grid * np.sin(THETA) * np.cos(PHI)
Y_e = r_e_grid * np.sin(THETA) * np.sin(PHI)
Z_e = r_e_grid * np.cos(THETA)

# Горизонт событий (сфера по r, но это не сфера в обычном смысле из-за координат)
r_h_grid = np.full_like(THETA, r_h)
X_h = r_h_grid * np.sin(THETA) * np.cos(PHI)
Y_h = r_h_grid * np.sin(THETA) * np.sin(PHI)
Z_h = r_h_grid * np.cos(THETA)

# Кольцевая сингулярность: r=0, theta=pi/2 (экваториальная плоскость)
R_ring = 0.05  # радиус кольца для визуализации (сингулярность формально нулевая)
z_ring = 0
theta_ring = np.pi/2
x_ring = R_ring * np.cos(phi)
y_ring = R_ring * np.sin(phi)
z_ring_arr = np.zeros_like(x_ring)

fig = go.Figure()

# Эргосфера
fig.add_trace(go.Surface(
    x=X_e, y=Y_e, z=Z_e,
    colorscale='Blues', opacity=0.6,
    showscale=False, name='Эргосфера'
))

# Горизонт
fig.add_trace(go.Surface(
    x=X_h, y=Y_h, z=Z_h,
    colorscale='Greys', opacity=1.0,
    showscale=False, name='Горизонт событий'
))

# Кольцо сингулярности
fig.add_trace(go.Scatter3d(
    x=x_ring, y=y_ring, z=z_ring_arr,
    mode='lines', line=dict(color='red', width=4),
    name='Кольцевая сингулярность'
))

fig.update_layout(
    title=f'Строение чёрной дыры (метрика Керра), a = {a}',
    scene=dict(
        xaxis_title='x',
        yaxis_title='y',
        zaxis_title='z',
        aspectmode='data'
    ),
    width=800,
    height=700
)
fig.show()

Результат работы программы:

Вращающаяся чёрная дыра.
Вращающаяся чёрная дыра.

В метрике Керра появляется эргосфера (Источник[26])(область вне горизонта событий, где даже свет не может оставаться в покое относительно удалённого наблюдателя — эффект перетаскивания инерциальных систем, или Лензе — Тирринга) и кольцевая сингулярность (Источник[27])(в отличие от точечной в метрике Шварцшильда).

3) Метрика Рейсснера‑Нордстрёма(Источник [5]) (для заряжённой и не вращающейся чёрной дыры):

ds^2 = -\left(1 - \frac{2M}{r} + \frac{Q^2}{r^2}\right)dt^2      + \left(1 - \frac{2M}{r} + \frac{Q^2}{r^2}\right)^{-1}dr^2      + r^2(d\theta^2+\sin^2\theta\,d\phi^2)

Где Q‑ заряд чёрной дыры.

Сначала покажем, как заряд влияет на горизонты событий:

Горизонты заряженной чёрной дыры.
Горизонты заряженной чёрной дыры.

Теперь покажем, как заряд влияет на радиальную координату:

растяжение радиальной координаты
растяжение радиальной координаты

Код для получения чёрной дыры в 3d в метрике Рейсснера‑Нордстрёма:

import numpy as np
import plotly.graph_objects as go

M = 1.0
Q_vals = [0.0, 0.5, 0.8, 0.95]  # можно менять

theta = np.linspace(0, np.pi, 60)
phi = np.linspace(0, 2*np.pi, 80)
THETA, PHI = np.meshgrid(theta, phi)

fig = go.Figure()

for i, Q in enumerate(Q_vals):
    disc = M**2 - Q**2
    if disc < 0:
        print(f"Q={Q:.2f}: голая сингулярность, горизонтов нет")
        continue
    r_plus = M + np.sqrt(disc)
    r_minus = M - np.sqrt(disc) if disc > 0 else None

    # Внешний горизонт
    X_out = r_plus * np.sin(THETA) * np.cos(PHI)
    Y_out = r_plus * np.sin(THETA) * np.sin(PHI)
    Z_out = r_plus * np.cos(THETA)

    fig.add_trace(go.Surface(
        x=X_out, y=Y_out, z=Z_out,
        colorscale='Viridis',
        opacity=0.85,
        showscale=False,
        name=f'Q={Q:.2f}, r_+'
    ))

    # Внутренний горизонт (если есть)
    if r_minus is not None and r_minus > 0:
        X_in = r_minus * np.sin(THETA) * np.cos(PHI)
        Y_in = r_minus * np.sin(THETA) * np.sin(PHI)
        Z_in = r_minus * np.cos(THETA)

        fig.add_trace(go.Surface(
            x=X_in, y=Y_in, z=Z_in,
            colorscale='Plasma',
            opacity=0.9,
            showscale=False,
            name=f'Q={Q:.2f}, r_-'
        ))

fig.update_layout(
    title=f'Горизонты чёрной дыры Рейсснера–Нордстрёма (M={M})',
    scene=dict(
        xaxis_title='x',
        yaxis_title='y',
        zaxis_title='z',
        aspectmode='data'
    ),
    width=800,
    height=700
)
fig.show()

В итоге получим:

Метрика Рейсснера-Нордстрёма.
Метрика Рейсснера‑Нордстрёма.

В метрике Рейсснера‑Нордстрёма эргосферы нет- она есть только у вращающихся чёрных дыр.

Зато у неё может быть два различных горизонта:внешний и внутренний, что видно из полученного изображения.

4) Метрика Керра‑Ньюмана в координатах Бойера‑Линдквиста (Источник [6])(для заряженной и вращающейся чёрной дыры):

\begin{align}     ds^2 ={}& -\left(1 - \frac{2Mr - Q^2}{\rho^2}\right) dt^2      - \frac{2(2Mr - Q^2)a\sin^2\theta}{\rho^2} \, dt\, d\phi      + \frac{\rho^2}{\Delta} \, dr^2 \notag \\     &+ \rho^2 \, d\theta^2      + \left(r^2 + a^2 + \frac{(2Mr - Q^2)a^2\sin^2\theta}{\rho^2}\right)\sin^2\theta \, d\phi^2, \end{align}

Где:

\rho^2 = r^2 + a^2\cos^2\theta, \quad \Delta = r^2 - 2Mr + a^2 + Q^2.

является наиболее общим решением для стационарной чёрной дыры; её геометрия полностью определяется тремя параметрами: M, a, Q.

Покажем, как параметры влияют на горизонты и эргосферу:

Метрика Керра-Ньюмана
Метрика Керра‑Ньюмана

Код для визуализации метрики Керра‑Ньюмана:

import numpy as np
import plotly.graph_objects as go

M = 1.0
a = 0.7
Q = 0.4

theta_vals = np.linspace(0, np.pi, 60)
phi_vals = np.linspace(0, 2*np.pi, 80)
THETA, PHI = np.meshgrid(theta_vals, phi_vals)

# Горизонт: r = r_plus (не зависит от theta)
disc = M**2 - a**2 - Q**2
if disc < 0:
    raise ValueError("Параметры дают голую сингулярность")
r_plus = M + np.sqrt(disc)

X_h = r_plus * np.sin(THETA) * np.cos(PHI)
Y_h = r_plus * np.sin(THETA) * np.sin(PHI)
Z_h = r_plus * np.cos(THETA)

# Эргосфера: r_erg(theta) = M + sqrt(M^2 - a^2*cos^2(theta) - Q^2)
term_erg = M**2 - (a**2)*(np.cos(THETA)**2) - Q**2
mask = term_erg >= 0
r_erg_grid = np.zeros_like(THETA)
r_erg_grid[mask] = M + np.sqrt(term_erg[mask])

X_e = r_erg_grid * np.sin(THETA) * np.cos(PHI)
Y_e = r_erg_grid * np.sin(THETA) * np.sin(PHI)
Z_e = r_erg_grid * np.cos(THETA)

fig = go.Figure()

# Горизонт
fig.add_trace(go.Surface(
    x=X_h, y=Y_h, z=Z_h,
    colorscale='Greys',
    opacity=1.0,
    showscale=False,
    name='Горизонт событий'
))

# Эргосфера
fig.add_trace(go.Surface(
    x=X_e, y=Y_e, z=Z_e,
    colorscale='Viridis',
    opacity=0.6,
    showscale=False,
    name='Эргосфера'
))

fig.update_layout(
    title=f'Эргосфера и горизонт в метрике Керра–Ньюмана (M={M}, a={a}, Q={Q})',
    scene=dict(
        xaxis_title='x',
        yaxis_title='y',
        zaxis_title='z',
        aspectmode='data'
    ),
    width=800,
    height=700
)
fig.show()

Результат работы программы:

Черная дыра в метрике Керра-Ньюмана
Черная дыра в метрике Керра‑Ньюмана

Следует отметить, что астрофизически заряженные чёрные дыры практически не встречаются: заряд быстро нейтрализуется. Поэтому Керр‑Ньюман и Рейсснер-Нордстрём — это прежде всего теоретические модели, но они важны как «самый общий случай» и как полигон для численных методов.

Практически во всех метриках существует фотонная сфера (Источник[28])— это поверхность (или набор орбит), где могут существовать круговые нулевые геодезические, то есть траектории света, замкнутые в виде окружностей. Условие: эффективный потенциал для фотонов имеет экстремум при некотором r, и при правильных начальных условиях фотон будет «висеть» на этой орбите (хотя она неустойчива).

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

Статья носит чисто демонстрационный и иллюстративный характер.

Литература:

  1. https://ru.wikipedia.org/wiki/Уравнения_Эйнштейна

  2. https://ru.wikipedia.org/wiki/Решения_уравнений_Эйнштейна

  3. https://ru.wikipedia.org/wiki/Метрика_Шварцшильда

  4. https://translated.turbopages.org/proxy_u/en‑ru.ru.ccbd0af6-6a67b04a-35689e94-74722d776562/https/en.wikipedia.org/wiki/Kerr_metric

  5. https://en.wikipedia.org/wiki/Reissner‑Nordström_metric

  6. https://en.wikipedia.org/wiki/Kerr‑Newman_metric

  7. https://bigenc.ru/wiki/Чёрная_дыра_Райсснера_‑_Нордстрёма

  8. С. А. Пастон, А. А. Шейкин «Глобальное вложение метрики Рейсснера‑Нордстрёма в плоское окружающее пространство» (SIGMA, 2014, № 10, 003).

  9. М. Джемри «Деформация термодинамики АдС чёрной дыры Рейсснера‑Нордстрёма, порождённая поправками Данкла» («Теоретическая и математическая физика», 2026, т. 227, № 1, с. 188–205).

  10. https://cyberleninka.ru/article/n/entropiya‑chernoy‑dyry‑v‑modeli‑reysnera‑nordstryoma‑de‑sittera

  11. Зельдович Я. Б., Новиков И. Д. «Теория тяготения и эволюция звёзд»

  12. https://cyberleninka.ru/article/n/uravneniya‑eynshteyna‑i‑ego‑svoystva

  13. https://cyberleninka.ru/article/n/o‑geometricheskoy‑klassifikatsii‑uravneniy‑eynshteyna

  14. С. Чандрасекар «Математическая теория чёрных дыр» (в 2 томах, перевод В. А. Березина, под ред. Д. А. Гальцова, «Мир», 1986).

  15. А. М. Баранов «О метрике Керра — Ньюмена» («Пространство, время и фундаментальные взаимодействия», 2021, № 2, с. 42–47).

  16. В. П. Фролов «Решения типа Керра — Ньюмана — Унти — Тамбурино уравнений Эйнштейна с космологическим членом» («Теоретическая и математическая физика», 1974, т. 21, № 2, с. 213–223).

  17. А. Ф. Захаров «Тени и круговые фотонные орбиты: рассмотрение некоторых случаев обобщений чёрных дыр Керра — Ньюмена» («Письма в ЭЧАЯ», 2025).

  18. В. П. Фролов, И. Д. Новиков «Чёрные дыры во Вселенной» (обзорные лекции/статьи, часто встречаются в сборниках).

  19. https://archive.org/details/arxiv‑hep‑th0112237

  20. https://arxiv.org/pdf/1408.3334

  21. https://en.wikipedia.org/wiki/Geodesics_in_general_relativity

  22. С. О. Алексеев, Е. А. Памятных, А. В. Урсулов «Общая теория относительности. Введение. Современное развитие и приложения» (2022).

  23. С. Хокинг, Дж. Эллис «Крупномасштабная структура пространства‑времени».

  24. Eva Hackmann “Geodesic equations in General Relativity: Motion in black hole space‑times with and without cosmological constant”

  25. https://www.dissercat.com/content/dvizhenie‑chastits‑vblizi‑chernykh‑dyr

  26. https://ru.wikipedia.org/wiki/Эргосфера

  27. https://ru.wikipedia.org/wiki/Кольцеобразная_сингулярность

  28. https://en.wikipedia.org/wiki/Photon_sphere

Комментарии (3)


  1. wl2776
    02.08.2026 08:10

    А выводы какие-то есть? Или объяснения какие-то популярные, на пальцах?

    Нынче такой код сможет написать ИИ.


  1. funca
    02.08.2026 08:10

    Как проверить, что код вообще валиден и визуализации соответствуют изначальным математическим формулам?


    1. wl2776
      02.08.2026 08:10

      Например, запросом в llm. "Вот текст, вот код, проверь, что код делает то, о чём написано в тексте".

      Второй вариант: два запроса. (1) вот текст, напиши код; (2) вот два кода сравни, расскажи, что делают и чем отличаются

      Под каждый блоком кода в статье есть ссылка на SourceCraft, можно прямо им и воспользоваться