作者:老齐
线性方程组,是任何标准大学数学教材讲解矩阵是都要用到的,并用它引出矩阵概念。之所以如此,可能有两个原因:一是因为我们在初中的时候就已经学习过线性方程组,对它不陌生,正所谓“温故而知新”;二是矩阵的确是为了求解线性方程组而被提出的。所以,此处也不免俗,依然从线性方程组开始,引出矩阵。
如果将上述线性方程组的等号左侧各个多项式的系数,按照下面的方式排列:
这就是矩阵。
线性方程组中第三个方程式缺少
,可以认为该变量的系数是0。上面的矩阵中的数字来自线性方程组左侧多项式的系数,此矩阵也称为系数矩阵。
如果将线性方程组等号右侧的常数也纳入到矩阵中,其样式如下:
这种类型的矩阵称为增广矩阵。
对于增广矩阵,用下面所演示的步骤,完成对线性方程组的求解过程。注:以下演示中,数字①②③分别指增广矩阵的第一行、第二行和第三行。
- 分别对第一行和第二行执行如下操作:
- 第一行:
- 第二行:
结果如下:
- 第二行和第三行分别与第一行做减法,第一行不变,即:
- 第二行:
- 第三行:
结果如下:
- 第一行和第二行不变,第三行做如下变化:
- 第三行:
结果如下:
此矩阵对应着一个新的线性方程组,只是此线性方程组与前面我们求解的线性方程组具有相同的解。
由此线性方程组,比较容易求得:
在上面的操作过程中,经过一系列的变换,最终得到了一个非常容易求解的矩阵,该矩阵称之为阶梯形矩阵。
★定义 如果满足如下条件,该矩阵称为阶梯形矩阵:
- 矩阵中如果有元素都是0的行,那么它位于矩阵的下方。
- 矩阵中每个非零行的第一个不是0的元素,称为矩阵的主元,主元的列索引随着行索引的递增而严格增大。
”
例如,下面是一个阶梯形矩阵:
- 第一行主元1,位于第一列
- 第二行主元2,位于第二列
- 第三行主元1,位于第四列
- 第四行是元素都为0的零行
前述将增广矩阵变换成比较容易求解的阶梯矩阵的过程,称为矩阵的初等变换,严格地说,上述进行的是初等行变换。
上述经过初等变换所得到的的阶梯矩阵,还可以继续进行如下变换:
- 第一行不变,将第二行和第四行的主元分别变为1:
- 第二行:
- 第三行:
- 第三行不变:
- 第一行:
- 第二行:
- 第二行和第三行不变:
- 第一行:
矩阵变换到这里,就可以直接“读”出解了。在这里我们得到了一种特殊的矩阵(去掉常数项):
这个矩阵称为单位矩阵。
★定义 主对角线元素都是1,其他元素都为0的矩阵,称为单位矩阵。通常用符号
表示。 ”
在上述计算过程中,将最初的矩阵(增广矩阵),经过一系列变换,最终得到了阶梯形矩阵,乃至于还能得到单位矩阵,这个变换的过程称为矩阵的初等行变换。
★对矩阵反复施行以下三种变换:
- 把某一行的倍数加到另一行上;
- 两行位置互换;
- 用一个非零数乘以某一行。
这三种变换称为矩阵的初等行变换。 ”
显然,求解线性方程组,即写出其增广矩阵,然后通过初等行变换化成阶梯形矩阵(包括最终的单位矩阵),从而得到原线性方程组的解。这种方法称为高斯(Gauss)消元法。
★任意一个矩阵都可以通过一系列的初等行变换化成阶梯形矩阵。 ”
正如你所知,线性方程组的系数和常数项为有理数时,线性方程组的解有三种可能:无解、有唯一解、有无穷多个解。
把
元线性方程组(即含有
个未知量的线性方程组)的增广矩阵经过初等行变换化成阶梯形矩阵:
- 若阶梯形矩阵形如:
,则原方程组无解。
- 否则,有解:
- 若阶梯形矩阵的非零行数(用
表示)等于未知量的数,即
,则原方程组有唯一解;
- 若$r
以上简要说明了利用矩阵求解线性方程组的方法,当然,这种方法是用手工计算完成的。那么,利用计算机程序如何实现?Numpy是机器学习的基础库,它提供了一种途径。
代码语言:javascript复制import numpy as np
A = np.mat("-1 3 -5; 2 -2 4;1 3 0") # 系数矩阵
b = np.mat("-3 8, 6").T # 常数项矩阵
r = np.linalg.solve(A,b) # 调用 solve 函数求解
print(r)
输出结果为:
代码语言:javascript复制[[ 4.5]
[ 0.5]
[-0. ]]
此结果中的三项依次对应为
的结果。
但是,如果要利用上述方法求解下面的线性方程组:
会得到如下的解:
代码语言:javascript复制A = np.mat("1 3 -4 2;3 -1 2 -1;-2 4 -1 3;3 0 -7 6")
b = np.mat("0 0 0 0").T
r = np.linalg.solve(A, b)
print(r)
# 输出结果
[[ 0.]
[ 0.]
[-0.]
[ 0.]]
观察线性方程组,如果各个变量的值都是0,此线性方程组成立。
不妨对线性方程组的系数矩阵经过初等行变换化成阶梯形矩阵:
观察阶梯形矩阵可知,原线性方程组有解,且$r=3,n=4,r
这个解称为原线性方程组的一般解,其中
称为自由变量。
那么,如果通过程序,是否可以求得一般解?
代码语言:javascript复制from sympy import *
from sympy.solvers.solveset import linsolve
x1, x2, x3, x4 = symbols("x1 x2 x3 x4")
linsolve([x1 3*x2 - 4*x3 2*x4, 3*x1 - x2 2*x3 - x4, -2*x1 4*x2 - x3 3*x4, 3*x1 9*x2 - 7*x3 6*x4], (x1, x2, x3, x4))
输出结果:
用未知量表示,即为:
此结果与上述运用初等行变换手工计算结果一样。
关于使用SymPy求解线性方程组的详细说明,请参阅文档:https://docs.sympy.org/latest/index.html。
从上述计算中可知,为了求解线性方程组,引入了矩阵——这项工作是19世纪英国数学家凯利发起的,自此之后,不仅形成了以矩阵为研究对象的数学分支,矩阵在电路、力学、量子力学、计算机科学等领域亦有广泛应用。