高斯消元

高斯消元适用于求解一组线性方程组,它包含\(n+1\)\(n\)维向量,前面的\(n*n\)矩阵为系数矩阵,在算法结束后,\(A_{i,n+1}\)即为\(x_i\)的值,根据适当修改也可求解非唯一解或无解情况。

void Goose()
{
 rep(i,1,n)
 {
  //换绝对值大的一行保证精度
  cur=i;
  rep(j,i+1,n) if (fabs(A[j][i])>fabs(A[cur][i])) cur=j;
  if (cur!=i) rep(j,1,n+1) swap(A[i][j],A[cur][j]);

  rep(j,i+1,n) //消元
  {
   double f=A[j][i]/A[i][i];
   rep(l,i,n+1) A[j][l]-=A[i][l]*f;
  }
 }
 
 dep(i,n,1) //回代
 {
  A[i][n+1]/=A[i][i];
  dep(j,i-1,1) A[j][n+1]-=A[j][i]*A[i][n+1];
 }
}

行列式

高斯消元还可以在\(O(n^3)\)时间以内求得一个方阵的行列式,原理:通过初等行变换将矩阵变为上三角矩阵(注意正负变化),对角线元素乘积即为所求值。

double Determinant()
{
 double ans=1;
 rep(i,1,n)
 {
  cur=i;
  rep(j,i+1,n) if (fabs(A[j][i])>fabs(A[cur][i])) cur=i;
  if (cur!=i)
  {
   ans=-ans; //行交换改变正负性
   rep(j,1,n) swap(A[i][j],A[cur][j]);
  }

  rep(j,i+1,n)
  {
   double f=A[j][i]/A[i][i];
   rep(l,i,n) A[j][l]-=A[i][l]*f; 
  }
 }
 
 rep(i,1,n)
 {
  rep(j,1,n) printf("%.6f ",A[i][j]);
  printf("\n");
 }

 rep(i,1,n) ans*=A[i][i];
 return ans;
}
posted @ 2017-02-15 20:41  Krew  阅读(152)  评论(0)    收藏  举报