对复杂二维表面的速度进行积分

Integrating Velocity Over a Complex 2-D Surface

我正在使用 matlab 通过积分表面上的离散速度点来计算管道横截面的平均速度。这些点以随机模式散布,形成一个圆圈(几乎)。

我使用 scatteredinterpolant 创建了一个将 x 和 y 与 v(速度)相关联的函数,以便创建一个插值网格。

F = scatteredInterpolant(x, y, v,'linear');

vq = F(xq,yq); % where xq and yq are a set of query points

我现在遇到的问题是尝试计算此函数的表面积,但仅限于包含所有散点的圆形部分。

我采用的第一种方法是使用 quad2d 函数。

int = quad2d(@(x,y) F(x,y), min(x), max(x), min(y), max(y), 'MaxFunEvals', 100000);

但是这个给出的是不正确的,因为它占据了一个矩形和一个圆的面积。

现在我可能可以用一个圆来定义表面积,但将来我将不得不使用更复杂的形状,所以我想使用定义散点边界的点。

我正在使用以下命令通过三角测量来执行此操作。

DT = delaunayTriangulation(x,y);

但是我不知道如何将这些点合并到 quad2d 函数中。我希望有人可能会提出建议,或者我可以使用另一种方法来计算这些复杂表面上的面积。

谢谢!

您可以假设您的函数在积分区域上是分段线性的,然后使用中点求积法则对其积分:

对于每个三角形,您将中点值计算为节点值的平均值,然后乘以三角形的面积。你把它加起来得到你的积分。

function int = integrate(T, values)
    meanOnTriangle = mean(values(T.ConnectivityList),2);
    int = sum(getElementAreas(T).*meanOnTriangle);        
end

function areas = getElementAreas(T)
    X = @(d) T.Points(T.ConnectivityList(:,d),:);
    d21 = X(2)-X(1);
    d31 = X(3)-X(1);
    areas = abs(1/2*(d21(:,1).*d31(:,2)-d21(:,2).*d31(:,1)));
end

由于您的目标是平均速度,因此您需要计算以下数量:

averageVelocity = integrate(DT,v)/sum(getElementAreas(DT));