在Matlab中对多边形进行双重积分

时间:2013-02-04 22:05:00

标签: matlab integration numerical-integration

我给了一个函数@f(x,y),我想在MATLAB中评估这个函数在某个凸多边形上的积分。多边形不一定是矩形,这就是为什么我不能使用MATLAB的函数“dblquad”。我所具有的多边形由一组由矢量X和Y表示的顶点给出,即顶点是(X(1),Y(1)),......,(X(n),Y(n)) )。我可以使用任何功能或方法吗?

1 个答案:

答案 0 :(得分:2)

诀窍是使用工具整合到感兴趣的区域内。我已经编写了一些用于在三角域中集成的工具。

% Define a function to integrate.
% This function takes an nx2 array, where each row
% contains a single point to evaluate the kernel at.
% This computes x^2 + y^2 at each point.
fun = @(xy) sum(xy.^2,2);

% define the domain as a triangulated polygon
% this tool uses ear clipping to do so.
sc = poly2tri([1 4 3 1],[1 3 5 4]);

% Gauss-Legendre integration over the 2-d domain
[integ,fev]= quadgsc(fun,sc,2)
integ =
       113.166666666667
fev =
     8

% the triangulated polygon...
plotsc(sc,'facecolor','none','markerfacecolor','r')
axis equal
grid on

enter image description here

我们可以将函数本身可视化,作为该多边形域上的映射z(x,y)。当提供范围字段时,单纯复形变为从2-d(x,y)域开始的2-1映射。

sc2 = refinesc(sc,'max',.5);
sc2.range = fun(sc2.domain);
plotsc(sc2,'markerfacecolor','r')
grid on
view(17,12)

enter image description here

这是一个关注域的简单多项式函数,因此默认的低阶高斯积分就足够了。所使用的方案是高斯 - 勒让德(Gauss-Legendre),在三角形上的张量积形式,不是真正最优的,但是可行的。高斯求积法的问题是它不是自适应的。它基于有限点上的多项式的隐式近似来计算估计值。

上述估计使用8个函数证据来计算该估计值。由于内核是低阶多项式,它应该完美。问题是,您需要知道它是否是正确的解决方案。这是高斯求积法的问题,没有简单的方法来知道答案是否正确,除了用更高阶的方案解决问题,直到它似乎收敛。

看到在重心处每个三角形有1个点,我们得到了错误的答案,但是更高阶的估计都是一致的。

[integ,fev]= quadgsc(fun,sc,1)
integ =
       107.777777777778
fev =
     2

[integ,fev]= quadgsc(fun,sc,3)
integ =
       113.166666666667

fev =
    18

[integ,fev]= quadgsc(fun,sc,4)
integ =
       113.166666666667
fev =
    32

编写quadgsc后,我不得不尝试一种自适应求解器,其工作方式与MATLAB中其他四合一工具的工作方式相同。这对三角测量进行了自适应细化,寻找解决方案不稳定的三角形。问题是,我从来没有写完这些工具让我满意。对于三角形域上的立方体问题,可以采用许多不同的方法。 quadrsc执行低阶解,然后对其进行精炼,使用Richardson外推,然后比较结果。对于差异太大的任何三角形,它会进一步细化它们直到它收敛。

例如,

[integ,fev]= quadrsc(fun,sc)
integ =
          113.166666666667

fev =
    16

所以这很有效。问题出现在更复杂的内核上,问题变得知道何时停止细化,并且在用完了太多功能评估之前这样做。我从来没有完全满意地工作,所以我从来没有发布过这些工具。我可以将工具箱发送给直接发送给我的人。 zip文件大约是2.4 MB。有一天,我希望能够完成这些工具,我希望......