《计算方法与实习》实验报告.doc
课程:计算方法与实习学期:2010-2011学年第三学期 习题一:用两种不同的顺序计算,分析其误差的变化。思路分析用一个循环语句,对从1到10000进行叠加,两种不同顺序指从1叠加到10000和从10000叠加到1,每隔一定的叠加次数就比较一次误差。用C+语言编程(1)从1叠加到10000源代码如下:#include<iostream>#include<cmath>#include <iomanip>using namespace std;int main()double N=10000,i=0;int a;double n=0,S=1.644834;for(i=1;i<=N;i+)n+=1/(i*i);a=i;if(a%500=0)cout<<setprecision(7)<<"迭代"<<a<<"次时,和为:S="<<n<<'t'<<"误差为:i="<<fabs(S-n)<<endl<<endl;return 0;运行结果如下:迭代500次时,和为:S=1.642936 误差为:i=0.001897934迭代1000次时,和为:S=1.643935 误差为:i=0.0008994333迭代1500次时,和为:S=1.644268 误差为:i=0.0005663776迭代2000次时,和为:S=1.644434 误差为:i=0.0003998082迭代2500次时,和为:S=1.644534 误差为:i=0.0002998532迭代3000次时,和为:S=1.644601 误差为:i=0.0002332109迭代3500次时,和为:S=1.644648 误差为:i=0.0001856066迭代4000次时,和为:S=1.644684 误差为:i=0.0001499019迭代4500次时,和为:S=1.644712 误差为:i=0.0001221307迭代5000次时,和为:S=1.644734 误差为:i=9.991315e-005迭代5500次时,和为:S=1.644752 误差为:i=8.173481e-005迭代6000次时,和为:S=1.644767 误差为:i=6.658593e-005迭代6500次时,和为:S=1.64478 误差为:i=5.376747e-005迭代7000次时,和为:S=1.644791 误差为:i=4.278009e-005迭代7500次时,和为:S=1.644801 误差为:i=3.32576e-005迭代8000次时,和为:S=1.644809 误差为:i=2.492534e-005迭代8500次时,和为:S=1.644816 误差为:i=1.757329e-005迭代9000次时,和为:S=1.644823 误差为:i=1.103809e-005迭代9500次时,和为:S=1.644829 误差为:i=5.19077e-006迭代10000次时,和为:S=1.644834 误差为:i=7.184807e-008Press any key to continue(2)从10000叠加到1的源代码如下:#include<iostream>#include<cmath>#include <iomanip>using namespace std;int main()double N=10000,i=0;int a;double n=0,S=1.644834;for(i=N;i>=1;i-)n+=1/(i*i);a=i;if(a=N)cout<<"以下为n大于200时每隔500所积累的和:"<<endl<<endl;if(a%500=0&&a>=200)cout<<setprecision(7)<<"n="<<a<<"时,和为:S="<<n<<'t'<<"误差为:i="<<fabs(S-n)<<endl<<endl;if(a=200)cout<<endl<<"以下为n小于200时每隔20所积累的和"<<endl<<endl;if(a<200&&a%10=0|a<=10)cout<<setprecision(7)<<"n="<<a<<"时,和为:S="<<n<<'t'<<"误差为:i="<<fabs(S-n)<<endl<<endl;return 0;运行结果如下:以下为n大于200时每隔500所积累的和:n=10000时,和为:S=1e-008 误差为:i=1.644834n=9500时,和为:S=5.273698e-006 误差为:i=1.644829n=9000时,和为:S=1.112228e-005 误差为:i=1.644823n=8500时,和为:S=1.765898e-005 误差为:i=1.644816n=8000时,和为:S=2.501281e-005 误差为:i=1.644809n=7500时,和为:S=3.334722e-005 误差为:i=1.644801n=7000时,和为:S=4.287235e-005 误差为:i=1.644791n=6500时,和为:S=5.386299e-005 误差为:i=1.64478n=6000时,和为:S=6.668556e-005 误差为:i=1.644767n=5500时,和为:S=8.183971e-005 误差为:i=1.644752n=5000时,和为:S=0.000100025 误差为:i=1.644734n=4500时,和为:S=0.0001222519 误差为:i=1.644712n=4000时,和为:S=0.0001500363 误差为:i=1.644684n=3500时,和为:S=0.0001857601 误差为:i=1.644648n=3000时,和为:S=0.0002333939 误差为:i=1.644601n=2500时,和为:S=0.000300085 误差为:i=1.644534n=2000时,和为:S=0.00040013 误差为:i=1.644434n=1500时,和为:S=0.0005668939 误差为:i=1.644267n=1000时,和为:S=0.0009005052 误差为:i=1.643933n=500时,和为:S=0.001902006 误差为:i=1.642932以下为n小于200时每隔20所积累的和n=180时,和为:S=0.005471021 误差为:i=1.639363n=160时,和为:S=0.006169577 误差为:i=1.638664n=140时,和为:S=0.007068433 误差为:i=1.637766n=120时,和为:S=0.008268157 误差为:i=1.636566n=100时,和为:S=0.009950172 误差为:i=1.634884n=80时,和为:S=0.01247846 误差为:i=1.632356n=60时,和为:S=0.01670633 误差为:i=1.628128n=40时,和为:S=0.02521511 误差为:i=1.619619n=20时,和为:S=0.05117083 误差为:i=1.593663n=10时,和为:S=0.1050663 误差为:i=1.539768n=9时,和为:S=0.117412 误差为:i=1.527422n=8时,和为:S=0.133037 误差为:i=1.511797n=7时,和为:S=0.1534452 误差为:i=1.491389n=6时,和为:S=0.181223 误差为:i=1.463611n=5时,和为:S=0.221223 误差为:i=1.423611n=4时,和为:S=0.283723 误差为:i=1.361111n=3时,和为:S=0.3948341 误差为:i=1.25n=2时,和为:S=0.6448341 误差为:i=0.9999999n=1时,和为:S=1.644834 误差为:i=7.184806e-008Press any key to continue结果分析从这两种不同顺序的结果来看,随着叠加次数的增加,误差是逐渐变小的,当全部叠加完之后,其结果达到了预期值1.644834,而且两种方法出来的最终误差是相同的习题二:用牛顿法求下列方程的根:(1);思路分析1.给定初始值,e为根的容许误差,N为迭代次数的容许值2.若或迭代次数大于N,则算法失败,结束,否则转向33.计算4.若则输出,否则令,转向2C+语言编程源代码如下:#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main()double x0=1,x1,e=0.00001,u;int i,N=100;cout<<"迭代过程数据如下:"<<endl<<endl;cout<<"k"<<setw(15)<<"x0"<<setw(15)<<"x1"<<setw(15)<<"误差"<<endl;for(i=1;i+)x1=x0-(x0*x0-exp(x0)/(2*x0-exp(x0);u=fabs(x1-x0);cout<<i<<setw(15)<<x0<<setw(15)<<x1<<setw(15)<<u<<endl;if(u<e|i>N)break;else x0=x1;if(i>N)cout<<"迭代次数超出限制,算法失败"<<endl;if(u<e&&i<=N)cout<<"算法成功,迭代次数为:n="<<i<<endl;return 0;实验结果如下:迭代过程数据如下:k x0 x1 误差1 1 -1.39221 2.392212 -1.39221 -0.835088 0.5571243 -0.835088 -0.709834 0.1252534 -0.709834 -0.703483 0.006350695 -0.703483 -0.703467 1.59816e-0056 -0.703467 -0.703467 1.0107e-010算法成功,迭代次数为:n=6Press any key to continue第三章第1题(1):编写用追赶法解三对角线性方程组的程序,并解下列方程组:,其中,思路分析1.用一个二维数组存储an,bn,cn,xi,dn2.用一个循环语句迭代和,使矩阵变换为上三角矩阵3.求出xn3.用一个循环语句完成回代法,C+语言编程源代码如下:#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main()double s510;int i,j,n=5,m=10;for(i=0;i<=n-1;i+)for(j=0;j<=m-1;j+)if(i=0)sij=1;/an赋值else if(i=1)sij=-4;/bn赋值else if(i=2)sij=1;/cn赋值else if(i=3)sij=0;/xn赋值else if(i=4&&j=0)sij=-27;/dn赋值else if(i=4&&j!=0)sij=-15;for(i=0;i<=m-2;i+)s4i+1=s4i+1-(s0i/s1i)*s4i;s1i+1=s1i+1-(s0i/s1i)*s2i;s0i=0;s09=0;s39=s49/s19;for(i=m-2;i>=0;i-)s3i=(s4i-s2i*s3i+1)/s1i;cout<<"方程的解如下:"<<endl; for(i=0;i<=m-1;i+)cout<<"x"<<i<<"="<<s3i<<endl;return 0;实验结果如下:方程的解如下:x0=8.70576x1=7.82303x2=7.58637x3=7.52245x4=7.50344x5=7.49131x6=7.46179x7=7.35584x8=6.96156x9=5.49039Press any key to continue习题4、分别用雅可比迭代法与高斯塞德尔迭代法解下列方程组:,其中,一、雅可比迭代法思路分析1.用一个二维数组存储方程组的各项系数,两个数组x0,x1分别存储和2.用三个嵌套的循环语句,第一层把上一次循环的x1赋给x0,并判断是否符合方程解,第二层和第三层进行雅克比迭代3.输出方程的解C+语言编程源代码如下:/雅克比迭代式#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main()double s910= 31,-13,0,0,0,-10,0,0,0,-15,-13,35,-9,0,-11,0,0,0,0,27,0,-9,31,-10,0,0,0,0,0,-23,0,0,-10,79,-30,0,0,0,-9,0,0,0,0,-30,57,-7,0,-5,0,-20,0,0,0,0,7,47,-30,0,0,12,0,0,0,0,0,-30,41,0,0,-7,0,0,0,0,-5,0,0,27,-2,7,0,0,0,0,0,0,0,-2,29,-10,x19,x09,e=0.00001,u,s2=0;int i,j,h,N=0,n=0;for(i=0;i<=8;i+)x1i=x0i=1;cout<<"迭代过程数据如下:"<<endl<<endl;for(i=0;i+)for(j=0;j<=8;j+)x0j=x1j; for(j=0;j<=8;j+)for(h=0;h<=8;h+)if(h!=j)s2+=(sjh*x0h);x1j=(-s2+sj9)/sjj;s2=0;for(j=0;j<=8;j+)u=fabs(x1j-x0j);if(u<e)N+;if(N=9)break;cout<<"x1="<<x10<<'t'<<"x2="<<x11<<'t'<<"x3="<<x12<<'t'<<endl;cout<<"x4="<<x13<<'t'<<"x5="<<x14<<'t'<<"x6="<<x15<<'t'<<endl;cout<<"x7="<<x16<<'t'<<"x8="<<x17<<'t'<<"x9="<<x18<<'t'<<endl;cout<<endl;n+;cout<<"算法成功,迭代次数为:n="<<n<<endl;return 0;实验结果如下:迭代过程数据如下:x1=0.258065 x2=1.71429 x3=-0.129032x4=0.620253 x5=0.385965 x6=0.744681x7=0.560976 x8=0.518519 x9=-0.275862x1=0.475243 x2=0.955405 x3=-0.044158x4=0.0988084 x5=0.112508 x6=0.555905x7=0.374157 x8=0.3103 x9=-0.309068x1=0.0961066 x2=0.971952 x3=-0.432686x4=0.00192468 x5=-0.203384 x6=0.477386x7=0.236028 x8=0.2572 x9=-0.323428x1=0.0777173 x2=0.631942 x3=-0.459135x4=-0.168851 x5=-0.268676 x6=0.436266x7=0.178575 x8=0.197638 x9=-0.32709x1=-0.0781318 x2=0.597791 x3=-0.612936x4=-0.197411 x5=-0.368833 x6=0.409319x7=0.148488 x8=0.185276 x9=-0.331197x1=-0.101146 x2=0.468877 x3=-0.632064x4=-0.255381 x5=-0.388258 x6=0.405031x7=0.12877 x8=0.166424 x9=-0.33205x1=-0.15659 x2=0.449305 x3=-0.688191x4=-0.265276 x5=-0.420949 x6=0.395338x7=0.125632 x8=0.162763 x9=-0.33335x1=-0.167924 x2=0.404005 x3=-0.697065x4=-0.284944 x5=-0.427669 x6=0.398205x7=0.11854 x8=0.156613 x9=-0.333603x1=-0.185996 x2=0.395401 x3=-0.716561x4=-0.288647 x5=-0.438207 x6=0.394678x7=0.120638 x8=0.15535 x9=-0.334027x1=-0.190742 x2=0.380363 x3=-0.720254x4=-0.295165 x5=-0.4407 x6=0.397587x7=0.118057 x8=0.153367 x9=-0.334114x1=-0.19611 x2=0.376868 x3=-0.726722x4=-0.296589 x5=-0.443948 x6=0.396311x7=0.120185 x8=0.152899 x9=-0.334251x1=-0.197987 x2=0.37219 x3=-0.728196x4=-0.298657 x5=-0.444895 x6=0.398153x7=0.119252 x8=0.152287 x9=-0.334283x1=-0.199355 x2=0.370816 x3=-0.730221x4=-0.299207 x5=-0.445811 x6=0.397698x7=0.1206 x8=0.15211 x9=-0.334325x1=-0.200078 x2=0.369499 x3=-0.730798x4=-0.299816 x5=-0.446171 x6=0.398695x7=0.120267 x8=0.151937 x9=-0.334337x1=-0.200308 x2=0.368969 x3=-0.731376x4=-0.300027 x5=-0.446385 x6=0.398536x7=0.120996 x8=0.151869 x9=-0.334349x1=-0.200582 x2=0.368668 x3=-0.731598x4=-0.300183 x5=-0.446521 x6=0.399034x7=0.12088 x8=0.151829 x9=-0.334354x1=-0.200548 x2=0.368466 x3=-0.731736x4=-0.300263 x5=-0.446546 x6=0.39898x7=0.121244 x8=0.151803 x9=-0.334357x1=-0.20065 x2=0.368436 x3=-0.731821x4=-0.30029 x5=-0.446597 x6=0.399216x7=0.121205 x8=0.151798 x9=-0.334358x1=-0.200586 x2=0.36836 x3=-0.731838x4=-0.300321 x5=-0.446583 x6=0.399198x7=0.121377 x8=0.151789 x9=-0.334359算法成功,迭代次数为:n=19Press any key to continue二、高斯赛德尔迭代法思路分析1.用一个二维数组存储方程组的各项系数,两个数组x0,x1分别存储和2.用三个嵌套的循环语句,第一层把上一次循环的x0赋给x1用于判断是否符合精度要求,并判断是否符合精度要求,第二层和第三层进行高斯塞德尔迭代3.输出方程的解C+语言编程源代码如下:/高斯赛德尔迭代法#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main()double s910= 31,-13,0,0,0,-10,0,0,0,-15,-13,35,-9,0,-11,0,0,0,0,27,0,-9,31,-10,0,0,0,0,0,-23,0,0,-10,79,-30,0,0,0,-9,0,0,0,0,-30,57,-7,0,-5,0,-20,0,0,0,0,7,47,-30,0,0,12,0,0,0,0,0,-30,41,0,0,-7,0,0,0,0,-5,0,0,27,-2,7,0,0,0,0,0,0,0,-2,29,-10,x19,x09,e=0.00001,u,s2=0;int i,j,h,N=0,n=0;for(i=0;i<=8;i+)x1i=x0i=1;cout<<"迭代过程数据如下:"<<endl<<endl;for(i=0;i+)for(j=0;j<=8;j+)x1j=x0j; for(j=0;j<=8;j+)for(h=0;h<=8;h+)if(h!=j)s2+=(sjh*x0h);x0j=(-s2+sj9)/sjj;s2=0;for(j=0;j<=8;j+)u=fabs(x0j-x1j);if(u<e)N+;if(N=9)break;cout<<"x1="<<x00<<'t'<<"x2="<<x01<<'t'<<"x3="<<x02<<'t'<<endl;cout<<"x4="<<x03<<'t'<<"x5="<<x04<<'t'<<"x6="<<x05<<'t'<<endl;cout<<"x7="<<x06<<'t'<<"x8="<<x07<<'t'<<"x9="<<x08<<'t'<<endl;cout<<endl;n+;N=0;cout<<"算法成功,迭代次数为:n="<<n<<endl;return 0;实验结果如下:迭代过程数据如下:x1=0.258065 x2=1.43871 x3=-0.00166493x4=0.49346 x5=0.119365 x6=0.875839x7=0.470126 x8=0.355438 x9=-0.320315x1=0.401988 x2=0.957825 x3=-0.304677x4=-0.0297297 x5=-0.227786 x6=0.589325x7=0.260482 x8=0.19335 x9=-0.331493x1=0.107902 x2=0.661571 x3=-0.559457x4=-0.195084 x5=-0.364219 x6=0.47583x7=0.177436 x8=0.167256 x9=-0.333293x1=-0.0529445 x2=0.493434 x3=-0.661611x4=-0.260029 x5=-0.414628 x6=0.430329x7=0.144144 x8=0.157788 x9=-0.333946x1=-0.138131 x2=0.419683 x3=-0.703972x4=-0.284608 x5=-0.433983 x6=0.411961x7=0.130703 x8=0.154155 x9=-0.334196x1=-0.174984 x2=0.389018 x3=-0.720804x4=-0.294117 x5=-0.441562 x6=0.404511x7=0.125252 x8=0.152733 x9=-0.334294x1=-0.190247 x2=0.376639 x3=-0.727465x4=-0.29785 x5=-0.444566 x6=0.401479x7=0.123034 x8=0.15217 x9=-0.334333x1=-0.196416 x2=0.371691 x3=-0.730106x4=-0.29933 x5=-0.445766 x6=0.400242x7=0.122128 x8=0.151945 x9=-0.334349x1=-0.19889 x2=0.369716 x3=-0.731157x4=-0.29992 x5=-0.446249 x6=0.399736x7=0.121758 x8=0.151854 x9=-0.334355x1=-0.199882 x2=0.368925 x3=-0.731577x4=-0.300157 x5=-0.446444 x6=0.399529x7=0.121606 x8=0.151817 x9=-0.334357x1=-0.20028 x2=0.368608 x3=-0.731745x4=-0.300253 x5=-0.446523 x6=0.399444x7=0.121544 x8=0.151803 x9=-0.334358x1=-0.200441 x2=0.36848 x3=-0.731813x4=-0.300292 x5=-0.446555 x6=0.399409x7=0.121519 x8=0.151797 x9=-0.334359x1=-0.200505 x2=0.368429 x3=-0.731841x4=-0.300307 x5=-0.446568 x6=0.399394x7=0.121508 x8=0.151794 x9=-0.334359x1=-0.200532 x2=0.368408 x3=-0.731852x4=-0.300314 x5=-0.446573 x6=0.399388x7=0.121504 x8=0.151793 x9=-0.334359x1=-0.200542 x2=0.368399 x3=-0.731856x4=-0.300316 x5=-0.446576 x6=0.399386x7=0.121502 x8=0.151793 x9=-0.334359算法成功,迭代次数为:n=15Press any key to continue实验分析从两种迭代法的实验结果来看,高斯塞德尔迭代法比雅可比迭代法的收敛速度更快,可以用更少的迭代次数来得到方程的解。习题5、按下列数据0.300.420.500.580.660.721.044031.084621.118031.156031.198171.23223作五次插值,并求,时的函数近似值。思路分析可用拉格朗日差值多项式作五次插值,用一个双层嵌套的循环语句来计算拉格朗日多项式,内层计算,外层计算C+语言编程源代码如下:#include<iostream>#include<cmath>#include <iomanip>using namespace std;double chazhi(double x)double xi6=0.30,0.42,0.50,0.58,0.66,0.72,yi6=1.04403,1.08462,1.11803,1.15603,1.19817,1.23223,li6=1,1,1,1,1,1,Ln=0;int i,j;for(i=0;i<=5;i+)for(j=0;j<=5;j+)if(j!=i)lii*=(x-xij)/(xii-xij);lii*=yii;Ln+=lii;return Ln;int main()cout<<"五次插值的结果如下:"<<endl<<endl;cout<<"x=0.46时,y="<<setprecision(7)<<chazhi(0.46)<<endl;cout<<"x=0.55时,y="<<setprecision(7)<<chazhi(0.55)<<endl;cout<<"x=0.60时,y="<<setprecision(7)<<chazhi(0.60)<<endl;return 0;实验结果如下:五次插值的结果如下:x=0.46时,y=1.100724x=0.55时,y=1.141271x=0.60时,y=1.166194Press any key to continue习题6、试分别用抛物线和指数曲线拟合下列数据11.522.533.544.533.479.50122.65159.05189.15214.15238.65252.5055.566.577.58267.55280.50296.65301.40310.40318.15325.15比较两个拟合函数的优劣。一、抛物线拟合思路分析套用最小二乘法的解题思路,先求取正规方程组,再用高斯消元法解得正规方程组的解即为抛物线拟合的系数,a,b,c。C+语言编程源代码如下:#include<iostream>#include<cmath>#include <iomanip>using namespace std;int main()double x15=1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8,y15=3