通过编程来学习线性代数4-行列式按行(列)展开

余子式:将aij所在的行和列划去后,剩下的元素组成的行列式,记作Mij。(i, j为下标)

代数余子式Aij = Math.pow(-1, i+j) * Mij

行列式每一项都对应一个余子式和代数余子式,因为i, j可以唯一确定一个元素。

ij列的余子式:

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
17
let 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
10
let 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
13
let 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:行列式中如果有两行(列)元素成比例,则此行列式为零,其结果为零。

代码

参考

声明:转载请注明作者及原文链接
分享到