3.7 克拉默法则

文章目录

  • 理论
  • Python代码
  • 结语

理论

  行列式可以用来解线性方程组。对于常数项都是0并且系数矩阵是个方针的齐次线性方程组来说,如果行列式不为0,那么方程组只有零解,行列式为零的话,则有无穷个解。对于常数项不为0的非齐次线性方程组,那就复杂了。如果系数矩阵是个方阵,这时候可以用到克拉默法则,但是我不建议使用克拉默法则,因为计算量太大了。具体为什么计算量大,且让我慢慢说。
  克拉默法则Cramer’s rule说的是对于系数矩阵为方阵的方程组来说,如果行列式不为0,那么方程的解为:
x i = ∣ B i ∣ ∣ A ∣ x_i=\frac{|B_i|}{|A|} xi=ABi
   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} 1112111112212211 x= 1345 1112111112212211 =21x= 21 1345111112212211 21 1112134512212211 21 1112111113452211 21 1112111112211345 = 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

  测试代码:

# _*_ 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来判断方程有没有解,有多少个解。但是有比行列式更好的东西可以用来分析方程组解的情况,这就是接下来我要介绍的——矩阵的秩。

你可能感兴趣的:(线性代数【更新中】,python,线性代数,矩阵)