J'aimerais ajouter quelques réflexions supplémentaires qui pourraient aider d'autres personnes confrontées à des problèmes de type domaine irrégulier. Pour une situation où l'utilisateur a 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()' d'ArtifixR sont applicables. Un exemple similaire, mais avec un domaine non rectangulaire, est le suivant :
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 ne résout pas tous les problèmes, notamment lorsque le problème est défini sur un domaine irrégulier. De plus, dans le cas où le domaine présente une ou plusieurs zones concaves, la triangulation delaunay peut générer des triangles parasites extérieurs au domaine. Dans de tels cas, ces triangles erronés doivent être supprimés de la triangulation afin d'obtenir une représentation correcte de la surface. Pour ces situations, l'utilisateur peut avoir à inclure explicitement le calcul de la triangulation delaunay afin que ces triangles puissent être supprimés de manière programmatique. 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 tracés 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 pourra être utile aux personnes confrontées à des situations de concavité dans les données de solution.
10 votes
Voici quelques postes connexes/similaires/dupliqués : stackoverflow.com/q/3012783/3585557 , stackoverflow.com/q/12423601/3585557 , stackoverflow.com/q/21161884/3585557 , stackoverflow.com/q/26074542/3585557 , stackoverflow.com/q/28389606/3585557 , stackoverflow.com/q/29547687/3585557 .
0 votes
S'il vous plaît, commencez à étiqueter tous ces doublons surface et de fermer les doublons les uns dans les autres. Étiquette également numpy , maille pour celles qui concernent la génération de grilles de maillage.