资源描述:
《高斯迭代法解线性方程组》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一.问题描述用Gauss-Seidel迭代法求解线性方程组由Jacobi迭代法中,每一次的迭代只用到前一次的迭代值。使用了两倍的存储空间,浪费了存储空间。若每一次迭代充分利用当前最新的迭代值,即在计算第个分量时,用最新分量,代替旧分量,,可以起到节省存储空间的作用。这样就得到所谓解方程组的Gauss-Seidel迭代法。二.算法设计将分解成,则等价于则Gauss-Seidel迭代过程故若设存在,则令则Gauss-Seidel迭代公式的矩阵形式为其迭代格式为(初始向量),或者三.程序框图开始读入数据,初始向量,增广矩阵k=N?输出迭代失败标志结束输出一.结果显示TestBench利用Gaus
2、s-Seidel迭代法求解下列方程组,其中取。运行程序依次输入:1.方阵维数1.增广矩阵系数2.初始向量得到:迭代12次后算出x[1]=-4.0x[2]=3.0x[3]=2.0一.程序#include#include#include#include#defineMAX_n100#definePRECISION0.0000001#defineMAX_Number1000voidVectorInput(floatx[],intn)//输入初始向量{inti;for(i=1;i<=n;++i){printf("x[%d]="
3、,i);scanf("%f",&x[i]);}}voidMatrixInput(floatA[][MAX_n],intm,intn)//输入增广矩阵{inti,j;printf("输入系数矩阵:");for(i=1;i<=m;++i){printf("增广矩阵行数%d:",i);for(j=1;j<=n;++j)scanf("%f",&A[i][j]);}}voidVectorOutput(floatx[],intn)//输出向量{inti;for(i=1;i<=n;++i)printf("x[%d]=%f",i,x[i]);}intIsSatisfyPricision(flo
4、atx1[],floatx2[],intn)//判断是否在规定精度内{inti;for(i=1;i<=n;++i)if(fabs(x1[i]-x2[i])>PRECISION)return1;return0;}intJacobi_(floatA[][MAX_n],floatx[],intn)//具体计算{floatx_former[MAX_n];inti,j,k;printf("初始向量x0:");VectorInput(x,n);k=0;do{for(i=1;i<=n;++i){printf("x[%d]=%f",i,x[i]);x_former[i]=x[i];}print
5、f("");for(i=1;i<=n;++i){x[i]=A[i][n+1];for(j=1;j<=n;++j)if(j!=i)x[i]-=A[i][j]*x[j];if(fabs(A[i][i])>PRECISION)x[i]/=A[i][i];elsereturn1;}++k;}while(IsSatisfyPricision(x,x_former,n)&&k=MAX_Number)return1;else{printf("Gauss-Seidel迭代次数为%d次",k);return0;}}intmain()//主函数{intn;float
6、A[MAX_n][MAX_n],x[MAX_n];printf("方阵维数n=");scanf("%d",&n);if(n>=MAX_n-1){printf(" 07nmust<%d!",MAX_n);exit(0);}MatrixInput(A,n,n+1);if(Jacobi_(A,x,n))printf("Gauss-Seidel迭代失败!");else{printf("结果:");VectorOutput(x,n);}printf(" 07Pressanykeytoquit!");getch();}