我有一个函数z = f(x, y)
,其中z
是点(x, y)
的值。如何在MATLAB中将z
集成到x-y
平面上?
通过上面的函数,我实际上意味着我有类似于哈希表的东西。也就是说,给定(x, y)
对,我可以查找表格以找到相应的z
值。
如果点均匀分布在x-y
平面上,问题会相当简单,在这种情况下,我可以简单地总结所有z
值,将其与底部区域相乘,最后除以我所拥有的点数。但是,分布不均匀,如下所示。 所以我实际上要求的是最小化错误的计算方法。
答案 0 :(得分:5)
如果您有一个离散数据集,其中包含定义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
是你的函数句柄,它接受两个输入。
答案 1 :(得分:5)
目前接受的答案仅适用于网格数据。如果您的数据分散,您可以使用以下方法:
scatteredInterpolant
+ integral2
:f = scatteredInterpolant(x(:), y(:), z(:), 'linear');
int = integral2(@(x,y) f(x,y), xmin, xmax, ymin, ymax);
这定义了数据f
的线性插值z(i) = f(x(i),y(i))
,并将其用作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);