在复杂的二维曲面上积分速度

时间:2015-06-13 18:31:27

标签: matlab interpolation triangulation numerical-integration

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

我使用scatinterpolant来创建一个将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函数中。我希望有人可能有一个建议,或者可能有另一种方法可以用来计算这些复杂曲面上的区域。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

对于每个三角形,您将中点值计算为节点值的平均值,并乘以三角形的面积。你总结一下来得到你的积分。

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));