SymPy多变量表达式绘图报错求助:解决TypeError问题
问题分析与解决方案
错误原因拆解
plt.plot(Rho, T)报错:matplotlib的plot需要数值数组,但Rho和T是SymPy符号表达式,无法直接转成浮点数,必须先把符号表达式转成可计算的数值函数。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
相关产品推荐
相关产品推荐

