VCSD-I / simular_espectro_completo_vcsd.py
PabloCT-code's picture
Upload 13 files
311ef24 verified
Raw History Blame Contribute Delete
3.81 kB
import numpy as np
import matplotlib.pyplot as plt
def generar_espectro_completo_vcsd():
"""
Genera y grafica el espectro de potencias continuo del CMB (l = 2 a 3000) bajo
el modelo VCSD-I, mostrando la emergencia de los micro-picos acústicos remanentes
y el desfase asintótico constante de las funciones de Bessel en alta frecuencia.
"""
# 1. Definición del rango multipolar completo (Bajas a ultra-altas frecuencias)
multipolos = np.arange(2, 3001)
# 2. Parámetros físicos calibrados analíticamente
A_base = 3200.0
l_acustico = 220.0
damping_silk = 450.0
alpha_gradiente = 0.35
beta_vorticidad = 0.18
# 3. Modelado de la Fase Híbrida Adaptativa (Logarítmica -> Límite Bessel Constante)
# Orden de la función de Bessel ν = (1 - β)/2. Desfase asintótico = ν*π/2
nu = (1.0 - beta_vorticidad) / 2.0
desfase_asintotico = (nu * np.pi) / 2.0
# Factor de transición suave para acoplar ambos regímenes dinámicos sin discontinuidades
factor_transicion = 1.0 / (1.0 + np.exp(-(multipolos - 1000) / 200))
fase_baja_frec = multipolos * (np.pi / l_acustico) + (beta_vorticidad * np.log(multipolos))
fase_alta_frec = multipolos * (np.pi / l_acustico) + desfase_asintotico
fase_efectiva = (1.0 - factor_transicion) * fase_baja_frec + factor_transicion * fase_alta_frec
oscilacion_acustica = np.cos(fase_efectiva)**2
# 4. Envolventes de Potencia y Confinamiento Geométrico
modulacion_pozo = 1.0 + alpha_gradiente * np.sin(multipolos * (np.pi / (2.0 * l_acustico)))
# El exponente (1.5 - beta) modela el confinamiento inercial por rotación macroscópica
filtro_atenuacion = np.exp(- (multipolos / damping_silk)**(1.5 - beta_vorticidad))
# 5. Espectro de Potencias Neto Cl
Cl_neto = A_base * oscilacion_acustica * modulacion_pozo * filtro_atenuacion
# 6. Configuración de la Gráfica de Alta Calidad Académica
plt.figure(figsize=(11, 6), dpi=120)
plt.style.use('seaborn-v0_8-whitegrid' if 'seaborn-v0_8-whitegrid' in plt.style.available else 'default')
# Trazado de la curva del modelo VCSD-I
plt.plot(multipolos, Cl_neto, color='#004488', linewidth=2.0, label=r'Modelo VCSD-I ($\beta=0.18, \alpha=0.35$)')
# Sombreado y marcadores específicos para la región de Micro-Picos Extremos (l > 2000)
plt.axvspan(2000, 3000, color='#ffea00', alpha=0.15, label='Región de Micro-Picos Remanentes (Bessel)')
# Anotación de los picos acústicos principales y secundarios
plt.annotate('1º Pico', xy=(220, 5600), xytext=(350, 5700), arrowprops=dict(arrowstyle='->', color='black'))
plt.annotate('2º Pico', xy=(540, 1200), xytext=(650, 1600), arrowprops=dict(arrowstyle='->', color='black'))
plt.annotate('3º Pico', xy=(810, 1100), xytext=(920, 1500), arrowprops=dict(arrowstyle='->', color='black'))
plt.annotate('Micro-Picos (4º-7º)', xy=(2300, 60), xytext=(1600, 800),
arrowprops=dict(arrowstyle='->', color='#cc0000', lw=1.5))
# Configuración de ejes y etiquetas formalizadas
plt.title('Espectro de Potencias Angular del CMB - Extensión Multipolar Completa (VCSD-I)', fontsize=13, pad=15)
plt.xlabel('Multipolo Angular ($\ell$)', fontsize=11)
plt.ylabel(r'$\mathcal{D}_\ell \equiv \ell(\ell+1)C_\ell / 2\pi$ [$\mu$K$^2$]', fontsize=11)
plt.xlim(2, 3000)
plt.ylim(0, 6200)
plt.legend(loc='upper right', frameon=True, fontsize=10)
plt.tight_layout()
# Guardar gráfica en alta resolución
plt.savefig('espectro_completo_vcsd_cmb.png', dpi=300)
print("[*] Gráfica generada y guardada con éxito como 'espectro_completo_vcsd_cmb.png'.")
plt.show()
if __name__ == '__main__':
generar_espectro_completo_vcsd()