- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
龙贝格(Romberg)求积法
1.算法理论
Romberg求积方法是以复化梯形公式为基础,应用Richardson外推法导出的数值求积方法。
由复化梯形公式 可以化为
=
一般地,把区间[a,b]逐次分半k-1次,(k=1,2,……,n)区间长度(步长)为,其中mk=2k-1。 记=
由= 从而
=- (1)
按Richardson外推思想,可将(1)看成关于,误差为的一个近似公式,因而,复化梯形公式的误差公式为
-== (2)
取=有 -= (3)
误差为的误差公式 =+
2。误差及收敛性分析
(1)误差,对复化梯形公式误差估计时,是估计出每个子区间上的误差,然后将n个子区间上的误差相加作为整个积分区间上的误差。
(2)收敛性,记,由于
=
上面两个累加式都是积分和,由于在区间上可积可知,只要的分划的最大子区间的长度时,也即时,它们的极限都等于积分值。可见,只要在区间上的可积的条件满足,由复化梯形求积公式计算所得复化梯形值序列都收敛于实际积分值。
3。算法:
(1)、输入:a,b,epsilon
(2)、令=b-a,计算=
(3)、令k=2,=
(4)、令=,计算
(5)、for j=2,3,……,k
(6)、if {输出; return;}
(7)、k=k+1; =; 跳转(4)
(8)、结束
4.实例
用龙贝格算法计算积分值
I=
5.龙贝格求积源程序:
//Romberg method for Integral
//Projectname hu1.cpp
//Executable file hu1.exe
//Date:2004.12
//By Hu Bentao
#include ”stdafx。h”
#include stdio.h
#include ”iostream.h
#include math.h”
#include conio.h”
#include ”stdlib。h
#define N1 20
#define N2 20
double fun(double x)
{//被积函数设置
return (8/(1+x*x));
}
void Romberg(double a,double b,double(*fun)(double),double epsilon)
{
int i,j,k;
double h=b-a,temp;
double T[20][20];
FILE *fp;
if((fp=fopen(”200402157。txt”,”w”))==NULL){//将运算的中间结果和最终结果保存到文件200402157.txt
puts(”\nopen file error!\n);
return ;
}
fflush(stdin);
fprintf(fp,”\n龙贝格求积计算的中间结果:);
printf(”\n龙贝格求积计算的中间结果:”);
T[1][1]=h*((*fun)(a)+(*fun)(b))/2;
fprintf(fp,”\nT[1][1]=%f,T[1][1]);
printf(”\nT[1][1]=%f”,T[1][1]);
k=2;h/=2;
while(1){
temp=0;
for(i=1;i=pow(2,(k-2));i++){
temp+=(*fun)(a+(2*i-1)*h);
}
T[k][1]=temp*h+T[k—1][1]/2;
fprintf(fp,”\nT[%d][1]=%f\t,k,T[k][1]);
printf(\nT[%d][1]=%f\t,k,T[k][1]);
for(j=2;j=k;j++){
T[k][j]=T[k][j-1]+(T[k][j-1]-T[k—1][j—1])/(pow(4,j-1)-1);
fprintf(fp,”T[%d][%d]=%f\t,k,j,T[k][j]);
printf(T[%d][%d]=%f\t,k,j,T[k][j]);
}
j——;
if((fabs(T[k][j]—T[k][j—1]))epsilon){
fprintf(fp,”\n积分结果\tI(f)=);
//coutendl〈OK!!”〈endl〈〈T”〈k〈j〈”=T[k][j];
fprintf(fp,%f\t,T[k][j]);//积分值输出
printf(”\n积分结果\tI(f)=”);
//cout〈〈endl〈OK!!”〈〈endlT”k〈j〈=”〈T[
文档评论(0)