代码报错TypeError:integrand()需3个位置参数却传入4个的求助
解决弗里德曼方程积分时的TypeError及代码逻辑问题
错误原因分析
- TypeError根源:
scipy.integrate.quad会自动将积分变量作为第一个参数传递给被积函数,你在调用时错误地将积分上限a加入了args参数,导致被积函数integrand收到4个参数(积分变量+a+两个Omega参数),但函数定义只接受3个参数,触发报错。正确的args只需要传入Omega相关参数。 - 物理公式错误:弗里德曼方程的积分项中,平直宇宙项应为
1 - Omega_m0 - Omega_lambda0,你写成了1-(Omega_m0-Omega_lambda0),符号错误会导致计算结果不符合物理预期。 - 循环与函数逻辑混乱:
Omega_m0_values是单个数值,无法用于for循环迭代;绘图部分重复计算且错误调用函数,没有正确生成每个Omega组合对应的演化曲线数据。
修正后的完整代码
import numpy as np from scipy.integrate import quad import matplotlib.pyplot as plt # Constants H0 = 70.0 # Hubble constant in km/s/Mpc Omega_r0 = 0.0 # Radiation density parameter (ignored) t0 = 1 / H0 # Approximation for the age of the universe in billions of years # Define Omega_M0 and Omega_Lambda0 pairs Omega_m0_values = [0.31] # 改为列表,支持循环 Omega_lambda0_values = [-0.31, 0.69, 1.7289, 1.728] # 被积函数:积分变量是dummy_a(积分上限是a,这里用dummy_a避免命名冲突) def integrand(dummy_a, Omega_m0, Omega_lambda0): # 修正平直项的符号:1 - Omega_m0 - Omega_lambda0 return 1.0 / np.sqrt((Omega_m0 / dummy_a) + (Omega_lambda0 * dummy_a**2) + (1 - Omega_m0 - Omega_lambda0)) # 求解弗里德曼方程:给定Omega参数,计算一系列a对应的t值 def solve_friedmann(Omega_m0, Omega_lambda0, a_values): t_values = [] for a in a_values: # quad的args只传Omega参数,积分变量由quad自动传入 result, _ = quad(integrand, 0, a, args=(Omega_m0, Omega_lambda0)) t_values.append(result / H0) return np.array(t_values) # 生成尺度因子范围 a_values = np.linspace(0.1, 1.9, 100) # 绘图 plt.figure(figsize=(6, 6)) for Omega_m0 in Omega_m0_values: for Omega_lambda0 in Omega_lambda0_values: # 计算当前Omega组合对应的t值 t_values = solve_friedmann(Omega_m0, Omega_lambda0, a_values) # 计算H0(t - t0) x_values = H0 * (t_values - t0) # 绘制曲线 plt.plot(x_values, a_values, label=f"Ω_M0={Omega_m0}, Ω_Λ0={Omega_lambda0}") plt.xlabel('H₀(t-t₀)') plt.ylabel('a') plt.title('不同Ω_M0和Ω_Λ0组合下的尺度因子演化') plt.legend() plt.grid(True) plt.show()
额外说明
- 被积函数的积分变量改用
dummy_a,避免和积分上限的a混淆,提升代码可读性。 - 重构了
solve_friedmann函数,使其接收Omega参数和尺度因子数组,返回对应的时间数组,更符合绘图需求。 - 修正了循环逻辑,确保每个Omega组合都能生成对应的演化曲线。
内容的提问来源于stack exchange,提问作者Shakeila
相关产品推荐
相关产品推荐

