数值分析第三次实习报告.docx
《数值分析第三次实习报告.docx》由会员分享,可在线阅读,更多相关《数值分析第三次实习报告.docx(13页珍藏版)》请在冰豆网上搜索。
数值分析第三次实习报告
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称:
数值分析(第三次实习)
开课名称:
计算机科学与技术学院
指导老师姓名:
熊盛武
学生姓名:
学生专业班级:
软件工程0803班
2009——2010学年第一学期
一、实习目的:
(1)通过编程计算实践,体会和理解复化梯形公式和复化Simpson公式。
(2)通过编程计算实践,搞清变步长梯形公式的计算流程。
(3)通过编程计算实践,掌握和提高Romberg算法流程的控制技术。
(4)通过各种方法对同一题目的求解,体会各种方法的精度差异。
二、实习步骤:
(1)分别画出复化梯形公式,复化Simpson公式,变步长梯形公式和Romberg公式的算法流程图。
(2)分别用复化梯形公式和复化Simpson公式通过编程计算积分,并分析和比较算法的效率差异和精度差异。
(3)用变步长梯形公式通过编程计算积分,并分析算法精度与二分法次数之间的关系。
(4)用Romberg公式通过编程计算积分,并分析算法精度与二分法次数之间的关系。
三、算法流程图:
(一)复化梯形求算法积流程图
(三)变步长梯形求积算法流程图
(二)复化Simpson求积算法流程图
(四)Romberg公式求积流程图
四、编程计算积分
(一)复化梯形:
(1)复化梯形算法描述
(1)输入求积区间a,b和区间等分数n
(2)计算步长hh=(b-a)/n
(3)对于i=0到i=n-1计算节点函数值f(a+i*h)
(4)计算积分值T=T+2*temp;
Tn=(f(a)+f(b)+T)*h/2;
(5)输出积分值
(2)复化梯形求积程序源代码
#include
#include
doublef(doublet)
{
return1/(1+t*t);
}
usingnamespacestd;
intmain()
{
inti,n;
doubleh,a,b,T,temp,Tn;
cout<<"请输入求积区间:
"<cin>>a>>b;
cout<<"请输入区间等分数:
"<cin>>n;
h=(b-a)/n;
temp=0;
T=0;
for(i=1;i{
temp=f(a+i*h);
T=T+2*temp;
}
Tn=(f(a)+f(b)+T)*h/2;
cout<<"经过复化梯形求积所得积分值T"<"<return0;
}
(3)调试过程,实验结果及分析:
1/(x*x)在区间[0,1]上8等分后,程序运行结果如下:
对区间等分后求每个子区间上的积分值,然后将每个子区间的积分值相加,就得到整个积分区间上的积分值,梯形公式具有一次代数精度。
(二)复化Simpson:
(1)复化Simpson算法描述
(1)输入求积区间a,b和区间等分数n
(2)计算步长hh=(b-a)/n
(3)对于i=0到n-1计算节点函数值temp1=f(a+i*h);
temp2=f(a+(i+0.5)*h);S1=S1+2*temp1;S2=S2+4*temp2;
(4)计算积分值Sn=(f(b)-f(a)+S1+S2)*h/6;
(5)输出积分值.
(2)复化Simpson算法程序源代码
#include
#include
doublef(doublet)
{
return1/(1+t*t);
}
usingnamespacestd;
intmain()
{
inti,n;
doubleh,a,b,S1,S2,temp1,temp2,Sn;
cout<<"请输入求积区间:
"<cin>>a>>b;
cout<<"请输入区间等分数:
"<cin>>n;
h=(b-a)/n;
temp1=0;
temp2=0;
S1=0;
S2=0;
for(i=0;i{
temp1=f(a+i*h);
temp2=f(a+(i+0.5)*h);
S1=S1+2*temp1;
S2=S2+4*temp2;
}
Sn=(f(b)-f(a)+S1+S2)*h/6;
cout<<"经过复化Simpson求积所得积分值S"<"<return0;
}
(3)调试过程,实验结果及分析:
1/(x*x)在区间[0,1]上8等分后,程序运行结果如下:
复化Simpson求积公式具有三次代数精度,因此在区间和区间等分数相同时,所取得的积分值结果比梯形公式更加精确。
和梯形公式一样都是利用线性组合来计算积分的近似值。
(三)变步长梯形求积:
(1)变步长梯形求积算法描述
(1)输入求积区间a,b和区间等分数n
(2)计算步长hh=(b-a)/n
(3)积分运算Fori=1ton-1;
temp1=f(a+i*h);T0=T0+2*temp1;
(4)输出经过N-1次变步长所得积分值Tn
(5)判断是否等分每个子区间后再求出积分值,是输入1,否输入0
Ifdir=0goto步骤9.
(6)等分后积分N++;n=2*n;h=(b-a)/n;temp=0;Fori=1ton/2
temp2=f(a+(2*i-1)*h);
temp=temp+temp2;
T[n-1]=T[n/2-1]/2+temp*h;Tn=T[n-1
(7)输出经过N-1次变步长所得积分值Tn
(8)判断是否等分每个子区间后再求出积分值,是输入1,否输入0
Ifdir=1goto步骤6.
(9)输出经过N-1次变步长所得积分值Tn
(10)结束。
(2)变步长梯形求积程序源代码
#include
#include
doublef(doublet)
{
return1/(1+t*t);
}
usingnamespacestd;
intmain()
{
inti,n,N,dir;
doubleh,a,b,T0,temp,temp1,temp2,temp3,T[180];
cout<<"请输入求积区间:
"<cin>>a>>b;
cout<<"请输入区间等分数:
"<cin>>n;
h=(b-a)/n;
temp=0;
temp1=0;
temp2=0;
temp3=0;
T0=0;
N=1;
for(i=1;i{
temp1=f(a+i*h);
T0=T0+2*temp1;
}
T[n-1]=(f(a)+f(b)+T0)*h/2;
cout<<"经过"<"<loop:
if(N>1)
{temp=0;
for(i=1;i<(n/2+1);i++)
{
temp2=f(a+(2*i-1)*h);
temp=temp+temp2;
}
T[n-1]=T[n/2-1]/2+temp*h;
cout<<"经过"<"<}
cout<<"是否需要继续二等分每个子区间,如果是,请输入:
1如果否,请输入:
0"<cin>>dir;
while(dir>0)
{
N++;
n=2*n;
h=(b-a)/n;
gotoloop;
}
if(dir<1)
cout<<"经过"<"<return0;
}
(3)调试过程,实验结果及分析:
1/(x*x)在区间[0,1]上2等分后,程序运行结果如下
变步长梯形求积中对于n等分后Tn不满足精度要求可以等分每个子区间来求T2n的值此时只需计算新增节点的函数值,因而计算量变小了,程序运行速度也提高了。
(四)Romberg:
(1)Romberg公式求积算法描述
(1)输入求积区间a,b和区间等分数n
(2)计算步长hh=(b-a)/n
(3)计算Tn
(4)利用Tn分别求出T2n,T4n,T8n
(5)利用Tn,T2n,T4n,T8n分别求出Sn,S2n,S4n.
(6)利用Sn,S2n,S4n分别求出Cn,C2n..
(7)利用Cn,C2n求出Rn.
(2)Romberg公式求积程序源代码
#include
#include
doublef(doublet)
{
return1/(1+t*t);
}
usingnamespacestd;
intmain()
{
inti,j,n;
doubleh,a,b,T0,temp,temp1,temp2,temp3,T[180],S[180],C[180],R[180];
cout<<"请输入求积区间:
"<cin>>a>>b;
cout<<"请输入区间等分数:
"<cin>>n;
h=(b-a)/n;
temp=0;
temp1=0;
temp2=0;
temp3=0;
T0=0;
for(i=1;i{
temp1=f(a+i*h);
T0=T0+2*temp1;
}
T[n-1]=(f(a)+f(b)+T0)*h/2;
for(j=0;j<3;j++)
{
temp=0;
n=2*n;
h=(b-a)/n;
for(i=1;i<(n/2+1);i++)
{
temp2=f(a+(2*i-1)*h);
temp=temp+temp2;
}
T[n-1]=T[n/2-1]/2+temp*h;
}
S[n/8-1]=(4*T[n/4-1]-T[n/8-1])/3;
S[n/4-1]=(4*T[n/2-1]-T[n/4-1])/3;
S[n/2-1]=(4*T[n-1]-T[n/2-1])/3;
C[n/4-1]=(16*S[n/2-1]-S[n/4-1])/15;
C[n/8-1]=(16*S[n/4-1]-S[n/8-1])/15;
R[n/8-1]=(64*C[n/4-1]-C[n/8-1])/63;
cout<<"经过Romberg公式所得积分值R"<return0;
}
(3)调试过程,实验结果及分析:
1/(x*x)在区间[0,1]上2等分后,程序运行结果如下:
Romberg积分公式在积分结果中加入了事后误差估计值进行补偿,因而积分计算的收敛加速,并且仅采用梯形求积法不断折半步长,就可以逐步加工出Sn,S2n,S4n,Cn,C2n,Rn等精度较高的积分结果。
第三次试验小结
1、通过试验进一步学习了积分和微分的数值计算方法,其基本原理主要是逼近论,即设法构造某个简单函数近似表示,然后对求积或求导得到的积分或导数的近似值。
基于差值原理,推导出数值积分和数值微分的基本公式。
2、插值型求积公式有公式和公式两类。
前者取等距节点,算法简单而且容易编制程序。
但是,由于其收敛性和稳定性都没有保证,所以,常用的低阶复化公式。
3、公式不但具有最高代数精度,而且收敛性和稳定性都有保证,因此是高精度的求积公式。
公式还可以通过选择恰当的权函数,用于计算奇异积分和广义积分,也可以是一些复杂的积分计算简化。
公式的主要缺点是节点与系数无规律。
所以高阶公式不便于上机使用。
实际应用中可以把低阶公式进行复化。
4、算法是在积分区间逐次二分的过程中,通过对梯形值进行外推加速处理,从而获得高精度的积分近似值。
它具有自动选取步长的特点,便于在计算机上使用。
外推的思想在数值微分,微分方程数值解等方法中也可以得到应用。