A x = 0 Ax=0 Ax=0算法
上一节我们讲解了列空间和零空间的定义,这些子空间包含哪些向量,那如何找到这些向量呢?本节将介绍零空间的计算方法,下一节讨论列空间。
还是从一个例子开始,假设矩阵
A
=
[
1
2
2
2
2
4
6
8
3
6
8
10
]
A=\left[\begin{array}{ccc}1&2&2&2\\2&4&6&8\\3&6&8&10\end{array}\right]
A=⎣⎡1232462682810⎦⎤,我们的算法还是从消元开始,因为消元不会改变方程组的解,也就是说不会改变列空间,这里有点特殊的地方是:
- 右边都为 0 0 0,可以省略
- 如果遇到主元为 0 0 0的情况(行交换无法解决),继续寻找下一个主元继续消元
A
=
[
1
2
2
2
2
4
6
8
3
6
8
10
]
⇒
[
[
1
]
2
2
2
0
0
2
4
0
0
2
4
]
⇒
[
[
1
]
2
2
2
0
0
[
2
]
4
0
0
0
0
]
=
U
A=\left[\begin{array}{ccc}1&2&2&2\\2&4&6&8\\3&6&8&10\end{array}\right]\Rightarrow \left[\begin{array}{ccc}[1]&2&2&2\\0&0&2&4\\0&0&2&4\end{array}\right]\Rightarrow \left[\begin{array}{ccc}[1]&2&2&2\\0&0&[2]&4\\0&0&0&0\end{array}\right]=U
A=⎣⎡1232462682810⎦⎤⇒⎣⎡[1]00200222244⎦⎤⇒⎣⎡[1]002002[2]0240⎦⎤=U
观察最终得到得矩阵
U
U
U,非零元素以阶梯形式出现,我们称为阶梯形式(echelon form)矩阵,这里主元又称为主变量(pivot variable),称主元的个数为矩阵的秩(rank),这个例子里是
2
2
2。
接下来只要计算
U
x
=
0
Ux=0
Ux=0即可:
[
[
1
]
2
2
2
0
0
[
2
]
4
0
0
0
0
]
[
x
1
x
2
x
3
x
4
]
=
0
\left[\begin{array}{ccc}[1]&2&2&2\\0&0&[2]&4\\0&0&0&0\end{array}\right]\left[\begin{array}{ccc}x_1\\x_2\\x_3\\x_4\end{array}\right] = 0
⎣⎡[1]002002[2]0240⎦⎤⎣⎢⎢⎡x1x2x3x4⎦⎥⎥⎤=0
我们把矩阵
U
U
U中包含主变量的列称为主列(pivot column),其余列为*列(free column),主列的个数显然就是矩阵的秩
r
r
r,*列的个数就是
n
−
r
n-r
n−r。
主列很好理解,这里的*列表示,其可以*或任意分配数值,在这个例子里就是
x
2
x_2
x2与
x
4
x_4
x4,然后通过回代求解
x
1
x_1
x1与
x
3
x_3
x3即可。如:
- 假设 x 2 = 1 , x 4 = 0 x_2=1,x_4=0 x2=1,x4=0,则可以得到 x ′ = [ − 2 1 0 0 ] x^{'}=\left[\begin{array}{ccc}-2\\1\\0\\0\end{array}\right] x′=⎣⎢⎢⎡−2100⎦⎥⎥⎤
- 假设 x 2 = 0 , x 4 = 1 x_2=0,x_4=1 x2=0,x4=1,则可以得到 x ′ ′ = [ 2 0 − 2 1 ] x^{''}=\left[\begin{array}{ccc}2\\0\\-2\\1\end{array}\right] x′′=⎣⎢⎢⎡20−21⎦⎥⎥⎤
这样求得的解,我们称为方程的特解,由上节所讲零空间性质可以知道,零空间所包含的就是所有特解的线性组合,那特解有多少个呢?特解的个数等于*列的个数,即 n − r n-r n−r。
简化行阶梯形式
**简化行阶梯形式(reduce row echelon form)**是针对消元矩阵 U U U进行的进一步简化。它主要需要达到以下目的:
- 通过向上消元使得主元以上的元素也变为 0 0 0
- 将主元都变为 1 1 1
U
=
[
[
1
]
2
2
2
0
0
[
2
]
4
0
0
0
0
]
⇒
[
[
1
]
2
0
−
2
0
0
[
2
]
4
0
0
0
0
]
⇒
[
[
1
]
2
0
−
2
0
0
[
1
]
2
0
0
0
0
]
=
R
U=\left[\begin{array}{ccc}[1]&2&2&2\\0&0&[2]&4\\0&0&0&0\end{array}\right]\Rightarrow \left[\begin{array}{ccc}[1]&2&0&-2\\0&0&[2]&4\\0&0&0&0\end{array}\right]\Rightarrow \left[\begin{array}{ccc}[1]&2&0&-2\\0&0&[1]&2\\0&0&0&0\end{array}\right]=R
U=⎣⎡[1]002002[2]0240⎦⎤⇒⎣⎡[1]002000[2]0−240⎦⎤⇒⎣⎡[1]002000[1]0−220⎦⎤=R
相当于Matlab里的
r
r
e
f
(
A
)
rref(A)
rref(A)命令。可以知道以上简化步骤不影响方程的解,因此我们求解就变成了
R
x
=
0
Rx=0
Rx=0,接下来我们把主列放在一起,把*列放一起(交换未知数的位置)可以得到以下形式:
[
[
1
]
0
2
−
2
0
[
1
]
0
2
0
0
0
0
]
⇒
[
I
F
0
0
]
\left[\begin{array}{cc|cc}[1]&0&2&-2\\0&[1]&0&2\\\hline0&0&0&0\end{array}\right]\Rightarrow \left[\begin{array}{c|c}I&F\\\hline0&0\end{array}\right]
⎣⎡[1]000[1]0200−220⎦⎤⇒[I0F0]
转换成这种形式是为了一次性得到所有特解,这样就可以得到了整个零空间,想象一下所有特解的组合应该是一个矩阵,形式我们把这种所有特解作为列的矩阵称为”零空间矩阵“,即为
N
N
N。那么如何得到这样的矩阵呢?即求解
R
N
=
0
RN=0
RN=0,由于我们做了列交换,方程变成了以下形式:
[
I
F
]
N
=
0
⇒
N
=
[
−
F
I
]
\left[\begin{array}{cc}I&F\\\end{array}\right]N=0\Rightarrow N=\left[\begin{array}{c}-F\\I\\\end{array}\right]
[IF]N=0⇒N=[−FI]
在本例中就是
[
−
2
2
0
2
1
0
0
1
]
\left[\begin{array}{cc}-2&2\\0&2\\1&0\\0&1\end{array}\right]
⎣⎢⎢⎡−20102201⎦⎥⎥⎤。这两个特解跟之前通过求得的特解是一致的。
Matlab可以通过
n
u
l
l
null
null指令求得
N
N
N,这个指令是如何工作的呢?
- 先通过 r r e f ( A ) rref(A) rref(A)指令求得 R R R,然后找出主变量和*变量
- 把 1 1 1和 0 0 0分配到*变量,主变量通过回代进行计算,这里回代就非常简单了,即求解 [ I F ] [ x p i v o t x f r e e ] ⇒ x p i v o t = − F x f r e e ⇒ x p i v o t = − F \left[\begin{array}{cc}I&F\\\end{array}\right]\left[\begin{array}{cc}x_{pivot}\\x_{free}\\\end{array}\right]\Rightarrow x_{pivot}=-Fx_{free} \Rightarrow x_{pivot}=-F [IF][xpivotxfree]⇒xpivot=−Fxfree⇒xpivot=−F
这就是我们计算零空间矩阵的算法,下面我们再举一个例子来回顾一下这个过程,这里以 A T A^{\mathrm {T}} AT为例:
- 先进行消元计算 U U U
A
=
[
1
2
3
2
4
6
2
6
8
2
8
10
]
⇒
[
[
1
]
2
3
0
[
2
]
2
0
0
0
0
0
0
]
=
U
A=\left[\begin{array}{ccc}1&2&3\\2&4&6\\2&6&8\\2&8&10\end{array}\right]\Rightarrow \left[\begin{array}{ccc}[1]&2&3\\0&[2]&2\\0&0&0\\0&0&0\end{array}\right]=U
A=⎣⎢⎢⎡1222246836810⎦⎥⎥⎤⇒⎣⎢⎢⎡[1]0002[2]003200⎦⎥⎥⎤=U
这里的秩也为
2
2
2,矩阵与其转置的秩是相同的。这里的*列数为
1
1
1,特解的个数也为
1
1
1,令
x
3
=
1
x_3=1
x3=1,可以求得
x
=
[
−
1
−
1
1
]
x=\left[\begin{array}{ccc}-1\\-1\\1\end{array}\right]
x=⎣⎡−1−11⎦⎤,这里的零空间就为
c
[
−
1
−
1
1
]
c\left[\begin{array}{ccc}-1\\-1\\1\end{array}\right]
c⎣⎡−1−11⎦⎤,这是一条直线。
- 下面求解简化行阶梯矩阵
U
=
[
[
1
]
2
3
0
[
2
]
2
0
0
0
0
0
0
]
⇒
[
[
1
]
0
1
0
[
1
]
1
0
0
0
0
0
0
]
U=\left[\begin{array}{ccc}[1]&2&3\\0&[2]&2\\0&0&0\\0&0&0\end{array}\right]\Rightarrow \left[\begin{array}{ccc}[1]&0&1\\0&[1]&1\\0&0&0\\0&0&0\end{array}\right]
U=⎣⎢⎢⎡[1]0002[2]003200⎦⎥⎥⎤⇒⎣⎢⎢⎡[1]0000[1]001100⎦⎥⎥⎤
可以看出这里
F
=
[
1
1
]
F=\left[\begin{array}{ccc}1\\1\end{array}\right]
F=[11],由于*变量个数为
1
1
1,因此
I
=
1
I=1
I=1,可以求得零空间矩阵为
[
−
1
−
1
1
]
\left[\begin{array}{ccc}-1\\-1\\1\end{array}\right]
⎣⎡−1−11⎦⎤