Python绘制积分函数故障:修改z取值后图表无显示
光度距离计算代码无图表显示的问题修复
问题分析
- 标量绘图无法生成可见元素:你循环计算每个z对应的单个光度距离标量,而
plt.plot()绘制线条需要至少两个数据点,单个标量无法生成可见的图形,这是图表无显示的核心原因。 - numpy命名空间错误:代码开头导入
numpy as np,但H()函数里用了numpy.sqrt,应改为np.sqrt,否则会触发NameError(若未报错可能是环境全局导入了numpy,但属于不规范写法)。 - 单位不统一:光速用了
2.99e8 m/s,哈勃常数H0单位是km/s/Mpc,两者单位不匹配,计算出的距离单位混乱,需统一为km/s。 - 参数冗余传递:
H_inv()调用H()时重复传H_0=70,可利用函数默认参数简化。
修正后的代码
import numpy as np import matplotlib.pyplot as plt from scipy import integrate def H(z, omega_m, H_0=70): omega_lambda = 1 - omega_m z_prime = (1 + z) ** 3 wurzel = np.sqrt(omega_m * z_prime + omega_lambda) # 修正numpy命名空间 return H_0 * wurzel def H_inv(z, omega_m, H_0=70): return 1 / H(z, omega_m, H_0) # 去掉冗余参数指定 def integral(z, omega_m, H_0=70): return integrate.quad(H_inv, 0, z, args=(omega_m, H_0))[0] def d_L(z, omega_m, H_0=70): c = 299792 # 单位:km/s,与H0单位匹配 distance = c * (1 + z) * integral(z, omega_m, H_0) return distance z = [0.0, 0.1, 0.5, 2.0, 4.0, 5.0] omega_m = 0.27 # 收集所有z对应的光度距离值 d_L_values = [d_L(zi, omega_m) for zi in z] plt.figure(figsize=(8, 5)) # 用散点图展示离散数据,添加连线增强可视化效果 plt.scatter(z, d_L_values, s=50, label="离散数据点") plt.plot(z, d_L_values, '-', alpha=0.7, label="数据连线") plt.xlabel("红移 z") plt.ylabel("光度距离 $d_L$ (Mpc)") plt.title("红移与光度距离关系") plt.legend() plt.grid(True, alpha=0.3) plt.show()
修正说明
- 先收集所有z对应的光度距离值,再用
plt.scatter()绘制离散点、plt.plot()绘制连线,确保图表正常显示。 - 修正numpy命名空间错误,避免潜在报错。
- 统一光速与哈勃常数单位,计算结果以天文领域常用的Mpc为单位。
- 简化函数参数传递,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者dove
相关产品推荐
相关产品推荐

