对于行列式的求值主要有三种方法:①对角线相乘②行列式展开③代数余子式计算。
-
对角线相乘
对角线相乘需要行列式满足特定的要求,如上三角、下三角或者对角阵,否则不能直接使用此方法。如果需要使用这个方法,则需要对行列式进行初等行变换,直到满足要求。
初等行变换性质:- 交换任意两行,行列式的值变为相反数。
- 把某一行乘以一个非零数加到另外一行行列式的值不变。
- 行列式转置后,行列式的值不变,因此上述性质同样适用于列变换的情况。
∣ D ∣ = ∏ i = 1 n a i i |D|=\prod_{i=1}^{n}a_{ii} ∣D∣=i=1∏naii
//采用上三角转换的方法求行列式的值 #include <iostream> #include<iomanip>//这个头文件仅仅是用来设置cout的输出精度 double determinant_value(double **D,int n) { if(n==1) { return D[0][0]; } else if(n==0){ throw "error: determinant is empty"; } char flag = 1;//符号位 double D_value = 0.0; double **D_temp = new double*[n]; for (int i = 0; i < n;i++) { D_temp [i]= new double[n]; for(int j=0;j<n;j++) { D_temp[i][j]=D[i][j]; } } // 转为上三角 for (int i = 0; i < n; i++) { if (D_temp[i][i] == 0) { int j = i + 1; // 将主对角线上的值转为非0值 for (; j < n; j++) { if (D_temp[j][i] != 0) { double temp; for (int k = 0; k < n; k++) { temp = D_temp[i][k]; D_temp[i][k] = D_temp[j][k]; D_temp[j][k] = temp; // 交换两行 } flag = -flag; break; } } if (j == n) { return D_value; } } // 将主对角线下面的值转为0 for (int j = i + 1; j < n; j++) { double temp = D_temp[j][i] / D_temp[i][i]; for (int k = i; k < n; k++) { D_temp[j][k] -= temp * D_temp[i][k]; } } } // 计算行列式的值 D_value = 1.0; for (int i = 0; i < n; i++) { D_value *= D_temp[i][i]; } D_value*=flag; for (int i = 0; i < n;i++) { delete[] D_temp[i]; } delete [] D_temp; return D_value; } int main() { int n; std::cout << "请输入n的值,n代表矩阵的维数:"; std::cin>>n;//n维 double **D=new double *[n]; std::cout<<"请输入矩阵的元素:"<<std::endl;; for(int i=0;i<n;i++) { D[i]=new double[n]; for(int j=0;j<n;j++) { std::cin>>D[i][j];//每次输入一个数字都用空格隔开,输入样例 //1 2 3\enter //4 5 6\enter //7 8 9\enter } } std::cout<<"行列式的值"<<std::setprecision(8)<<determinant_value(D,n); for(int i=0;i<n;i++) { delete[] D[i]; } delete[] D; return 0; }
测试结果如下:
-
行列式展开
此方法多用于二阶、三阶行列式,对于高阶行列式计算比较困难,展开项数多达 n ! n! n!项,四阶行列式展开多达24项,计算量非常大。
二阶
∣ D ∣ = d 11 ∗ d 22 − d 12 ∗ d 21 |D|=d_{11}*d_{22}-d_{12}*d_{21} ∣D∣=d11∗d22−d12∗d21
三阶
∣ D ∣ = d 11 ∗ d 22 ∗ d 33 + d 12 ∗ d 23 ∗ d 31 + d 13 ∗ d 21 ∗ d 32 − d 11 ∗ d 23 ∗ d 32 − d 12 ∗ d 21 ∗ d 33 − d 13 ∗ d 22 ∗ d 31 |D|=d_{11}*d_{22}*d_{33}+d_{12}*d_{23}*d_{31}+d_{13}*d_{21}*d_{32}-\\ d_{11}*d_{23}*d_{32}-d_{12}*d_{21}*d_{33}-d_{13}*d_{22}*d_{31} ∣D∣</