本文主要介绍如何用拉普拉斯展开计算计算n阶行列式的值。
行列式(Determinant)是数学中的一个函数,将一个 n × n {n\times n} n×n的矩阵 A {A} A映射到一个纯量,记作 det ( A ) 或 ∣ A ∣ {\det(A)}或{|A|} det(A)或∣A∣。 ——摘自维基百科
说白了就是一个 n × n {n\times n} n×n的特殊矩阵。
但是虽然它跟矩阵很像,但也是两种不同的东西。
一个 2 × 2 {2\times 2} 2×2的行列式,又被称为二阶行列式。
对于行列式:A= [ 1 2 3 4 ] {\begin{bmatrix}1&2\\3&4\end{bmatrix}} [1324]。
其值为:A = 1 × 4 − 2 × 3 = − 2 {1\times 4 - 2\times 3 = -2} 1×4−2×3=−2
3 × 3 {3\times 3} 3×3的行列式,又被称为三阶行列式。
对于行列:B= [ 1 2 3 4 5 6 7 8 9 ] {\begin{bmatrix}1&2&3\\4&5&6\\7&8&9\end{bmatrix}} ⎣⎡147258369⎦⎤。
其值为:
∣ B ∣ = 1 ⋅ ∣ 5 6 8 9 ∣ − 2 ⋅ ∣ 4 6 7 9 ∣ + 3 ⋅ ∣ 4 5 7 8 ∣ |B|=1\cdot {\begin{vmatrix}5&6\\8&9\end{vmatrix}}-2\cdot {\begin{vmatrix}4&6\\7&9\end{vmatrix}}+3\cdot {\begin{vmatrix}4&5\\7&8\end{vmatrix}} ∣B∣=1⋅∣∣∣∣5869∣∣∣∣−2⋅∣∣∣∣4769∣∣∣∣+3⋅∣∣∣∣4758∣∣∣∣
= 1 ⋅ ( − 3 ) − 2 ⋅ ( − 6 ) + 3 ⋅ ( − 3 ) = 0 {\displaystyle {}=1\cdot (-3)-2\cdot (-6)+3\cdot (-3)=0} =1⋅(−3)−2⋅(−6)+3⋅(−3)=0。
以上对于三阶行列式的计算方式是:拉普拉斯展开。
在数学中,拉普拉斯展开(或称拉普拉斯公式)是一个关于行列式的展开式。将一个 n × n n×n n×n的行列式进行拉普拉斯展开,即是将其表示成关于行列式的某一行(或某一列)的n个元素与其代数余子式乘积的和。
对于行列式:B= [ 1 2 3 4 5 6 7 8 9 ] {\begin{bmatrix}1&2&3\\4&5&6\\7&8&9\end{bmatrix}} ⎣⎡147258369⎦⎤。
[ 5 6 8 9 ] {\begin{bmatrix}5&6\\8&9\end{bmatrix}} [5869]是其去掉第一行和第一列后的一个余子式。
[ 4 6 7 9 ] {\begin{bmatrix}4&6\\7&9\end{bmatrix}} [4769]是其去掉第一行和第二列后的一个余子式。
在n阶行列式中,把所在的第i行与第j列划去后,所留下来的n-1阶行列式为余子式。
在n阶行列式中,把元素 a i j a_{ij} aij所在的第 i i i行和第 j j j列划去后,留下来的n-1阶行列式叫做元素 a i j a_{ij} aij的余子式,记作 M i j M_{ij} Mij, M i j × ( − 1 ) i + j M_{ij}\times(-1)^{i+j} Mij×(−1)i+j记为 A i j A_{ij} Aij, A i j A_{ij} Aij叫做元素 a i j a_{ij} aij的代数余子式
对于行列式:B = [ 1 2 3 4 5 6 7 8 9 ] {\begin{bmatrix}1&2&3\\4&5&6\\7&8&9\end{bmatrix}} ⎣⎡147258369⎦⎤。
a 11 的 代 数 余 子 式 为 : − 1 ( 1 + 1 ) × ∣ 5 6 8 9 ∣ a_{11} 的代数余子式为:-1^{(1+1)}\times{\begin{vmatrix}5&6\\8&9\end{vmatrix}} a11的代数余子式为:−1(1+1)×∣∣∣∣5869∣∣∣∣
a 12 的 代 数 余 子 式 为 : − 1 ( 1 + 2 ) × ∣ 4 6 7 9 ∣ a_{12} 的代数余子式为:-1^{(1+2)}\times{\begin{vmatrix}4&6\\7&9\end{vmatrix}} a12的代数余子式为:−1(1+2)×∣∣∣∣4769∣∣∣∣
a 13 的 代 数 余 子 式 为 : − 1 ( 1 + 3 ) × ∣ 4 6 7 9 ∣ a_{13} 的代数余子式为:-1^{(1+3)}\times{\begin{vmatrix}4&6\\7&9\end{vmatrix}} a13的代数余子式为:−1(1+3)×∣∣∣∣4769∣∣∣∣
根据拉普拉斯展开,按第一行将行列式展开就得到:
∣ B ∣ = a 11 × A 11 + a 12 × A 12 + a 13 × A 13 |B| = a_{11} \times A_{11} + a_{12}\times A_{12} + a_{13}\times A_{13} ∣B∣=a11×A11+a12×A12+a13×A13
= 1 ⋅ ∣ 5 6 8 9 ∣ − 2 ⋅ ∣ 4 6 7 9 ∣ + 3 ⋅ ∣ 4 5 7 8 ∣ = 1\cdot {\begin{vmatrix}5&6\\8&9\end{vmatrix}}-2\cdot {\begin{vmatrix}4&6\\7&9\end{vmatrix}}+3\cdot {\begin{vmatrix}4&5\\7&8\end{vmatrix}} =1⋅∣∣∣∣5869∣∣∣∣−2⋅∣∣∣∣4769∣∣∣∣+3⋅∣∣∣∣4758∣∣∣∣
= 1 ⋅ ( − 3 ) − 2 ⋅ ( − 6 ) + 3 ⋅ ( − 3 ) = 0 {=1\cdot (-3)-2\cdot (-6)+3\cdot (-3)=0} =1⋅(−3)−2⋅(−6)+3⋅(−3)=0。
计算n阶行列式的值的代码实现就是模拟拉普拉斯展开,假定以第一行展开, 不断的n阶行列式降阶, 直到n等于2时可以直接交叉计算,所以我们可以用递归的思路写。
比如一个5阶行列式,按第一行展开,将其转化为5个4阶行列式,然后将这5个4阶行列式转化为5*4个3阶,最后转化为2阶。
先给出一道模板题:
试题 算法提高 计算行列式
代码:
import java.io.*;
public class Main{
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static int Int(String s){return Integer.parseInt(s);}
public static void copy(int[][]A, int[][] A1, int i, int len) throws IOException{
for(int x = 1; x < len; x++)
for(int y = 0, j = 0; j < len; j++)
if(j != i) {
A1[x-1][y++] = A[x][j];
}
}
public static int F(int[][] A, int len)throws Exception{
int res = 0;
if(len == 1)return A[0][0];
if(len == 2){
return A[0][0]*A[1][1] - A[0][1]*A[1][0]; // 递归出口
}
else{
int A1[][] = new int[10][10];
for(int i = 0; i < len; i++){
copy(A, A1, i, len);// 得到余子式
res += Math.pow(-1, i) * A[0][i] * F(A1, len-1); //递归式
}
}
return res;
}
public static void main(String[] args) throws Exception{
int n;
n = Integer.parseInt(in.readLine());
int arr[][] = new int[10][10];
for(int i = 0; i < n; i++){
String[] s = in.readLine().split(" ");
for(int j = 0; j < n; j++){
arr[i][j] = Int(s[j]);
}
}
out.write(F(arr, n) + "\n");
out.flush();
}
}
以上代码中用了一个递归函数求解行列式的值,用一个copy函数求解余子式的值,代码很简单,不再多解释了。