เพียงเพื่อเพิ่มความคิดเพิ่มเติมซึ่งอาจช่วยผู้อื่นที่มีปัญหาประเภทโดเมนผิดปกติ สำหรับสถานการณ์ที่ผู้ใช้มีเวกเตอร์ / รายการสามรายการ x, y, z แสดงโซลูชัน 2 มิติโดยที่ z จะถูกพล็อตบนตารางสี่เหลี่ยมเป็นพื้นผิวความคิดเห็น 'plot_trisurf ()' โดย ArtifixR จะใช้ได้ ตัวอย่างที่คล้ายกัน แต่ไม่มีโดเมนสี่เหลี่ยมคือ:
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()
รหัสข้างต้นก่อให้เกิด:
อย่างไรก็ตามนี่อาจไม่สามารถแก้ปัญหาทั้งหมดได้โดยเฉพาะอย่างยิ่งเมื่อปัญหาถูกกำหนดบนโดเมนที่ผิดปกติ นอกจากนี้ในกรณีที่โดเมนมีพื้นที่เว้าตั้งแต่หนึ่งส่วนขึ้นไปการกำหนดรูปสามเหลี่ยมที่ล่าช้าอาจส่งผลให้เกิดรูปสามเหลี่ยมปลอมที่อยู่ภายนอกโดเมน ในกรณีเช่นนี้ต้องนำสามเหลี่ยมที่หลอกลวงเหล่านี้ออกจากรูปสามเหลี่ยมเพื่อให้ได้การแสดงพื้นผิวที่ถูกต้อง สำหรับสถานการณ์เหล่านี้ผู้ใช้อาจต้องรวมการคำนวณการกำหนดรูปสามเหลี่ยมเดลาวันอย่างชัดเจนเพื่อให้สามารถลบรูปสามเหลี่ยมเหล่านี้ได้โดยทางโปรแกรม ภายใต้สถานการณ์เหล่านี้รหัสต่อไปนี้สามารถแทนที่รหัสแปลงก่อนหน้า:
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()
ตัวอย่างแผนภาพแสดงไว้ด้านล่างวิธีการแก้ปัญหา 1) ที่มีสามเหลี่ยมปลอมและ 2) ที่ถูกลบออก:
ฉันหวังว่าข้อมูลข้างต้นอาจช่วยผู้ที่มีสถานการณ์ความเว้าในข้อมูลโซลูชันได้