理论
行列式可以用来解线性方程组。对于常数项都是0并且系数矩阵是个方针的齐次线性方程组来说,如果行列式不为0,那么方程组只有零解,行列式为零的话,则有无穷个解。对于常数项不为0的非齐次线性方程组,那就复杂了。如果系数矩阵是个方阵,这时候可以用到克拉默法则,但是我不建议使用克拉默法则,因为计算量太大了。具体为什么计算量大,且让我慢慢说。
克拉默法则Cramer’s rule说的是对于系数矩阵为方阵的方程组来说,如果行列式不为0,那么方程的解为:
x
i
=
∣
B
i
∣
∣
A
∣
x_i=\frac{|B_i|}{|A|}
xi=∣A∣∣Bi∣
B
i
B_i
Bi是什么?
B
i
B_i
Bi就是将常数项代替系数矩阵的第
i
i
i列形成的新矩阵。所以我说计算量大嘛,对于一个
n
n
n元方程组来说,这得计算
n
+
1
n+1
n+1次行列式,简直就是折磨。解方程还是高斯消元最香,计算量小。
我举个用克拉默法则解方程的例子:
(
−
1
1
−
1
2
1
−
1
2
2
1
1
2
−
1
2
−
1
1
1
)
x
=
(
1
3
4
5
)
∣
−
1
1
−
1
2
1
−
1
2
2
1
1
2
−
1
2
−
1
1
1
∣
=
21
x
=
(
∣
1
1
−
1
2
3
−
1
2
2
4
1
2
−
1
5
−
1
1
1
∣
21
∣
−
1
1
−
1
2
1
3
2
2
1
4
2
−
1
2
5
1
1
∣
21
∣
−
1
1
1
2
1
−
1
3
2
1
1
4
−
1
2
−
1
5
1
∣
21
∣
−
1
1
−
1
1
1
−
1
2
3
1
1
2
4
2
−
1
1
5
∣
21
)
=
(
3
2
0
1
)
\begin{pmatrix}-1 & 1 & -1 & 2\\ 1 & -1 & 2 & 2\\ 1 & 1 & 2 & -1\\ 2 & -1 & 1 & 1\\ \end{pmatrix}x=\begin{pmatrix}1\\ 3\\ 4\\ 5\\ \end{pmatrix}\\ \begin{vmatrix}-1 & 1 & -1 & 2\\ 1 & -1 & 2 & 2\\ 1 & 1 & 2 & -1\\ 2 & -1 & 1 & 1\\ \end{vmatrix}=21\\ x=\begin{pmatrix} \frac{ \begin{vmatrix}1 & 1 & -1 & 2\\ 3 & -1 & 2 & 2\\ 4 & 1 & 2 & -1\\ 5 & -1 & 1 & 1\\ \end{vmatrix}}{21}\\ \frac{ \begin{vmatrix}-1 & 1 & -1 & 2\\ 1 & 3 & 2 & 2\\ 1 & 4 & 2 & -1\\ 2 & 5 & 1 & 1\\ \end{vmatrix}}{21}\\ \frac{ \begin{vmatrix}-1 & 1 & 1 & 2\\ 1 & -1 & 3 & 2\\ 1 & 1 & 4 & -1\\ 2 & -1 & 5 & 1\\ \end{vmatrix}}{21}\\ \frac{ \begin{vmatrix}-1 & 1 & -1 & 1\\ 1 & -1 & 2 & 3\\ 1 & 1 & 2 & 4\\ 2 & -1 & 1 & 5\\ \end{vmatrix}}{21}\\ \end{pmatrix}=\begin{pmatrix}3\\ 2\\ 0\\ 1\\ \end{pmatrix}
−11121−11−1−122122−11
x=
1345
−11121−11−1−122122−11
=21x=
21
13451−11−1−122122−11
21
−11121345−122122−11
21
−11121−11−1134522−11
21
−11121−11−1−12211345
=
3201
Python代码
直接按照公式来计算就行了:
# 克拉默法则求方程组的解
def cramer(self, values):
det = self.cofactor_expansion()
if det == 0:
return
result = [0 for _ in self.__vectors]
for i, vector in enumerate(self.__vectors):
array = copy.deepcopy(self.__vectors)
array[i] = values
matrix = Matrix(array)
result[i] = matrix.cofactor_expansion() / det
return result
测试代码:文章来源:https://www.toymoban.com/news/detail-473730.html
# _*_ coding:utf-8 _*_
import unittest
from com.youngthing.mathalgorithm.matrix import Matrix
class MyTestCase(unittest.TestCase):
def test(self):
a = Matrix(
[[-1, 1, 1, 2],
[1, -1, 1, -1],
[-1, 2, 2, 1],
[2, 2, -1, 1]
])
print("A=", a.to_latex())
values = [1, 3, 4, 5]
print(Matrix([values]).to_latex())
cramer = a.cramer(values)
print(Matrix([cramer]).to_latex())
if __name__ == '__main__':
if __name__ == '__main__':
unittest.main()
结语
其实克拉默法则不是用来解方程的,而是用来判断方程组有没有解的。因为克拉默法则要除于系数矩阵的行列式,所以可以用行列式是否为0来判断方程有没有解,有多少个解。但是有比行列式更好的东西可以用来分析方程组解的情况,这就是接下来我要介绍的——矩阵的秩。文章来源地址https://www.toymoban.com/news/detail-473730.html
到了这里,关于4.7 克拉默法则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!