1、东北大学数值分析实验报告实验一 迭代格式的比较一、问题提出设方程f(x)=x- 3x 1=0 有三个实根 x=1.8793 , x=-0.34727 ,x=-1.53209现采用下面三种不同计算格式,求 f(x)=0的根 x 或x 1、x = 2、x = 3、x = 二、要求1、编制一个程序进行运算,最后打印出每种迭代格式的敛散情况;2、用事后误差估计来控制迭代次数,并且打印出迭代的次数;3、初始值的选取对迭代收敛有何影响;4、分析迭代收敛和发散的原因。三、目的和意义1、通过实验进一步了解方程求根的算法;2、认识选择计算格式的重要性;3、掌握迭代算法和精度控制;4、明确迭代收敛性与初值选取的关
2、系。四、程序设计流程图 五、源程序代码#include #include float one(float x0)x1=(3*x0+1)/(x0*x0);return(x1);float two(float x0)x2=(pow(x0,3)-1)/3;return(x2);float three(float x0)x3=pow(3*x0+1,0.33333);return(x3);void main()float x,x0;float x1,x2,x3;int k1,k2,k3;printf(please input x0=);scanf(%f,&x);x0=x;x1=one(x0);print
3、f(第一个公式迭代结果:n);while(fabs(x0-x1)1e-5)printf(x1=%6.5fn,x1);x0=x1;x1=one(x0);k1+;printf(x1=%6.5fn,x1);printf( k1=%i,k1);x0=x;x2=two(x0);printf(第二个公式迭代结果为:n);while(fabs(x0-x2)1e-5)printf(x2=%6.5fn,x2);x0=x;x1=two(x0);k2+;printf(x2=%6.5fn,x2);printf( k2=%i,k2);x0=x;x3=three(x0);printf(第三个公式迭代结果为:n);whil
4、e(fabs(x0-x3)1e-5)printf(x3=%6.5fn,x3);x0=x;x1=three(x0);k3+;printf(x3=%6.5fn,x3);printf( k3=%i,k3);运行结果如下:结果分析:初值对迭代结果影响解析:实验二 线性方程组的直接算法一、问题提出给出下列几个不同类型的线性方程组,请用适当算法计算其解。1、设线性方程组=x= ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 ) Gsuss列主元消去法#include #include #include #define MAX 100typedef structint row,col;fl
5、oat MATMAXMAX;float SolutionMAX;Matrix;void Gauss(Matrix *M);void MBack(Matrix *M);void MSave(Matrix *M);void MInput(Matrix *M);void MOutput(Matrix *M);void Solution(Matrix *M);void MSort(Matrix *M,int n);void main() printf(列主元方法如下:n);Matrix Mat;MInput(&Mat);MSave(&Mat);Gauss(&Mat);MSave(&Mat);if(Ma
6、t.row=Mat.col-1) MBack(&Mat); Solution(&Mat);printf(Press any key to halt.);getch();void MInput(Matrix *M)int i,j;printf(输入行数:); scanf(%d,&M-row);printf(输入列数:); scanf(%d,&M-col);for(i=0;irow;i+) printf(第%d行:,i+1); for(j=0;jcol;j+) scanf(%f,&M-MATij); for(i=0;irow;i+) M-Solutioni = 0;void MOutput(Mat
7、rix *M)int i,j;printf(MATRIX:n);for(i=0;irow;i+) for(j=0;jcol;j+) printf(%10.3f,M-MATij); printf(n);printf(-END-n);void Gauss(Matrix *M)int i,j,k;float temp;for(i=0;irow-1;i+) MSort(M,i); MOutput(M); for(j=i+1;jrow;j+) temp = M-MATji; for(k=0;kcol;k+) if(temp!=0) M-MATjk /= temp; M-MATjk *= M-MATii;
8、 M-MATjk -= M-MATik; MOutput(M);void MSort(Matrix *M,int n)int i,j,k;float tempMAX;for(i=n;irow-1;i+) for(j=n;jrow-i-1;j+) if(fabs(M-MATjn)MATj+1n) for(k=0;kcol;k+) tempk = M-MATj+1k; M-MATj+1k = M-MATjk; M-MATjk = tempk; void MBack(Matrix *M)int i,j;float sum;M-SolutionM-row-1 = M-MATM-row-1M-col-1
9、 M-MATM-row-1M-row-1;for(i=M-row-2;i=0;i-) sum = M-MATiM-col-1; for(j=i+1;jrow;j+) sum -= M-MATij*M-Solutionj; M-Solutioni = sum/M-MATii;void Solution(Matrix *M)int i;printf(Solution:n);for(i=0;irow;i+) printf(X%d = %fn,i+1,M-Solutioni);printf(n-END-n);void MSave(Matrix *M)int i,j;FILE *eryar;eryar
10、= fopen(Matrix.txt,a);fprintf(eryar,-BEGIN-n);for(i=0;irow;i+) for(j=0;jcol;j+) fprintf(eryar,%10.3f,M-MATij); fprintf(eryar,n);fclose(eryar);2、设对称正定阵系数阵线方程组= x = ( 1, -1, 0, 2, 1, -1, 0, 2 )平方根法:源程序:#include#include#includeusing namespace std;int main() int n,i,j,k,m; coutn; double *A=new double*(n
11、+1); for(i=1;i=n;i+) Ai=new doublen+1; double *b=new doublen+1; double *x=new doublen+1; double *y=new doublen+1; cout输入系数对称正定矩阵A:endl; for(i=1;i=n;i+) for(j=1;jAij; cout输入向量b:; for(i=1;ibi; coutendl; for(k=1;k=n;k+) double sum=0; for(m=1;m=k-1;m+) sum=sum+pow(Akm,2.0); sum=Akk-sum; Akk=sqrt(sum); f
12、or(i=k+1;i=n;i+) double temp1=0; for(m=1;m=k-1;m+) temp1=temp1+Aim*Akm; temp1=Aik-temp1; Aik=temp1/Akk; double temp2=0; for(m=1;m=1;k-) double temp3=0; for(m=k+1;m=n;m+) temp3=temp3+Amk*xm; xk=(yk-temp3)/Akk; cout输出结果向量x:endl; for(i=1;i=n;i+) coutxiendl; return 0;3、三对角形线性方程组 = x= ( 2, 1, -3, 0, 1, -
13、2, 3, 0, 1, -1 )追赶法:源程序#include#include#includeusing namespace std;int main() int n,i; coutn; double *a=new doublen+1; double *c=new doublen+1; double *d=new doublen+1; double *b=new doublen+1; double *x=new doublen+1; double *y=new doublen+1; cout输入系数矩阵A数据:endl; for(i=1;iai; for(i=1;ici; for(i=1;id
14、i; cout输入b :endl; for(i=1;ibi; for(i=1;i=n-1;i+) ci=ci/ai; ai+1=ai+1-di+1*ci; cout输出解向量a:endl; for(i=1;i=n;i+)coutaiendl; cout输出解向量c:endl; for(i=1;i=n;i+)coutciendl; y1=b1/a1; for(i=2;i=n;i+) yi=(bi-di*yi-1)/ai; cout输出解向量y:endl; for(i=1;i=n;i+)coutyi=1;i-) xi=yi-ci*xi+1; cout输出解向量x:endl; for(i=1;i=n
15、;i+)coutxiendl; system(pause); return 0;运行结果课题三 线性方程组的迭代法一、问题提出对课题二所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR方法时,选取松弛因子=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。 三、目的和意义1、通过上机计算体会迭代法求解线
16、性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(予给的迭代次数),对迭代法敛散性的意义;4、体会初始解 x,松弛因子的选取,对计算结果的影响。1Jacobi 迭代法源程序:#include#include#includeusing namespace std;int main() int n,N; int i,j,k; double e; coutn; coutN; coute; double *A=new double*(n+1); for(i=1;i=n;i+) Ai=new doublen+1; double *
17、b=new doublen+1; double *x0=new doublen+1; double *x=new doublen+1; cout输入系数矩阵A:endl; for(i=1;i=n;i+) for(j=1;jAij; cout输入右端项b:endl; for(i=1;ibi; cout初始化解向量x0:endl; for(i=1;ix0i; for(k=1;k=N;k+) for(i=1;i=n;i+) double sum=0; for(j=1;j=n;j+) sum=sum+Aij*x0j; xi=x0i+(bi-sum)/Aii; double max=0; for(i=1
18、;imax) max=m; if(max=e) cout输出迭代次k:kendl; cout迭代后的解x:endl; for(i=1;i=n;i+) coutxiendl; system(pause); return 0; else for(i=1;i=n;i+) x0i=xi; cout已达到最大迭代次数:Nendl; cout迭代后的解x:endl; for(i=1;i=n;i+) coutxiendl; system(pause); return 0;2Gauss-Seidol迭代法源程序#include#include#includeusing namespace std;int ma
19、in() int n,N; int i,j,k; double e; coutn; coutN; coute; double *A=new double*(n+1); for(i=1;i=n;i+) Ai=new doublen+1; double *b=new doublen+1; double *x0=new doublen+1; double *x=new doublen+1; cout输入系数矩阵A:endl; for(i=1;i=n;i+) for(j=1;jAij; cout输入右端项b:endl; for(i=1;ibi; cout初始化解向量x0:endl; for(i=1;i
20、x0i; for(k=1;k=N;k+) for(i=1;i=n;i+) double sum=0; for(j=1;j=n;j+) if(ji) sum=sum+Aij*xj; else sum=sum+Aij*x0j; xi=x0i+(bi-sum)/Aii; double max=0; for(i=1;imax) max=m; if(max=e) cout输出迭代次k:kendl; cout迭代后的解x:endl; for(i=1;i=n;i+) coutxiendl; system(pause); return 0; else for(i=1;i=n;i+) x0i=xi; cout已
21、达到最大迭代次数:Nendl; cout迭代后的解x:endl; for(i=1;i=n;i+) coutxiendl; system(pause); return 0;3SOR方法源程序#include #include #include #include using namespace std;int main() int n; coutn; vectorvector va; vector vd; cout输入系数矩阵:endl; for(int i=0;in;+i) for(int j=0;jdtemp; vd.push_back(dtemp); va.push_back(vd); vd
22、.clear(); cout输入初始解向量:; vector vtemp; for(int i=0;idtemp; vd.push_back(dtemp); coutd; coutmcount; coutxd; vectorvector :iterator ia,iaend; ia=va.begin(); bool flag=true; int count=0; while(flag) double dmax=0.0; vtemp.assign(vd.begin(),vd.end(); for(int i=0;in;+i) double dtemp=0.0; for(int j=0;jn;+j)
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2