上回说到,我们可以将一个三元一次方程组转化为列向量的方式来求解,比如 { 2 x − y = 0 − x + 2 y − z = − 1 − 3 y + 4 z = 4 ⇒ x [ 2 − 1 0 ] + y [ − 1 2 − 3 ] + z [ 0 − 1 4 ] = [ 0 − 1 4 ] \begin{cases} 2x-y=0 \\ -x+2y-z=-1\\ -3y+4z=4 \end{cases}\\ ⇒x\begin{bmatrix} 2\\-1\\0 \end{bmatrix}+ y\begin{bmatrix} -1\\2\\-3 \end{bmatrix}+ z\begin{bmatrix} 0\\-1\\4 \end{bmatrix}= \begin{bmatrix} 0\\-1\\4 \end{bmatrix} ⎩⎪⎨⎪⎧2x−y=0−x+2y−z=−1−3y+4z=4⇒x⎣⎡2−10⎦⎤+y⎣⎡−12−3⎦⎤+z⎣⎡0−14⎦⎤=⎣⎡0−14⎦⎤
可以很明显得看到 [ 0 , 0 , 1 ] [0,0,1] [0,0,1]为 x y z xyz xyz的解,但是如果遇到解不是那么明显的方程又该怎么办呢。例如这个方程
{ x + 2 y + z = 2 3 x + 8 y + z = 12 4 y + z = 2 \begin{cases} x+2y+z=2 \\ 3x+8y+z=12\\ 4y+z=2 \end{cases} ⎩⎪⎨⎪⎧x+2y+z=23x+8y+z=124y+z=2
以我等凡人的眼力见,显然没办法一眼看出来,当初高斯可能也是没一眼看出来,对就是他
当时高斯就想怎么办呀,有没有一种通用的方法来让我解决这一类问题呀,可能高斯想了那么五六分钟,随便写了几笔,于是总结出了我们现在所谓的高斯消元法,具体步骤如下
⇒
[
1
~
2
1
2
3
8
1
12
0
4
1
2
]
⇒
[
1
~
2
1
2
0
2
~
−
2
6
0
4
1
2
]
⇒\begin{bmatrix} \utilde{1}&2&1&&2\\ 3&8&1&&12\\ 0&4&1&&2 \end{bmatrix} ⇒\begin{bmatrix} \utilde{1}&2&1&&2\\ 0&\utilde{2}&-2&&6\\ 0&4&1&&2 \end{bmatrix}
⇒⎣⎡
1302841112122⎦⎤⇒⎣⎡
1002
241−21262⎦⎤
⇒
[
1
~
2
1
2
0
2
~
−
2
6
0
0
5
~
−
10
]
⇒
[
x
,
y
,
z
]
=
[
2
,
1
,
−
2
]
⇒\begin{bmatrix} \utilde{1}&2&1&&2\\ 0&\utilde{2}&-2&&6\\ 0&0&\utilde{5}&&-10 \end{bmatrix}⇒[x,y,z]=[2,1,-2]
⇒⎣⎡
1002
201−2
526−10⎦⎤⇒[x,y,z]=[2,1,−2]
矩阵中有波浪线下标的元素被称为pivot,消元的主要任务就是用每一行减去pivot行的倍数,使pivot下全部为0,消元过程最好的情况就是能让系数矩阵形成如上图所示的上三角的形式。
但是,事情不总是如想象的那么美好,例如
⇒
[
1
~
1
1
a
2
2
5
b
4
4
8
c
]
⇒
[
1
~
2
1
a
0
0
3
b
−
2
a
0
0
4
c
−
4
a
]
⇒\begin{bmatrix} \utilde{1}&1&1&&a\\ 2&2&5&&b\\ 4&4&8&&c \end{bmatrix} ⇒\begin{bmatrix} \utilde{1}&2&1&&a\\ 0&0&3&&b-2a\\ 0&0&4&&c-4a \end{bmatrix}
⇒⎣⎡
124124158abc⎦⎤⇒⎣⎡
100200134ab−2ac−4a⎦⎤
此时方程解的情况要根据 a b c abc abc的值来判断,有如下两种情况
b − 2 a 3 = c − 4 a 4 = z ⇒ i n f s o l u t i o n b − 2 a 3 ≠ c − 4 a 4 = z ⇒ n o s o l u t i o n \quad\dfrac{b-2a}{3}=\dfrac{c-4a}{4}=z⇒inf\enspace solution \\ \quad\dfrac{b-2a}{3}\not=\dfrac{c-4a}{4}=z⇒no\enspace solution 3b−2a=4c−4a=z⇒infsolution3b−2a=4c−4a=z⇒nosolution
如果把这两种解的情况放到空间中去看的话,有无限解指的是由向量 [ 1 , 2 , 4 ] [1,2,4] [1,2,4]和 [ 1 , 5 , 8 ] [1,5,8] [1,5,8]所组成的整个平面上的点,而无解指的是 [ a , b , c ] [a,b,c] [a,b,c]这个点不在由上述两个向量所组成的平面上。
通过上面的演示我们可以看到,使用消元法只要按照乘法加法这样简单的步骤一步步做就可以了,这不就是计算机所擅长的吗,乘加这样的算法步骤已经确定好了,那我们再来看看消元法的时间复杂的是多少。
假设对大小为n的系数方阵的最终消元结果是一个完美的上三角矩阵且乘加算作一次操作,那么为了找到第二个pivot我们
需要 n ( n − 1 ) = n 2 − n \color{blue}n(n-1) = n^2-n n(n−1)=n2−n 步
操作(第一行有n个数,且要乘n-1次),找第三个pivot与找第二个pivot的步骤完全一致,但是规模缩小了1,所以
需要 ( n − 1 ) ( n − 2 ) = ( n − 1 ) 2 − ( n − 1 ) \color{blue}(n-1)(n-2)=(n-1)^2-(n-1) (n−1)(n−2)=(n−1)2−(n−1) 步
所以对整个系数矩阵消元需要的步骤及运算时间复杂度为
( 1 2 + 2 2 + . . . + n 2 ) − ( 1 + 2 + . . . + n ) = n ( n + 1 ) ( 2 n + 1 ) 6 − n ( n + 1 ) 2 = n 3 − n 3 = O ( n 3 ) (1^2+2^2+...+n^2)-(1+2+...+n)\\ =\dfrac{n(n+1)(2n+1)}{6}-\dfrac{n(n+1)}{2}=\dfrac{n^3-n}{3}=O(n^3) (12+22+...+n2)−(1+2+...+n)=6n(n+1)(2n+1)−2n(n+1)=3n3−n=O(n3)
以前学微积分的时被级数那一章搞得死去活来,背一堆公式却不知道那些公式能干什么,到这我才看明白原来那堆级数前n项和的公式能帮我们算时间复杂的。当然 O ( n 3 ) O(n^3) O(n3)是常规做法的时间复杂度,听说大佬们通过减少乘法次数和并行计算的手段已经把复杂度降到 O ( n 2.376 ) O(n^{2.376}) O(n2.376)了,不知道以后还能不能再降。
关于前n项平方和的推导我们以后聊微积分的时候再说,这个公式本身,只需要记住分母为6,分子前两项与前n项和公式一致,第三项是前两项的和就可以了。