В этой статье мы напишем код для математического моделирования и компьютерной визуализации чёрных дыр, а также запишем ключевые уравнения, описывающие их.
Самое главное уравнение‑это уравнение поля Эйнштейна в общей теории относительности (Источник [1]):
Где:
— тензор Риччи,
R — скалярная кривизна,
— метрический тензор,
Λ — космологическая постоянная,
— тензор энергии‑импульса (материя/поля),
G, c — гравитационная постоянная и скорость света соответственно.
Точные решения уравнения Эйнштейна (Источник [2] ) в частных случаях при наложении симметрий называются метриками. Перечислим некоторые из них:
1) Метрика Шварцшильда в координатах Шварцшильда (статическая, сферически‑симметричная чёрная дыра, без заряда и вращения)(Источник [3]):
где
Радиус Шварцшильда (радиус горизонта событий).
Написав код для визуализации,
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]) (для вращающейся чёрной дыры):
Где:
‑параметр вращения.
M, J‑ масса и момент импульса чёрной дыры.
В этой метрике радиус горизонта событий:
Радиус статической границы (эргосферы):
Напишем на 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]) (для заряжённой и не вращающейся чёрной дыры):
Где 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])(для заряженной и вращающейся чёрной дыры):
Где:
является наиболее общим решением для стационарной чёрной дыры; её геометрия полностью определяется тремя параметрами: 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, и при правильных начальных условиях фотон будет «висеть» на этой орбите (хотя она неустойчива).
Таким образом, в данной статье сделана компьютерная графическая визуализация чёрных дыр в четырёх различных метриках, показаны ключевые отличия, а также построены графики.
Статья носит чисто демонстрационный и иллюстративный характер.
Литература:
С. А. Пастон, А. А. Шейкин «Глобальное вложение метрики Рейсснера‑Нордстрёма в плоское окружающее пространство» (SIGMA, 2014, № 10, 003).
М. Джемри «Деформация термодинамики АдС чёрной дыры Рейсснера‑Нордстрёма, порождённая поправками Данкла» («Теоретическая и математическая физика», 2026, т. 227, № 1, с. 188–205).
https://cyberleninka.ru/article/n/entropiya‑chernoy‑dyry‑v‑modeli‑reysnera‑nordstryoma‑de‑sittera
Зельдович Я. Б., Новиков И. Д. «Теория тяготения и эволюция звёзд»
https://cyberleninka.ru/article/n/uravneniya‑eynshteyna‑i‑ego‑svoystva
https://cyberleninka.ru/article/n/o‑geometricheskoy‑klassifikatsii‑uravneniy‑eynshteyna
С. Чандрасекар «Математическая теория чёрных дыр» (в 2 томах, перевод В. А. Березина, под ред. Д. А. Гальцова, «Мир», 1986).
А. М. Баранов «О метрике Керра — Ньюмена» («Пространство, время и фундаментальные взаимодействия», 2021, № 2, с. 42–47).
В. П. Фролов «Решения типа Керра — Ньюмана — Унти — Тамбурино уравнений Эйнштейна с космологическим членом» («Теоретическая и математическая физика», 1974, т. 21, № 2, с. 213–223).
А. Ф. Захаров «Тени и круговые фотонные орбиты: рассмотрение некоторых случаев обобщений чёрных дыр Керра — Ньюмена» («Письма в ЭЧАЯ», 2025).
В. П. Фролов, И. Д. Новиков «Чёрные дыры во Вселенной» (обзорные лекции/статьи, часто встречаются в сборниках).
https://en.wikipedia.org/wiki/Geodesics_in_general_relativity
С. О. Алексеев, Е. А. Памятных, А. В. Урсулов «Общая теория относительности. Введение. Современное развитие и приложения» (2022).
С. Хокинг, Дж. Эллис «Крупномасштабная структура пространства‑времени».
Eva Hackmann “Geodesic equations in General Relativity: Motion in black hole space‑times with and without cosmological constant”
https://www.dissercat.com/content/dvizhenie‑chastits‑vblizi‑chernykh‑dyr
Комментарии (3)

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

wl2776
02.08.2026 08:10Например, запросом в llm. "Вот текст, вот код, проверь, что код делает то, о чём написано в тексте".
Второй вариант: два запроса. (1) вот текст, напиши код; (2) вот два кода сравни, расскажи, что делают и чем отличаются
Под каждый блоком кода в статье есть ссылка на SourceCraft, можно прямо им и воспользоваться
wl2776
А выводы какие-то есть? Или объяснения какие-то популярные, на пальцах?
Нынче такой код сможет написать ИИ.