Juste pour ajouter quelques réflexions supplémentaires qui peuvent aider les autres avec des problèmes de type de domaine irrégulier. Pour une situation où l'utilisateur dispose de trois vecteurs / listes, x, y, z représentant une solution 2D où z doit être tracé sur une grille rectangulaire comme une surface, les commentaires 'plot_trisurf ()' par ArtifixR sont applicables. Un exemple similaire mais avec un domaine non rectangulaire est:
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
# problem parameters
nu = 50; nv = 50
u = np.linspace(0, 2*np.pi, nu,)
v = np.linspace(0, np.pi, nv,)
xx = np.zeros((nu,nv),dtype='d')
yy = np.zeros((nu,nv),dtype='d')
zz = np.zeros((nu,nv),dtype='d')
# populate x,y,z arrays
for i in range(nu):
for j in range(nv):
xx[i,j] = np.sin(v[j])*np.cos(u[i])
yy[i,j] = np.sin(v[j])*np.sin(u[i])
zz[i,j] = np.exp(-4*(xx[i,j]**2 + yy[i,j]**2)) # bell curve
# convert arrays to vectors
x = xx.flatten()
y = yy.flatten()
z = zz.flatten()
# Plot solution surface
fig = plt.figure(figsize=(6,6))
ax = Axes3D(fig)
ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0,
antialiased=False)
ax.set_title(r'trisurf example',fontsize=16, color='k')
ax.view_init(60, 35)
fig.tight_layout()
plt.show()
Le code ci-dessus produit:
Cependant, cela peut ne pas résoudre tous les problèmes, en particulier lorsque le problème est défini sur un domaine irrégulier. De même, dans le cas où le domaine a une ou plusieurs zones concaves, la triangulation de delaunay peut conduire à générer des triangles parasites extérieurs au domaine. Dans de tels cas, ces triangles non fiables doivent être supprimés de la triangulation afin d'obtenir la représentation de surface correcte. Pour ces situations, l'utilisateur peut avoir à inclure explicitement le calcul de triangulation de delaunay afin que ces triangles puissent être supprimés par programme. Dans ces circonstances, le code suivant pourrait remplacer le code de tracé précédent:
import matplotlib.tri as mtri
import scipy.spatial
# plot final solution
pts = np.vstack([x, y]).T
tess = scipy.spatial.Delaunay(pts) # tessilation
# Create the matplotlib Triangulation object
xx = tess.points[:, 0]
yy = tess.points[:, 1]
tri = tess.vertices # or tess.simplices depending on scipy version
#############################################################
# NOTE: If 2D domain has concave properties one has to
# remove delaunay triangles that are exterior to the domain.
# This operation is problem specific!
# For simple situations create a polygon of the
# domain from boundary nodes and identify triangles
# in 'tri' outside the polygon. Then delete them from
# 'tri'.
# <ADD THE CODE HERE>
#############################################################
triDat = mtri.Triangulation(x=pts[:, 0], y=pts[:, 1], triangles=tri)
# Plot solution surface
fig = plt.figure(figsize=(6,6))
ax = fig.gca(projection='3d')
ax.plot_trisurf(triDat, z, linewidth=0, edgecolor='none',
antialiased=False, cmap=cm.jet)
ax.set_title(r'trisurf with delaunay triangulation',
fontsize=16, color='k')
plt.show()
Des exemples de graphiques sont donnés ci-dessous, illustrant la solution 1) avec des triangles parasites, et 2) où ils ont été supprimés:
J'espère que ce qui précède peut être utile aux personnes présentant des situations de concavité dans les données de la solution.