Astropy Cosmology:粒子视界绘图异常及事件视界添加方法
问题解决:Astropy视界绘图修正与事件视界添加
问题说明
使用astropy.cosmology库复现视界图时,粒子视界曲线出现倒置,同时需要添加事件视界(event horizon),当前代码生成的粒子视界不符合预期,需修正并补充事件视界的绘制逻辑。
问题分析与修正
粒子视界倒置原因
你当前直接使用cosmo.comoving_distance(z)作为粒子视界是错误的:
- 粒子视界的正确定义是从宇宙诞生到z时刻,光所能传播的最大共动距离,Astropy内置了
cosmo.particle_horizon(z)方法可直接计算该值。 - 绘图需要的是固有距离(proper distance),需将共动粒子视界乘以尺度因子
a(z) = 1/(1+z)(或调用cosmo.scale_factor(z))。 - 原代码的红移顺序是从0到1089(对应时间从现在到宇宙早期),但粒子视界随时间演化是从0逐渐增大到当前值,错误的计算逻辑导致了曲线倒置。
添加事件视界
事件视界是当前时刻发出的光所能到达的最大未来共动距离,Astropy内置cosmo.event_horizon(z)方法,同样转换为固有距离后即可绘制。
修正后完整代码
from astropy.cosmology import Planck18 from astropy import units as u import numpy as np from matplotlib import pyplot as plt import astropy.constants as cc def hubble_radius(z): c = cc.c return (c / Planck18.H(z)).to(u.Glyr) # 定义宇宙学模型 cosmo = Planck18 # 生成红移数组:从宇宙早期到现在(z从1089到0),对应时间从诞生到当前 redshift = np.arange(1089, 0, -0.1) time = cosmo.age(redshift) # 计算各视界的固有距离 hubble_radius_vals = [hubble_radius(z).value for z in redshift] # 光程:z时刻到现在的固有距离(共动距离乘以当前尺度因子a=1) light_path = cosmo.comoving_distance(redshift).to(u.Glyr).value # 粒子视界:固有距离 = 共动粒子视界 * 尺度因子a(z) particle_horizon = (cosmo.particle_horizon(redshift) * cosmo.scale_factor(redshift)).to(u.Glyr).value # 事件视界:固有距离 = 共动事件视界 * 尺度因子a(z) event_horizon = (cosmo.event_horizon(redshift) * cosmo.scale_factor(redshift)).to(u.Glyr).value # 绘图 fig, ax1 = plt.subplots(figsize=(10,6)) ax1.plot(time, hubble_radius_vals, 'g-', label='Hubble radius') ax1.plot(time, light_path, 'y-', label='Light path') ax1.plot(time, particle_horizon, 'b-', label='Particle horizon') ax1.plot(time, event_horizon, 'r--', label='Event horizon') ax1.invert_xaxis() # 时间轴从现在向左延伸到宇宙早期 ax1.legend(fontsize=12) ax1.set_xlabel('Time (Gyr)', fontsize=12) ax1.set_ylabel('Proper distance (Glyr)', fontsize=12) ax1.grid(True, alpha=0.3) plt.show()
关键修改点
- 改用Astropy内置的
particle_horizon()和event_horizon()方法,避免手动计算的逻辑错误。 - 调整红移数组顺序为从1089到0,让时间轴从宇宙早期到现在,贴合视界演化的直观规律。
- 统一将所有视界值转换为固有距离,与目标图的坐标轴定义完全匹配。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

