Python绘制3D动量平面报错:ValueError: Argument Z must be 2-dimensional
解决Matplotlib 3D绘图中Z必须为二维数组的错误
错误原因
你遇到的ValueError: Argument Z must be 2-dimensional是因为:
plot_surface要求Z参数必须是和X、Y维度完全匹配的二维数组(X和Y由meshgrid生成,形状为(len(m), len(H_1)))- 你的代码中,每次外层循环(遍历质量m的元素)都会将
M重置为一维数组np.zeros(len(H_1)),最终M仅保留了最后一个质量对应的力矩数据,是一维数组,无法和二维的X、Y匹配。 - 另外内层循环误用了和外层相同的变量名
i,会导致外层循环的索引被覆盖,逻辑出错。
修正后的循环版本代码
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits import mplot3d g = 9.81 m = np.linspace(0, 1, 301) H_1 = np.arange(100, 401, 1) # 初始化二维数组,行数对应质量数量,列数对应高度数量 M = np.zeros((len(m), len(H_1))) for i, kg in enumerate(m): Fg = -kg * g # 内层循环改用j作为索引,避免和外层i冲突 for j, h in enumerate(H_1): F1 = np.array([0, Fg]) theta = np.arctan(200 / h) F2 = np.array([Fg * np.sin(theta), Fg * np.cos(theta)]) Fres = F1 + F2 M_arm = np.array([0, h]) # 为二维数组的(i,j)位置赋值,对应第i个质量、第j个高度的力矩 M[i, j] = np.cross(M_arm, Fres) / 10e3 x, y = np.meshgrid(H_1, m) z = M fig = plt.figure() ax = fig.add_subplot(projection='3d') ax.plot_surface(x, y, z) ax.set_xlabel('hoogte toren in (mm)') ax.set_ylabel('massa') ax.set_zlabel('momentum') plt.show()
优化的向量化版本(推荐)
利用Numpy的广播机制替代嵌套循环,计算效率更高:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits import mplot3d g = 9.81 m = np.linspace(0, 1, 301) H_1 = np.arange(100, 401, 1) # 生成二维网格,indexing='ij'保证m对应行、H对应列,匹配后续计算维度 m_mesh, H_mesh = np.meshgrid(m, H_1, indexing='ij') Fg = -m_mesh * g theta = np.arctan(200 / H_mesh) # 向量化计算合力分量 F1_x = np.zeros_like(Fg) F1_y = Fg F2_x = Fg * np.sin(theta) F2_y = Fg * np.cos(theta) Fres_x = F1_x + F2_x Fres_y = F1_y + F2_y # 二维叉乘简化计算:M_arm=(0, H_mesh),叉乘结果为0*Fres_y - H_mesh*Fres_x M = (-H_mesh * Fres_x) / 10e3 x, y = np.meshgrid(H_1, m) fig = plt.figure() ax = fig.add_subplot(projection='3d') ax.plot_surface(x, y, M) ax.set_xlabel('hoogte toren in (mm)') ax.set_ylabel('massa') ax.set_zlabel('momentum') plt.show()
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

