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