高斯消元
高斯消元适用于求解一组线性方程组,它包含\(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号