我有一个函数 z = f(x, y)
,其中 z
是点 (x, y)
的值。我如何在 MATLAB 的 x-y
平面上积分 z
?
通过上面的函数,我实际上是指我有类似于哈希表的东西。也就是说,给定一个 (x, y)
对,我可以查表找到相应的 z
值。
问题会很简单,如果点均匀分布在 x-y
平面上,在这种情况下,我可以简单地总结所有 z
值,将其乘以底部区域,最后除以我拥有的点数。但是,分布并不均匀,如下所示。 所以我其实是在求误差最小的计算方法。
最佳答案
当前接受的答案仅适用于网格化数据。如果您的数据是分散的,您可以改用以下方法:
scatteredInterpolant
+ integral2
:
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
并将其用作参数积分 2
。请注意,ymin
和 ymax
可以是取决于 x
的函数句柄,而不是 double 。所以通常你会整合矩形,但这可以用于更复杂一点的整合区域。
如果您的集成区域相当复杂或有漏洞,您应该考虑对数据进行三角测量。
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 中对离散二维曲面进行积分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23688669/