您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 理论文章 > 数值分析第四次实习报告
学生学号实验课成绩武汉理工大学学生实验报告书实验课程名称:数值分析(第四次实习)开课名称:计算机科学与技术学院指导老师姓名:熊盛武学生姓名:学生专业班级:软件工程0803班2009——2010学年第一学期一、计算实习的内容:实习1给定矩阵A与向量bA=0123012nnnnb=10000(1)求A的三角分解(不必输出);(2)利用A的三角分解解下列方程组:①Ax=b②A2x=b③A3x=b对第③题分析一下,如果先求M=A2,再解Mx=b,有何缺点?实习2追赶法的优点分别对n=5,100,300解下列方程组Ax=bA=2112112112b=7505再用现有的三角分解法程序解此方程组,比较一下两者的效率,哪种方法机时少,可求解的矩阵阶数高?实习3Jacobi迭代法与Gauss-Seidel迭代法的收敛性与收敛速度研究用Jacobi迭代法与Gauss-Seide迭代法解下列方程组Ax=b的收敛性,通过上机计算,验证分析是否正确,并观察右端项对迭代收敛是否有影响,比较两法的收敛速度。(1)A=413241126b1=423b2=345200100(2)A=10.80.80.810.80.80.81b1=321b2=5010(3)A=1371b=46实习4松弛因子对超松弛迭代法收敛速度的影响编写一个超松弛迭代法解方程组Ax=b的计算机程序,其中A=4114114114b=3223分别对不同的阶数(例如n=10,n=100)w=1.1,1.2,……,1.9进行迭代,记录近似解()(1)kkxxe=610时所用的迭代次数k,观察松弛因子对收敛速度的影响。实习5用欧拉公式求解二、计算实习:(一)三角分解法程序源代码#includeiostreamusingnamespacestd;intmain(){constintMAX_N=20;staticdoublea[MAX_N][MAX_N],b[MAX_N],x[MAX_N],y[MAX_N];staticdoubleu[MAX_N][MAX_N],l[MAX_N][MAX_N];inti,j,k,n,r;cout请输入矩阵阶数:;cinn;if(nMAX_N){coutTheinputnislargerthanMAX_N,pleaseredefinetheMAX_Nendl;return1;}if(n=0){coutpleaseinputnbetween1andMAX_N;return1;}//输入a[i][j],b[i]coutnowinputthematrixa[i][j],i,j=0...n-1:;for(i=0;in;i++){for(j=0;jn;j++)cina[i][j];}coutnowinputthematrixb[i],i=0...n-1:;for(i=0;in;i++)cinb[i];//分解过程for(i=0;in;i++)l[i][i]=1;//l矩阵对角元素为1for(k=0;kn;k++){for(j=0;jn-1;j++)//计算u矩阵{u[k][j]=a[k][j];for(r=0;r=k-1;r++)u[k][j]-=l[k][r]*u[r][j];}for(i=k+1;kn;i++)//计算l矩阵{l[i][k]=a[i][k];for(r=0;r=k-1;r++)l[i][k]-=l[i][r]*u[r][k];l[i][k]/=u[k][k];}}//ly=bfor(i=0;in;i++){y[i]=b[i];for(j=0;j=i-1;j++)y[i]-=l[i][r]*y[j];}//ux=yfor(i=n-1;i=0;i--){x[i]=y[i];for(j=i+1;jn;j++)x[i]-=u[i][j]*x[j];x[i]/=u[i][i];}cout方程组的解为:;//输出xfor(i=0;in;i++)coutx[i];return0;}(二)追赶法程序源代码#includeiostreamusingnamespacestd;intmain(){constintMAX_N=300;inta[MAX_N],b[MAX_N],c[MAX_N],d[MAX_N];floatl[MAX_N],r[MAX_N],y[MAX_N],x[MAX_N];inti,n;cout请输入矩阵阶数:;cinn;if(nMAX_N){coutTheinputnislargerthanMAX_N,pleaseredefinetheMAX_Nendl;return1;}if(n=0){coutpleaseinputnbetween1andMAX_N;return1;}//输入a[n],b[n],c[n],d[n]coutnowinputthematrixa[n],n=2...n:;for(i=2;i=n;i++)cina[i];coutnowinputthematrixb[n],n=1...n:;for(i=1;i=n;i++)cinb[i];coutnowinputthematrixc[n],n=1...n-1:;for(i=1;in;i++)cinc[i];coutnowinputthematrixd[n],n=1...n:;for(i=1;i=n;i++)cind[i];//追的过程r[0]=0;y[0]=0;a[1]=0;c[n]=0;for(i=1;i=n;i++){l[i]=b[i]-a[i]*r[i-1];r[i]=c[i]/l[i];y[i]=(d[i]-a[i]*y[i-1])/l[i];}//赶的过程coutendl;x[n]=y[n];for(i=n-1;i=1;i--){x[i]=y[i]-r[i]*x[i+1];\}cout方程组的解为:;for(i=1;i=n;i++){coutx[i];}coutendl;return0;}计算得解为:-2-3-3-3-2(三)雅可比迭代法和高斯赛德尔迭代法程序源代码#includeiostream#includecmathusingnamespacestd;inta,b,m;double*x0;voidJacobi(double**c,double*d,intn,doubleeps);voidGauss(double**c,double*d,intn,doubleeps);voidmain(){intn;double**A,*B;doublee;cout请选择求方程组的迭代方法!雅可比选0,高斯-赛德尔选1!endl;cinn;cout输入方程组的变量的个数以及方程的个数!endl;cinab;A=newdouble*[b];for(inti=0;ib;i++){A[i]=newdouble[a];}B=newdouble[b];x0=newdouble[a];cout输入每个方程组的变量的系数以及方程右端的值!endl;for(intk=0;kb;k++){for(intj=0;ja;j++){cinA[k][j];}cinB[k];}cout输入方程组迭代的次数及所要求的精度!endl;cinme;cout输入方程组迭代的初值!endl;for(intj=0;ja;j++){cinx0[j];}switch(n){case0:Jacobi(A,B,m,e);break;case1:Gauss(A,B,m,e);break;default:cout你没有选择求解方程组的一种方法!!endl;break;}}voidJacobi(double**c,double*d,intn,doubleeps){intk,i;double*y=newdouble[a],*x=newdouble[a],s,temp=0.0;k=1;while(1){temp=0.0;for(i=0;ia;i++){s=0.0;for(intj=0;ja;j++){if(j!=i){s+=c[i][j]*x0[j];}}s=(d[i]-s)/c[i][i];y[i]=s;if(fabs(x0[i]-s)temp){temp=fabs(x0[i]-s);}}if(tempeps){cout迭代成功!迭代结果为:endl;for(i=0;ia;i++){couty[i]=y[i]endl;}break;}if(k==m){cout迭代失败!!endl;break;}k+=1;for(i=0;ia;i++){x0[i]=y[i];}}}voidGauss(double**c,double*d,intn,doubleeps){intk,i;double*y=newdouble[a],*x=newdouble[a],s,temp=0.0;for(i=0;ia;i++){x[i]=x0[i];y[i]=x[i];}k=1;while(1){temp=0.0;for(i=0;ia;i++){s=0.0;for(intj=0;ja;j++){if(j!=i){s+=c[i][j]*y[j];}}s=(d[i]-s)/c[i][i];y[i]=s;if(fabs(x[i]-s)temp){temp=fabs(x[i]-s);}}if(tempeps){cout迭代成功!迭代结果为:endl;for(i=0;ia;i++){couty[i]=y[i]endl;}break;}if(k==m){cout迭代失败!!endl;break;}k+=1;for(i=0;ia;i++){x[i]=y[i];}}}用雅可比迭代法,程序运行结果如下:用高斯赛德尔迭代法程序运行结果如下:通过运行结果可以看出高斯赛德尔迭代法比雅可比迭代法所求结果精度高,收敛性好。(四)超松弛迭代法程序源代码#includeiostreamusingnamespacestd;#includemath.h#defineMAX_N20#defineMAXREPT100#defineepsilon0.00001intmain(){intn;inti,j,k;doubleerr,w;staticdoublea[MAX_N][MAX_N],b[MAX_N][MAX_N],c[MAX_N],g[MAX_N];staticdoublex[MAX_N],nx[MAX_N];coutinputnvalue(dimofAx=c):;//输入方程的维数cinn;if(nMAX_N){coutTheinputnislargerthanMAX_N,pleaseredefinetheMAX_Nendl;return1;}if(n=0){coutpleaseinputnbetween1andMAX_N;return1;}//输入a[i][j],c[i]coutnowinputthematrixa[i][j],i,j=0...n-1:;for(i=0;in;i++){for(j=0;jn;j++)cina[i][j];}coutnowinp
本文标题:数值分析第四次实习报告
链接地址:https://www.777doc.com/doc-6362300 .html