双积分在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
这不仅仅是为了方便。告诉积分器边界在哪里会给它带来巨大的优势。相反,掩盖被积函数对性能和精度有破坏性的影响。当被积函数是平滑的时,基本的求积规则给出了最好的结果,当被积函数的不连续点急剧降至零时,将导致自适应求积算法在该区域进行再细分,直到跨不连续点的误差估计足够小。
这对于quad2d和integral2与“瓦”方法。与“迭代”方法,在任何给定的积分中,任何曲线不连续都被单个区间覆盖,但在二维中,将每个贴图细分为4块,积分器最终用大量小矩形覆盖曲线路径。通常情况下,函数求值的数量会达到极限,然后才能全部完成。
我们可以用quad2d的FailurePlot选择并使用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 = 0和z = 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秒。
奇异点
不像dblquad,integral2可以积分边界上的奇点,如果它们不是太严重的话。如果你的问题在积分区域的内部有一个奇点,你应该把积分分割成小块,这样所有的奇点都在积分区域的边界上。例如,
f = @ (x, y) 1. /√(abs (x。* y))
f = @ (x, y) 1. /√(abs (x。* y))
如果我们对这个平方积分-1 <= x <= 1,-1 <= y <= 1我们有一个问题,因为f在两边都是奇异的x和y轴。很明显f是关于两个轴对称的,所以我们只需要对它积分0 <= x <= 1,0 <= 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有其他同伴帮你吗?让我们知道在这里.
- 类别:
- 集成
评论
要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。