龙贝格加速算法及python实现
梯形求积法简单,但精度差,收敛速度慢,如何提高收敛速度以节省计算量是这里主要探讨的话题。
首页地址https://kz16.top/na
本文来源https://kz16.top/na/Romberg
考虑函数f(x)∈C2(a,b)的积分
I=∫abf(x)dx(1)
把区间(−1,1)分成n等分,步长为h=nb−a,
这n+1个等距节点xk=a+kh,(k=0,1,⋯n)对应的复化梯形求积公式为
In=2hk=0∑n−1[f(xk)+f(xk+1)](2)
我们知道复化梯形求积公式的本质是折线代替曲线,也就是在每个子区间上,利用子区间的两个端点做线性插值。根据拉格朗日中值定理,第k个子区间(xk,xk+1)上的线性插值关系为
f(x)=f(xk)+hf(xk+1)−f(xk)(x−xk)+21f′′(ξk)(x−xk)(x−xk+1)
因此有
I=In+k=0∑n−1∫xkxk+121f′′(ξk)(x−xk)(x−xk+1)dx
这里ξk∈(xk,xk+1),从而有估计
I−In=k=0∑n−1∫xkxk+121f′′(ξk)(x−xk)(x−xk+1)dx=k=0∑n−1−121f′′(ξk)h3=Cnh2.
这里Cn=−12h∑k=0n−1f′′(ξk)。
由于函数f(x)∈C2(a,b),根据定积分的定义,因此有
h→0limk=0∑n−12hf′′(ξk)=∫abf′′(x)dx=f′(b)−f′(a)
即,只要h足够小,就有Cn≈C2n≈−61[f′(b)−f′(a)]。
于是根据等式
I−In=Cnh2,I−I2n=C2n(2h)2.(3)
有
I−InI−I2n=41CnC2n≈41.(4)
上式移项整理得
I≈34I2n−31In.(5)
从上述推导可以得出结论:把梯形二分前后的两个积分值In与I2n按照(5)式作线性组合,同样可以作为真实积分I的逼近,容易验证,(5)式的这种逼近恰好就是Simpson求积法的积分值Sn,即
Sn=34I2n−31In.(6)
同样的道理,可以把Simpson求积法作类似处理,注意到Simpson求积的截断误差大致与h4成正比,因此有
I−SnI−S2n≈81,I≈1516S2n−151Sn.(7)
上面(6)式结果恰好是相同节点的Cotes求积法的积分值Tn,即
Tn=1516S2n−151Sn.(8)
同样的手续,进一步可得龙贝格公式:
Rn=6364T2n−631Tn.(9)
通过上面的推导过程,我们知道(4)式后面的约等于是有限制条件的
- 步长h足够小
- 函数有二阶连续的导数,即f(x)∈C2(a,b).
类似我们不难推导,后面的公式(6),(8)和(9)对函数f(x)的光滑性要求会更高。
计算积分值
I=∫01xsinxdx
import numpy as np
class RombergQuad(object):
def __init__(self, f, a, b):
self.f = f
self.a = a
self.b = b
def trapezoid(self, n):
h = 1.0*(self.b - self.a)/n
x = np.linspace(self.a+h, self.b-h, n-1)
return 0.5*h*(f(self.a) + 2*f(x).sum() + f(self.b))
def simpson(self, xn, x2n):
return (4.0*x2n - xn)/3.0
def cotes(self, xn, x2n):
return (16.0*x2n - xn)/15.0
def romberg(self, xn, x2n):
return (64.0*x2n - xn)/63.0
def f(x):
if isinstance(x, int) and x == 0:
return 1
return np.sin(x)/x
rq = RombergQuad(f, 0, 1)
t0 = rq.trapezoid(1)
t1 = rq.trapezoid(2)
t2 = rq.trapezoid(4)
t3 = rq.trapezoid(8)
s1 = rq.simpson(t0, t1)
s2 = rq.simpson(t1, t2)
s3 = rq.simpson(t2, t3)
c2 = rq.cotes(s1, s2)
c3 = rq.cotes(s2, s3)
r3 = rq.romberg(c2, c3)
print(t0, t1, t2, t3)
print(s1, s2, s3)
print(c2,c3)
print(r3)
print("I=", 0.9460831)
结果为
0.9207354924039483 0.9397932848061772 0.9445135216653896 0.9456908635827014
0.9461458822735868 0.9460869339517938 0.946083310888472
0.9460830040636742 0.9460830693509172
0.9460830703872227
I= 0.9460831
首页地址https://kz16.top/na
本文来源https://kz16.top/na/Romberg
仅供参考,部分漏洞在所难免
欢迎转载,转载请指明来源,
请勿用于商业
作者:Zhou Bingzhen
2019.11.21