2

我正在使用matlab通過在表面上集成離散速度點來計算管道橫截面的平均速度。點以散亂的形式散佈,形成一個圓形(幾乎)。在複雜的2D表面上積分速度

我使用分散插值創建一個函數,將x和y與v(velocity)相關聯,以創建一個插值值的網格。

F = scatteredInterpolant(x, y, v,'linear'); 

vq = F(xq,yq); % where xq and yq are a set of query points 

我現在的問題是試圖計算這個函數的表面積,但只在這個圓形部分包含所有的散點。

我對此的第一種方法是使用quad2d函數。

int = quad2d(@(x,y) F(x,y), min(x), max(x), min(y), max(y), 'MaxFunEvals', 100000); 

但是這給出是不正確的,因爲它需要矩形和圓形區域。

現在我可以用圓來定義表面區域,但將來我將不得不使用更復雜的形狀,所以我想使用定義散點的邊界的點。

我正在通過三角測量,使用以下命令。

DT = delaunayTriangulation(x,y); 

但是我不知道如何將這些點合併到quad2d函數中。我希望有人可能會有一個建議,或者可能有另一種方法來計算這些複雜曲面的面積。

謝謝!

回答

2

你可以假設你的函數是分段線性你的積分區域,然後使用中點積分規則整合呢:

對於每個用戶使用電腦時的中點值作爲節點值的平均值的三角形和由乘三角形的區域。你總結一切來得到你的積分。

function int = integrate(T, values) 
    meanOnTriangle = mean(values(T.ConnectivityList),2); 
    int = sum(getElementAreas(T).*meanOnTriangle);   
end 

function areas = getElementAreas(T) 
    X = @(d) T.Points(T.ConnectivityList(:,d),:); 
    d21 = X(2)-X(1); 
    d31 = X(3)-X(1); 
    areas = abs(1/2*(d21(:,1).*d31(:,2)-d21(:,2).*d31(:,1))); 
end 

當你的目標是平均速度,要計算以下數量:

averageVelocity = integrate(DT,v)/sum(getElementAreas(DT)); 
+0

這工作完美!感謝您的幫助。 – user5006725

+0

我想知道如果我有一個更復雜的形狀,如心臟。三角測量是否有可能獲得縮進發生的周邊點,而不是像目前正在進行的那樣跳過點或者是否需要使用更復雜的方法。 – user5006725

+0

@ user5006725:這是對您的域進行三角測量的問題。 delaunay-triangulation將總是讓你凸包(沒有縮進)。你可以嘗試[alpha形狀](http://www.mathworks.com/matlabcentral/fileexchange/28851-alpha-shapes)或手動定義邊界並使用[constrained delaunay triangulations](http://de.mathworks.com) /help/matlab/math/delaunay-triangulation.html#bspqi8a-12)。 – knedlsepp