You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3求解弗里德曼方程代码报错求助:参数不匹配TypeError

修复弗里德曼方程数值积分的TypeError错误

错误原因分析

  • scipy.integrate.quad要求被积分函数的第一个参数必须是积分变量,你的integrand函数参数顺序颠倒,还引用了外部循环变量a,同时函数末尾多余的逗号导致返回元组,这些是报错的核心原因。
  • 调用quad时,它会自动将积分区间的变量作为第一个参数传给integrand,再加上args里的两个宇宙学参数,总共传递3个参数,但你的函数只定义了2个参数,因此触发TypeError。

修复步骤

  1. 调整被积分函数的参数顺序:将积分变量作为第一个参数,宇宙学参数放在后面,移除函数末尾的多余逗号。
  2. 替换函数内的外部变量:用积分变量(如x)代替循环变量a,避免变量作用域错误。
  3. 修正弗里德曼方程的物理逻辑:补充遗漏的曲率参数项,调整积分结果与哈勃参数的对应关系。
  4. 修正坐标轴标签:按照物理意义调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:45:18