1数值分析上机报告2前言随着计算机技术的高速发展,越来越多的科技工作者使用计算机进行科学研究和解决工程技术问题。数值分析(或计算方法)课程的内容是科学工程计算的必备知识,已经成为众多理工科大学生、研究生的必修课程,越来越受到重视。由于工程实际中所遇到的数学模型求解过程迭代次数很多,计算量很大,所以需要借助很多编程软件来解决,得到一个满足误差限的解。本文所计算题目,均采用C++编程。在本文中使用C++编写了牛顿法、牛顿-Steffensen法方程求解的程序和雅格比法、高斯-赛德尔迭代法求解方程组的程序及Runge-Kutta4阶算法,并通过实例求解验证了其可行性,比较了求解同一种问题时不同方法之间的优缺性,其中包含解的精确度和解的收敛速度两个重要指标。1一牛顿法和牛顿-Steffensen法迭代求解的比较1.计算题目分别用牛顿法,及基于牛顿算法下的Steffensen加速法(1)求ln(x+sinx)=0的根。初值x0分别取0.1,1,1.5,2,4进行计算。(2)求sinx=0的根。初值x0分别取1,1.4,1.6,1.8,3进行计算。分析其中遇到的现象与问题。2.计算过程和结果1.对方程ln(x+sinx)=0,其导数有些复杂,我们可以对其进行变形,即求解x+sinx=1的解。使用牛顿法,令1sin)(xxxf,则xxfcos1)(,直至51101||kkxx时,结束迭代;然后再使用基于牛顿法的Steffensen加速法进行计算,直至51101||kkxx时,结束迭代。其迭代结果与迭代次数如下表所示(注N1为牛顿法迭代次数,N2为基于牛顿法Steffensen加速法迭代次数):x00.111.524牛顿法x0.5109730.5109730.5109730.5109730.510973N1445640牛顿—Steffensen加速法x0.5109730.510973无收敛解0.5109730.510973N233482.对方程sinx=0,使用牛顿法时,令xxfsin)(,使用牛顿法计算,直至51101||kkxx时,结束迭代;然后依据Steffensen加速法进行编程计算,直至51101||kkxx时,结束迭代。其迭代结果与迭代次数如下表所示:x011.41.61.83牛顿法x03.1415931.41596.283193.14159N157843牛顿—Steffensen加速法x无收敛解-3.1415925.13276.28319无收敛解N24632附:第一问牛顿法#includeiostream.h#includemath.h#defineEPS1.0e-5intmain(){doublex=0.0;doubley=0.0;intn=0;cout请输入初值X0endl;cinx;do{y=x;x=x-(x+sin(x)-1)/(1+cos(x));n++;}while(fabs(x-y)=EPS);coutXn=xendl;cout迭代次数为N=nendl;}第一问牛顿-Steffensen法#includeiostream.h#includemath.h#defineEPS1.0e-5intmain(){doublex=0.0;3doubley=0.0;doublez=0.0;doublea=0.0;intn=0;cout请输入初值x0endl;cinx;do{a=x;y=x-(x+sin(x)-1)/(1+cos(x));z=y-(y+sin(y)-1)/(1+cos(y));x=x-(y-x)*(y-x)/(z-2*y+x);n++;}while(fabs(x-a)=EPS);coutxn=xendl;cout迭代次数N=nendl;}第二问牛顿法#includeiostream.h#includemath.h#defineEPS1.0e-5intmain(){doublex=0.0;doubley=0.0;intn=0;cout请输入初值X0endl;cinx;do4{y=x;x=x-tan(x);n++;}while(fabs(x-y)=EPS);coutXn=xendl;cout迭代次数为N=nendl;}第二问牛顿-Steffensen法#includeiostream.h#includemath.hintmain(){doublex=0.0;doubley=0.0;doublez=0.0;doublea=0.0;intn=0;cout请输入初值x0endl;cinx;do{a=x;y=x-tan(x);z=y-tan(y);x=x-(y-x)*(y-x)/(z-2*y+x);n++;}while(fabs(x-a)=1.0E-05);5coutxn=xendl;cout迭代次数N=nendl;}3.结果分析从结果对比我们可发现牛顿—Steffensen加速法比牛顿法要收敛的快,牛顿法对于初值的选取特别重要,比如第(1)问中的初值为4的情况,迭代次数算了40次,远大于其余初值的情况;在第(2)问中的初值为1.6的情况,收敛解得31.4159,分析其原因应该是xxfcos)(',x0=1.62,0)('xf;在牛顿—Steffensen加速法第(1)问中x=1.5、第二问x=0和3的情况,无收敛解。二Jacobi迭代法与Causs-Seidel迭代法迭代求解的比较1.计算题目用雅格比法与高斯-赛德尔迭代法解下列方程组Ax=b,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。(1)A行分别为A1=[6,2,-1],A2=[1,4,-2],A3=[-3,1,4];b1=[-3,2,4]T,b2=[100,-200,345]T,(2)A行分别为A1=[1,0,8,0.8],A2=[0.8,1,0.8],A3=[0.8,0.8,1];b1=[3,2,1]T,b2=[5,0,-10]T,(3)A行分别为A1=[1,3],A2=[-7,1];b=[4,6]T,2.计算过程与结果(1)x0=[0,0,0]T为初始值,N为迭代次数,0.00001为误差精度,X为收敛解6Jacobi迭代Causs-Seidel迭代Ax=b1X[-0.727271,0.808083,0.252524][-0.727275,0.808082,0.252523]N2012Ax=b2X[36.3636,-2.0707,114.04][36.3636,-2.07071,114.04]N2617(2)Jacobi迭代Causs-Seidel迭代Ax=b1X无收敛解[5.76922,0.76922,-4.23075]N37Ax=b2X无收敛解[36.6923,7.69229,-42.3077]N44(3)Jacobi迭代Causs-Seidel迭代Ax=bX无收敛解无收敛解N附:雅格比法#includeiostream#includecmathusingnamespacestd;intmain(){doublea[10][10],b[10],sum=0.0,x[10],y[10],c,s=0.0;inti,k=0,n,j;cout请输入维数:;cinn;cout请输入数组A:;for(i=0;in;i++)for(j=0;jn;j++)cina[i][j];cout请输入数组B:;for(i=0;in;i++)cinb[i];cout请输入初始X:;for(i=0;in;i++)cinx[i];do{for(i=0;in;i++){for(j=0;ji;j++)7sum=sum+a[i][j]*x[j];for(j=i+1;jn;j++)sum=sum+a[i][j]*x[j];y[i]=(b[i]-sum)/a[i][i];sum=0;}c=0;for(i=0;in;i++)if(cfabs(x[i]-y[i]))c=fabs(x[i]-y[i]);if(c0.00001)c=0;elses=1;for(i=0;in;i++)x[i]=y[i];k++;}while(s!=1);for(i=0;in;i++)cout解为:x[i]endl;coutN=kendl;return0;}高斯-赛德尔迭代法#includeiostream#includecmathusingnamespacestd;intmain(){doublea[10][10],b[10],sum=0.0,x[10],y[10],c,s=0.0,z[10];inti,k=0,n,j;cout请输入维数:;cinn;cout请输入数组A:;for(i=0;in;i++)for(j=0;jn;j++)cina[i][j];cout请输入数组B:;for(i=0;in;i++)cinb[i];cout请输入初始X:;for(i=0;in;i++)cinx[i];do{for(i=1;in;i++)8z[i]=x[i];for(i=0;in;i++){for(j=0;ji;j++)sum=sum+a[i][j]*x[j];for(j=i+1;jn;j++)sum=sum+a[i][j]*x[j];y[i]=(b[i]-sum)/a[i][i];sum=0;x[i]=y[i];}c=0;for(i=0;in;i++)if(cfabs(z[i]-y[i]))c=fabs(z[i]-y[i]);if(c0.00001)c=0;elses=1;for(i=0;in;i++)z[i]=y[i];k++;}while(s!=1);for(i=0;in;i++)cout解为:x[i]endl;coutN=kendl;return0;}3.结果分析问题(1)中因系数矩阵严格对角占优,所以,无论采用Jacobi迭代法还是Causs-Seidel迭代法,其迭代过程均收敛。从迭代次数来看,方程组Ax=b1中Jacobi迭代法使用迭代次数20次,而Causs-Seidel迭代法使用迭代次数12次;方程组Ax=b2中Jacobi迭代法使用迭代次数26次,而Causs-Seidel迭代法使用迭代次数17次。可明显看出,在方程组绝对收敛的条件下,Causs-Seidel迭代法比Jacobi迭代法收敛速度快。问题(2)中,使用Jacobi迭代法方法时,其方程组不收敛,而采用Causs-Seidel迭代法迭代时,方程Ax=b1迭代37次,得到准确解;方程Ax=b2迭代44次,9得到准确解。这是因为,Jacobi迭代矩阵为:08.08.08.008.08.08.00,经计算其特征值λ为-1.6,0.8,0.8,其谱半径为)(B1.61,所以其迭代矩阵发散。而Causs-Seidel迭代矩阵为:768.0128.0016.064.008.08.00,经计算其特征值λ为0,0.7040+0.1280i,0.704280i,其谱半径为)(B0.71551,所以采用Causs-Seidel迭代法时,方程收敛。问题(3)中,采用Jacobi迭代法和Causs-Seidel迭代法其方程均不收敛,这是因为,Jacobi迭代矩阵为:0730,经计算其特征值λ为-4.5826i,4.5826i其谱半径为)(B4.58261,迭代方法发散。Causs-Seidel迭代矩阵为:21030,经计算其特征值λ为0,21,其谱半径为)(B,211,迭代方法发散。如果将方程系数矩阵两行进行交换,则为严格对角优