Gauss-seidel迭代法的思想及C语言编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

即xi( k +1) = (bi − ∑ aij x (jk +1) −
j =1
i −1
j =i +1
∑a x
ij
( k +1)
n
(k ) j
) / aii
( k +1)
这样,每一个计算出来的分量 xi 法收敛得快。
马上就可以用于计算下一个分量 xi +1 ,这种方法比 Jacobi 迭代
(2)Gauss-seidel 迭代法的矩阵形式的推导
⎞ ⎛ x1(k +1) ⎞ ⎛ 0 −a12 " −a1,n−1 −a1n ⎞ ⎛ x1(k ) ⎞ ⎛ b1 ⎞ ⎛ a11 ⎞ ⎛ x1(k +1) ⎞ ⎛ 0 ⎟ ⎜ (k +1) ⎟ ⎜ ⎜ ⎟ ⎜ (k +1) ⎟ ⎜ −a ⎟ ⎜ (k ) ⎟ ⎜ b ⎟ 0 a22 0 " −a2,n−1 −a2n ⎟ ⎜ x2 ⎟ ⎜ 2⎟ ⎟ ⎜ x2 ⎟ ⎜ ⎜ ⎟ ⎜ x2 ⎟ ⎜ 21 ⎟⎜ # ⎟ + ⎜ ⎟⎜ # ⎟ = ⎜ # # % % ⇔⎜ % # # ⎟⎜ # ⎟ + ⎜ # ⎟ ⎟ ⎜ (k +1) ⎟ ⎜ ⎜ ⎟ ⎜ (k +1) ⎟ ⎜ ⎟ ⎜ (k ) ⎟ ⎜ ⎟ 0 an−1,n−1 b −an−1,n ⎟ ⎜ xn 0 ⎟ ⎜ xn−1 ⎟ ⎜ −1 ⎟ ⎜ n−1 ⎟ ⎜ ⎟ ⎜ xn−1 ⎟ ⎜ −an−1,1 −an−1,2 " ( k +1) ⎟ ⎜ ( k +1) ⎟ ⎜ (k ) ⎟ ⎜ ⎟ ⎜ ⎟ ⎟ ⎜ ⎜ ⎜ ann ⎠ ⎝ xn ⎠ ⎝ −an1 −an2 " −an,n−1 0⎠ ⎝ xn ⎠ ⎝ 0 ⎠ ⎝ xn ⎠ ⎝ bn ⎟ ⎝ ⎠ ( k +1) ( k +1) (k ) ⇔ Dx = Lx +Ux + b ⇔ (D − L)x(k +1) = Ux(k ) + b ⇔ x(k +1) = (D − L)−1Ux(k ) + (D − L)−1b = BJ x + g 其中BJ =(D − L)−1U, g = (D − L)−1b
xbbaxlxuxbdlx?uxbxdlux?dlb??????????????????????????????????????????????????????????????11jjbdlugdlb???其中12gaussseidel迭代法的迭代法的c语言编程语言编程下面是gaussseidel迭代的c语言编程实例程序功能是求解线性方程组axb要求迭代精度小于10其中612384632?2033361131???12xxxaxb????????????????????????????includestdiohincludemathhincludeiostreamhdefinen3doublecomparedoubleandoublebndoublec0
printf("\n"); printf("x= "); for(i=0;i<=N-1;i++) printf("%lf ",x[i]); printf("\n"); //判断是否达到迭代精度 if(Compare(x3,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++) x3[i]=x[i]; 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}; Gauss_seidel(A,x,b,1e-6); }
a ⎧ a (k ) a1n ( k ) a (k ) b (k ) x1( k +1) = − 12 x2 xn − 13 x3 − " − 1, n −1 xn + 1 −1 − ⎪ a11 a11 a11 a11 a11 ⎪ ⎪ a a (k ) a2 n ( k ) a b ( k +1) (k ) = − 21 x1( k +1) − 23 x3 − " − 2, n −1 xn + 2 x2 xn ⎪ −1 − a22 a22 a22 a22 a22 由⎪ ⎪ "" ⎨ ⎪ a an −1, n ( k ) an −1,1 ( k +1) an −1,2 ( k +1) b ( k +1) ( k +1) ⎪ xn x2 − " − n −1,n − 2 xn xn + n −1 x1 − −2 − −1 = − an −1,n −1 an −1,n −1 an −1,n −1 an−1,n −1 an −1, n −1 ⎪ ⎪ ⎪ x ( k +1) = − an1 x ( k +1) − an 2 x ( k +1) − " − an ,n − 2 x ( k +1) − an ,n −1 x ( k +1) + bn n 1 2 n−2 n −1 ⎪ ann ann ann ann ann ⎩
a ⎧ a (k ) a1n ( k ) a (k ) b (k ) − 13 x3 − " − 1,n −1 xn + 1 x1( k +1) = − 12 x2 xn −1 − ⎪ a11 a11 a11 a11 a11 ⎪ ⎪ a a (k ) a2 n ( k ) a b ( k +1) (k ) = − 21 x1( k +1) − 23 x3 − " − 2,n −1 xn + 2 x2 xn ⎪ −1 − a22 a22 a22 a22 a22 ⎪ ⎪ "" ⎨ ⎪ a an −1,n ( k ) an −1,1 ( k +1) an −1,2 ( k +1) b ( k +1) ( k +1) ⎪ xn x2 − " − n −1,n − 2 xn xn + n −1 x1 − −2 − −1 = − an −1,n −1 an −1,n −1 an −1,n −1 an−1,n −1 an −1,n −1 ⎪ ⎪ ⎪ x ( k +1) = − an1 x ( k +1) − an 2 x ( k +1) − " − an ,n − 2 x ( k +1) − an ,n −1 x ( k +1) + bn n 1 2 n−2 n −1 ⎪ ann ann ann ann 迭代法的 C 语言编程
下面是 Gauss-seidel 迭代的 C 语言编程实例,程序功能是求解线性方程组 Ax=b,要求迭代精度小于 10 。 其中
-6
⎡8 −3 2 ⎤ ⎡ x1 ⎤ ⎡ 20 ⎤ ⎢ ⎥ ⎢ ⎥ ⎥ A = ⎢ 4 11 −1⎥ , x = ⎢ x 2 ⎥ , b = ⎢ ⎢ 33 ⎥ ⎢ ⎢ ⎢ ⎣ 6 3 12 ⎥ ⎦ ⎣ x3 ⎥ ⎦ ⎣ 36 ⎥ ⎦
#include<stdio.h> #include<math.h> #include<iostream.h> #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 Gauss_seidel(double A[N][N],double x[N],double b[N],double precesion) { int i,j,k; double x2[N],x3[N],sum; for(i=0;i<=N-1;i++) { x2[i]=x[i]; x3[i]=x[i]; } k=1; 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[i]=x[i]; } //输出每一次迭代的结果 printf("第%d 次迭代:\n",k); printf("x3= "); for(i=0;i<=N-1;i++) printf("%lf ",x3[i]); //k 为迭代次数
Gauss-seidel 迭代法
1.1 Gauss-seidel 迭代法的算法知识
(1)Gauss-seidel 迭代法的来由
Gauss-seidel 迭代法是对 Jacobi 迭代法的改进,在 Jacobi 迭代的分量形式中,为了在每一次迭代计算 不同的分量时,可以利用前面已经计算出来的分量,就将 Jacobi 迭代的分量形式修改为:
相关文档
最新文档