簡體   English   中英

使用matplotlib簡化三角剖分

[英]Streamlines on a triangulation with matplotlib

我在matplotlib中制作了一個三角剖分對象(在P矩陣中包含點坐標,在T矩陣中包含三角形節點,它們描述一個矩形減去一個孔),並在該節點處計算了一個稱為phi的標量字段三角剖分(使用應用於Poisson方程的有限元方法)。 使用這個三角剖分,我計算出了我感興趣的梯度。我繪制了這個矢量場的顫動圖,一切都很好,矢量不與孔相交。

但是,當我想通過streamplot函數繪制流線時,它們與孔相交,如下圖所示:

在此處輸入圖片說明

事實是,為了跟蹤流線,我必須為streamplot函數創建一個結構化的網格。 但是由於我的向量字段未在常規網格的節點上定義,因此我需要在這些節點上進行插值。 為此,我使用了griddata 問題在於,這樣做時,孔被規則網格覆蓋,因此矢量場在孔內部被定義,因此產生結果。 這是產生圖片的相關代碼:

def plot_streamlines(P, T, phi):
    triangulation = tr.Triangulation(P[:,0], P[:,1], T)
    interpolator = tr.CubicTriInterpolator(triangulation, phi)
    (u_x,u_y) = interpolator.gradient(triangulation.x, triangulation.y)
    grid_x, grid_y = np.mgrid[x_min:x_max:100j, y_min:y_max:100j]
    grid_u_x = ip.griddata(P, u_x, (grid_x,grid_y), method='cubic')
    grid_u_y = ip.griddata(P, u_y, (grid_x,grid_y), method='cubic')
    pl.streamplot(grid_x[:,0], grid_y[0,:], -grid_u_x.T, -grid_u_y.T)

我知道被遮罩的數組,但是沒有設法使用遮罩來獲得想要的結果。 我想創建一種蒙版的規則網格,然后在其上插值矢量字段,但是我沒有做到這一點。 有人對這種問題有經驗嗎? 任何建議將不勝感激。

謝謝!

在您的代碼示例中, interpolator.gradient已經是一個插值器,即您不需要將其與griddata結合使用。 嘗試:

grid_u_x, grid_u_y = interpolator.gradient(grid_x, grid_y)

由於此插值器知道您的三角剖分網格,因此應導致在網格外部填充了nan的速度矢量。 希望Streamplot應該能夠像下面的示例一樣優雅地處理此問題:

http://matplotlib.org/examples/images_contours_and_fields/streamplot_demo_masking.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM