双积分的自适应辛普森正交算法?



我目前正在使用Richard L Burden的Numerical Analysis 10th edition作为近似积分技术的参考。其中描述了自适应辛普森正交规则,该规则仅输入边界和容错,并在误差容限的精度内吐出近似积分。这种方法比标准的辛普森规则更有效,在标准辛普森规则中,您必须输入迭代次数,而不知道它与实际解决方案有多接近。然而,这本书继续描述了一种使用辛普森规则的双积分方法,但没有描述双积分的自适应辛普森正交规则算法。有谁知道双积分自适应辛普森规则的伪算法??

作为参考,这是单积分的复合辛普森规则的伪算法:迭代的输入边界 (a, b( 和 n #

`NAME: compositeSimpsons(a, b, n):
h=(b-a)/n
first = f(a)
last = f(b)
sum=0
x = a+h
for(i=2:n-1)
if(i%2==0) // even
sum+=4*(x)
else // odd
sum+=2*f(x) 
x+=h
end for
return (h/3) * (first+sum+last)`

这是单积分的自适应辛普森正交的伪算法:(输入边界a,b(和公差(tol(

`NAME: adaptiveQuadratureSimspons(a, b, tol):
myStack.push(a)
myStack.push(b)
I=0
while(myStack is not empty)
bb = myStack.pop()
aa = myStack.pop()
I1 = compositeSimpsons(aa, bb, 2)
m = (aa+bb)/2
I2 = compositeSimpsons(aa, mm, 2) + compositeSimspons(mm, bb, 2)
if(|I2-I1|/15 < (bb-aa)*tol)
I += I2
else
myStack.push(m)
myStack.push(bb)
myStack.push(aa)
myStackl.push(m)
end while
return I`

辛普森规则的两个积分的算法很快就会变得非常复杂,因为每次迭代都会用不同的细分替换 x 变量,所以除非必要,否则我不会在这里详细介绍。但是,我知道问题不在于该算法,因为我已经尝试了很多次,并且可以很好地解决许多不同的双积分问题。我试图使用在自适应辛普森规则中找到的相同逻辑,通过将复合辛普森((替换为我的复合辛普森双((,但它进入了一个无限循环,因为 I2 和 I1 之间的差异总是小于公差。有什么帮助吗?用 Java 编写代码

在数字正交的术语中,"双积分"的作用不如你想要整合函数的那么大。在 1D 中,它始终是一个间隔,在 2D 中,它可以是圆盘、矩形、三角形、具有权重函数的平面exp(-r**2)等。也许你的双重积分就是其中之一。对于所有这些不同的域,您有不同的集成技术。有关一些示例,请参阅 https://github.com/nschloe/quadpy。

对于 2D 中的自适应正交,我的第一个冲动是检查域是否可以由多个三角形很好地近似。与一维区间一样,如果误差估计器建议,可以很容易地将它们分成更小的三角形。

查看 https://github.com/nschloe/quadpy/wiki/Adaptive-quadrature 了解如何使用 quadpy 执行此操作。

最新更新