Chỉ để thêm một số suy nghĩ có thể giúp những người khác có vấn đề về loại miền không đều. Đối với trường hợp người dùng có ba vectơ / danh sách, x, y, z đại diện cho giải pháp 2D trong đó z sẽ được vẽ trên một lưới hình chữ nhật làm bề mặt, các nhận xét 'plot_trisurf ()' của ArtifixR có thể áp dụng. Một ví dụ tương tự nhưng với miền không phải là hình chữ nhật là:
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()
Đoạn mã trên tạo ra:
Tuy nhiên, điều này có thể không giải quyết được tất cả các vấn đề, đặc biệt khi vấn đề được xác định trên một miền bất thường. Ngoài ra, trong trường hợp miền có một hoặc nhiều vùng lõm, tam giác sai lệch có thể tạo ra các tam giác giả bên ngoài miền. Trong những trường hợp như vậy, các hình tam giác giả này phải được loại bỏ khỏi hình tam giác để đạt được biểu diễn bề mặt chính xác. Đối với những tình huống này, người dùng có thể phải đưa vào tính toán tam giác sai lệch một cách rõ ràng để có thể loại bỏ các tam giác này theo chương trình. Trong những trường hợp này, mã sau có thể thay thế mã cốt truyện trước đó:
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()
Các biểu đồ ví dụ được đưa ra dưới đây minh họa giải pháp 1) với tam giác giả và 2) nơi chúng đã bị loại bỏ:
Tôi hy vọng những điều trên có thể giúp ích cho những người có tình huống khó hiểu trong dữ liệu giải pháp.