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()