主元消去法(N元一次方程组)



代码是我自己写的,发现错误或者bug的请评论告诉我,谢谢


学过线代的话,就会知道算法很简单,把方程组的系数和常数放在一个矩阵里,进行

矩阵变换,最后得到的单位矩阵就是方程组的解


#include
#include

#define N 3

float A[N][N+1];

void findmain (int n)    //寻找主元函数,将方程组系数的最大放在矩阵前面,并前除以自己变成一
{
    float a,b;
 a = fabs (A[n][n]);
    int i;
 int j = n;

 if (n != N - 1)
 {
     for (i = n; i < N; i++)
  {
      if (fabs(A[i][n]) > a)
   {
       a = A[i][n];
                j = i;
   }
  }
 }
 if (j != n)
 {
     for (i = n; i < N + 1; i++)
  {
      b = A[n][i];
   A[n][i] = A[j][i];
   A[j][i] = b;
  }
 }
        b = A[n][n];
 if (A[n][n] != 0)
 {
     for (i = n; i < N + 1; i++)
     {  
         A[n][i] /= b;
     }
 }
 for (i = 0; i < N; i++)
 {
     for (j = 0; j < N+1; j++)
  {
      printf("%10.3f",A[i][j]);
  }
  printf("\n");
    }
}
void eliminat (int n)        //消元函数
{
     int i, j;
     float a;

  for (i = n + 1; i < N ; i++)
  {    a = A[i][n];
       if (a != 0)
    {
           for (j = n; j < N + 1; j++)
        {
            A[i][j] = A[i][j]/a;
         A[i][j] -= A[n][j];
        }
    }
  }

 for (i = 0; i < N; i++)
 {
     for (j = 0; j < N+1; j++)
  {
      printf("%10.3f",A[i][j]);
  }
  printf("\n");
    }
}
void eliminat_last (void)  //将消元后的矩阵进一步变换,得到单位矩阵
{
    int  i, j, k;
    float a;

 for (i = 0; i < N - 1; i++)
 { 
     for ( k = i + 1; k < N; k++)
  {
         a = A[i][k];
      for (j = i + 1; j < N + 1; j++)
         {
          A[i][j] = A[i][j] - A[k][j]*a;
      }
     }
 }

}
int main ()
{
    int i, j;


 for (i = 0; i < N; i++)
 {
     for (j = 0; j < N+1; j++)
  {
      scanf("%f",&A[i][j]);
  }
 }
 
 for (i = 0; i < N; i++)
 {
     for (j = 0; j < N+1; j++)
  {
      printf("%10.3f",A[i][j]);
  }
  printf("\n");
    }
 printf("\n");
 for (i = 0; i < N; i++)
 {
     findmain(i);
  printf("\n");
  eliminat(i);
 }
   
 eliminat_last();
 for (i = 0; i < N; i++)
 {
     for (j = 0; j < N+1; j++)
  {
      printf("%10.3f",A[i][j]);
  }
  printf("\n");
    }
    return 0;
}

你可能感兴趣的:(嵌入式系统软件中常用的算法)