Python绘制含线性代数求解的二元函数3D图遇meshgrid问题求助
问题解决:meshgrid矩阵下的电磁学3D绘图适配
核心问题
你的CalcularTransformador函数仅支持标量输入,但meshgrid生成的是二维数组(矩阵形式),直接传入会导致阻抗矩阵Z的维度不匹配,无法完成线性方程组的求解,进而无法生成可绘图的结果。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 全局参数定义 R1 = 0.4 * 3.5 R2 = R1 L1 = 83e-6 L2 = L1 C1 = 0.47e-6 C2 = C1 Rc = 10 Vp = 2 / np.pi * 5 # 用numpy的pi适配数组运算 def CalcularTransformador(K, w): # 利用numpy广播计算电抗,支持二维数组输入 XL1 = 1j * w * L1 XL2 = 1j * w * L2 XC1 = (-1j) / (w * C1) XC2 = (-1j) / (w * C2) M = K * np.sqrt(L1 * L2) XM = 1j * w * M # 计算负载支路的等效阻抗 Z_load = (Rc * XC2) / (Rc + XC2) Z2 = XL2 + R2 + Z_load # 构造批量阻抗矩阵:形状为 (2,2,N,M),适配K和W的二维形状 Z = np.array([ [R1 + XL1 + XC1, -XM], [-XM, Z2] ]) # 构造电压向量:形状为 (2,N,M) V = np.array([Vp * np.ones_like(K), np.zeros_like(K)]) # 批量求解线性方程组 Ax = b,自动适配每个位置的2x2矩阵 i = np.linalg.solve(Z, V) # 计算V2,形状为(N,M) V2 = i[1] * Z2 return i[0], i[1], V2 # 生成网格数据 w_angular = np.linspace(150000, 260000, 100) # 减少点数提升速度,可按需调回1000 k = np.linspace(0, 1, 100) K, W = np.meshgrid(k, w_angular) # 获取计算结果 i0, i1, V2 = CalcularTransformador(K, W) # 绘图示例:绘制V2的幅值(复数需取模才能可视化) fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') surf = ax.plot_surface(K, W, np.abs(V2), cmap='RdBu', edgecolor='none') ax.set_xlabel('耦合系数k') ax.set_ylabel('角频率ω') ax.set_zlabel('输出电压幅值|V2|') ax.set_title('变压器输出电压随耦合系数和角频率的变化') plt.colorbar(surf, shrink=0.5, aspect=5) plt.show()
关键修改说明
- 替换标量运算为numpy广播:所有电抗计算改用numpy函数,自动适配
meshgrid生成的矩阵维度,无需手动循环处理每个元素。 - 批量线性方程组求解:使用
np.linalg.solve替代inv+dot,既高效稳定,又天然支持批量矩阵求解,适配二维网格的每个计算点。 - 复数结果可视化处理:返回的电流、电压均为复数,绘图时必须取幅值(
np.abs())、实部或虚部,因为plot_surface和imshow仅支持实数数组。 - 优化模块导入:移除冗余的模块导入,避免命名冲突,统一使用numpy的数学函数适配数组运算。
- 调整网格点数:默认将1000改为100以提升运行速度,若需要更高精度可改回原数值。
内容的提问来源于stack exchange,提问作者Gabriel Tumang
相关产品推荐
相关产品推荐

