数值分析上机实验报告东北大学软件2011年姓名闫三木学号20093514 班级软件工程0908 指导教师邵新慧实验名称曲线拟合最小二乘法线性方程组迭代法开设学期2010 – 2011第二学期评定成绩评定人签字评定日期课题三 解线性方程组的迭代法一. 实验内容1、设线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------------------136824381004120291372642212341791110161035243120536217758683233761624491131512013012312240010563568000121324⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125x *= ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 )T 2、设对称正定阵系数阵线方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----------------------19243360021411035204111443343104221812334161206538114140231212200420424⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡87654321x x x x x x x x = ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---4515229232060x * = ( 1, -1, 0, 2, 1, -1, 0, 2 )T 3、三对角形线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------4100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x = ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----5541412621357x *= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )T试分别选用Jacobi 迭代法,Gauss-Seidol 迭代法和SOR 方法计算其解。
二. 实验要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。
三. 目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤∞+-)()1(k k x x < ε 或k >(予给的迭代次数),对迭代法敛散性的意义;4、体会初始解 x )0(,松弛因子的选取,对计算结果的影响。
四. 流程图设计 1.主要部分流程2.Jacobi 算法流程3.GS 算法流程图4.SOR算法流程五.结构程序设计#include<iostream>using namespace std;#define N 40const int n=10;int jacobi(fl oat *p,float b[],fl oat X[],fl oat x[],int n); int GS(float *p,fl oat b[],float X[],float x[],int n); int SOR(float *p,fl oat b[],float X[],float x[],int n); void print(fl oat *a,int r);void main(){fl oat A[10][10]={4,2,-3,-1,2,1,0,0,0,0,8,6,-5,-3,6,5,0,1,0,0,4,2,-2,-1,3,2,-1,1,9,4,0,-2,1,5,-1,3,-1,1,9,4,-4,2,6,-1,6,7,-3,3,2,3,0,2,-1,3,-4,2,5,3,0,1,16,10,-11,-9,17,34,2,-1,2,2,4,6,2,-7,13,9,2,0,12,4,0,0,-1,8,-3,-24,-8,6,3,-1};fl oat a[10]={7,5,-13,2,6,-12,14,-4,5,-5};fl oat X1[10]={0,0,0,0,0,0,0,0,0,0};fl oat x1[10];fl oat B[8][8]={4,2,-4,0,2,4,0,0,2,2,-1,-2,1,3,2,0,-4,-1,14,1,-8,-3,5,6,0,-2,1,6,-1,-4,-3,3,2,1,-8,-1,22,4,-10,-3,4,3,-3,-4,4,11,1,-4,0,2,5,-3,-10,1,14,2,0,0,6,3,-3,-4,2,19};fl oat b[8]={0,-6,6,23,11,-22,-15,45};fl oat X2[8]={0,0,0,0,0,0,0,0};fl oat x2[8];fl oat C[10][10]={4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4,-1,0,0,0,0,0,0,0,0,-1,4};fl oat c[10]={7,5,-13,2,6,-12,14,-4,5,-5};fl oat x3[10];fl oat X3[10]={0,0,0,0,0,0,0,0,0,0};fl oat *p[3];p[0]=&A[0][0];p[1]=&B[0][0];p[2]=&C[0][0];cout<<"Jacobi迭代法解第1个方程:"<<endl; jacobi(p[0],a,X1,x1,10);cout<<"Jacobi迭代法解第2个方程:"<<endl; jacobi(p[1],b,X2,x2,8);cout<<"Jacobi迭代法解第3个方程:"<<endl; jacobi(p[2],c,X3,x3,10);cout<<"Gauss-Seidel迭代法解第1个方程:"<<endl; GS(p[0],a,X1,x1,10);cout<<"Gauss-Seidel迭代法解第2个方程:"<<endl; GS(p[1],b,X2,x2,8);cout<<"Gauss-Seidel迭代法解第3个方程:"<<endl; GS(p[2],c,X3,x3,10);cout<<"SOR迭代法解第1个方程:"<<endl;SOR(p[0],a,X1,x1,10);cout<<"SOR迭代法解第2个方程:"<<endl;SOR(p[1],b,X2,x2,8);cout<<"SOR迭代法解第3个方程:"<<endl;SOR(p[2],c,X3,x3,10);}int jacobi(fl oat *p,float b[],fl oat X[],fl oat x[],int n) {int k,i,j;fl oat m,R,r,e;cout<<"请输入精度e:";cin>>e;for(k=0;k<N;k++){R=0;for(i=0;i<n;i++){m=0;for(j=0;j<n;j++){m=m+(*(p+i*n+j))*X[j];}x[i]=X[i]+(b[i]-m)/(*(p+i*n+i));r=x[i]-X[i];if(r<0)r=X[i]-x[i];if(r>R)R=r;}print(x,n);cout<<"迭代次数为:"<<k+1<<endl;return k;}for(j=0;j<10;j++)X[j]=x[j];}print(x,n);cout<<"迭代次数为:"<<k<<endl;cout<<"方程解发散,无法用Jacobi方法解此方程!"<<endl; return 0;}int GS(float *p,fl oat b[],float X[],float x[],int n){int i,j,k;fl oat t,R,r,e;cout<<"请输入精度e:";cin>>e;for(k=0;k<N;k++){for(i=0;i<n;i++){t=0;for(j=0;j<n;j++){if(j<i)t+=(*(p+i*n+j))*x[j];if(j>i)t+=(*(p+i*n+j))*X[j];}x[i]=(b[i]-t)/(*(p+i*n+i));}for(i=0;i<10;i++){r=x[i]-X[i];if(r<0)r=X[i]-x[i];}if(R<=e&&R>0){print(x,n);cout<<"迭代次数为:"<<k+1<<endl;return k;}for(j=0;j<8;j++)X[j]=x[j];}print(x,n);cout<<"迭代次数为:"<<k<<endl;cout<<"方程解发散,无法用Gauss-Seidel方法解此方程!"<<endl; return 0;}int SOR(float *p,fl oat b[],float X[],float x[],int n){int i,j,k;fl oat t,R,r,e,w;cout<<"请输入松弛因子w(0<w<2):";cin>>w;cout<<"请输入精度e:";cin>>e;for(i=0;i<n;i++)x[i]=X[i];for(k=0;k<N;k++){R=0;for(i=0;i<n;i++){t=0;for(j=0;j<n;j++)t+=(*(p+i*n+j))*x[j];r=w*(b[i]-t)/(*(p+i*n+i));x[i]+=r;if(r<0)r=-r;R=r;}if(R<=e&&R>0){print(x,n);cout<<"迭代次数:"<<k+1<<endl;return k;}}print(x,n);cout<<"迭代次数:"<<k<<endl;cout<<"方程解发散,无法使用SOR方法解此方程!!!!"<<endl; return 0;}void print(fl oat *a,int n){int j;fl oat *t=a;cout<<"x=( ";for(j=0;j<n-1;j++)cout<<*(t+j)<<",";cout<<*(t+j)<<")"<<endl;}六.结果讨论和分析程序运行截图:七.小结和体会通过这次实验,我对线性方程组的迭代算法有了更深的理解。