如何用Python基于二维矩阵绘制二元函数f(x₁,x₂)的3D图?
二元函数3D绘图的矩阵索引问题解决
你的代码报错是因为列表推导式里用了x1 in x1_axis and x2 in x2_axis——numpy数组无法直接通过and做布尔判断,会触发歧义错误;而且这种写法也没法生成二维的函数值矩阵,因为你需要的是x1和x2的所有组合对应的fun元素。
下面是两种可行的实现方法:
方法一:直接利用已有矩阵(推荐)
因为fun本身就是对应x1(行)、x2(列)的二维函数值矩阵,只需生成匹配的网格坐标即可绘图:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D x1_axis = np.arange(0, 10, 0.1) x2_axis = np.arange(0, 10, 0.1) # 生成网格矩阵,indexing='ij'确保行对应x1,列对应x2,和你的fun矩阵索引逻辑匹配 X1, X2 = np.meshgrid(x1_axis, x2_axis, indexing='ij') # 直接用fun矩阵绘图 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X1, X2, fun) plt.show()
indexing='ij'是关键参数,它保证生成的X1每行对应一个x1值,X2每列对应一个x2值,完全匹配你说的"x1对应矩阵行,x2对应矩阵列"的规则。
方法二:通过索引重新生成函数值矩阵(仅需手动生成时用)
如果必须手动遍历生成f矩阵,注意浮点数不能直接作为矩阵索引,要先转换成对应整数位置,同时用嵌套列表推导式实现双重循环:
import numpy as np x1_axis = np.arange(0, 10, 0.1) x2_axis = np.arange(0, 10, 0.1) # 把x1、x2的浮点值转成矩阵的整数索引(步长0.1,所以索引=值/0.1取整) f = [[fun[int(x1 / 0.1), int(x2 / 0.1)] for x2 in x2_axis] for x1 in x1_axis] f = np.array(f) # 后续绘图代码和方法一一致
内容的提问来源于stack exchange,提问作者ellekalle
相关产品推荐
相关产品推荐

