Pull to refresh

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 Питоном картинка более весёлая

Sign up to leave a comment.

Articles