Algorithm 二重积分的自适应辛普森求积算法?

Algorithm 二重积分的自适应辛普森求积算法?,algorithm,math,numerical-methods,integral,numerical-integration,Algorithm,Math,Numerical Methods,Integral,Numerical Integration,我目前正在使用Richard L Burden的《数值分析》第10版作为近似积分技术的参考。其中描述了自适应辛普森求积规则,该规则只输入边界和误差容限,并在误差容限的精度范围内给出近似积分。这种方法比标准的辛普森规则有效得多,在标准的辛普森规则中,您必须输入迭代次数,而不知道它与实际解有多接近。然而,本书继续描述了一种使用辛普森规则的二重积分方法,而不是一种适用于二重积分的自适应辛普森求积规则的算法。有人知道二重积分自适应辛普森规则的伪算法吗 作为参考,这是用于单积分的复合辛普森规则的伪算法:迭

我目前正在使用Richard L Burden的《数值分析》第10版作为近似积分技术的参考。其中描述了自适应辛普森求积规则,该规则只输入边界和误差容限,并在误差容限的精度范围内给出近似积分。这种方法比标准的辛普森规则有效得多,在标准的辛普森规则中,您必须输入迭代次数,而不知道它与实际解有多接近。然而,本书继续描述了一种使用辛普森规则的二重积分方法,而不是一种适用于二重积分的自适应辛普森求积规则的算法。有人知道二重积分自适应辛普森规则的伪算法吗

作为参考,这是用于单积分的复合辛普森规则的伪算法:迭代的输入边界(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:adaptivequadrauresimpons(a、b、tol):
myStack.push(a)
myStack.push(b)
I=0
while(myStack不是空的)
bb=myStack.pop()
aa=myStack.pop()
I1=复合粒子(aa,bb,2)
m=(aa+bb)/2
I2=复合粒子(aa,mm,2)+复合粒子(mm,bb,2)
如果(| I2-I1 |/15<(bb aa)*tol)
I+=I2
其他的
myStack.push(米)
myStack.push(bb)
myStack.push(aa)
mystack.push(米)
结束时
返回I`

两个积分的Simpsons规则的算法变得非常复杂,因为每次迭代都用不同的细分来替换x变量,所以除非必要,否则我不会在这里详细介绍。然而,我知道问题并不是那个算法,因为我已经尝试过很多次了,并且对许多不同的二重积分问题都很有效。我尝试使用adaptive Simpsons规则和我的二重积分adaptive Simpsons规则中相同的逻辑,用我的compositeSimpsonsDouble()替换CompositeSimpson(),但它进入了一个无限循环,因为I2和I1之间的差异总是小于公差。有什么帮助吗?用Java编码,用数值求积的行话来说,“二重积分”的作用不如你想在上面集成函数的域那么大。在1D中它总是一个区间,在2D中它可以是一个圆盘,一个矩形,一个三角形,一个具有权函数exp(-r**2)等的平面。也许你的二重积分就是其中之一。对于所有这些不同的领域,您有不同的集成技术。有关一些示例,请参见

对于2D中的自适应求积,我的第一个冲动是检查该域是否可以由多个三角形很好地逼近。与1D中的区间一样,如果误差估计器建议,这些区间可以很容易地分割成更小的三角形

检查如何使用四边形进行此操作

`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`