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

SymPy多变量表达式绘图报错求助:解决TypeError问题

问题分析与解决方案

错误原因拆解

  1. plt.plot(Rho, T)报错:matplotlib的plot需要数值数组,但Rho和T是SymPy符号表达式,无法直接转成浮点数,必须先把符号表达式转成可计算的数值函数。
  2. plot_implicit(T, Rho)报错:SymPy的plot_implicit要求传入等式/不等式(比如Eq(Rho, T)),不是单独传两个变量;另外表达式里的X、Z是未赋值的自由变量,不赋值无法绘图。

修正后的完整代码

import matplotlib.pyplot as plt
from sympy import init_session, Eq, simplify, lambdify
import numpy as np

# 初始化SymPy会话
init_session()

# 定义所有符号变量
rho, X, Y, Z, T_9, T, T_8, m, n, Gamma = symbols('rho X Y Z T_9 T T_8 m n Gamma')

# 定义pp链和CNO循环的反应率
q_pp = (2.4 * 10**4 * rho * X**2 / T_9**(2/3)) * exp(-3.380 / T_9**(1/3))
q_CNO = (4.4 * 10**25 * rho * X * Z / T_9**(2/3)) * exp(-15.228 / T_9**(1/3))
q_min = q_pp + q_CNO

# 替换T_9为T的表达式(用subs避免覆盖符号变量)
T_9_expr = T / 10**9
Rho = (10**3 * (T_9_expr**(1/3) / (24000 * X * exp(15.228 / T_9_expr**(1/3)) + 4.4*10**25 * Z * exp(3.38 / T_9_expr**(1/3)))) * exp(-18.608 / T_9_expr**(1/3)))
Rho_simplified = simplify(Rho)

# 为自由变量赋值(示例用太阳的元素丰度:X=0.7, Z=0.02)
X_val = 0.7
Z_val = 0.02
Rho_numeric = Rho_simplified.subs({X: X_val, Z: Z_val})

# ------------------------------
# 方法1:用matplotlib绘制数值曲线(推荐,适合显式函数)
# ------------------------------
# 将符号表达式转成numpy可计算的函数
rho_func = lambdify(T, Rho_numeric, 'numpy')

# 生成温度数值范围(单位:K,对数刻度覆盖天体物理常用区间)
T_vals = np.logspace(8, 10, 1000)
rho_vals = rho_func(T_vals)

# 绘图
plt.figure(figsize=(10,6))
plt.loglog(T_vals, rho_vals)
plt.xlabel('温度 T (K)')
plt.ylabel('密度 Rho (g/cm³)')
plt.title('pp链+CNO循环的温度-密度关系')
plt.grid(True, which='both', linestyle='--')
plt.show()

# ------------------------------
# 方法2:用SymPy的plot_implicit绘制隐式曲线
# ------------------------------
# 因Rho和T量级差极大,先缩放T便于展示
T_scaled = T / 1e9
plot_implicit(Eq(Rho_numeric, 1e-6 * T_scaled), 
              (T, 1e8, 1e10), (rho, 1e-8, 1e-2),
              xlabel='T (K)', ylabel='Rho (g/cm³)',
              title='温度-密度隐式关系')

关键注意事项

  • 符号转数值:必须用lambdify把SymPy表达式转成数值函数,或者用subs逐个赋值,才能给matplotlib用。
  • 自由变量处理:X、Z这类参数必须先赋值,否则表达式存在未定义符号,无法计算。
  • plot_implicit用法:必须传入等式(如Eq(a, b))或不等式,还要指定变量的取值范围,不然会报错或显示异常。
  • 刻度选择:天体物理的温度、密度跨度极大,用对数刻度(loglog)能更清晰展示关系。

内容的提问来源于stack exchange,提问作者Casper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:20:51