绘制二元函数时出现'Mul'对象无'ndim'属性报错的问题求助
报错原因分析
报错核心是符号运算对象与数值运算数组混用,具体问题如下:
- 你最开始通过
sp.symbols将r、P定义为了SymPy符号变量,后续虽然给它们重新赋值了numpy数值数组,但自定义函数f里使用的是SymPy的sp.exp符号运算函数,传入numpy数组后返回的是SymPy的Mul符号运算对象,不是matplotlib绘图要求的numpy数值数组,因此不存在ndim属性。 - 你当前的场景只有数值计算和绘图需求,完全不需要引入SymPy做符号运算,属于不必要的依赖引入。
关键修改点
- 移除了不必要的SymPy依赖和符号变量定义
- 将函数内的
sp.exp替换为np.exp,适配numpy数组的批量数值运算 - 将
n、K的计算移到P赋值为数值数组之后,确保输出的是数值结果而非符号表达式
修复后可直接运行的代码
import math import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm # 导入颜色映射工具 Kb = 1.38*10**(-23) # 玻尔兹曼常数 T = 293 # 室温(开尔文) I = 304.4 sigma = 7.63*10**(-18) def f(r, P): # 替换为numpy的指数函数适配数组运算 return 304.4 * np.exp((r * 293 * 1.38 * 10**(-23)) / (P * 7.63 * 10**(-18))) r = np.linspace(1, 11, 50) # 取值范围1cm到11cm P = np.linspace(133.322, 66661.2, 100) # 取值范围1Torr到500Torr # 数值计算n、K,放在P赋值为数值之后 n = (P/(Kb * T)) print('n: ', n) print('pi: ', math.pi) K = (1/(n*sigma)) print('K: ', K) X, Y = np.meshgrid(r, P) # 生成网格坐标 Z = f(X, Y) # 此时返回二维numpy数组,符合绘图要求 fig = plt.figure() ax = plt.axes(projection = "3d") ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = "jet", edgecolor = "none") plt.xlabel('r') plt.ylabel('P') ax.set_title("surface") plt.show()
内容的提问来源于stack exchange,提问作者Keyli
相关产品推荐
相关产品推荐

