高斯消元
高斯消元适用于求解一组线性方程组,它包含\(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;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号