余子式:将aij
所在的行和列划去后,剩下的元素组成的行列式,记作Mij
。(i, j
为下标)
代数余子式:Aij = Math.pow(-1, i+j) * Mij
行列式每一项都对应一个余子式和代数余子式,因为i, j
可以唯一确定一个元素。
求i
行j
列的余子式:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/**
* 余子式
*
* @param {Number} i 行
* @param {Number} j 列
*/
Det.prototype.complementMinor = function (i, j) {
let len = this.length
if (!(i < len && j < len)) {
throw ('行标或列标超出范围: 0~'+(len-1))
}
let detArr = JSON.parse(JSON.stringify(this.array))
let newArr = []
for (let k = 0; k < len; k++) {
if (i != k) {
let temp = detArr[k]
temp.splice(j, 1)
newArr.push(temp)
}
}
return new Det(newArr)
}
line 15~19
如果k
等于i
就跳过(同一行),如果不是,那就移除该行的第j
个元素,并添加到新数组中。最后生成Det
对象。
测试:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17let det = new Det([
[1, 1, 2, 1],
[1, -3, 5, 3],
[0, 2, 2, 2],
[1, 2, -4, 4]
])
let c0 = det.complementMinor(0, 0)
// 输出
// [-3, 5, 3]
// [2, 2, 2]
// [2, -4, 4]
let c1 = det.complementMinor(3, 2)
// 输出
// [1, 1, 1]
// [1, -3, 3]
// [0, 2, 2]
引理:一个n
阶行列式,如果其中第i
行所有元素除aij
外都为零,那么这行列式等于aij
与它的代数余子式的乘积,即D=aijAij
测试:1
2
3
4
5
6
7
8
9
10let det1 = new Det([
[1, 3, 2, 5],
[5, -3, -1, 3],
[0, 0, -2, 0],
[-5, 2, 0, 4]
])
det1.calc() //296
let c2 = det1.complementMinor(2, 2)
let a0 = -2 * Math.pow(-1, 2 + 2) * c2.calc() //-2 * (-148)
console.log(a0) //296
这里(2, 2)
即3行3列的-2
,该行除(2, 2)
外其余都为零,根据上面的引理,行列式的值为-2 * 代数余子式
行列式按行(列)展开法则
定理3 行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和,即:
根据性质5
,若行列式的某一行(列)的元素都是两个数之和,则可以将其拆分开来:
在Det
对象上添加通过代数余子式
来计算行列式的值的方法calcViaComplement
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/**
* 通过代数余子式来计算行列式的值
*
* @param {Number} i 行
*/
Det.prototype.calcViaComplement = function (i=0) {
let len = this.length
if (!(i < len)) {
throw ('行标或列标超出范围: 0~'+(len-1))
}
let sum = 0
for (let k = 0; k < len; k++) {
let tempDet = this.complementMinor(i, k)
sum += tempDet.calc() * Math.pow(-1, k + i) * this.array[i][k]
}
return sum
}
这里默认以行来计算,默认第0行,可以通过计算不同行来验证:1
2
3
4
5
6
7
8
9
10
11
12
13let det1 = new Det([
[1, 3, 2, 5],
[5, -3, -1, 3],
[0, 0, -2, 0],
[-5, 2, 0, 4]
])
let res0 = det1.calc()
let res1 = det1.calcViaComplement(0)
let res2 = det1.calcViaComplement(2)
console.log('res0=' + res0) //296
console.log('res1=' + res1) //296
console.log('res2=' + res2) //296
推论 行列式任一行(列)的元素与另一行(列)的对应元素的代数余子式乘积之和等于零。
相当于用j
行替换掉第i
行,此时有两行的对应列元素都相等,根据性质4:行列式中如果有两行(列)元素成比例,则此行列式为零
,其结果为零。