正文

全选主元高斯消去算法2006-07-30 02:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/petibo/16976.html

分享到:

/*    全选主元高斯消去算法,求解线性方程组 A * x = b    By Kingwei  2005.2.27*/#include <stdio.h>#include <math.h>#define EPS        1e-11#define MAX_DIM        20int GaussLEquation(double x[], int dim, double A[][MAX_DIM], double b[]){    int maxColPos[MAX_DIM], maxRowPos;    double maxElem, absElem, temp;    int k, i, j, status = 1;        for (k=0; k<dim; k++)    {        maxElem = 0.0;        for (i=k; i<dim; i++)            for (j=k; j<dim; j++)            {                absElem = fabs(A[i][j]);                if (maxElem < absElem)                {                    maxElem = absElem;                    maxRowPos = i;                    maxColPos[k] = j;                    }               }                       if (maxElem <= EPS)        {            for (i=k; i<dim; i++)                if (fabs(b[i]) > EPS)                    return 0;            for (i=k; i<dim; i++)                maxColPos[i] = i;            status = 2;            break;          }                    if (maxRowPos != k)          {              for (j=k; j<dim; j++)              {                  temp = A[k][j];                  A[k][j] = A[maxRowPos][j];                  A[maxRowPos][j] = temp;                 }                 temp = b[k];                 b[k] = b[maxRowPos];                 b[maxRowPos] = temp;            }                        if (maxColPos[k] != k)            {                for (i=0; i<dim; i++)                {                    temp = A[i][k];                    A[i][k] = A[i][maxColPos[k]];                    A[i][maxColPos[k]] = temp;                   }              }                            temp = A[k][k];              for (j=k; j<dim; j++)                  A[k][j] /= temp;         b[k] /= temp;                  for (i=k+1; i<dim; i++)         {             temp = A[i][k];             for (j=k; j<dim; j++)                 A[i][j] -= A[k][j]*temp;            b[i] -= b[k]*temp;           }     }          x[dim-1] = b[dim-1];     for (i=dim-1; i>=0; i--)     {         temp = 0.0;         for (j=dim-1; j>i; j--)             temp += x[j]*A[i][j];        x[i] = b[i]-temp;      }            for (i=dim-1; i>=0; i--)          if (maxColPos[i] != i)          {              temp = x[i];              x[i] = x[maxColPos[i]];              x[maxColPos[i]] = temp;            }                return status;}int ReadLEquation(int *dim, double A[][MAX_DIM], double b[]){    int i, j;    if (scanf("%d", dim) == EOF)        return 0;    for (i=0; i<*dim; i++)    {        for (j=0; j<*dim; j++)            scanf("%lf", &A[i][j]);        scanf("%lf", &b[i]);    }    return 1;}void DisplayRoot(double x[], int dim){    int i;    for (i=0; i<dim; i++)        printf("%lf ", x[i]);    printf("\n\n");}int main(){    int dim;    double A[MAX_DIM][MAX_DIM], b[MAX_DIM], x[MAX_DIM];    while (ReadLEquation(&dim, A, b))    {        switch (GaussLEquation(x, dim, A, b))        {            case 0:    printf("No Solution!\n\n");                   break;            case 1:    printf("Succeseful Solved!\n");                DisplayRoot(x, dim);                    break;            case 2:    printf("Unnumberable Solutions!\n");                   DisplayRoot(x, dim);                       break;            default:break;        }    }        return 0;}

阅读(1844) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册