算法原理
龙贝格(Romberg)求积法是甲酸定积分$T=\int_{a}^{b}f(x)dx$的最常用算法之一。
设$T_{m}(h)$ 步长为h时利用2m-2 阶牛顿-科茨(Newton-Cotes)公式计算得到的结果:$T_{m}(\frac{h}{2})$ 为将步长h减半后用2m-2 阶牛顿-科茨公式计算得到的结果。将他们机型线性组合,便得到步长为h的2m阶牛顿-科茨公式,即:
$$ T_{m+1}(h)=\frac{4^{m}T_{m}(h/2)-T_{m}(h)}{4^{m}-1} $$
其中$T_{1}(h)$为步长为h时的梯形公式计算得到的结果。$T_{1}(h/2)$为步长为h/2时的梯形公式计算得到的结果。
在实际计算时,龙贝格求积法按下表所示的计算格式进行,直到$|T_{m+1}(h)-T_{m}(h)| < \xi$为止。
梯形法则 | 二阶公式 | 四阶公式 | 六阶公式 | 八阶公式 | ··· |
---|---|---|---|---|---|
$T_{1}(h)$ | |||||
$T_{1}(\frac{h}{2})$ | $T_{2}(h)$ | ||||
$T_{1}(\frac{h}{2^{2}})$ | $T_{2}(\frac{h}{2})$ | $T_{3}(h)$ | |||
$T_{1}(\frac{h}{2^{3}})$ | $T_{2}(\frac{h}{2^{2}})$ | $T_{3}(\frac{h}{2})$ | $T_{4}(h)$ | ||
$T_{1}(\frac{h}{2^{4}})$ | $T_{2}(\frac{h}{2^{3}})$ | $T_{3}(\frac{h}{2^{2}})$ | $T_{4}(\frac{h}{2})$ | $T_{5}(g)$ | ··· |
: | : | : | : | : | : |
算法实现
- double CommonAlgorithm::integral(double (* vFunction)(double x), double a, double b, double eps = 1e-6){
- int m,n,i,k;
- double y[10],h,ep,p,x,s,q;
-
- // 迭代初值
- h=b-a;
- y[0]=h*(vFunction(a)+vFunction(b))/2.0;
- m=1;
- n=1;
- ep=eps+1.0;
-
- // 迭代计算
- while ((ep>=eps)&&(m<=9))
- {
- p=0.0;
-
- for (i=0;i<=n-1;i++)
- {
- x=a+(i+0.5)*h;
- p=p+vFunction(x);
- }
-
- p=(y[0]+h*p)/2.0;
- s=1.0;
-
- for (k=1;k<=m;k++)
- {
- s=4.0*s;
- q=(s*p-y[k-1])/(s-1.0);
- y[k-1]=p; p=q;
- }
-
- ep=fabs(q-y[m-1]);
- m=m+1;
- y[m-1]=q;
- n=n+n;
- h=h/2.0;
- }
-
- return(q);
- }