Comments 4
Красиво! Меня всегда удивляло, как из пары мутных пикселей с телескопа, астрономы умудряются дорисовывать такие картинки. Вот у кого фантазия без границ.
ощущение, будто учёные сами до конца не понимают, что увидели сначала одно, потом другое… но если это правда что-то новое, то это прям очень круто и немного сносит крышу
В принципе довольно неплохая модель получается для визуализации квадрупольного момента при излучении гравиволн. Пример в спойлере
Вайб- бинарная система
Промпт:
симуляция матплотлиб вращай две окружности 100 пикселей расстояние 300 пикселей. Использовать сетка нормали гравитационная волна квадрупольный момент. Один оборот за 5 секунд примерно выводи экран шаг счёта примерно 1 пиксель. Дай питон скрипт.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# --- КОНФИГУРАЦИЯ ---
WIDTH = 800 # Ширина окна
HEIGHT = 800 # Высота окна
GRID_STEP = 25 # Шаг сетки (чем меньше, тем детальнее, но медленнее)
PERIOD = 5.0 # Период обращения (секунды)
SEPARATION = 300 # Расстояние между телами (пиксели)
WAVE_SPEED = 200 # Скорость распространения волны (пиксели/сек)
AMPLITUDE = 20.0 # Амплитуда искажения сетки
BODY_RADIUS = 20 # Размер тел
# Частота системы
OMEGA = 2 * np.pi / PERIOD
# Подготовка графического окна
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(-WIDTH//2, WIDTH//2)
ax.set_ylim(-HEIGHT//2, HEIGHT//2)
ax.set_aspect('equal')
ax.set_facecolor('black')
plt.title(f"Binary System GW Simulation (T={PERIOD}s)")
# Создание координатной сетки
x = np.arange(-WIDTH//2, WIDTH//2, GRID_STEP)
y = np.arange(-HEIGHT//2, HEIGHT//2, GRID_STEP)
X0, Y0 = np.meshgrid(x, y) # Исходные позиции узлов
# Элементы графика
# 1. Сетка (Lines)
grid_lines_x = [ax.plot([], [], color='cyan', alpha=0.3, lw=1)[0] for _ in range(len(x))]
grid_lines_y = [ax.plot([], [], color='cyan', alpha=0.3, lw=1)[0] for _ in range(len(y))]
# 2. Тела (Circles)
body1, = ax.plot([], [], 'o', color='yellow', markersize=BODY_RADIUS)
body2, = ax.plot([], [], 'o', color='yellow', markersize=BODY_RADIUS)
# 3. Векторное поле (Quiver) - визуализация "нормалей"/смещения
quiver = ax.quiver(X0, Y0, np.zeros_like(X0), np.zeros_like(Y0),
color='magenta', alpha=0.4, scale=500)
def get_strain(t, x, y):
"""
Вычисляет смещение узлов сетки на основе квадрупольной формулы.
Гравитационная волна имеет частоту 2 * Omega.
"""
# Расстояние от центра
r = np.sqrt(x**2 + y**2) + 1e-6 # защита от деления на 0
phi = np.arctan2(y, x)
# Задержка времени (retarded time) для эффекта распространения
t_ret = t - r / WAVE_SPEED
# Фаза волны (квадруполь = 2*phi)
# Частота волны удвоена относительно орбитальной (2 * OMEGA)
phase = 2 * (phi - OMEGA * t_ret)
# Убывание амплитуды с расстоянием (1/r)
strain_mag = AMPLITUDE * np.cos(phase) * (SEPARATION / r)
# Применяем тензор деформации для "+" поляризации (упрощенно)
# dx ~ h * x, dy ~ -h * y
dx = strain_mag * np.cos(2*phi) * 10 # Усиленный эффект для визуализации
dy = strain_mag * np.sin(2*phi) * 10
return dx, dy
def update(frame):
# Текущее время
t = frame * 0.05
# 1. Обновление позиций тел
# Тела вращаются с частотой OMEGA
bx1 = (SEPARATION/2) * np.cos(OMEGA * t)
by1 = (SEPARATION/2) * np.sin(OMEGA * t)
body1.set_data([bx1], [by1])
body2.set_data([-bx1], [-by1])
# 2. Расчет деформации сетки
dX, dY = get_strain(t, X0, Y0)
X_new = X0 + dX
Y_new = Y0 + dY
# 3. Обновление линий сетки
# Горизонтальные линии (итерируемся по строкам Y)
for i, line in enumerate(grid_lines_x):
line.set_data(X_new[:, i], Y_new[:, i])
# Вертикальные линии (итерируемся по столбцам X)
for i, line in enumerate(grid_lines_y):
line.set_data(X_new[i, :], Y_new[i, :])
# 4. Обновление векторов (нормалей смещения)
quiver.set_UVC(dX, dY)
return grid_lines_x + grid_lines_y + [body1, body2, quiver]
# Запуск анимации
# interval=50ms соответствует ~20 FPS
ani = FuncAnimation(fig, update, frames=range(1000), interval=50, blit=False)
plt.show()
В режиме ИИ встроенная симуляция

C Питоном картинка более весёлая

Астрономы обнаружили невиданный тип космических взрывов