本文将先介绍线性方程组求解的一般性方法——消元法。而后再给出矩阵的概念,并给出几个常见的矩阵变换的定义。
在初等数学中我们就已经学过如何求解一个线性方程组,不考虑特殊情况的特殊求解技巧,一般情况就是使用消元法。因为我们可以轻松地求解一元线性方程,所以只要我们把每个方程消元到只剩一个未知数,那么方程组就求解完成。如果不能消元到只剩一个会怎么样呢?我们先来给出消元法的一般步骤,再做分析。
现在我们求解如下一个方程组:
3 x 1 − x 2 − x 3 = 1 3x_1-x_2-x_3=1 3x1−x2−x3=1
2 x 2 + 3 x 3 = 5 2x_2+3x_3=5 2x2+3x3=5
x 1 + x 3 = 2 x_1+x_3=2 x1+x3=2
不失一般性,我们从左往右,从 x 1 x_1 x1开始消元,我们以第一个(行)方程为 x 1 x_1 x1作为主元的方程(姑且称之为主行),去消去其他方程中的 x 1 x_1 x1。(若第一个方程中不包含 x 1 x_1 x1,则我们总可以找到一个包含 x 1 x_1 x1的方程,交换俩个方程的行数达到目的。)消元所用的方法就是对包含主元的方程两边乘上一个系数,再加到目标方程两边。这里第二行已经不包含 x 1 x_1 x1了,我们可以不管,那么我们就乘上系数 − 1 / 3 -1/3 −1/3,然后加到第三行,从而消去 x 1 x_1 x1。
接下来,找到第二个主元,并以第二个方程作为包含主元的方程,我们重复上面的过程。然后再重复,知道我们没有办法“往下”找到任何一个方程包含未被消去的主元,则消元过程结束。
会不会有人觉得为什么不继续用第一行做第二次消元的主行,毕竟他也包含第二个主元 x 2 x_2 x2,其实一想也容易清楚,如果继续用第一行做主行,虽然消去了其他行的第二个主元 x 2 x_2 x2,但是第一个主元 x 1 x_1 x1又回去了。
对于上面这个方程组,我们重复进行选取主元、主行,乘系数求和操作,最终可以得到如下的新方程组:
3 x 1 − x 2 − x 3 = 1 3x_1-x_2-x_3=1 3x1−x2−x3=1
2 x 2 + 3 x 3 = 5 2x_2+3x_3=5 2x2+3x3=5
5 x 3 / 6 = 5 / 6 5x_3/6=5/6 5x3/6=5/6
到这里消元的过程就结束,接下来我们要回代。从下往上,第三行只有一个未知数,可以直接求出 x 3 x_3 x3的值,然后继续回代到第二行,可以求出 x 2 x_2 x2的值,重复操作,即可求出所有的未知数(1,1,1)。且所有的未知数都只有一个固定的解。至此,消元法求解线性方程组整个过程就结束了。
经过上述一番实操过后,我们容易发现的一点是,我们看似对三个方程进行加减乘除运算操作,但其实实际上并不需要管 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3。只要我们保证每个未知数的系数只与相同的未知数的系数做加减即可。这样的话,只要我们给方程的未知数人为的固定一个顺序避免加错即可。也就是说,我们可以对下面这个矩阵做同样的操作即可:
A = ( 3 − 1 − 1 0 2 3 1 0 1 ) \mathbf{A} = \left(
\right) A= 301−120−131 " role="presentation"> 3 − 1 − 1 0 2 3 1 0 1
现在我们给出了矩阵的概念,所谓矩阵就是把数字按行列排列的一种集合。它与向量非常相似,可以认为矩阵是向量概念的拓展。向量是一种特殊的矩阵,即行数为1的矩阵。
回到我们的问题,需要注意,我们如果只对这个系数矩阵做操作,那么最终得到的解会有问题,因为我们所做的操作都要保证每个方程等式仍然成立,而只对方程左边做操作显然是不对的。所以我们要操作的矩阵完整表达应该是如下这个增广矩阵:
A ∣ b = ( 3 − 1 − 1 1 0 2 3 5 1 0 1 2 ) \mathbf{A\vert \bm{b}} = \left(
\right) A∣b= 301−120−131152 " role="presentation"> 3 − 1 − 1 1 0 2 3 5 1 0 1 2
进一步我们可以得到线性方程组的矩阵表示 A x = b A\bm{x}=\bm{b} Ax=b,这里 x = [ x 1 , x 2 , x 3 ] T \bm{x}=[x_1,x_2, x_3]^T x=[x1,x2,x3]T和 b \bm{b} b为列向量,顾名思义,如果我们以前所学的向量是从左往右排列元素成一行的话,这个列向量就是从上往下来排成一列的向量。 T T T表示转置符号,它将被转置的矩阵的行列进行交换——即第一行变成第一列,第一列变成第一行…
还有一点需要说明的是,这里涉及到了一个矩阵的乘法, A x A\bm{x} Ax。用已学的向量点乘的方式来解释矩阵乘法,那就是:矩阵乘法AB=C的输出结果中,C的第 i i i行第 j j j列元素值为A矩阵的第i行向量与B矩阵的第j列向量的向量点乘。我们知道要进行向量点乘必须两个向量是等长的,所以这里就暗含了一个条件,A的行向量的长度要等于B的列向量的长度,换句话说,A的列数等于B的行数。
回到最初的系数矩阵A,初始的系数矩阵是可以随意变化的,我们开始消元则必须先找到第一个主行,即第一列中的非零元素的那一行。如果第一列都是零,那么运气好,第一个元不用消了,也说明这个方程组中压根没有第一个未知数 x 1 x_1 x1。如果找到了主行,那么我们把它交换到第一行去——交换两行不影响方程组的解。(其实,从人的角度来说,不交换到第一行也能继续操作,之所以交换是为了方便回代的时候从下往上迭代地去做,从而可以在计算机编程的时候很容易用递归的方式实现。)
然后我们用乘系数求和——一行两边乘上一个系数与其他行求和不影响方程的解,使得其他行的第一个元素为0。然后再找到第二个主行,重复上述操作,我们观察,最后得到的一个矩阵,形状上总是会像一个三角形,而且是一个上三角,即所有非零元素都在矩阵的主对角线以及主对角线的右上方。这里主对角线是由所在行数等于列数的元素构成的。思考我们消元的过程,容易知道它必然会得到这个一个上三角形状的矩阵,我们称之为上三角矩阵,一般用字母 U U U表示。
得到上三角矩阵后,我们从下往上进行求解与回代,就能很容易的求出每个未知数了。其实这个回代的过程,我们也可以规范化,第一步,我们将每一行的主元系数都变成1——一行乘上一个非零常数不影响方程组的解。第二补,我们从下往上,进行反向消元,即用第三行作为主行,将第一第二行中的第三列元素化为0。重复上述操作,最后我们会得到一个只有对角线有非零元素1的矩阵:
A ∣ b = ( 1 0 0 1 0 1 0 1 0 0 1 1 ) \mathbf{A\vert \bm{b}} = \left(
\right) A∣b= 100010001111 " role="presentation"> 1 0 0 1 0 1 0 1 0 0 1 1
这下,我们能够直接一眼看出方程组的解了,而且是唯一解 ( 1 , 1 , 1 ) (1,1,1) (1,1,1)。当然,有的时候我们也可能会化得其他形式,比如:
A ∣ b = ( 1 0 0 1 0 1 0 1 0 0 0 1 ) \mathbf{A\vert \bm{b}} = \left(
\right) A∣b= 100010000111 " role="presentation"> 1 0 0 1 0 1 0 1 0 0 0 1
如果化成这样,最后一行对应的方程就是0=1,这显然是无解的。如果恰好此时右边的元素也为0呢?即如下形式:
A ∣ b = ( 1 0 0 1 0 1 0 1 0 0 0 0 ) \mathbf{A\vert \bm{b}} = \left(
\right) A∣b= 100010000110 " role="presentation"> 1 0 0 1 0 1 0 1 0 0 0 0
此时,第三行是恒等式0=0,第一行第二行能求出 x 1 , x 2 x_1,x_2 x1,x2的取值,那 x 3 x_3 x3不需要满足任意一行等式,也就意味着x_3无论取什么值,都是方程组的解,即原方程有无穷多解。
本文介绍了消元法解线性方程组的一般性步骤,随后引入的矩阵的概念及一些相关的简单定义,最后从矩阵的视角重新分析了消元法的过程,矩阵帮助我们简单的表示、运算、操作方程组,也令我们更直观地观察到方程组的解的几种情况——唯一解、无穷多解、无解。后续我们将继续深入,看看矩阵这一工具还能带来什么更多的好处。