线性方程组和矩阵的定义
求解线性方程组是线性代数的一个基本论题。所谓的线性方程组就是我们在中学阶段接触的多元一次方程组。 我们把\(n\)个未知数\(x_1, x_2, \cdots, x_n\)的如下形式的方程 $$ a_1x_1 + a_2x_2 + \cdots + a_nx_n = b $$ 称为n元一次方程或者n元线性方程。其中各项系数\(a_1, a_2, \cdots, a_n\)以及等式右边的\(b\)均为常数。 若存在一组数\(c_1, c_2, \cdots, c_n\),能够使得等式成立,那么我们称这组数为方程的解,其中\(x_i = c_i\)。 由若干个方程构成的如下形式的方程组 $$ \begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n & = & b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n & = & b_2 \\ & \vdots & \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n & = & b_m \end{cases} $$ 称为n元线性方程组。能使方程组中所有方程都成立的一组数\(c_1, c_2, \cdots, c_n\)称为方程组的解。
1. 一个多元一次方程组的消元求解过程
我们知道在平面笛卡尔坐标系下,抛物线可以写成\(y = ax^2 + bx + c\)的形式,若已知抛物线经过(-3,20),(1,0)和(2,10),可以得到如下的多元一次方程组: $$ \begin{cases} 9a - 3b + c = 20 & (1) \\ a + b + c = 0 & (2) \\ 4a + 2b + c = 10 & (3) \end{cases} $$ 通过求解方程组我们可以求出抛物线方程。
首先分别用(1)式减去(2)式、(3)式减去(2)式消去未知数\(c\),得到新方程组: $$ \begin{cases} 8a - 4b = 20 & (4) \\ 3a + b = 10 & (5) \end{cases} $$ 再用(5)式加上1/4的(4)式,可以消去未知数\(b\),得到方程\(5a = 15\),解之得\(a = 3\)。再代入(5)式得到\(b = 1\),代入(2)式得到\(c = -4\)。
对于一个n元一次方程组而言,我们可以利用类似上述的消元法,得到n-1元一次方程组。再对新的方程组继续消元,直到只有一个未知数为止。 对于一个一元的方程,通过等式两端除以未知数的系数,就可以很容易的解出未知数。我们将解出的值代入原方程组,就可以解出其余未知数。
对于上述的例子,我们实际上是从如下的方程组中求解的: $$ \begin{cases} a + b + c = 0 & (2) \\ 3a + b = 10 & (5) \\ 5a = 15 & (6) \end{cases} $$ 因此,就带来了一个问题,方程组(1)(2)(3)与(2)(5)(6)的解是一样的吗?因为新方程组是由原方程经过变形得到的,所以我们可以说原方程的解一定是新方程的解。 那么反过来呢,我们在变形得过程中是否增加了其它不是原方程的解呢?事实上,我们可以通过一系列乘以系数和加减操作从方程组(2)(5)(6)中得到原方程组。 这样,就可以说新方程组的解就是原方程组的解。
下面,我们用一种较为形式化的方法,对这一过程进行描述。
2. 线性组合与同解变形
我们把两个线性方程 $$ \begin{matrix} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n & = & b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n & = & b_2 \\ \end{matrix} $$ 左右两边分别相加得到的新方程 $$ (a_{11} + a_{21})x_1 + (a_{12} + a_{22})x_2 + \cdots + (a_{1n} + a_{2n})x_n = (b_1 + b_2) $$ 称为原方程的和,这一操作称为方程的加法。
将方程左右两边同乘以一个常数\(\lambda\),得到新方程 $$ (\lambda a_1)x_1 + (\lambda a_2)x_2 + \cdots + (\lambda a_n)x_n = (\lambda b) $$ 称为原方程的\(\lambda\)倍,这一操作称为方程的数乘。若\(\lambda\)等于0,得到的是\(0 = 0\)的恒等式,没有意义。
将\(m\)个方程 $$ \begin{matrix} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n & = & b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n & = & b_2 \\ & \vdots & \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n & = & b_m \end{matrix} $$ 分别乘以\(\lambda_1, \lambda_2, \cdots, \lambda_m\),再将它们相加得到新方程 $$ \alpha_1x_1 + \alpha_2x_2 + \cdots + \alpha_nx_n = \beta $$ 称为原方程组的一个线性组合。其中,\(\alpha_i = \lambda_1 a_{1i} + \lambda_2 a_{2i} + \cdots + \lambda_m a_{mi}, 1 \le i \le n\), \(\beta = \lambda_1b_1 + \lambda_2b_2 + \cdots + \lambda_mb_m\)。因为线性组合都是由原方程组得到的, 所以原方程组的解一定也是它们的任何一个线性组合的解。
如果方程组(II)中所有的方程都是方程组(I)的线性组合,那么我们称方程组(II)是方程组(I)的线性组合。如果反过来,方程组(I)也是方程组(II)的线性组合, 那么我们称这两个方程组等价,它们具有相同的解空间。
求解线性方程组的过程,就是对原方程组经过一系列同解变形,直到最后得出可以直接写出解的方程组。可以证明,方程组有以下三种同解变形, 它们被称为线性方程组的初等变换(elementary transformation)
- 交换其中任意两个方程的位置,保持其余方程不变。
- 将任意一个方程乘以一个非零的常数\(\lambda\),其余方程不变。
- 将任意一个方程的\(\lambda\)倍加到另一个方程上,其余方程不变。
证:为论证方便,我们将原方程组中各方程记为\(U = {u_1, u_2, \cdots, u_m}\), 经变换后的方程组记为\(V = {v_1, v_2, \cdots, v_m}\)。
(1). 交换原方程组中第\(i,j\)两个方程,我们有 $$ \begin{cases} v_i = u_j \\ v_j = u_i \\ v_k = u_k, (k \neq i,j) \end{cases} $$ 所以新方程组是原方程组得线性组合。反过来,我们通过交换\(v_i\)和\(v_j\)两个方程就可以得到原方程组,说明两个方程组互为线性组合,它们的解相同。
(2). 对原方程中第\(i\)个方程乘以\(\lambda\),有 $$ \begin{cases} v_i = \lambda u_k \\ v_k = u_k, (k \neq i) \end{cases} $$ 所以方程组\(V\)是\(U\)的线性组合。反过来,将\(V\)中第\(i\)个方程乘以\(1/\lambda\)就可以得到原方程组,因此\(U\)和\(V\)同解。
(3). 若将\(U\)中的第\(i\)个方程的\(\lambda\)倍加到第\(j\)个方程中,有 $$ \begin{cases} v_j = \lambda u_i + u_j \\ v_k = u_k, (k \neq j) \end{cases} $$ 所以方程组\(V\)是\(U\)的线性组合。反过来,将\(V\)中第\(i\)个方程的\(-\lambda\)倍加到第\(j\)个方程上,就可以得到原方程组,因此\(U\)和\(V\)同解。
3. 线性方程组的矩阵描述
通过上述对线性方程组的初等变换的描述,不难看出求解线性方程组的过程本质上是对未知数的系数的计算过程。我们可以将这些系数写成一个表格, 使表格中的每一行对应一个方程,每一列对应一个未知数。这样由m个方程构成的n元一次方程组可以写成如下的形式: $$ \begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n & = & b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n & = & b_2 \\ & \vdots & \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n & = & b_m \end{cases} \Rightarrow \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\ a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} & b_m \end{bmatrix} $$
我们将这种由数域\(F\)中的\(m\times n\)个数构成的\(m\)行\(n\)列的数据表,称为一个\(m\times n\)的矩阵。 由于矩阵背后具有线性方程组的意义,所以矩阵中各个元素的位置是不能随意变动的,否则将可能改变原方程组。也就说矩阵中的元素是有序的。
特别的,我们将由\(n\)个元素有序的排成一行,所构成的\(1\times n\)矩阵称为行向量;由\(m\)个元素有序的排成一列, 所构成的\(m\times 1\)矩阵称为列向量。如果向量中的每一项都是0,则称之为零向量。
结合方程的加法、数乘、线性组合的定义,我们有向量的加法、数乘、线性组合的定义:
- 向量的加法:向量\(\overrightarrow{\alpha} = (a_1, a_2, \cdots, a_n), \overrightarrow{\beta} = (b_1, b_2, \cdots, b_n)\)的和为\(\overrightarrow{\alpha} + \overrightarrow{\beta} = (a_1 + b_1, a_2 + b_2, \cdots, a_n + b_n)\)。
- 向量的数乘:向量\(\overrightarrow{\alpha} = (a_1, a_2, \cdots, a_n)\)乘以常数\(\lambda\)得到\(\lambda\overrightarrow{\alpha} = (\lambda a_1, \lambda a_2, \cdots, \lambda a_n)\)。
- 向量的线性组合:将数域\(F\)中的\(m\)个向量\(\overrightarrow{a_1}, \overrightarrow{a_2}, \cdots, \overrightarrow{a_m}\)分别乘以\(F\)中的\(m\)个常数后相加,得到\(\lambda_1\overrightarrow{a_1} + \lambda_2\overrightarrow{a_2} + \cdots + \lambda_m\overrightarrow{a_m}\)。
如果矩阵\(A\)经过如下的变换得到矩阵\(B\),则称矩阵\(A\)与矩阵\(B\)行等价,相应的变换则被称为初等行变换:
- 交换矩阵\(A\)中的任意两行;
- 用数域\(F\)中某个非零的数乘以矩阵的某行;
- 将某行的常数倍加到另一行上。
4. 矩阵形式的消元求解过程
我们仍然以第一节中的抛物线为例介绍,设抛物线经过(-3,20),(1,0)和(2,10),得到如下的多元一次方程组: $$ \begin{cases} 9a - 3b + c = 20 & (1) \\ a + b + c = 0 & (2) \\ 4a + 2b + c = 10 & (3) \end{cases} $$ 我们有矩阵\(\begin{bmatrix} 9 & -3 & 1 & 20 \\ 1 & 1 & 1 & 0 \\ 4 & 2 & 1 & 10 \end{bmatrix} \),交换(1)(2)行得到\(\begin{bmatrix} 1 & 1 & 1 & 0 \\ 9 & -3 & 1 & 20 \\ 4 & 2 & 1 & 10 \end{bmatrix}\),再分别把第一行的-9倍和-4倍加到第二行和第三行上,最后对第三行除以-2得到矩阵\(\begin{bmatrix} 1 & 1 & 1 & 0 \\ 0 & -12 & -8 & 20 \\ 0 & 1 & 1.5 & -5 \end{bmatrix}\)。交换(2)(3)行,然后分别把第二行的-1倍和12倍加到第一行和第三行上,最后对第三行除以10得到矩阵\(\begin{bmatrix} 1 & 0 & -0.5 & 5 \\ 0 & 1 & 1.5 & -5 \\ 0 & 0 & 1 & -4 \end{bmatrix}\)。分别把第三行的0.5倍和-1.5倍分别加到第一行和第二行上,有矩阵\(\begin{bmatrix} 1 & 0 & 0 & 3 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & -4 \end{bmatrix}\)。可以看到矩阵的最后一列正对应着我们的解\(a = 3, b = 1, c = -4\)。这一求解过程被称为 Gauss-Jordan 消元法, 我们在 XiaoTuMathBox 中给出了一个该算法的实现, 其形式化描述如下。 给定一个由m个方程构成的n元一次方程组,将其写成矩阵的形式如下,并记为\(A\): $$ \begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n & = & b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n & = & b_2 \\ & \vdots & \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n & = & b_m \end{cases} \Rightarrow \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\ a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} & b_m \end{bmatrix} $$ 我们可以假定矩阵\(A\)的第一列不全为0,因为若第一列全为零,意味着未知数\(x_1\)对方程的解没有影响。选择一个第一列不为零的行,与第一行交换。 选择的方式随意,可以是第一列中最大的那一行,也可以是第一个非零的那一行,只要对应元素不为零就可以了,我们把这个元素称为这一列的主元。 然后将新矩阵中的第一行数乘\(1/a_{11}\)倍, 将矩阵化为第一行第一列的元素为1的形式。对于第\(i, 2 \le i \le m\)行,我们将之加上新矩阵第一行的\(-a_{i1}\)倍,得到第一列只有第一行为1其余全为0的矩阵。 为了方便,我们记之为矩阵\(A^{(1)}\),其中上角标表示对第一行的变换操作。 $$ \begin{bmatrix} 1 & a_{12}^{(1)} & \cdots & a_{1n}^{(1)} & b_1^{(1)} \\ 0 & a_{22}^{(1)} & \cdots & a_{2n}^{(1)} & b_2^{(1)} \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & a_{m2}^{(1)} & \cdots & a_{mn}^{(1)} & b_m^{(1)} \end{bmatrix} $$
在新矩阵\(A^{(1)}\)中,我们考察第二列第二行及其右下方的各个系数\(a_{ij}^{(1)}\)。它们可能全为零,此时化简结束。否则,我们找到第一个不全为0的列,将之记为\(j_2\)。 此时的矩阵A具有如下的形式: $$ \begin{bmatrix} 1 & \cdots & a_{1j_2}^{(1)} & \cdots & a_{1n}^{(1)} & b_1^{(1)} \\ 0 & 0 & a_{2j_2}^{(1)} & \cdots & a_{2n}^{(1)} & b_2^{(1)} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & a_{mj_2}^{(1)} & \cdots & a_{mn}^{(1)} & b_m^{(1)} \end{bmatrix} $$ 类似的,我们取\(j_2\)列中的一个不为零的元素\(a_{j_2i}, 1 < i \le m\)所在的行,将之与第2行交换,并数乘\(1/a_{j_2i}\)倍,将矩阵化成第2行第\(j_2\)列的元素为1的形式。 再对第\(i, 1 \le i \le m, i \neq 2\)行加上第二行的\(-a_{j_22}\)倍,得到第\(j_2\)列只有第二行为1其余全为0的矩阵\(A^{(2)}\)。 $$ \begin{bmatrix} 1 & \cdots & 0 & \cdots & a_{1n}^{(2)} & b_1^{(2)} \\ 0 & 0 & 1 & \cdots & a_{2n}^{(2)} & b_2^{(2)} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \cdots & a_{mn}^{(2)} & b_m^{(2)} \end{bmatrix} $$
对于剩下的矩阵,我们重复同样的操作,直到第\(k\)次变换后,剩余系数\(a_{ij}\)均为0为止。此时得到的矩阵\(A^{(k)}\)具有如下的形式: $$ \begin{bmatrix} a_{1,1}^{(k)} & \cdots & 0 & \cdots & 0 & a_{1,j_k+1}^{(k)} & \cdots & b_1^{(k)} \\ & & a_{2,j_2}^{(k)} & \cdots & 0 & a_{2,j_k+1}^{(k)} & \cdots & b_2^{(k)} \\ & & & \ddots & \vdots & \vdots & \vdots & \vdots \\ & & & & a_{k,j_k}^{(k)}& a_{k,j_k+1}^{(k)} & \cdots & b_k^{(k)} \\ & & & & & & & \vdots \\ & & & & & & & b_m^{(k)} \end{bmatrix} $$ 其中左下角空白表示对应元素均为0,矩阵中\(a_{1,1}, a_{2,j_2}, \cdots a_{k,j_k}\)均为1。我们称之为最简形式。下面,我们分情况讨论解。
(1). 如果方程数量等于未知数数量,即\(m =n\)的情况。理想情况下,整个化简过程都有 \(j_i = i, 1 \le i \le n\),我们可以得到下面左侧形式的矩阵, 据此可以直接写出方程组的解: $$ \begin{bmatrix} 1 & \cdots & 0 & b_1^{(n)} \\ \vdots & \ddots & \vdots & \vdots \\ 0 & \cdots & 1 & b_n^{(n)} \end{bmatrix} \Longrightarrow \begin{cases} x_1 & = & b_1^{(n)} \\ & \vdots & \\ x_n & = & b_n^{(n)} \end{cases} $$
(2). 对于\(m=n\)的矩阵,有时我们会得到\(j_i > i\)的情形。这意味着对于矩阵我们经过了\(1 \le k < n\)次的变换就得到了最简的形式。 那么对于矩阵中第 \(r\) 行,\(k < r ≤ n\),我们有等式\(0x_1 + \cdots + 0x_m = b_l^{(k)}\),若要等式成立,必须有\(b_l^{(k)} = 0\),否则方程组无解。
我们把方程中\(j_i\)列对应的未知数称为非自由变量,其它的未知数称为自由变量。 所谓的自由变量的意思是对应的未知数可以取数域\(F\)中定义的任何数, 而总能在非自由变量取特定值时保证方程成立。我们把非自由变量对应的列,即最简形式对应中第 \(h_u\) 列,移到方程的右边得到: $$ \begin{cases} x_1 & = & b_1^{(k)} - a_{1,h_1}^{(k)}x_{h_1} - \cdots - a_{1, h_u}^{(k)}x_{h_u} \\ x_{j_2} & = & b_2^{(k)} - a_{2,h_1}^{(k)}x_{h_1} - \cdots - a_{2, h_u}^{(k)}x_{h_u} \\ & \vdots & \\ x_{j_k} & = & b_k^{(k)} - a_{k,h_1}^{(k)}x_{h_1} - \cdots - a_{k, h_u}^{(k)}x_{h_u} \end{cases} \Longrightarrow \begin{bmatrix} x_1 \\ x_{j_2} \\ \vdots \\ x_{j_k} \end{bmatrix} = \begin{bmatrix} b_1^{(k)} \\ b_2^{(k)} \\ \vdots \\ b_k^{(k)} \end{bmatrix} - \begin{bmatrix} a_{1,h_1}^{(k)} & \cdots & a_{1, h_u}^{(k)} \\ a_{2,h_1}^{(k)} & \cdots & a_{2, h_u}^{(k)} \\ \vdots & \ddots & \vdots \\ a_{k,h_1}^{(k)} & \cdots & a_{k, h_u}^{(k)} \end{bmatrix} \begin{bmatrix} x_{h_1} \\ x_{h_2} \\ \vdots \\ x_{h_u} \end{bmatrix} $$ 其中,\(h_u \neq j_i\),\(u \in \{1, \cdots, v\}\),\(i \in \{1, \cdots, k\}\),\(v + k = n\)。这种情况其实就是方程数量少于未知数数量的情况, 此时方程组的解就是由自由变量的线性组合再加上一组常数得到的,这也就是人们常说的通解 + 特解,我们称之为解空间。
(3). 对于\(m < n\)的矩阵,我们总可以得到上述的情况(2)。对于\(m > n\)的矩阵,我们最多进行n次变换就会得到上述情况(1)或者(2)。