数值分析报告实验报告材料华科书本实验4.1附C程序.doc
word实验目的:复化求积公式计算定积分试验题目:数值计算如下各式右端定积分的近似值。1;2;3;4;实验要求:1假如用复化梯形公式、复化Simpson公式和复化Gauss-Legendre I型公式做计算,要求绝对误差限为,分别利用他们的余项对每种算法做出步长的事前估计。2分别用复化梯形公式、复化Simpson公式和复化Gauss-Legendre I型公式做计算。3将计算结果与准确解做比拟,并比拟各种算法的计算量。实验容:1复化梯形公式:=;余项:;2复化Simpson公式: =;余项:;3复化Gauss-Legendre I型公式:;余项:;1;如此可以得到:;估计步长:;将上述结果分别带入到复化梯形公式、复化Simpson公式和复化Gauss-Legendre I型公式的余项中可以得到:复化梯形公式:;复化Simpson公式:;复化Gauss-Legendre I型公式:;2;如此可以得到:;估计步长:;将上述结果分别带入到复化梯形公式、复化Simpson公式和复化Gauss-Legendre I型公式的余项中可以得到:复化梯形公式:;复化Simpson公式:;复化Gauss-Legendre I型公式:;3;如此可以得到:;估计步长:;将上述结果分别带入到复化梯形公式、复化Simpson公式和复化Gauss-Legendre I型公式的余项中可以得到:复化梯形公式:;复化Simpson公式:;复化Gauss-Legendre I型公式:;4;如此可以得到:;估计步长:;将上述结果分别带入到复化梯形公式、复化Simpson公式和复化Gauss-Legendre I型公式的余项中可以得到:复化梯形公式:;复化Simpson公式:;复化Gauss-Legendre I型公式:;3.C+编程计算结果1区间逐次分半求积法:依据“事后误差法,将区间逐次分半进展计算,并利用前后两次计算结果来判断误差的大小。在逐次二分进展计算时,可以用与来估计误差,这种直接用计算结果来估计误差的方法通常称作误差的事后估计法,假如为计算结果允许的误差,如此停止计算,并取作为积分的近似值;否如此将区间再次二分后算出,并检验不等式是否满足。由于是区间分半,因此区间等分数必定是2的n次方。完毕输出结果选择题号N复化公式函数选择f(x)开始2流程图:3计算结果与误差:分别对4题作复化Trapezoid、Simpson、Gauss_Legendre计算,并计算计算值与准确值之间的误差,结果如下表:1计算结果表 数据类型求积类型1计算值区间二分相邻误差绝对误差区间二分等分复化Trapezoid公式20435094.18e-0081.3935e-008211=2048复化Simpson公式99529082.76e-00825=32Gauss_LegendreI公式687838625=322计算结果表 数据类型求积类型2计算值区间二分相邻误差绝对误差区间二分等分复化Trapezoid公式1385336e-007e-008211=2048复化Simpson公式5122482e-007e-00923=8Gauss_LegendreI公式5527155e-007e-00923=83计算结果表 数据类型求积类型3计算值区间二分相邻误差绝对误差区间二分等分复化Trapezoid公式49690861.31e-007e-008211=2048复化Simpson公式45413181.32e-008e-25=32Gauss_LegendreI公式44388811.4e-007e-00924=164计算结果表 数据类型求积类型4计算值区间二分相邻误差绝对误差区间二分等分复化Trapezoid公式1970612e-008e-008213=8192复化Simpson公式07563761.29e-007e-00925=32Gauss_LegendreI公式9317526e-008e-00925=32由上表中的误差分析可知,利用题目所要求的复化求积公式运算的结果均在绝对误差限,精度满足要求。由各种算法的步长可知,复化梯形公式、复化Simpson公式和复化Gauss_LegendreI公式在一样精度的情况下,其步长依次减少,相应地,其计算量也依次递减。四、总结由于计算过程使用的“事后误差估计法,区间分半,因此区间都是划分为2的k次方等分,因此最后实际等分数应该是大于由余项计算得出的区间等分数的某个2的k次方。例如1,由余项计算法求出的复化梯形公式、Simpson公式、Gauss_LegendreI公式的区间等分数n分别为1792、21、19,而“事后误差估计法的区间等分数n为相应的2048、32、32,这个结果符合实际情况。这次数值分析试验,加深我对复化求积公式的理解。通过此次数值分析试验,我掌握了利用复化求积公式求解定积分的方法。相信,在未来的科研中,作为数值计算根本工具的复化求积方法,一定会为科研过程中遇到的数值计算问题提供极大的便利。感谢与我共同探讨该问题的几位同学,感谢知识渊博的路教师!5.附C+程序#include<iostream>#include<iomanip>#include<math.h>usingnamespace std;int N;/*全局变量N,作为题号输入的同时选择对应的f(x)函数*/double a,b,t,s,g,tol=0.5e-7;double f(double x);/*菜单函数*/int select_menu()do/system("cls");cin>>N;while (N<0|N>4);return N;/*主函数*/int main()double v1,v2,v3,v4,e;double Trapezoid(),Simpson(),Gauss_Legendre();cout<<setw(40)<<"实验4.1"<<endl<<"请输入题号1-4,将依次以复化梯形、Simpson、Gauss_Legendre公式"<<endl;for (;)switch(select_menu()/*switch循环选择题号*/case(1):a=2;b=3;v1=log(a)-log(b);cout<<"实验题(1)的准确计算值为:"<<setprecision(15)<<"v="<<v1<<endl;cout<<" 复化梯形公式计算机结果:"Trapezoid();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v1-t)<<" < 0.5e-007"<<endl;cout<<" 复化Simpson公式计算结果:"Simpson();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v1-s)<<" < 0.5e-007"<<endl;cout<<" 复化Gauss_Legendre结果:"Gauss_Legendre();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v1-g)<<" < 0.5e-007"<<endl;system("pause>nul");break;case(2):a=0;b=1;cout<<"实验题(2)的准确计算值为:"<<setprecision(15)<<"v="<<v2<<endl;cout<<" 复化梯形公式计算机结果:"Trapezoid();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v2-t)<<" < 0.5e-007"<<endl;cout<<" 复化Simpson公式计算结果:"Simpson();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v2-s)<<" < 0.5e-007"<<endl;cout<<" 复化Gauss_Legendre结果:"Gauss_Legendre();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v2-g)<<" < 0.5e-007"<<endl;system("pause>nul");break;case(3):a=0;b=1;v3=2/log(3);cout<<"实验题(3)的准确计算值为:"<<setprecision(15)<<"v="<<v3<<endl;cout<<" 复化梯形公式计算机结果:"Trapezoid();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v3-t)<<" < 0.5e-007"<<endl;cout<<" 复化Simpson公式计算结果:"Simpson();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v3-s)<<" < 0.5e-007"<<endl;cout<<" 复化Gauss_Legendre结果:"Gauss_Legendre();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v3-g)<<" < 0.5e-007"<<endl;system("pause>nul");break;case(4):a=1;b=2;v4=exp(2);cout<<"实验题(4)的准确计算值为:"<<setprecision(15)<<"v="<<v4<<endl;cout<<" 复化梯形公式计算机结果:"Trapezoid();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v4-t)<<" < 0.5e-007"<<endl;cout<<" 复化Simpson公式计算结果:"Simpson();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v4-s)<<" < 0.5e-007"<<endl;cout<<" 复化Gauss_Legendre结果:"Gauss_Legendre();cout<<" 绝对误差:e="<<setprecision(5)<<abs(v4-g)<<" < 0.5e-007"<<endl;system("pause>nul");break;case(0):cout<<"选择退出"<<endl;exit(0);/break;return 0;/*Trapezoid公式*/double Trapezoid()int k=1,i,n;double t0=0,h,sum;t=(f(a)+f(b)*(b-a)/2;while(abs(t-t0)>=(tol*3)/*事后误差估计,验证前后两次区间分半后的计算值是否小于3*tol,假如是,如此循环完毕*/sum=0;n=2;n=n<<(k-1);t0=t;h=(b-a)/n;for(i=1;i<n;i+)sum+=f(a+i*h);t=h*(f(a)+f(b)/2+h*sum;k=k+1;cout<<setprecision(15)<<"t="<<t<<" 区间等分:n=2"<<k-1<<""<<"="<<n<<endl;cout<<setprecision(3)<<" 相邻误差:abs(t-t0)="<<abs(t-t0)<<" < 1.50e-007"<<endl;return t;/*Simpson公式*/double Simpson()int k=1,i,n;double s0=0,h,sum,sum1;s=(f(a)+4*f(a+b)/2)+f(b)*(b-a)/6;while(abs(s-s0)>=(tol*3)/*事后误差估计,验证前后两次区间分半后的计算值是否小于3*tol,假如是,如此循环完毕*/sum=0;n=2;n=n<<(k-1);s0=s;h=(b-a)/n;sum1=f(a+h/2);for(i=1;i<n;i+)sum+=f(a+i*h);sum1+=f(a+i*h+h/2);s=h*(f(a)+4*sum1+2*sum+f(b)/6;k=k+1;cout<<setprecision(15)<<"s="<<s<<" 区间等分:n=2"<<k-1<<""<<"="<<n<<endl;cout<<setprecision(3)<<" 相邻误差:abs(s-s0)="<<abs(s-s0)<<" < 1.50e-007"<<endl;return s;/*Gauss_Legendre公式*/double Gauss_Legendre()int k=1,i,n;double g0=0,h,sum;g=(f(a+b)/2-(b-a)/(2*sqrt(3)+f(a+b)/2+(b-a)/(2*sqrt(3)*(b-a)/2;while(abs(g-g0)>=(tol*3)/*事后误差估计,验证前后两次区间分半后的计算值是否小于3*tol,假如是,如此循环完毕*/sum=0;n=2;n=n<<(k-1);g0=g;h=(b-a)/n;for(i=0;i<n;i+)sum+=(f(a+i*h+h/2-h/(2*sqrt(3)+f(a+i*h+h/2+h/(2*sqrt(3);g=h*sum/2;k=k+1;cout<<setprecision(15)<<"g="<<g<<" 区间等分:n=2"<<k-1<<""<<"="<<n<<endl;cout<<setprecision(3)<<" 相邻误差:abs(g-g0)="<<abs(g-g0)<<" < 1.50e-007"<<endl;return g;/*依据题号自动选择对应的f(x)函数*/double f(doublex)switch(N)case(1):return(-2.0/(x*x-1);break;case(2):return(4.0/(x*x+1);break;case(3):return(pow(3,x);break;case(4):return(x*(exp(x);break;return 0;11 / 11