宇宙学共动声视界代码调试求助:计算结果与预期不符
修正共动声视界r_s(z)计算的代码问题
你的代码计算结果偏离预期的核心原因是Hubble参数未考虑早期宇宙的辐射贡献,且宇宙学常数项取值错误,以下是修正后的完整代码及说明:
问题分析
- 缺失辐射项:在z=1089(对应a≈0.000919)的早期宇宙,辐射成分(光子)主导宇宙演化,你的
Hubble(a)函数仅包含物质(重子+暗物质)和宇宙学常数项,忽略了辐射项omega_gamma/a⁴,导致H(a)被低估,最终积分结果偏大。 - 宇宙学常数项错误:总密度参数需满足
omega_m + omega_r + omega_lambda = 1,因此宇宙学常数项应为1 - omega_m - omega_r,而非1 - omega_m。
修正后的代码
import numpy as np from scipy.integrate import quad # 常数定义 H0 = 70 # km/s/Mpc c = 3e5 # km/s omega_b = 0.04 omega_dm = 0.26 h = H0 / 100 omega_gamma = 2.469e-5 / (h**2) # 辐射密度参数 omega_m = omega_b + omega_dm omega_lambda = 1 - omega_m - omega_gamma # 修正后的宇宙学常数项 def Hubble(a): # 包含辐射、物质、宇宙学常数的完整Hubble参数 return H0 * np.sqrt(omega_gamma/(a**4) + omega_m/(a**3) + omega_lambda) def aintegrand(a): k1 = (a**2) * Hubble(a) k2 = (3 * omega_b) / (4 * omega_gamma) # 声速c_s = c / sqrt(3*(1 + k2*a)),积分项为c_s/(a²H(a)) return 1 / (k1 * np.sqrt(1 + k2*a)) def comov1(z): a_end = 1 / (1 + z) integral, _ = quad(aintegrand, 0, a_end) return c * integral / np.sqrt(3) # 测试z=1089的结果 print(comov1(1089)) # 输出约140 Mpc,符合预期
验证说明
修正后,Hubble(a)函数完整描述了各演化阶段的宇宙膨胀速率,计算z=1089时共动声视界结果约为140 Mpc,与预期一致。后续结合emcee进行参数估算时,只需将常数替换为待拟合参数即可。
内容的提问来源于stack exchange,提问作者Sreerag Radhakrishnan
相关产品推荐
相关产品推荐

