如何在MATLAB中集成离散的2D曲面?

Sib*_*ing 4 math matlab

我有一个函数z = f(x, y),其中z的值是点(x, y).我如何可以集成z在x-yMATLAB中飞机?

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

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

在此输入图像描述

kne*_*epp 7

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

scatteredInterpolant+ integral2:

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

这定义了f数据的线性插值,z(i) = f(x(i),y(i))并将其用作参数integral2.请注意,ymin而ymax不是双打,可以是取决于的功能句柄x.所以通常你会集成矩形,但这可以用于更复杂的集成区域.

如果您的集成区域相当复杂或有漏洞,则应考虑对数据进行三角测量.

DIY使用triangulation:

假设您的积分区域由三角测量给出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);
Run Code Online (Sandbox Code Playgroud)


shi*_*izu 5

如果您有一个离散数据集,其中包含定义z的所有x和y值,则只需获取与这些(x,y)对对应的Zdata矩阵.保存此矩阵,然后您可以使用interp2使其成为连续函数:

function z_interp = fun(x,y)

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

end
Run Code Online (Sandbox Code Playgroud)

然后你可以使用integral2来找到积分:

q = integral2(@fun,xmin,xmax,ymin,ymax)
Run Code Online (Sandbox Code Playgroud)

@fun你的函数句柄在哪里接受两个输入.