文档详情

高斯-赛德尔迭代法的算法及程序设计【最新资料】.doc

发布:2018-03-31约1.99万字共39页下载文档
文本预览下载声明
高斯-赛德尔迭代法的算法及程序设计 设方程组的系数矩阵的对角线元素,为迭代次数容许的最大值,为容许误差。 1 取初始向量令k=0. 2 对i=1,2,…,n计算 3 如果则输出结束;否则执行4 4 如果则不收敛,终止程序;否则,转2 源程序: #include stdio.h #include math.h #define N 600 void main() { int i; double x[4]; double c[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25}; void GaussSeidel(double *,int,double[]); GaussSeidel(c[0],4,x); for(i=0;i=3;i++) printf(x[%d]=%f\n,i,x[i]);} void GaussSeidel(double *a,int n,double x[]) { int i,j,k=1; double d,dx,eps; for(i=0;i=3;i++) while(1) {eps=0; for(i=0;i=3;i++) { d=0; for(j=0;j=4;j++) { if(j==i)continue; d+=*(a+i*(n+1)+j)*x[j]; } dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i)); eps+=fabs(dx-x[i]); x[i]=dx; } if(eps1e-6) {printf(迭代次数是:%d\n,k);return;} if(kN) { printf(迭代发散n\n); return; } } } 输出结果 结果分析: 从输出结果可以看出此方程组的迭代次数为1,此时能得到精确结果是    x[0]=-1.467391,x [1]=-2.358696,x[2] =0.657609,x[3] =2.842391 从结果和原有知识可以知道其系数矩阵是严格对角占优的。所以此迭代解法有很好的收敛性. 附录 C语言编程 源程序 #include stdio.h #include string.h #include math.h #include stdlib.h #define N 3 main() { int i,j,k,s; float a[N][N]={0},L[N][N]={0},U[N][N]={0},sigma1,sigma2; for(i=0;iN;i++) { L[i][i]=1; } for(i=0;iN;i++) { printf(请输入矩阵第%d行元素:\n,i+1); for(j=0;jN;j++) scanf(%f,a[i][j]); } for(i=0;iN;i++) { U[0][i]=a[0][i]; L[i][0]=a[i][0]/U[0][0]; } for(k=1;kN;k++) { for(j=k;jN;j++) { sigma1=0; for(s=0;s=k-1;s++) sigma1+=L[k][s]*U[s][j]; U[k][j]=a[k][j]-sigma1; } for(i=k;iN;i++) { sigma2=0; for(s=0;s=k-1;s++) sigma2+=L[i][s]*U[s][k]; L[i][k]=(a[i][k]-sigma2)/U[k][k]; } } printf(a矩阵为:\n); for(i=0;iN;i++) { for(j=0;jN;j++) printf(%5.1f ,a[i][j]); printf(\n); } printf(L矩阵为:\n); for(i=0;iN;i++) { for(j=0;jN;j++) printf(%5.1f ,L[i][j]); printf(\n); } printf(U矩阵为:\n); for(i=0;iN;i++) { for(j=0;jN;j++) printf(%5.1f ,U[i][j]); printf(\n); } } 以下是附加文档,不需要 的朋友下载后删除,谢谢 班主任工作总
显示全部
相似文档