- 问题背景与提出
龙贝格求积公式也称为逐次分半加速法。是数值计算方法之一,用以求解数值积分。是在梯形公式、辛普森公式和柯特斯公式之间关系的基础上,构造出一种加速计算积分的方法。 作为一种外推算法,在不增加计算量的前提下提高了误差的精度。
龙贝格公式在变步长的求积过程中运用三个加速公式,由变步长的梯形加速法,逐步得到梯形加速公式、抛物线加速公式,进而由粗糙的积分近似值迅速加工成精度较高的积分近似值。本实验通过龙贝格公式的C语言实现,两个简单示例,认识龙贝格公式的高精度积分近似。
- 实验目的
通过对龙贝格求积公式的学习,在梯形公式、辛普森公式、柯特斯公式的基础上,实现龙贝格积分公式的C语言实现,理解龙贝格积分的的积分近似值的加工精度高的效果,进一步提高对龙贝格积分的认识。
- 实验原理与数学模型
由
可以看到,用
和
的线性组合可以得到一个比
和
都好的近似公式,因此用
作为
的近似计算方式,通过验算,可以得到
即复化Simpson公式。复化Simpson公式要优于复化梯形公式。
再由复化Simpson公式的截断误差公式
若 变化不大时,即
。则
所以得到上式表明,用
和
的线性组合可以得到一个比
和
都好的近似公式。通过验算,上式右端项是
。即
当然复化Cotes公式要优于复化Simpson公式。
类似于前面的推导,可以得到关于 的线性组合公式
令上式的右端项为
。即
称
为龙贝格(Romberg)值。可以猜想,龙贝格(Romberg)值
要优于Cotes值
。因此用龙贝格(Romberg)值计算积分,将有较快的收敛速度。 [1]
- 实验内容(要点)
1、龙贝格积分算法C语言实现
2、龙贝格积分算法应用
- 实验过程记录(含基本步骤、主要程序清单及异常情况记录等)
- 龙贝格积分算法C语言实现
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double f(double x);
double rom(double a,double b,double ep)
{
double h,s1,c1,r1,s2,c2,r2,t1,t2,s;
int i,k,n;
h=(b-a)/2.0;
t2=(f(a)+f(b))*h;
s2=0;
c2=0;
r2=0;
n=1;
k=0;
do{
t1=t2;
s1=s2;
c1=c2;
r1=r2;
s=0.0;
for(i=1;i<=n;i++)
{
s=s+f(a+(2*i-1)*h);
}
t2=t1/2+s*h;
s2=(4*t2-t1)/3;
c2=(16*s2-s1)/15;
r2=(64*c2-c1)/63;
n=n*2;
k=k+1;
h=h/2;
printf("R(%d)=%f\n",k,r2);
}
while(fabs(r2-r1)>=ep);
return 0;
}
- 龙贝格积分算法应用
1、主函数程序及函数子程序1
double f(double x)
{
double f1;
if(x!=0) f1=sin(x)/x;
return f1;
}
int main()
{
double a,b,ep;
a=0;
b=1;
ep=0.0000005;
rom(a,b,ep);
}
运行结果如下:
2、主函数程序及函数子程序2
double f(double y)
{
return 1/y;
}
int main()
{
double a,b,ep;
a=1;
b=3;
ep=0.0000005;
rom(a,b,ep);
}
运行结果如下:
实验问题及解决方法:
参考相关龙贝格实现方法,主要是一些语法错误。
- 实验总结
通过对龙贝格积分算法的学习,龙贝格积分算法的C语言实现及应用,对龙贝格求积公式有了一定认识,认识到其优势在于收敛速度快,积分近似值精度高。但实验中仅对该积分公式进行实现及应用,未与其他积分公式进行对比,其特性不够明显。
参考文献
- 同等科等,中国石油大学出版社,计算方法.
- 网络资源https://baike.baidu.com/item/%E9%BE%99%E8%B4%9D%E6%A0%BC%E6%B1%82%E7%A7%AF%E5%85%AC%E5%BC%8F/3882832?fr=aladdin