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

绘制二元函数时出现'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:00:04