홈으로 돌아가기

Python, SPARC 및 TVERK: 암흑물질에 맞서는 새로운 모델

Python과 SPARC 데이터를 사용한 연구가 암흑물질 없이 175개 은하의 운동학을 설명하는 새로운 TVERK 가설을 제안합니다. 중급/시니어 개발자를 위한 분석 및 코드.

Python 및 TVERK: 은하 역학에서 암흑물질의 대안
Advertisement 728x90

광자 파문이 암흑물질 대체: Python과 SPARC로 은하 회전 법칙 재정의

수십 년간 천체물리학자들을 괴롭혀온 암흑물질 문제. 은하 역학의 표준 모델은 은하 외곽 영역의 별들이 예상보다 훨씬 빠르게 회전하는 현상을 설명하기 위해 보이지 않는 질량을 필요로 합니다. 하지만 이 가상의 물질을 각 은하마다 매번 조정하는 것은 그 근본적인 타당성에 의문을 제기합니다. 독립 연구자 파벨 K.는 대담한 대안을 제안했습니다: 진동-에너지 공명 연속체 이론(TVERC). 이 이론은 우주를 연속체 역학과 비선형 유체역학의 엄격한 법칙이 지배하는 매질로 봅니다. 이 아이디어를 검증하기 위해 그는 Python과 공개 천문 데이터를 활용한 계산 실험을 구축하여, 암흑물질 없이 175개 은하의 운동학을 모델링했습니다.

암흑물질 퍼즐과 TVERC 대안

은하 모델은 보이는 물질의 중력에 의존합니다. 그러나 관측 결과 외곽 영역이 예측보다 훨씬 빠르게 회전하는 것으로 나타났습니다. 데이터를 맞추기 위해 암흑물질이 가정되었죠—우주의 질량 대부분을 차지하는 보이지 않는 물질입니다. 문제는? 각 은하마다 암흑물질 후광 매개변수를 맞춤형으로 조정해야 한다는 점입니다. 이는 패러다임의 결함을 암시하며 더 나은 설명을 찾는 연구를 촉발했습니다.

TVERC는 판을 뒤집습니다. 암흑물질 입자 대신, 탄성 진공 파문으로부터 생성되는 밀도 높은 "음향 쿠션"을 도입합니다. 별들은 수십억 년에 걸쳐 이 파문을 생성하며, 국부적으로 공간의 광기계적 점도를 높입니다. 은하는 응집된 단위로 회전하며, 이 점성 매질에서의 파동 에너지 확산의 보편적이고 확장 가능한 법칙을 따릅니다. 더 이상 은하별 조정 불필요—모든 은하에 하나의 물리 기반 모델만 있으면 됩니다.

Google AdInline article slot

SPARC 데이터베이스 활용 계산 실험

TVERC를 검증하기 위해 파벨은 실제 천문 데이터를 바탕으로 계산 테스트를 실행했습니다. 그는 공개 SPARC 데이터베이스(Spitzer Photometry & Accurate Rotation Curves)를 사용했는데, 이는 거대 나선은하부터 왜소 불규칙은하까지 175개 은하의 정밀 광도와 회전곡선을 제공합니다. 은하 역학 연구의 골드 스탠다드죠.

목표: 175개 은하 전체에 맞는 단일 보편적 19개 거시적 3D 매질 매개변수 세트를 찾는 것. 이는 진공 강성, 파동 에너지 감쇠 기울기, 파문 증배기 등을 포함합니다. 그는 SciPy의 scipy.optimize.differential_evolution을 활용해 이 거대한 문제를 해결했습니다—고차원 공간의 강력한 전역 최적화 도구입니다. TVERC 예측 회전곡선과 관측값 간 불일치를 최소화하며, 엄격한 제약으로 물리적 현실성을 유지했습니다.

Python 구현: 최적화기와 TVERC 물리 모델

과학 스택(numpy, scipy, matplotlib)을 갖춘 Python은 이 작업에 완벽했습니다. 과정은 재현성을 위해 SPARC를 자동 다운로드한 후, 19개 매개변수에 물리 제약 경계를 적용해 최적화기를 가동합니다. 이는 솔루션을 현실에 기반하게 합니다.

Google AdInline article slot

최적화기 설정과 경계를 보여주는 코드 스니펫:

# === SCRIPT 1: TVERC AUTO-OPTIMIZER V10.1 (STRICT PHYSICS ENGINE) ===

import os
import subprocess

print("=== STAGE 1: SPARC DATABASE DOWNLOADING ===")
# Auto-download SPARC safely
if not os.path.exists('sparc-json'):
    print("Downloading aggregated SPARC database (sparc_full.json)...")
    subprocess.run(["git", "clone", "https://github.com/wohlig/sparc-json.git'])
    print("Done! Database loaded.\n")
else:
    print("Database exists. Skipping download.\n")

import numpy as np
import matplotlib.pyplot as plt
import json
import warnings
from scipy.optimize import differential_evolution

warnings.filterwarnings("ignore")

print("=== TVERC UNIFIED MODEL: V10.1 STRICT PHYSICS OPTIMIZER ===")
print("Mode: 175 galaxies. Physical penalties active. 5% outlier trimming.")

# ==============================================================================
# STRICT PHYSICAL BOUNDS (19 PARAMETERS)
# ==============================================================================
BOUNDS = [
    (1.0, 15.0),          # 0: initial_phi (Constrained by adequate vacuum tension)
    (0.0005, 15.0),       # 1: coupling (Matter-vacuum interaction)
    (0.0, 50.0),          # 2: base_kinetic_push (Kinematic offset max 50 km/s)
    (0.1, 3.0),           # 3: gas_ripple_multiplier (Gas volatility multiplier)
    (2.0, 20.0),          # 4: halo_radius_multiplier (Halo larger than disk by 2-20x)
    (1.0, 10.0),          # 5: a_scale_divisor (Density decay shape)
    (0.3, 0.85),          # 6: M_L_disk_base (PHYSICS: Disk M/L in IR band ~0.5)
    (1e-6, 0.5),          # 7: min_scattering 
    (0.1, 1.5),           # 8: phi_exponent (Field attenuation exponent)
    (0.1, 20.0),          # 9: k_ripple_base 
    (0.01, 5.0),          # 10: rho_sup_scale 
    (0.1, 1.0),           # 11: rho_sup_power 
    (0.4, 1.0),           # 12: M_L_bulge (PHYSICS: Bulge has older stars, higher M/L)
    (-0.3, 0.3),          # 13: ml_gradient (Smooth stellar population gradient)
    (5.0, 25.0),          # 14: disp_center (Core gas dispersion 5-25 km/s)
    (2.0, 12.0),          # 15: disp_edge (Edge dispersion minimum ~2 km/s)
    (0.5, 3.0),           # 16: disp_scale (Dispersion decay rate)
    (0.3, 1.0),           # 17: bulge_flattening (PHYSICS: Bulge is a 3D ellipsoid)
    (0.0, 0.5)            # 18: thermal_halo_coupling 
]

최적화 후(보통 3시간 이상 소요), 19개 보편 매개변수가 회전곡선을 생성합니다. 이 스니펫은 이를 로드하고 TVERC 물리 코어를 실행합니다:

# ==============================================================================
# TVERC KINEMATIC VISUALIZER: 12 GALAXY GRID
# ==============================================================================
# Auto-download SPARC
import os
if not os.path.exists('sparc-json'):
    print("Downloading SPARC database...")
    os.system('rm -rf sparc-json')
    os.system('git clone https://github.com/wohlig/sparc-json.git')

import numpy as np
import matplotlib.pyplot as plt
import json
import warnings

warnings.filterwarnings('ignore')
print("\n=== TVERC KINEMATIC VISUALIZER: FORWARD CALCULATION ===")

# ==============================================================================
# 19 UNIVERSAL TVERC PARAMETERS (Derived from Run 1 Baseline)
# ==============================================================================
# Each represents a core property of the 3D Continuum
best_params = [
    14.4842,    # 0: initial_phi (Baseline vacuum tension scalar)
    13.4859,    # 1: coupling (Matter-vacuum interaction constant)
    6.7855,     # 2: base_kinetic_push (Ponderomotive acceleration offset, km/s)
    1.3480,     # 3: gas_ripple_multiplier (Thermodynamic volatility of interstellar gas)
    19.9079,    # 4: halo_radius_multiplier (Wave halo boundary scaling relative to disk)
    2.4916,     # 5: a_scale_divisor (Radial gradient shape factor of the transition zone)
    0.5702,     # 6: M_L_disk_base (Mass-to-Light ratio for the stellar disk)
    0.0000146,  # 7: min_scattering (Absolute lower limit of wave scattering in void)
    0.8768299,  # 8: phi_exponent (Spatial decay exponent of the tension field)
    0.3786,     # 9: k_ripple_base (Fundamental wave-number for thermal ripples)
    3.3008619,  # 10: rho_sup_scale (Density threshold for high-frequency damping)
    0.4823863,  # 11: rho_sup_power (Power of the density damping threshold)
    0.5949,     # 12: M_L_bulge (Mass-to-Light ratio for the older central bulge)
    -0.1827,    # 13: ml_gradient (Smooth radial decay of stellar mass density)
    5.3,        # 14: disp_center (Gas velocity dispersion at the core, km/s)
    2.4,        # 15: disp_edge (Gas velocity dispersion at the periphery, km/s)
    2.2334,     # 16: disp_scale (Exponential decay scale of gas dispersion)
    0.8531,     # 17: bulge_flattening (Geometric oblateness of the 3D bulge)
    0.2692      # 18: thermal_halo_coupling (Fraction of thermal energy feeding the halo)
]

# ==============================================================================
# TVERC CORE PHYSICS ENGINE
# ==============================================================================
FIXED_CONFIG = {'alpha': 10e113}

class TVERCGalaxyModel:
    def __init__(self, params):    
        self.alpha = FIXED_CONFIG['alpha']
        self.initial_phi = params[0]
        self.coupling = params[1]
        self.base_push = params[2]
        self.gas_ripple_multiplier = params[3]
        self.halo_multiplier = params[4]
        self.a_scale_divisor = params[5]
        self.ml_disk_base = params[6]
        self.min_scattering = params[7]
        self.phi_exponent = params[8]
        self.k_ripple_base = params[9]
        self.rho_sup_scale = params[10]
        self.rho_sup_power = params[11]
        self.ml_bulge = params[12]
        self.ml_gradient = params[13]
        self.disp_center = params[14]
        self.disp_edge = params[15]
        self.disp_scale = params[16]
        self.bulge_flattening = params[17]
        self.thermal_coupling = params[18]
        self.v_phi_base = 299792.458

    def get_static_tension_energy(self, phi_val):
        return (3.0 / (2.0 * self.alpha)) * (1.0 - 1.0 / (1.0 + self.alpha * phi_val**2))

    def effective_ripple_energy_density(self, phi_val, rho_eff, grad_sq):
        local_k_ripple = self.k_ripple_base / (1.0 + (rho_eff / self.rho_sup_scale))
        local_k_ripple = np.maximum(local_k_ripple, 1.0) 
        v_eff_local = self.v_phi_base / (local_k_ripple * 124.1)
        retention_factor = 1.0 / (1.0 + (rho_eff / self.rho_sup_scale)**self.rho_sup_power)
        effective_factor = np.maximum(retention_factor, self.min_scattering)
        u_static = self.get_static_tension_energy(phi_val)
        u_coupling = 0.5 * self.coupling * rho_eff * phi_val**2
        kinetic_energy = 0.5 * v_eff_local**2 * grad_sq
        return kinetic_energy + (u_static + u_coupling) * effective_factor

G = 4.30091e-6 

def process_galaxy_json(galaxy_data, tverc_model):
    raw_array = np.array(galaxy_data['data'])
    R, V_obs, V_gas_raw = raw_array[:, 0], raw_array[:, 1], np.abs(raw_array[:, 3])     
    V_disk, V_bulge = raw_array[:, 4], raw_array[:, 5]  
    valid = R > 0
    R, V_obs, V_gas_raw, V_disk, V_bulge = R[valid], V_obs[valid], V_gas_raw[valid], V_disk[valid], V_bulge[valid]

    M_stars_raw = R * (V_disk**2 * 0.2) / G
    idx_half = np.searchsorted(M_stars_raw, M_stars_raw[-1]/2) if M_stars_raw[-1] > 0 else -1
    R_eff_raw = R[min(idx_half, len(R)-1)] if M_stars_raw[-1] > 0 else max(R[-1]/2, 1.0)
    
    V_dispersion = tverc_model.disp_center * np.exp(-R / (R_eff_raw * tverc_model.disp_scale)) + tverc_model.disp_edge
    V_gas = np.sqrt(V_gas_raw**2 + V_dispersion**2)

    surf_dens_approx = M_stars_raw[-1] / (R_eff_raw**2)
    dyn_ml_disk = tverc_model.ml_disk_base * (np.maximum(surf_dens_approx / 1e8, 0.1))**tverc_model.ml_gradient

    M_disk_R = R * (V_disk**2 * dyn_ml_disk) / G
    M_bulge_R = R * (V_bulge**2 * tverc_model.ml_bulge) / G
    M_gas_R = R * V_gas**2 / G
    
    rho_disk, rho_bulge, rho_gas = np.zeros_like(R), np.zeros_like(R), np.zeros_like(R)
    V_sph_0 = (4/3) * np.pi * R[0]**3
    rho_disk[0], rho_bulge[0], rho_gas[0] = M_disk_R[0]/V_sph_0, M_bulge_R[0]/(V_sph_0*tverc_model.bulge_flattening), M_gas_R[0]/V_sph_0
    
    for j in range(1, len(R)):
        dV = (4/3) * np.pi * (R[j]**3 - R[j-1]**3)
        if dV > 0:
            rho_disk[j] = np.maximum((M_

결과와 물리적 통찰

최적화기가 성공했습니다: 단일 19개 보편 매개변수 세트가 175개 다양한 은하의 운동학을 완벽히 맞춤. TVERC 곡선과 망원경 데이터 간 평균 절대 백분율 오차(MAPE)는 15.59%에 불과합니다. 이렇게 광범위한 샘플에 하나의 모델로 이 정도면 획기적입니다. 맞춤형 암흑물질 후광 불필요—시공간의 본질적 속성에서 역학이 자연스럽게 나타납니다.

Google AdInline article slot

주요 교훈:

  • 보편적 적합: 하나의 매개변수 세트가 거대은하부터 왜소은하까지 모든 유형을 커버—암흑물질 모델처럼 은하별 조정 불필요.
  • 인상적 정확도: 15.59% 평균 오차로 강력한 예측력을 입증.
  • 물리적 기반: 19개 매개변수 모두 진공 장력(initial_phi)이나 물질-진공 결합(coupling) 같은 실제 특성과 매핑.
  • 암흑물질 불필요: TVERC는 진공 파동 효과만으로 평탄 회전곡선을 설명.

이는 암흑물질 정설에 도전하며 우주 법칙의 새로운 관점을 열어줍니다. TVERC는 LIGO 데이터로 검증된 블랙홀 공명 진동까지 예측하며 은하를 넘어 확장됩니다.

주요 하이라이트

  • 천문 패러다임 전환: 암흑물질 버리고 연속체 역학적 우주관 채택.
  • Python 기반 모델링: scipy.optimize.differential_evolution으로 175개 은하를 19개 보편 매개변수로 시뮬레이션.
  • 입증된 정밀도: SPARC 회전곡선에서 15.59% MAPE.
  • 올인원 솔루션: 보편 매개변수가 암흑물질 맞춤형보다 우수.
  • 확장성: LIGO 확인으로 블랙홀까지 적용.

— Editorial Team

Advertisement 728x90

다음 읽기