matlab - 如何在 MATLAB 中对离散二维曲面进行积分?

标签 matlab math

我有一个函数 z = f(x, y),其中 z 是点 (x, y) 的值。我如何在 MATLAB 的 x-y 平面上积分 z

通过上面的函数,我实际上是指我有类似于哈希表的东西。也就是说,给定一个 (x, y) 对,我可以查表找到相应的 z 值。

问题会很简单,如果点均匀分布在 x-y 平面上,在这种情况下,我可以简单地总结所有 z 值,将其乘以底部区域,最后除以我拥有的点数。但是,分布并不均匀,如下所示。 所以我其实是在求误差最小的计算方法。

enter image description here

最佳答案

当前接受的答案仅适用于网格化数据。如果您的数据是分散的,您可以改用以下方法:

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。请注意,yminymax 可以是取决于 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/

相关文章:

matlab - 将常量传递给 fminsearch

php - 类似于Axis X, Y - 需要检查多个值,怎么办?

c# - 反转数学函数

javascript - 比较平均值之谜 - 是这个政府机构不正确,还是我不正确?

java - 从关卡堆栈中获取相对比例的数学

matlab - Matlab 中标记控制分水岭的过度分割

Matlab 3d 矩阵

web-services - 如何在 Web 服务调用中输入凭据(授权对象)?

matlab - 如何在 MATLAB 中绘制一维绘图?

javascript - 如何使用javascript返回字符串中每个字母的数字