File size: 3,812 Bytes
311ef24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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()