高斯-赛德尔迭代法

#include <stdio.h>
#include <math.h>
#define N 4 /* N为方程组系数矩阵的阶数*/
#define MAX_N 1000 /* 最大迭代次数*/
#define eps 1e-6 /* 给定精度要求*/
float a[N][N]={{1.5,0.5,2.5,-3},{6,0.6,0,-5},{1,1.2,14,1},{-3,-5,1,11.1}};/*输入被求解线性方程组*/
float b[N]={14.4095,16.166,24.628,-5.8256};
float x[N]={0,0,0,0}; /*定义初始值*/
int gauss_seidel(float a[N][N],float b[N],float x[N])/*高斯-赛德尔计算核心*/
{
         float d,s,max,temp;
         int i,j,k,flag;
         k=0;
         while(1)
         {
                  max=0.0;
                  k++;
                  for(i=0;i<N;i++)
                  {
                          s=0.0;
                          temp=x[i]; /* temp临时存放x[i]的旧值*/
                          for(j=0;j<N;j++)
                          {
                                   if(j==i)
                                            s=s+a[i][j]*x[j];
                          }
                          x[i]=(b[i]-s)/a[i][i]; /* 计算x[i]的新值*/
                          d=fabs(x[i]-temp);
                          if(max<d)
                                   max=d;
                  }
                  if(max<eps) /* 满足精度时,结束迭代*/
                  {
                          flag=1;
                          break;
                  }
         }
         return(flag);
}
void augm_matrix(float a[N][N],float b[N]) /*输出增广矩阵*/
{
         int i,j;
         for(i=0;i<N;i++)
         {
                  for(j=0;j<N;j++)
                          printf("%10f",a[i][j]);
                  printf("%12f",b[i]);
                  printf("\n");
         }
         printf("\n");
}
main()
{
         int i,k;
         printf("Linear equations:\n");
         augm_matrix(a,b);
         k=gauss_seidel(a,b,x);
         if(k==1) /* 输出方程组的解*/
         {
                  printf("Results:\n");
                  for(i=0;i<N;i++)
                          printf(" x%d=%f\n",i+1,x[i]);
         }
         else
                  printf("No result could be obtained.\n"); /*输出失败信息*/
         system("pause");
}

参考资料:
[1] 王汉青. 暖通空调流体流动数值计算方法与应用[M]. 北京: 科学出版社, 2013.10.