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