2017-04-15 74 views
1

绘制的作用下: (X1 - 3)^ 2 +(X2 - 2)^ 2matplotlib,如何绘制3D 2可变功能的给定条件

随着约束:

  • X1^2 - ×2 - 3 < = 0
  • X2 - 1 < = 0
  • -x1 < = 0

该方程式也可以找到here

我试图解决这个图形使用matplotlib

graph missing the first condition

但使用其中缺少第一条件下面的代码(the question i found that helped me with the code)结束了与上述曲线图。

import matplotlib.pyplot as plt 
from numpy import arange 
from pylab import meshgrid 

# function to be plotted 
def z_func(a, b): 
    return (a - 3) * (a - 3) + (b - 2) * (b - 2) 

x1 = arange(15.0, 0, -0.1) # x1 >= 0 according to given conditions 
x2 = arange(-15.0, 1, 0.1) # x2 <= 1 according to given conditions 
X1,X2 = meshgrid(x1, x2) 
Z = z_func(X1, X2) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X1, X2, Z, rstride=1, cstride=1, cmap=cm.RdBu,linewidth=0, antialiased=False) 

ax.zaxis.set_major_locator(LinearLocator(10)) 
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 

ax.set_xlabel('x-axis') 
ax.set_ylabel('y-axis') 
ax.set_zlabel('z-axis') 
ax.view_init(elev=25, azim=-120) 

fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.show()   

以哪种方式修改上述代码以考虑第一个条件?

感谢

回答

1

可以过滤数组中的情节和设置条件以外的所有值nan

Z[X1**2 - X2 - 3 > 0] = np.nan 

enter image description here

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d.axes3d import Axes3D 
import numpy as np 
from pylab import meshgrid 

# function to be plotted 
def z_func(a, b): 
    return (a - 3) * (a - 3) + (b - 2) * (b - 2) 

x1 = np.arange(15.0, 0, -0.1) # x1 >= 0 according to given conditions 
x2 = np.arange(-15.0, 1, 0.1) # x2 <= 1 according to given conditions 
X1,X2 = meshgrid(x1, x2) 
Z = z_func(X1, X2) 
# set all values outside condition to nan 
Z[X1**2 - X2 - 3 > 0] = np.nan 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X1, X2, Z, rstride=1, cstride=1,vmin=0, vmax=np.nanmax(Z), 
         cmap=plt.cm.RdBu,linewidth=0, antialiased=False) 

ax.set_xlabel('x-axis') 
ax.set_ylabel('y-axis') 
ax.set_zlabel('z-axis') 
ax.view_init(elev=25, azim=-120) 
ax.set_ylim(0,4) 
fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.show()