[英]How to integrate over a discrete 2D surface in MATLAB?
我有一個函數z = f(x, y)
,其中z
是點(x, y)
的值。 如何在 MATLAB 中將z
在xy
平面上積分?
通過上面的功能,我實際上是指我有類似於哈希表的東西。 也就是說,給定一個(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
的參數。 請注意, ymin
和ymax
可以是函數句柄,而不是雙精度數,具體取決於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);
我最近不得不在 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.