Hanya untuk menambahkan beberapa pemikiran lebih lanjut yang dapat membantu orang lain dengan masalah jenis domain tidak teratur. Untuk situasi di mana pengguna memiliki tiga vektor / daftar, x, y, z mewakili solusi 2D di mana z akan diplot pada kisi persegi panjang sebagai permukaan, komentar 'plot_trisurf ()' oleh ArtifixR dapat diterapkan. Contoh serupa tetapi dengan domain non persegi panjang adalah:
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()
Kode di atas menghasilkan:
Namun, ini mungkin tidak menyelesaikan semua masalah, khususnya di mana masalah didefinisikan pada domain tidak beraturan. Juga, dalam kasus di mana domain memiliki satu atau lebih area cekung, triangulasi penundaan dapat mengakibatkan munculnya segitiga palsu di luar domain. Dalam kasus seperti itu, segitiga nakal ini harus dihilangkan dari triangulasi untuk mencapai representasi permukaan yang benar. Untuk situasi ini, pengguna mungkin harus secara eksplisit menyertakan penghitungan triangulasi penundaan sehingga segitiga ini dapat dihapus secara terprogram. Dalam keadaan ini, kode berikut dapat menggantikan kode plot sebelumnya:
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()
Contoh plot diberikan di bawah ini menggambarkan solusi 1) dengan segitiga palsu, dan 2) di mana mereka telah dihilangkan:
Saya berharap hal di atas dapat membantu orang-orang dengan situasi cekung dalam data solusi.