我必须绘制一个三维函数,它有无意义的负值(它们不应该出现在绘图中)。必须绘制的函数如下:
def constraint_function(x, y):
return min(
(1800 - 0.3 * x - 0.5 * y) / 0.4,
(500 - 0.1 * x - 0.08 * y) / 0.12,
(200 - 0.06 * x - 0.04 * y) / 0.05
)
我用以下方法计算函数:
^{pr2}$该函数的有效值大多在[0, 3600]x[0, 3600]
中。我采用的第一种方法是设置轴限制以满足我的需要:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.azim = 20
ax.set_xlim(0, 3500)
ax.set_ylim(0, 3500)
ax.set_zlim(0, 4500)
ax.plot_surface(xs, ys, zs)
plt.show()
结果如下图:
它只是忽略了限制,无论如何都在策划它。第二种方法是将负值定义为np.nan
,将函数改为:
def constraint_function(x, y):
temp = min(
(1800 - 0.3 * x - 0.5 * y) / 0.4,
(500 - 0.1 * x - 0.08 * y) / 0.12,
(200 - 0.06 * x - 0.04 * y) / 0.05
)
return temp if temp >= 0 else np.nan
将无效值的alpha设置为零:
plt.cm.jet.set_bad(alpha=0.0)
ax.azim = 20
ax.set_xlim(0, 3500)
ax.set_ylim(0, 3500)
ax.set_zlim(0, 4500)
ax.plot_surface(xs, ys, zs)
plt.show()
首先,z值数组轴是相反的;它应该是
zs[iy][ix]
而不是zs[ix][iy]
。正因为如此,你的情节被左右颠倒了。在其次,通过在Python中迭代构建z数组要慢得多;您应该委托给numpy,如下所示:
NumPy矢量化操作速度快很多倍。在
第三,你的代码没有什么特别的错误,只是采样分辨率太低;把它设置得更高
^{pr2}$生产
从技术上讲,你可以使网格倾斜,这样会导致zick-zack模式的网格点发生移动,从而使它们位于一条直线上。在
如下所示。在
现在的问题是将这种方法推广到任意曲面。当然有可能,但还需要一些工作。在
相关问题 更多 >
编程相关推荐