Python3求解弗里德曼方程代码报错求助:参数不匹配TypeError
修复弗里德曼方程数值积分的TypeError错误
错误原因分析
scipy.integrate.quad要求被积分函数的第一个参数必须是积分变量,你的integrand函数参数顺序颠倒,还引用了外部循环变量a,同时函数末尾多余的逗号导致返回元组,这些是报错的核心原因。- 调用
quad时,它会自动将积分区间的变量作为第一个参数传给integrand,再加上args里的两个宇宙学参数,总共传递3个参数,但你的函数只定义了2个参数,因此触发TypeError。
修复步骤
- 调整被积分函数的参数顺序:将积分变量作为第一个参数,宇宙学参数放在后面,移除函数末尾的多余逗号。
- 替换函数内的外部变量:用积分变量(如
x)代替循环变量a,避免变量作用域错误。 - 修正弗里德曼方程的物理逻辑:补充遗漏的曲率参数项,调整积分结果与哈勃参数的对应关系。
- 修正坐标轴标签:按照物理意义调整x/y轴,尺度因子演化图应为
a(t)随时间变化。
修复后的完整代码
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import quad # Constants H0 = 70.0 # Hubble constant in km/s/Mpc Omega_r0 = 0.0 # Radiation density parameter (ignored) # 修正后的被积分函数:第一个参数为积分变量x,后续为宇宙学参数 def integrand(x, Omega_m0, Omega_lambda0): Omega_k0 = 1 - Omega_m0 - Omega_lambda0 # 曲率参数 # 对应dt/da = 1/(a*H(a)),积分得到H0*(t-t0) return 1.0 / (x * np.sqrt(Omega_m0 / x + Omega_lambda0 * x**2 + Omega_k0)) # 修正后的弗里德曼方程求解函数 def solve_friedmann(Omega_m0, Omega_lambda0): a_values = np.linspace(0.01, 10, 1000) t_values = [] for a in a_values: # 积分下限设为0.01避免除以0的数值错误 result, _ = quad(integrand, 0.01, a, args=(Omega_m0, Omega_lambda0)) t_values.append(result) # 计算哈勃参数H(a) Omega_k0 = 1 - Omega_m0 - Omega_lambda0 H_values = H0 / np.sqrt(Omega_m0 / a_values + Omega_lambda0 * a_values**2 + Omega_k0) return a_values, t_values, H_values # 定义Ω_M0和Ω_Λ0配对(一一对应,避免9组重复) Omega_pairs = [(0.3, 0.7), (0.5, 0.5), (0.7, 0.3)] # 绘制尺度因子随时间演化图 plt.figure(figsize=(10, 6)) for Omega_M0, Omega_Lambda0 in Omega_pairs: a_values, t_values, H_values = solve_friedmann(Omega_M0, Omega_Lambda0) plt.plot(t_values, a_values, label=f"Ω_M0={Omega_M0}, Ω_Λ0={Omega_Lambda0}") plt.xlabel('H₀(t - t₀)') plt.ylabel('尺度因子a(t)') plt.title('不同Ω_M0和Ω_Λ0下的尺度因子演化') plt.legend() plt.grid(True) plt.show() # 可选:绘制哈勃参数随尺度因子的变化 plt.figure(figsize=(10, 6)) for Omega_M0, Omega_Lambda0 in Omega_pairs: a_values, t_values, H_values = solve_friedmann(Omega_M0, Omega_Lambda0) plt.plot(a_values, H_values, label=f"Ω_M0={Omega_M0}, Ω_Λ0={Omega_Lambda0}") plt.xlabel('尺度因子a') plt.ylabel('哈勃参数H(a) (km/s/Mpc)') plt.title('不同Ω_M0和Ω_Λ0下的哈勃参数演化') plt.legend() plt.grid(True) plt.show()
关键修正点说明
- 参数顺序:
quad强制将积分变量作为第一个参数传入,因此必须将积分变量x放在integrand的参数首位,宇宙学参数通过args传递。 - 物理公式修正:补充了曲率参数$\Omega_{k0}=1-\Omega_{M0}-\Omega_{\Lambda0}$,符合弗里德曼方程的完整形式。
- 数值稳定性:积分下限设为0.01,避免积分变量为0时出现除以0的错误。
- 逻辑优化:将Ω参数改为一一配对,避免绘制9组重复曲线,符合实际物理对比需求。
内容的提问来源于stack exchange,提问作者Shakeila
相关产品推荐
相关产品推荐

