对复杂二维表面的速度进行积分
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));
我正在使用 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));