Solo para agregar algunas ideas adicionales que pueden ayudar a otros con problemas de tipo de dominio irregular. Para una situación en la que el usuario tiene tres vectores / listas, x, y, z que representan una solución 2D donde z debe trazarse en una cuadrícula rectangular como una superficie, los comentarios 'plot_trisurf ()' de ArtifixR son aplicables. Un ejemplo similar pero con dominio no rectangular es:
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()
El código anterior produce:
Sin embargo, es posible que esto no resuelva todos los problemas, en particular cuando el problema se define en un dominio irregular. Además, en el caso de que el dominio tenga una o más áreas cóncavas, la triangulación delaunay puede resultar en la generación de triángulos espurios en el exterior del dominio. En tales casos, estos triángulos rebeldes deben eliminarse de la triangulación para lograr la representación de superficie correcta. Para estas situaciones, el usuario puede tener que incluir explícitamente el cálculo de triangulación delaunay para que estos triángulos se puedan eliminar mediante programación. En estas circunstancias, el siguiente código podría reemplazar el código de trazado anterior:
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()
A continuación se muestran gráficos de ejemplo que ilustran la solución 1) con triángulos falsos y 2) donde se han eliminado:
Espero que lo anterior pueda ser de ayuda para las personas con situaciones de concavidad en los datos de la solución.