Jacobi 迭代法迭代法 ((1))Jacobi 迭代法的思想迭代法的思想 Jacobi 迭代法的具体算法如下: 对方程组 Ax=b,其中 A 为非奇异矩阵。设0(1,2,, ) ii ain≠=?,并将 A 写为三部分: 121,11 11 21 2,12 22 1,11,2 1, 12,1 00 00 00 00 nn nn nn nn nn nnn n aaa a aaa a A aaa a aaa DLU − − −− − − −−−⎡⎤⎡⎤ ⎡⎤ ⎢⎥⎢⎥ −− ⎢⎥ ⎢⎥⎢⎥ ⎢⎥ ⎢⎥⎢⎥=−− ⎢⎥ ⎢⎥⎢⎥ −−− ⎢⎥ ⎢⎥⎢⎥ ⎣⎦ ⎢⎥⎢⎥ −−− ⎣⎦⎣⎦ =−− ? ? ?????? ? ? ? 于是()AxbDLU xb=⇔−−= 即 11 ()xDLU xD b −− =++ 所以解 Ax=b 的基本迭代公式为 (0)(0)(0) 1 (1)( ) 1 (,,), ()/(1,2,, )(0,1,). n n kk iiijjii j j i xxx xba xa in k + = ≠ ⎧= ⎪ ⎪ ⎨ =−== ⎪ ⎪⎩ ∑ ? ?? ((2))Jacobi 迭代法的迭代法的 C 语言编程语言编程 下面是 Jacobi 迭代的 C 语言编程实例,程序功能是求解线性方程组 Ax=b,要求迭代精度小于 10 -6。其中 1 2 3 83220 4111 ,,33 631236 x Axxb x −⎡⎤⎡⎤⎡⎤ ⎢⎥⎢⎥⎢⎥ =−== ⎢⎥⎢⎥⎢⎥ ⎢⎥⎢⎥⎢⎥ ⎣⎦⎣⎦⎣⎦ #include #include #include #define N 3 double Compare(double a[N],double b[N]) { double c=0; int i; for(i=0;i=N-1;i++) c+=fabs(a[i]-b[i]); return c; } void Jacobi(double A[N][N],double x[N],double b[N],double precesion) { int i,j,k; double x2[N],sum; for(i=0;i=N-1;i++) x2[i]=x[i]; //将初始迭代向量 x=[0,0,0,0]赋给 x2 k=1; //k 为迭代次数 while(1) { for(i=0;i=N-1;i++) { sum=0; for(j=0;j=N-1;j++) { if(j!=i) sum+=A[i][j]*x2[j]; } x[i]=(b[i]-sum)/A[i][i]; //以 x2 为基础进行迭代求出 x } //输出每一次迭代的结果 printf(“第%d 次迭代:\n“,k); printf(“x2= “); for(i=0;i=N-1;i++) printf(“%lf “,x2[i]); printf(“\n“); printf(“x= “); for(i=0;i=N-1;i++) printf(“%lf “,x[i]); printf(“\n“); //判断是否达到迭代精度 if(Compare(x2,x)=precesion) { printf(“达到迭代精度的方程组的解为:\n“); printf(“x= “); for(i=0;i=N-1;i++) printf(“%lf “,x[i]); printf(“\n“); break; } else { for(i=0;i=N-1;i++) x2[i]=x[i]; //将第 k 次迭代计算得到的向量 x 赋给 x2 k++; continue; } } } void main() { double A[N][N]={{8,-3,2},{4,11,-1},{6,3,12}},x[N]={0},b[N]={20,33,36}; Jacobi(A,x,b,1e-6); } 程序运行结果: 迭代 17 次达到所需精度 10 -6
展开阅读全文