我目前使用Richard L Burden的Numerical Analysis第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: 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变量,所以除非必要,否则我不会在这里详细介绍。然而,我知道问题不是那个算法,因为我已经尝试过很多次了,对于许多不同的双重积分问题都很好用。我尝试使用与自适应辛普森规则相同的逻辑,将compositeSimpsons()替换为我的compositeSimpsonsDouble(),这与自适应辛普森规则中的双积分自适应辛普森规则相同,但它进入了无限循环,因为I2和I1之间的差值总是小于容差。有什么帮助吗?用Java编写代码
发布于 2019-12-24 18:38:21
在数值求积的行话中,“双重积分”的作用并不像你想要积分函数的域那么大。在一维中它总是一个区间,在二维中它可以是一个圆盘,一个矩形,一个三角形,一个带有权函数exp(-r**2)的平面,等等,也许你的二重积分就是其中之一。对于所有这些不同的领域,您都有不同的集成技术。有关示例,请参阅https://github.com/nschloe/quadpy。
对于2D中的自适应求积,我的第一个冲动是检查域是否可以由许多三角形很好地近似。就像1D中的间隔一样,如果误差估计器建议的话,这些间隔可以很容易地分割成更小的三角形。
请查看https://github.com/nschloe/quadpy/wiki/Adaptive-quadrature,了解如何使用quadpy完成此操作。
https://stackoverflow.com/questions/59438763
复制相似问题