Solo per aggiungere alcuni ulteriori pensieri che possono aiutare gli altri con problemi di tipo di dominio irregolare. Per una situazione in cui l'utente ha tre vettori / elenchi, x, y, z che rappresentano una soluzione 2D in cui z deve essere tracciato su una griglia rettangolare come superficie, sono applicabili i commenti 'plot_trisurf ()' di ArtifixR. Un esempio simile ma con dominio non rettangolare è:
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()
Il codice sopra produce:
Tuttavia, questo potrebbe non risolvere tutti i problemi, in particolare quando il problema è definito su un dominio irregolare. Inoltre, nel caso in cui il dominio abbia una o più aree concave, la triangolazione delaunay può provocare la generazione di triangoli spuri esterni al dominio. In questi casi, questi triangoli irregolari devono essere rimossi dalla triangolazione per ottenere la corretta rappresentazione della superficie. Per queste situazioni, l'utente potrebbe dover includere esplicitamente il calcolo della triangolazione delaunay in modo che questi triangoli possano essere rimossi a livello di programmazione. In queste circostanze, il codice seguente potrebbe sostituire il codice di trama precedente:
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()
Di seguito vengono forniti grafici di esempio che illustrano la soluzione 1) con triangoli spuri e 2) dove sono stati rimossi:
Spero che quanto sopra possa essere di aiuto alle persone con situazioni di concavità nei dati della soluzione.