实验六数值积分数值分析实验报告.docx
《实验六数值积分数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《实验六数值积分数值分析实验报告.docx(8页珍藏版)》请在冰点文库上搜索。
实验六数值积分数值分析实验报告
实验六-数值积分-数值分析-实验报告
山西大学计算机与信息技术学院实
验
报
告姓
名
学号
班级08计科课程名称计算方法实验日期2021年12月6日实验名称实验六
数值积分成绩
一、实验目的利用复化梯形公式,复化辛普生公式和龙贝格数值积分公式计算a()b_f_d的近似值。
二、实验方法
(1)
将[a,b]区间n等分,记分点为,(,0,1,...,)iba_aihhinn,并在每个小区间[1,ii__]上应用梯形公式
11[()2()()]2nniihTfaf_fb
(2)在每个小区间[1,ii__]上应用辛普生公式
111112[()4()2()()]6nnniiiihSfaf_f_fb
式中,12i_为[1,ii__]的中点,即1212ii__h。
(3)先用梯形公式计算()/2_[()()]iTbafafb,然后,将求积区间(a,b)逐次折半的方法,令区间长度()/2(0,1,2....)ihbai。
计算211/2_
/2_
(_(1/2))nnnkTThfahk,式中2in。
于是,得到辛普生公式22()/3nnnnSTTT。
科特斯求积公式22()/15nnnnCSSS
最后,得到龙贝格求积公式22()/63nnnnRCCC
利用上述各式计算,直到相邻两次的积分结果之差满足精度要求。
三、实验内容利用复化梯形公式,复化辛普生公式和龙贝格数值积分公式计算
221__e_ed和12041_d_的近似值,要求误差为71_102,将计算结果与精度值比较,并对计算结果进行分析。
四、实验程序
#include“stdio.h”#include“math.h”#include“iostream.h”#include“iomanip.h”
double
f1(double_){
return__e_p(_);}doublef2(double_){
return4/(1+___);}//.............梯形公式..............................
double
T(doublea,doubleb,intn){
double_[20__00];
doubleh=(b-a)/n;
for(inti=0;i_[i]=a+i_h;
}
doublem=0;
for(i=1;i<=n-1;i++){
m=m+f1(_[i]);
}
returnh/2_(f1(a)+2_m+f1(b));}voidteT
{
inta=1,o=0;
doubleq=T(1,2,a);
doublew=T(1,2,2_a);
while(fabs(w-q)>0.00000005){
o++;
a=a_2;
q=T(1,2,a);
w=T(1,2,2_a);
}
printf(“%d
”,o);
printf(“T=%15.10f”,T(1,2,2_a));}doubleT1(doublea,doubleb,intn){
double_[10000];
doubleh=(b-a)/n;
for(inti=0;i_[i]=a+i_h;
}
doublem=0;
for(i=1;i<=n-1;i++){
m=m+f2(_[i]);
}
returnh/2_(f2(a)+2_m+f2(b));}voidteT1{
intb=1,p=0;
doubles=T1(0,1,b);
doubled=T1(0,1,2_b);
while(fabs(s-d)>0.00000005){
p++;
b=b_2;
s=T1(0,1,b);
d=T1(0,1,2_b);
}
printf(“\n%d
”,p);
printf(“T1=%15.10f”,T1(0,1,b));}//......................辛普生公式........................................
doubleS(doublea,doubleb,intn){
doubleh=(b-a)/n;
doubles=f1(a)-f1(b);
double_;
_=a;
for(inti=0;i_=_+h/2;
s=s+4_f1(_);
_=_+h/2;
s=s+2_f1(_);
}
s=s_h/6;
returns;}voidteS{
intc=1,l=0;
doubleg=S(1,2,c);
doubleh=S(1,2,2_c);
while(fabs(h-g)>0.00000005){
l++;
c=c_2;
g=S(1,2,c);
h=S(1,2,2_c);
}
printf(“\n%d
”,l);
printf(“S=%15.10f”,S(1,2,c));}doubleS1(doublea,doubleb,intn){
doubleh=(b-a)/n;
doubles=f2(a)-f2(b);
double_;
_=a;
for(inti=0;i_=_+h/2;
s=s+4_f2(_);
_=_+h/2;
s=s+2_f2(_);
}
s=s_h/6;
returns;}voidteS1{
intm=1,v=0;
doublej=S1(0,1,m);
doublek=S1(0,1,2_m);
while(fabs(k-j)>0.00000005){
v++;
m=m_2;
j=S1(0,1,m);
k=S1(0,1,2_m);
}
printf(“\n%d
”,v);
printf(“S1=%15.10f\n”,S1(0,1,m));}//.................龙贝格公式...........................
void
L(doublea,doubleb){
doubleh=b-a;
doublet1=(f1(a)+f1(b))_h/2,t2;
intk=1;
doubled=0;
doubler1=0,r2=1;
doublec1,c2;
doubles1=0,_,s2;
while
(1){
if(fabs(r2-r1)<0.00000005)
break;
s1=0;
_=a+h/2;
while(_
s1=s1+f1(_);
_=_+h;
}
t2=t1/2+h/2_s1;
s2=t2+1/3_(t2-t1);
if(k==1){
k=k+1;
h=h/2;
t1=t2;
continue;
}
c2=s2+1/15_(s2-s1);
if(k==2){
c1=c2;
k=k+1;
h=h/2;
t1=t2;s1=s2;
continue;
}
r1=d;r2=c2+1/63_(c2-c1);
if(k==3){
d=r2;
c1=c2;
h=h/2;k=1;t1=t2;s1=s2;
continue;
}
}
printf(“
L=%15.10f\n”,r2);}voidmain{
teT;
teT1;
teS;
teS1;
L(1,2);}五、实验结果
六、结果分析
在对积分区间作同样分割或利用同样个数的函数值的条件下,复化辛普生公式比复化梯形公式的计算精度高。
在利用复合求积公式计算积分之前,必须给出适当的步长bahn。
步长太大,精度难以保证;步长太小,则会导致计算量的增加。
而计算之前给出一个恰当的步长,往往非常困难,因此采用了变步长的方法——龙贝格算法。