簡體   English   中英

如何在 MATLAB 中集成離散二維曲面?

[英]How to integrate over a discrete 2D surface in MATLAB?

我有一個函數z = f(x, y) ,其中z是點(x, y)的值。 如何在 MATLAB 中將zxy平面上積分?

通過上面的功能,我實際上是指我有類似於哈希表的東西。 也就是說,給定一個(x, y)對,我可以查表找到對應的z值。

問題會很簡單,如果點均勻分布在xy平面上,在這種情況下,我可以簡單地將所有z值相加,乘以底部區域,最后除以我擁有的點數。 但是,分布並不均勻,如下所示。 所以我實際上是在要求最小化誤差的計算方法。

在此處輸入圖像描述

當前接受的答案僅適用於網格數據。 如果您的數據分散,您可以使用以下方法:

scatteredInterpolant + integral2 2:

f = scatteredInterpolant(x(:), y(:), z(:), 'linear');
int = integral2(@(x,y) f(x,y), xmin, xmax, ymin, ymax);

這定義了數據z(i) = f(x(i),y(i))的線性插值f並將其用作integral2的參數。 請注意, yminymax可以是函數句柄,而不是雙精度數,具體取決於x 所以通常你會整合矩形,但這可以用於更復雜的整合區域。

如果您的集成區域相當復雜或有漏洞,您應該考慮對數據進行三角剖分。

使用triangulation DIY:

假設您的積分區域由三角測量trep給出,例如可以通過trep = delaunayTriangulation(x(:), y(:))獲得。 如果您的值z對應於z(i) = f(trep.Points(i,1), trep.Points(i,2)) ,則可以使用以下積分例程。 它計算線性插值的精確積分。 這是通過評估所有三角形的面積,然后將這些面積用作每個三角形的中點(平均值)值的權重來完成的。

function int = integrateTriangulation(trep, z)
P = trep.Points; T = trep.ConnectivityList;
d21 = P(T(:,2),:)-P(T(:,1),:);
d31 = P(T(:,3),:)-P(T(:,1),:);
areas = abs(1/2*(d21(:,1).*d31(:,2)-d21(:,2).*d31(:,1)));
int = areas'*mean(z(T),2);

如果您有一個離散數據集,其中包含定義了 z 的所有 x 和 y 值,則只需獲取與這些 (x,y) 對對應的 Zdata 矩陣。 保存此矩陣,然后您可以使用interp2使其成為連續函數:

function z_interp = fun(x,y)

    z_interp = interp2(Xdata,Ydata,Zdata,x,y);

end

然后你可以使用integral2求積分:

q = integral2(@fun,xmin,xmax,ymin,ymax)

其中@fun是您的函數句柄,它接受兩個輸入。

我最近不得不在 MatLab 中整合一個二元正態分布。 這個想法很簡單。 Matlab 通過網格定義一個表面,所以從 x, y 你需要這樣做:

x = -10:0.05:10;
y = x;

[X,Y] = meshgrid(x',y');

...例如。 然后,讓我們調用 FX 定義曲面每個點的值的函數。 要計算積分,您只需要這樣做:

surfint = zeros(length(X),1);
for a = 1:length(X)
   surfint(a,1) = trapz(x,FX(:,a));     
end

trapz(x, surfint)

對我來說,這是最簡單的方法。

暫無
暫無

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

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