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

Python中np.meshgrid转复数变量及传递函数3D绘图报错解决

解决方案:传递函数3D幅值曲面图Python实现及错误修复

错误原因分析

  1. NameError: name 'Yj' is not defined:是因为你没正确定义复变量的虚部,用s = X + 1j * Y的方式是正确的,直接把实数网格转换成复数数组即可。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:05:26