Python中np.meshgrid转复数变量及传递函数3D绘图报错解决
解决方案:传递函数3D幅值曲面图Python实现及错误修复
错误原因分析
- NameError: name 'Yj' is not defined:是因为你没正确定义复变量的虚部,用
s = X + 1j * Y的方式是正确的,直接把实数网格转换成复数数组即可。 - TypeError: Cannot convert expression to float:大概率是两种情况导致:
- 混合了sympy符号变量和numpy数值数组,类型不兼容;
- 部分版本的
np.polyval对二维复数数组的处理存在兼容问题。
修复方案及代码示例
方案一:纯numpy数值计算(推荐,无类型冲突)
直接用numpy的数组运算计算传递函数,避免依赖np.polyval的潜在问题:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 生成实部、虚部的网格范围 x_real = np.linspace(-10, 10, 100) x_imag = np.linspace(-10, 10, 100) X, Y = np.meshgrid(x_real, x_imag) # 定义复变量s s = X + 1j * Y # 定义传递函数的分子和分母(示例:G(s) = (s²+2)/(s²+3s+2)) num = s**2 + 2 den = s**2 + 3*s + 2 # 计算幅值 mag = np.abs(num / den) # 绘制3D曲面图 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, mag, cmap='viridis') ax.set_xlabel('Real Part') ax.set_ylabel('Imaginary Part') ax.set_zlabel('Magnitude') ax.set_title('3D Magnitude Surface of Transfer Function') plt.show()
如果你的传递函数是高阶多项式,也可以用np.polyval,但要确保输入是纯numpy复数数组:
# 替换分子分母的计算部分 num_coeff = [1, 0, 2] # 系数按最高次到最低次排列:s²+0s+2 den_coeff = [1, 3, 2] # s²+3s+2 num_val = np.polyval(num_coeff, s) den_val = np.polyval(den_coeff, s) mag = np.abs(num_val / den_val)
方案二:用sympy定义传递函数后转数值计算
如果习惯用符号运算定义传递函数,需要用sp.lambdify将符号函数转换为numpy可调用的函数,避免类型冲突:
import numpy as np import sympy as sp import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 用sympy定义传递函数 s_sym = sp.symbols('s') num_sym = s_sym**2 + 2 den_sym = s_sym**2 + 3*s_sym + 2 G_sym = num_sym / den_sym # 转换为numpy兼容的函数 G_func = sp.lambdify(s_sym, G_sym, 'numpy') # 生成网格并计算幅值 x_real = np.linspace(-10, 10, 100) x_imag = np.linspace(-10, 10, 100) X, Y = np.meshgrid(x_real, x_imag) s = X + 1j * Y mag = np.abs(G_func(s)) # 绘图(同方案一) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, mag, cmap='viridis') ax.set_xlabel('Real Part') ax.set_ylabel('Imaginary Part') ax.set_zlabel('Magnitude') ax.set_title('3D Magnitude Surface of Transfer Function') plt.show()
内容的提问来源于stack exchange,提问作者Sildek
相关产品推荐
相关产品推荐

