接下来的内容要有系统性的求出一个一般的 n 元一次联立方程式的所有解,而这个联立方程式不再限于未知数与限制式个数相同。
首先,必须要认知道的一项事实是,就单纯要一眼判断出一个联立方程式是否有解是不可能的,因此退而求其次,要找一套固定的标准的流程,看最终结果来判断。
换句话说,要找到一个演算法可以交给电脑来执行,而不是期待电脑能像人类可以见机行事,判断当下哪种做法比较“好算”。
对于一个联立方程式,或其所对应的增广矩阵,其求解过程总是将方程式的各式,或增广矩阵的各列,进行一些类似加加减减的运算。那么,要研究出到底有哪些动作是可以被执行的,下面将举尽所有的基本列运算:两列互换、一列乘上非零常数、一列加上另一列的常数倍。
- 1. 两列互换,例如
![{\displaystyle \left[{\begin{array}{cccc|c}3&-2&-1&0&7\\-2&0&0&3&5\\1&0&4&0&-2\end{array}}\right]\Longrightarrow \left[{\begin{array}{cccc|c}1&0&4&0&-2\\-2&0&0&3&5\\3&-2&-1&0&7\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1c4d935d2a38967e7389c20ad45085ba6b4c0186)
- 将第一列和第三列互换,而它所对应的联立方程式是
。
- 2. 一列乘上非零常数,例如
![{\displaystyle \left[{\begin{array}{ccc|c}2&0&1&0\\-3&6&3&-3\\\end{array}}\right]\Longrightarrow \left[{\begin{array}{ccc|c}2&0&1&0\\1&-2&-1&1\\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c9c644781aef9701b8fd59f4bf066ee75109d48c)
- 是将第二列乘上常数
,而它所对应的联立方程式是

- 3. 一列加上另一列的常数倍,例如
![{\displaystyle \left[{\begin{array}{cc|c}1&-2&1\\-2&0&1\\2&-1&4\end{array}}\right]\Longrightarrow \left[{\begin{array}{cc|c}1&-2&1\\-2&0&1\\0&3&2\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/51b1941769ac8f44209524b86f57e1cb49a02974)
- 是将第三列加上 -2 倍的第一列,而它所对应的联立方程式是

在第 2 点中,乘上的常数不可以是 0,否则会把整列归零,换言之,会使一整条等式直接消失,可能造成最后解出不合的解;但在第 3 点中,一列加上另一列的常数倍,那个常数就可以是 0,因为一列加上另一列的 0 倍,等于是不对任何式子做变动,所以此作用虽然合法,但是没有意义。
而基本列运算的名称来源于,其他用于解方程式的复杂变换,都可以由多个基本列运算组合而成,例如多列的顺序重排、多列同乘常数、一列加上多列的线性组合……等等。
由于接著要处理的是给电脑来执行的一般性解法,因此必须照著
的顺序依序消除便变数,并且要妥善安排消完变数后的列的上下顺序。
首先,假设拿到一个增广矩阵
![{\displaystyle A=\left[{\begin{array}{cccc|c}a_{11}&a_{12}&\dots &a_{1n}&a_{1\,n+1}\\a_{21}&a_{22}&\dots &a_{2n}&a_{2\,n+1}\\\vdots &\vdots &\ddots &\vdots &\vdots \\a_{m1}&a_{m2}&\dots &a_{mn}&a_{m\,n+1}\\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bdd5089eb90521e7f190dab8223e717358e9e50a)
同时我们在心里要秉记著它所对应的联立方程式

第一个步骤要消掉
,然后分成三种情况分别处理:
- 如果增广矩阵
的第一列各项皆 0,换句话说
,那么这就意味著变数
根本不存在于联立方程式之中,因此不需要做任何处理,直接前往下一步处理
。
- 如果
的最左上角那一项
不等于 0,那么将第一行乘以
,得到
![{\displaystyle A'=\left[{\begin{array}{cccc|c}1&a'_{12}&\dots &a'_{1n}&a'_{1(n+1)}\\a_{21}&a_{22}&\dots &a_{2n}&a_{2(n+1)}\\\vdots &\vdots &\ddots &\vdots &\vdots \\a_{m1}&a_{m2}&\dots &a_{mn}&a_{m(n+1)}\\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/29f26ea9c059a710a5db243452f5bbd370c28f71)
- 其中对所有
,有
。然后下一步是要将
、
、…、
消掉,因此,分别将第二行、第三行、…、第 m 行减去
、
、…、
倍的第一行,得到
![{\displaystyle A''=\left[{\begin{array}{cccc|c}1&a'_{12}&\dots &a'_{1n}&a'_{1(n+1)}\\0&a_{22}-a_{21}a'_{12}&\dots &a_{2n}-a_{21}a'_{1n}&a_{2(n+1)}-a_{21}a'_{1(n+1)}\\\vdots &\vdots &\ddots &\vdots &\vdots \\0&a_{m2}-a_{m1}a'_{12}&\dots &a_{mn}-a_{m1}a'_{1n}&a_{m(n+1)}-a_{21}a'_{m(n+1)}\\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd9cc0565808bd3e7a90d8ec90f138782a85c688)
- 特别要注意的是,从
到
的过程不是一个基本行运算,而是要将各行分别做,总共要做
次。
- 如果
的最左上角那一项
等于 0,但
、
、…、
不全为 0,那么设 k 是最小的正整数使得
,接著将
的第一行和第 k 行互换,就回到上面第二点的情况。
在此做个统整,顺便看看下一步该怎么操作,如果是第一点的情况
![{\displaystyle A=\left[{\begin{array}{cccc|c}0&a_{12}&\dots &a_{1n}&a_{1\,n+1}\\0&a_{22}&\dots &a_{2n}&a_{2\,n+1}\\\vdots &\vdots &\ddots &\vdots &\vdots \\0&a_{m2}&\dots &a_{mn}&a_{m\,n+1}\\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a2b6ab7589369e3fac8b2bbfa48cfcfa81fbb8a4)
接下来就对
里面的

进行与第一步骤相同的处理,一样如上分成三种情况讨论;如果是第二或第三点的情况,经处理后得到
![{\displaystyle A''=\left[{\begin{array}{cccc|c}1&a'_{12}&\dots &a'_{1n}&a'_{1\,n+1}\\0&a_{22}-a_{21}a'_{12}&\dots &a_{2n}-a_{21}a'_{1n}&a_{2\,n+1}-a_{21}a'_{1\,n+1}\\\vdots &\vdots &\ddots &\vdots &\vdots \\0&a_{m2}-a_{m1}a'_{12}&\dots &a_{mn}-a_{m1}a'_{1n}&a_{m\,n+1}-a_{21}a'_{m\,n+1}\\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3de4b1e0bdee2218f6dfbb4bf95540a3e11cb713)
接下来就对
里面首行首列以外的部分

进行与第一步骤相同的处理,一样如上分成三种情况讨论。
依据前一节的步骤,不断重复对
进行列运算,由于每执行一次前一节的动作,
待处理的部分的长度或宽度会变小,因此在有限步的操作之内,上述的动作将会终止。而在上一节的操作中可以发现,在
最后两行之间的那一杠其实没有起什么作用,因此在就算重复到最后,出现形如

的部分,仍然可以继续操作:将第一个非 0 元素换到最上面,并且将它除成 1,再将剩下的元素减成 0。
那么接著来看看在终止时的状态,先直接下结论,此时
将形如
![{\displaystyle \left[{\begin{array}{ccccccccc|c}\mathbf {0} _{m_{1}}&1&\triangle &\dots &\triangle &\dots &\triangle &\dots &\triangle &\triangle \\\mathbf {0} _{m_{1}}&0&\mathbf {0} _{m_{2}}&1&\triangle &\dots &\triangle &\dots &\triangle &\triangle \\\mathbf {0} _{m_{1}}&0&\mathbf {0} _{m_{2}}&0&\mathbf {0} _{m_{3}}&1&\triangle &\dots &\triangle &\triangle \\\vdots &&\vdots &&\vdots &&\ddots &&\vdots &\vdots \\\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a5c8364d5e05dda45d7f82a499a29e703c77449c)
其中
代表连续 m 个 0,而 △ 则代表该项可以填入任意的数。
接下来解释
的终止状态会形如上式的原因:最左边的连续
列的 0 代表前
次操作都是第一点的状况,也就首列全为 0;而第一行第
列的 1 代表接著出现的状况是第二或三点的状况,因此操作完会使第
列上除了第一行的 1 以外全部都是 0。再之后便没有第一行的事了,因此在 1 之后全都是 △,可能填入任何的数。然后第二列的
又代表著连续
次操作都是第一点的状况,而接下去的 1 则代表接著出现的状况是第二或三点的状况,依此类推。
实际上,在前述中的
、
、
…中,有可能下标中出现的是 0,也就连续出现零个 0,直接在 1 的右下角又出现一个 1,如果
,那么
终止状态是
![{\displaystyle \left[{\begin{array}{ccccc|c}1&\triangle &\triangle &\dots &\triangle &\triangle \\0&1&\triangle &\dots &\triangle &\triangle \\\vdots &\vdots &&\ddots &\vdots &\vdots \\0&0&0&\dots &1&\triangle \\0&0&0&\dots &0&1\\0&&\dots &&0&0\\\vdots &&&&\vdots &\vdots \\0&&\dots &&0&0\end{array}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2f768aa523fee632004af958a2b276adc2c848fe)
在此这情况下,最下面好几列的全零列对应到的方程式是 0 = 0,毫无任何意义。忽略那些全 0 列之后,最后一列有意义的列是
,对应到的方程式是 0 = 1,代表增广矩阵
无解。
在很多时候,矩阵中的 0 常会被省略不写,而如果这样的话,增广矩阵经过列运算后的最终状态长得像是个阶梯,这就是阶梯型矩阵的名字由来。
可以很容易的看出,一个增广矩阵经过列运算后的最终状态必然是一个阶梯形矩阵。
、
都是阶梯形矩阵。