二元函数Lambdify后绘制3D曲面失败,报'int'无'ndim'属性错误
问题解决:'int' object has no attribute 'ndim' 错误修复
错误原因
- 使用
sympy.vector.CoordSys3D生成的坐标标量x,y属于CoordinateSymbol特殊类型,sp.lambdify无法将其正确转换为支持numpy数组输入的函数,最终返回单个int值而非二维数组,触发plot_surface的维度错误。 - 额外问题:代码未导入
sympy.vector模块,sv会未定义,实际运行时需补充导入,但核心错误为坐标标量类型不兼容。
修正代码
import sympy as sp import numpy as np import matplotlib.pyplot as plt %matplotlib notebook # 用普通SymPy符号替代坐标系标量 x, y, t = sp.symbols("x y t") f = sp.sin(2*sp.pi*t)*sp.exp(-(x-3*sp.sin(sp.pi*t))**2 -(y-3*sp.cos(sp.pi*t))**2) fig = plt.figure(figsize=(6, 6)) ax = fig.add_subplot(projection='3d') X = np.linspace(-5,5,100) Y = np.linspace(-5,5,100) xvals, yvals = np.meshgrid(X,Y) zvals = sp.lambdify((x,y), f.subs(t, 1), "numpy")(xvals, yvals) ax.plot_surface(xvals, yvals, zvals) plt.show()
额外说明
当t=1时,sin(2*sp.pi*1)=0,函数值恒为0,最终会绘制一个平面。若想查看非零曲面,可替换t为其他值,比如t=0.25,此时函数会呈现一个高斯峰值曲面。
内容的提问来源于stack exchange,提问作者joshuasinner
相关产品推荐
相关产品推荐

