Nur um einige weitere Gedanken hinzuzufügen, die anderen bei Problemen mit unregelmäßigen Domänentypen helfen können. Für eine Situation, in der der Benutzer drei Vektoren / Listen hat, x, y, z, die eine 2D-Lösung darstellen, bei der z als Oberfläche auf einem rechteckigen Gitter dargestellt werden soll, gelten die Kommentare von 'plot_trisurf ()' von ArtifixR. Ein ähnliches Beispiel, jedoch mit nicht rechteckiger Domäne, ist:
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()
Der obige Code erzeugt:
Dies löst jedoch möglicherweise nicht alle Probleme, insbesondere wenn das Problem in einer unregelmäßigen Domäne definiert ist. In dem Fall, in dem die Domäne einen oder mehrere konkave Bereiche aufweist, kann die Delaunay-Triangulation dazu führen, dass außerhalb der Domäne falsche Dreiecke erzeugt werden. In solchen Fällen müssen diese Schurkendreiecke aus der Triangulation entfernt werden, um die korrekte Oberflächendarstellung zu erreichen. In diesen Situationen muss der Benutzer möglicherweise die Delaunay-Triangulationsberechnung explizit einbeziehen, damit diese Dreiecke programmgesteuert entfernt werden können. Unter diesen Umständen könnte der folgende Code den vorherigen Plotcode ersetzen:
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()
Die nachstehenden Beispieldiagramme veranschaulichen die Lösung 1) mit falschen Dreiecken und 2) wo sie entfernt wurden:
Ich hoffe, dass das oben Genannte für Personen mit Konkavitätssituationen in den Lösungsdaten hilfreich sein kann.