罗兰关于MATLAB的艺术

将想法转化为MATLAB

双积分在MATLAB -方法和处理不连续,奇点,和更多

在我们的最近的帖子, Mike Hosea和我讨论了在计算二重积分时,为了获得更准确的结果,需要同时调整绝对公差和相对公差。今天我们要讨论的是如何选择积分的方法,以及如何选择积分的第一个维度(方向)的顺序。

内容

创造了条件

integral2目前有两种不同的积分方法,“瓦”“迭代”,不包括“汽车”方法在它们之间进行选择。

每一种集成方法都采用了一种“分治”的方法来实现双重集成,但方法非常不同。的“瓦”方法基于quad2d该方法将区域划分为象限,并用二维求积法则逼近每个象限的积分。如果不满足矩形上的误差条件,则将矩形划分为象限,以此类推。的“迭代”方法,顾名思义,将积分作为迭代的一维积分执行,因此它的“分治”策略是先处理一维,然后再处理另一维。

那么,为什么要有两个方法呢?每一种都有不同的优势。通常平铺方法是两种方法中较快的,但它也有弱点。作为一个例子,考虑以前在MATLAB中对非矩形区域进行积分的方法。因为dblquad只会在矩形上积分,我们会“屏蔽”输入函数,使其在矩形区域内为零。例如,集成F在一个顶点为(0,0),(1,0)和(1,1)的三角形上,你会写

F = @ (x, y) exp (10 * x)。* tan (y) Q = dblquad (@ (x, y) F (x, y)。* (y < = x)、0、1 0 1)
F = @(x,y)exp(10*x).*tan(y) Q = 1072.6

现在你可以写了

Q = integral2 (F, 0 1 0, @ x (x))
Q = 1072.6

这不仅仅是为了方便。告诉积分器边界在哪里会给它带来巨大的优势。相反,掩盖被积函数对性能和精度有破坏性的影响。当被积函数是平滑的时,基本的求积规则给出了最好的结果,当被积函数的不连续点急剧降至零时,将导致自适应求积算法在该区域进行再细分,直到跨不连续点的误差估计足够小。

这对于quad2dintegral2“瓦”方法。与“迭代”方法,在任何给定的积分中,任何曲线不连续都被单个区间覆盖,但在二维中,将每个贴图细分为4块,积分器最终用大量小矩形覆盖曲线路径。通常情况下,函数求值的数量会达到极限,然后才能全部完成。

我们可以用quad2dFailurePlot选择并使用MaxFunEvals选项来控制在代码放弃之前完成了多少工作。假设

F = @ (x, y) sin (x / y。* y + 1))。* < = x (y)
F = @ (x, y) sin (x / y (y。* + 1))* < = x (y)。

然后

Q = quad2d (F, 0 1 0 1“MaxFunEvals”现年60岁的“FailurePlot”,真正的)
警告:已达到函数求值的最大数目(60)。结果无法通过全局错误测试。Q = 0.26562

底部的大矩形没有什么特别的。quad2d优先攻击误差最大的矩形,所以当一个较大的矩形刚刚通过误差测试时,如果积分器在其他地方有更大的问题,它就会暂停。那些较大的问题用较小的矩形表示。现在,如果我们增加允许的函数求值的次数,我们会看到quad2d仍然在为界限而挣扎。

Q = quad2d (F, 0 1 0 1“MaxFunEvals”, 600,“FailurePlot”,真正的)
警告:已达到函数求值的最大数目(600)。结果无法通过全局错误测试。Q = 0.26518

integral2“瓦”方法基于quad2d的算法,它有同样的问题。

Q = integral2 (F, 0 1 0,1)
警告:已达到函数计算的最大数目(10000)。结果无法通过全局错误测试。Q = 0.26514

虽然要花些时间,但是“迭代”方法可以处理这个问题。

F,0,1,0,1,“方法”“迭代”tq = toc
Q = 0.26513 tq = 5.0793

如果你发现“迭代”方法似乎慢,考虑放宽公差。integral2对所有的子积分使用相同的容差,这是一种非常保守的做法。使用默认容差,前面的示例在我们发布博客的机器上花费了4秒。

F,0,1,0,1,“方法”“迭代”“AbsTol”1 e-6“RelTol”tq(2) = toc
Q = 0.26514 tq = 5.0793 0.14705

这在同一台机器上只花了不到十分之一秒。

改变整合的顺序

不连续点可能蜿蜒穿过积分区域,但偶尔它们可能是线性的,并平行于一个或另一个轴。在这种情况下,积分的顺序很重要“迭代”方法。由于每个外部积分执行许多内部积分,如果可能的话,使外部积分更有效往往更有用,这意味着让内部积分处理跳转不连续。在这个例子中,被积函数在两者之间交替z = 0z = y这取决于地板(x)是偶数还是奇数。

f = @ (x, y)国防部(地板(x), 2)。* y tic integral2 (20 f, 0, 0, 1,“方法”“迭代”)目录
f = @ (x, y)国防部(地板(x), 2)。*y ans = 5运行时间是5.625905秒。

那是有效的,但"内在"的整合是y-方向,并为一个给定x这意味着函数要么等于零,要么等于一条直线。两者都很容易积分。然而,这意味着外积分的被积函数有从0到0.5的跳跃不连续,这取决于是否地板(x)是偶数还是奇数。我们宁愿用内积分来处理任何(或至少大部分)不连续点。改变积分的顺序很容易。

抽搐integral2 (@ (y, x) f (x, y), 0, - 1, 0, 20日“方法”“迭代”)目录
耗时为0.264443秒。

奇异点

不像dblquadintegral2可以积分边界上的奇点,如果它们不是太严重的话。如果你的问题在积分区域的内部有一个奇点,你应该把积分分割成小块,这样所有的奇点都在积分区域的边界上。例如,

f = @ (x, y) 1. /√(abs (x。* y))
f = @ (x, y) 1. /√(abs (x。* y))

如果我们对这个平方积分-1 <= x <= 1-1 <= y <= 1我们有一个问题,因为f在两边都是奇异的xy轴。很明显f是关于两个轴对称的,所以我们只需要对它积分0 <= x <= 10 <= y = 1然后乘以4,我们先把这个放到一边,直接算出来。

integral2 (f, 1, 1, 1, 1,“RelTol”1 e-12“AbsTol”1 e-14)
警告:已达到函数计算的最大数目(10000)。结果无法通过全局错误测试。ans = 15.869

“迭代”方法帮不了我们了。

integral2 (f, 1, 1, 1, 1,“RelTol”1 e-12“AbsTol”1 e-14“方法”“迭代”
警告:已达到使用中的最大间隔数的限制。误差的近似界是9.0 -09。积分可能不存在,或者很难在数值上近似达到所要求的精度。警告:集成不成功。ans =南

但是如果我们把积分分成四部分,把奇点放在边界上,这个问题绝对是常规的。

Q = 0;Q = Q + integral2(f,-1,0,-1,0,“RelTol”1 e-12“AbsTol”1 e-14);Q = Q + integral2(f,-1,0,0,1,“RelTol”1 e-12“AbsTol”1 e-14);Q = Q + integral2(f,0,1,-1,0,“RelTol”1 e-12“AbsTol”1 e-14);Q = Q + integral2(f,0,1,0,1,“RelTol”1 e-12“AbsTol”1 e-14)
Q = 16

你能利用这些新的集成程序吗?

哪些函数需要积分?灵活性integral2有其他同伴帮你吗?让我们知道在这里




发布与MATLAB®R2013b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。