线性方程组
我们知道,大多数时候n个n元一次方程可以解出唯一的一组解,例如⎩⎨⎧x+y+zx−y+2z2x−3y+4z=6=5=8可以解得唯一的一组解⎩⎨⎧x=1y=2z=3。这就是“线性代数”里最基础的一个问题,“线性(linear)”就是指方程里不会出现未知数(x,y,z)和自己相乘或者互相相乘的情况,也即未知数的指数都是“一次的”。我们把这样的一组方程称为一个线性方程组。
高斯消元法
我们在中学时就知道,解线性方程组的基本方法就是“消元”。事实上,这就是我们解决一切线性方程组问题的基本方法。在中学时,我们一般只会手动解两个或三个方程构成的方程组的解。下面我们要以一个确定性的算法的方式把解n个线性方程构成的线性方程组的方法描述出来,称为“高斯消元法”。
我们注意到,其实我们并不关心一个线性方程组中变量的名字。例如,⎩⎨⎧x+y+zx−y+2z2x−3y+4z=6=5=8完全可以写作⎩⎨⎧u+v+wu−v+2w2u−3v+4w=6=5=8。这样,我们就可以把等号的左侧抽象出来,写成每行三个数字排练成三行的数字方阵1121−1−3124,这就称为一个3×3的矩阵(matrix)。等号的右边也可以写成一个3×1的矩阵658。把变量的名字考虑进去,我们也把三个变量写成一个矩阵xyz。这样我们就可以用新的形式写出线性方程组:1121−1−3124xyz=658。我们暂且不去管把两个矩阵并排写在一起表示什么含义,只是提供了一种对线性方程组的新的描述方式。
下面我们来描述用高斯消元法解这个方程组的过程。尽管我们只是对变元数为3的例子给出高斯消元法,但我们很容易把这种方法类推到更多变元的情况。首先,我们把最左侧矩阵的第一列的数字都变为1,要完成这一点,只需要对第三个方程两边同时乘以1/2,得到1111−1−3/2122xyz=654。我们总是可以在某一个方程的两边同时乘以一个非零的常数,原因是我们可以证明这样做完全不会对方程组的解有任何影响。没有影响是指,任何一组变换前的解(x0,y0,z0)都将是变换后的方程组的解,任何一组变换后的方程组的解(x0′,y0′,z0′)都也还是变换前的方程组的解。接着,我们用第一个方程与第二个方程相减,然后把第二个方程替换为相减得到的结果;用同样的方法让第一个方程与第三个相减然后替换第三个,这样得到100125/21−1−1xyz=612。我们总是可以把两个方程相加然后用相加的结果替换其中一个(相减和相加是同理的,只不过经历了一步“乘以−1”),原因同样是我们可以证明这样做完全不会对方程组的解有任何影响。接下来,我们通过方程组两边同时乘以常数的方式把第二列除了第一行以外的所有系数变成1,得到1001111−1/2−2/5xyz=61/24/5,在三式上减去二式得到1001101−1/2−1/10xyz=61/2−3/10。把第三行第三列调整为1得1001101−1/21xyz=61/23。可以看到,这时候左侧的矩阵已经是一个上三角矩阵,并且从左上角到右下角的对角线(称为主对角线)上的值都是1。
中学时,这样之后已经得出了z的值为3,然后只需把z=3回代回第二个方程,就得出y=2,再把z=3,y=2代回第一个方程,就得到x=1。这就是传统的高斯消元法。但是在这里,我们想继续沿用加减消元的方法,而回避“回代”这一动作。这称为高斯-约旦消元法。具体地,我们可以先把三式乘以1/2然后加到二式上,再把2乘到三式上,得到100110101xyz=623。接着,在一式上减去二式和三式,得到100010001xyz=123。显然,这时候等式右边就已经是方程组的解。
我们可以看到,高斯消元法只是反复对方程组进行有限次下列操作:给某一个方程两边同时乘上一个非零常数c;将某一个方程加到另一个方程上;如果必要的话,可以上下交换两个方程的顺序。高斯消元能成功的关键在于,以上三种操作中的任何一种都是不会改变方程组的解的情况的——对于每一步操作,我们可以对比操作前与操作后的方程组F和F′,可以发现每一个F的解都是F′的解,而每一个F′的解都是F的解。
我们可以抽象出以上三种操作,把它们看作是对矩阵本身的操作:令矩阵的某一行乘上一个非零常数c;把矩阵某一行的数加到另一行上;交换两行。我们把这三种操作统称“初等行变换”。高斯消元的就是以特定的顺序对最左侧的矩阵和最右侧的矩阵同时进行上述操作,最终使得左侧矩阵变成了一个只有主对角线上为1其余全为0的矩阵,右侧矩阵变成了我们想要的解。
矩阵的运算
把形式1121−1−3124xyz=658与⎩⎨⎧x+y+zx−y+2z2x−3y+4z=6=5=8统一起来的一个好办法是,把并排写出的两个矩阵看作“进行了某种乘法运算”。具体规则是,第一个矩阵第一行的三个数各自与第二个矩阵第一列的每个数相乘之后,把得到的三个乘积累加起来得到作为运算结果的矩阵的第一行第一列的值;同理,第二行的三个数与x,y,z分别相乘后相加,得到第二行第一列的值;第三行同理。如果这样定义两个矩阵的乘法运算,那么就有1⋅x+1⋅y+1⋅z1⋅x−1⋅y+2⋅z2⋅x−3⋅y+4⋅z=123。把两个同样大小的矩阵相等理解为对应位上每个数都相等,这样我们的矩阵形式就与方程组的形式完全等价了。
上面指出的是一个方阵乘以一个单列的矩阵的乘法。如果一个方阵要乘以另一个方阵,我们可以依次对第二个方阵的每一列做上一段定义的乘法,这样会得到一系列单列的矩阵,把这些单列矩阵从左到右排列,就能得到一个新的方阵。我们就把这定义为方阵与方阵的乘法规则。尽管我们还没有看到这样做的意义,但我们之后会看到这样的乘法定义是极其有用的。依据这样的定义方式,只需要第一个矩阵的列数与第二个矩阵的行数相同,就可以定义乘法。我们定义一般的矩阵的乘法规则:设Am×n,Bn×p,A⋅B=Cm×p,那么C(i,j)=k=1∑nA(i,k)B(k,j)。其中C(i,j)表示C的第i行第j列的数值。
为了后面的用途,我们还可以定义矩阵的加法。加法的定义比乘法简单很多,只需把相同位置的数对应相加。我们只允许同样行数与列数的矩阵之间做加法:设Am×n,Bm×n,A+B=Cm×n,那么C(i,j)=A(i,j)+B(i,j)。
我们还可以定义一个实数与一个矩阵相乘,称为矩阵的数乘。数乘就是把矩阵的每个位置的元素都乘以这个实数。设c∈R,Am×n,cA=Bm×n,那么B(i,j)=c⋅A(i,j)。
可以验证矩阵的运算满足下列性质:
- A+B=B+A (加法交换律)
- c(A+B)=cA+cB(数乘分配律)
- A+(B+C)=(A+B)+C(加法结合律)
- A(B+C)=AB+AC(左乘矩阵的分配律)
- (A+B)C=AC+BC(右乘矩阵的分配律)
- A(BC)=(AB)C(矩阵乘法的结合律)
以上性质中,矩阵乘法的分配律和结合律是非平凡的,但是根据定义展开后可以验证它们确实是恒成立的。这显示出我们定义的乘法规则将具有很多实际的意义。
特别需要强调的是,矩阵乘法的交换律一般是不成立的。AB不一定等于BA。这一点从矩阵大小上就可以看出,Am×nBn×p可以相乘,而当m=p时Bn×pAm×n不能相乘。并且即便m=p,得到的结果也不一定相同。
我们在高斯-约旦消元中已经看到过,一个“在主对角线上全为1,其余全为0”的n×n矩阵是一个特殊的矩阵,把它与任何矩阵相乘(无论乘在左边还是乘在右边)都将得到这个矩阵本身。这称为一个单位矩阵,记为In×n。对任意Am×n,有Am×nIn×n=Am×n,Im×mAm×n=Am×n。
初等行变换与初等矩阵
从矩阵乘法的角度看,高斯消元中的三个初等行变换,都可以用“左乘某个矩阵”来理解。例如,如果我们想让第二行乘以常数c,就让矩阵左乘1000c0001;如果我们想在第三行上加上第一行,就让矩阵左乘101010001;如果我们想交换第二行和第三行,就让矩阵左乘100001010。
也就是说,任何一次初等行变换都可以理解为矩阵左乘了一个“用来完成变换”的矩阵En×n,称为初等矩阵。高斯消元就是在线性方程组Ax=b两边同时乘了一连串初等矩阵,得到Et⋯E2E1Ax=Et⋯E2E1b,使得Et⋯E2E1A=I,这时我们就解出了x=Et⋯E2E1b(这里我们用到了矩阵乘法的结合律)。如果把Et⋯E2E1整体看作一个矩阵C,高斯消元就是找出了这个满足CA=I的矩阵C并让它乘在了等式两边,解得x=Cb。
逆矩阵
从代数结构的角度看,In×n可以看作所有n×n的矩阵族的单位元。如果对于矩阵An×n存在Cn×n使得CA=AC=I,那么就可以把C称为A的逆元或“逆矩阵”。
从上文可知,对于一个有唯一解的线性方程组,高斯消元可以求出系数矩阵的“左逆”。
一个重要的观察是,假如Ax=b可以解出唯一解,那么把b中的元素替换成任意别的数,A依然有唯一解(因为解方程组只是根据A的性质求出一个C使得CA=I,与b没有本质关系)。于是,我们可以依次令b取10⋮0,01⋮0,⋯,00⋮1。这样我们可以相应地解出x1,⋯,xn。此时取B=[x1x2⋯xn],恰好就有AB=I。
所以我们得到,假如Ax=b有唯一解,那么存在B使得AB=I且存在C使得CA=I。进一步,B=IB=(CA)B=C(AB)=C,所以一定有B=C!所以我们得到,假如Ax=b有唯一解,那么存在B使得AB=BA=I。也即A存在逆元。下面证明,逆元是唯一的。假如有D=B使得AD=DA=I,那么B=B(AD)=(BA)D=D,矛盾。综上所述我们得到,假如Ax=b有唯一解,那么A有唯一的逆矩阵,记为A−1。
逆矩阵有这样的运算性质:(AB)−1=B−1A−1。因为根据结合律(B−1A−1)(AB) =B−1(A−1A)B=B−1B=I,(AB)(B−1A−1)=A(BB−1)A−1=AA−1=I,而逆矩阵又是唯一的。(这个结论可以推广到更多矩阵相乘的情形,(A1A2⋯An)−1=An−1⋯A2−1A1−1)
逆矩阵的存在性
自然地我们会思考:是否所有矩阵都存在逆矩阵的(我们只对方阵讨论逆矩阵)?根据我们已经得到的结论,假设存在b使得Ax=b有唯一解,那么A的逆矩阵存在。那么,什么时候Ax=b无解或没有唯一解,此时逆矩阵是否存在呢?
我们很容易举出方程组无解的例子,比如{x+yx+y=2=3。或者方程有无穷多组解的例子,比如{x+3yx+3y=2=2。并且我们也很容易计算验证像[1111]或[1133]这样的矩阵是不存在逆矩阵的。这说明,在对这样的矩阵做高斯消元会失败(否则我们就找到了一串初等矩阵的乘积作为逆矩阵了)。换言之,我们应当可以通过执行高斯消元的步骤判别一个矩阵是否可逆。
在高斯消元过程中,最关键的是我们最终会保证主对角线上的值都不为0。然而如果在进行到第k行时,发现从第k行一直到第n行的所有行上第k列都为0,那么最终一定无法顺利完成高斯消元。如果第k行消元结束后第k列上的值不为0,我们就把这称为一个pivot。高斯消元告诉我们,如果A有n个pivot,那么A就是可逆的。下面我们证明,如果A可逆,A必须得有n个pivot:如果A没有n个pivot,那么在整个高斯-约旦过程结束后一定会出现全0行。让这个带有全0行的矩阵A乘上任意一个n×n的矩阵B,都会让AB中也会出现一个全0行,因此对于任意的B都不可能满足AB=I,同样的对于任意的C都不可能满足CA=I,所以A不可逆。这给出了判定A的逆矩阵是否存在的第一个等价条件:A可逆当且仅当A有n个pivot。
pivot的数量这一概念是良定义的,因为高斯消元是一个确定性的算法,它在每个特定的矩阵上执行一定会得到确定的过程和结果。可能存在的一个疑惑是,高斯消元中各个步骤的执行顺序是可以多种多样的,许多不同的高斯消元算法都可以完成最终的求解,但它们产生的中间过程不同,这是否会产生不一样的pivot的个数呢?理论上而言,既然A是否可逆只取决于A的性质,不同的高斯消元算法一定会产生相同的pivot个数。我们能否从算法的角度直接给出证明,得到任何高斯消元算法都会产生相同个数的pivot呢?这好像是一个相当复杂的算法题。我们后续在讨论矩阵的秩和线性空间时,还会再次遇到pivot个数的问题,那时我们可以从线性空间的角度给出一个解释。
另一方面,“A可逆”⟹“存在一个矩阵C使得CA=I”。仿照上文的方法,假设CA=I,我们可以构造出一个B使得AB=I。所以“存在一个矩阵C使得CA=I”⟹“存在一个矩阵B使得AB=I”。假设“存在一个矩阵B使得AB=I”成立,此时A一定有n个pivot。否则,存在一串初等矩阵的乘积E使得EA有一个全零行,那么EAB=EI=E,既然EA有一个全零行,EAB一定也有一个全零行,这说明E一定有一个全零行。但是初等矩阵不可能有全零行,矛盾(我们可以证明,初等矩阵一定是可逆矩阵:从代数角度它有n个pivot;从效果上来看,将操作的效果“倒放”的矩阵一定是存在且唯一的)。
综上所述,以下四个命题等价:
- n×n的矩阵A有n个pivot。
- A可逆。
- 存在n×n的矩阵B满足AB=I。
- 存在n×n的矩阵C满足CA=I。
高斯-约旦求逆
对于一个给定的矩阵A,假设它是可逆的,我们只需要对它进行高斯消元,并记录下所有的初等矩阵并把它们乘起来,就可以求出A−1。为了让这一基于消元的求逆方法更可操作一些,我们可以采取以下办法:把A和I并排写在一起构成一个更“宽”的矩阵,对A做初等行变换时顺便把所有的行变换作用在I上,最后一定能得到[I A−1]。
矩阵的转置
矩阵A的转置就是一个把行列颠倒过来的矩阵,记作A⊤。严格来说,即A(i,j)=A⊤(j,i)对一切i,j成立。m×n的矩阵的转置是一个n×m的矩阵。
可以验证如下性质:
- (A+B)⊤=A⊤+B⊤
- (AB)⊤=B⊤A⊤
- (A−1)⊤=(A⊤)−1
分块矩阵
纯粹从代数出发,我们验证矩阵乘法有这样一个美妙的性质:如果把矩阵划分成若干块,在乘法时可以把每一个块当作整体来运算。(此时数的加法和乘法变成矩阵的加法和乘法)
例如,一个矩阵B可以被拆成一系列列向量,也就是B=[b1b2⋯bp]。因此根据分块矩阵的运算得到AB=[Ab1Ab2⋯Abp],这告诉我们研究矩阵乘矩阵可以从研究矩阵乘向量出发。