本篇仍旧是MIT课程的笔记总结。首先进行消元法的展示,重点体会从矩阵A化为行最简式的过程,然后分类讨论AX = b在不同秩r下的解情况。
消元法展示
仍旧从一个例子入手,已知矩阵A为:
A
=
[
1
2
3
4
5
6
]
A = \begin{bmatrix} 1 &2 & 3 \\ 4 & 5 & 6 \end{bmatrix}
A=[142536]
第一部分AX =0
我们先来考虑方程
A
X
=
0
AX =0
AX=0 的解的情况,应用初等行变换:
A
=
[
1
2
3
4
5
6
]
⇒
[
1
2
3
0
−
3
−
6
]
⇒
[
1
2
3
0
1
2
]
⇒
[
1
0
−
1
0
1
2
]
=
R
A = \begin{bmatrix} 1 &2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \Rightarrow \begin{bmatrix} 1 &2 & 3 \\ 0 & -3 & -6 \end{bmatrix} \Rightarrow \begin{bmatrix} 1 &2 & 3 \\ 0 &1 & 2\end{bmatrix} \Rightarrow \begin{bmatrix} 1 &0 & -1 \\ 0 & 1 & 2 \end{bmatrix} =R
A=[142536]⇒[102−33−6]⇒[102132]⇒[1001−12]=R
我们在行最简式R矩阵中可以找到单位矩阵
I
I
I,并可将其余部分记为
F
F
F。关注
A
X
=
0
AX=0
AX=0,我们不难发现这样一个结果,
x
1
x_1
x1和
x
2
x_2
x2是主列所在行(也即
I
I
I)对应的未知量,而
x
3
x_3
x3是自由变量,对应着
F
F
F。如果用如下记号
X
(
p
i
v
o
t
)
=
[
x
1
x
2
]
X
(
f
r
e
e
)
=
[
x
3
]
X(pivot) = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \ \ \ X(free) = \begin{bmatrix} x_3 \end{bmatrix}
X(pivot)=[x1x2] X(free)=[x3]
那么,对应
A
X
=
0
AX=0
AX=0的方程就可以写作:
[
I
F
]
[
X
(
p
i
v
o
t
)
X
(
f
r
e
e
)
]
=
I
X
(
p
i
v
o
t
)
+
F
X
(
f
r
e
e
)
=
0
\begin{bmatrix} I & F \end{bmatrix} \begin{bmatrix} X(pivot) \\ X(free) \end{bmatrix} =IX(pivot)+FX(free)=0
[IF][X(pivot)X(free)]=IX(pivot)+FX(free)=0
移项后就有:
X
(
p
i
v
o
t
)
=
−
F
X
(
f
r
e
e
)
X(pivot)=-FX(free)
X(pivot)=−FX(free)
这在我看来是个非常优美的式子,也就是说原方程的解应该有如下的形式:
x
1
=
x
3
x
2
=
−
2
x
3
x_1 = x_3 \\ x_2 = -2x_3
x1=x3x2=−2x3
在matlab中用rref函数就得到Gauss-Jordan 消元法下的简化的行阶梯形矩阵(reduced row echelon form)。
>> A = [1,2,3;4,5,6];
>> rref(A)
ans =
1 0 -1
0 1 2
也可以用solve函数验证求解的正确性。
>> syms x1;syms x2; syms x3;
>> result = solve([x1+2*x2+3*x3,4*x1+5*x2+6*x3]); % result作为struct存在
>> result.x1
ans =
x3
>> result.x2
ans =
-2*x3
第二部分AX =b
我们进一步来考虑
A
X
=
b
AX=b
AX=b的情况,不如假设b列就为7和8,于是我们考虑A的增广矩阵,并应用初等行变换,即
[
1
2
3
∣
7
4
5
6
∣
8
]
⇒
[
1
2
3
∣
7
0
−
3
−
6
∣
−
20
]
⇒
[
1
2
3
∣
7
0
1
2
∣
20
/
3
]
⇒
[
1
0
−
1
∣
−
19
/
3
0
1
2
∣
20
/
3
]
\begin{bmatrix} 1 &2 & 3 & | & 7 \\ 4 & 5 & 6 & | & 8\end{bmatrix} \Rightarrow \begin{bmatrix} 1 &2 & 3 & | & 7 \\ 0 & -3 & -6 & | & -20\end{bmatrix} \Rightarrow \begin{bmatrix} 1 &2 & 3 & | & 7 \\ 0 & 1 & 2 & | & 20/3\end{bmatrix} \Rightarrow \begin{bmatrix} 1 &0 & -1 & | & -19/3 \\ 0 & 1 & 2 & | & 20/3\end{bmatrix}
[142536∣∣78]⇒[102−33−6∣∣7−20]⇒[102132∣∣720/3]⇒[1001−12∣∣−19/320/3]
于是有解为
x
1
=
x
3
−
19
/
3
x
2
=
−
2
x
3
+
20
/
3
x_1 = x_3-19/3 \\ x_2 = -2x_3+20/3
x1=x3−19/3x2=−2x3+20/3
同样可以用solve函数验证其正确性
>> syms x1;syms x2; syms x3;
>> result = solve([x1+2*x2+3*x3-7,4*x1+5*x2+6*x3-8]); % 修改求解方程
>> result.x1
ans =
x3 - 19/3
>> result.x2
ans =
20/3 - 2*x3
解情况讨论
根据消元法所展示的例子,我们已经对Gauss-Jordan 消元法求解方程有了浅浅的认识,接下来我们讨论一般性的解情况,即 A X = b AX = b AX=b 在不同秩r下的解情况,其中A是一个 m × n m\times n m×n 的一般性矩阵。在matlab中,用rank函数就能求得矩阵的秩。
>> A = [1,2,3;4,5,6];
>> rank(A)
ans =
2
第1种情况:r = m < n
在这种情况下,方程数小于未知数个数,必然有无穷多解。且此时由于矩阵的秩为r,所以自由向量的个数为n-r,也即说明解空间应该是一个维数为n-r的超平面。以前文所展示的例子为例,可以画出此时的解空间是一个在3维空间中的1维直线,图示和代码如下所示:
% 解空间为n-r的超平面
% 定义
syms x1; syms x2;
y1 = x1+19/3; y2 = 10/3-0.0000001*x1-0.5*x2; % 避免默认将x2读成x1
% fsurf画平面
fsurf(y1,EdgeColor='g'); hold on; fsurf(y2,EdgeColor='b');
% 画交线
hold on;
fplot3(x1,-2*x1-6,x1+19/3,Color = 'r',Linewidth = 2)
% 标注
legend('x_1+19/3=x_3','10/3 - x_2/2=x_3','交线');
xlabel('x_1'); ylabel('x_2');zlabel('x_3');
第2种情况:r = n < m
实际上,再取A的转置即可研究
A
T
=
[
1
4
2
5
3
6
]
⇒
[
1
4
0
−
3
0
−
6
]
⇒
[
1
0
0
1
0
0
]
=
[
I
0
]
=
R
A^{T} = \begin{bmatrix} 1 &4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} \Rightarrow \begin{bmatrix} 1 &4 \\ 0 & -3 \\ 0 & -6 \end{bmatrix} \Rightarrow \begin{bmatrix} 1 &0 \\ 0 & 1 \\ 0 & 0 \end{bmatrix} = \begin{bmatrix} I \\ 0 \end{bmatrix} =R
AT=⎣
⎡123456⎦
⎤⇒⎣
⎡1004−3−6⎦
⎤⇒⎣
⎡100010⎦
⎤=[I0]=R
此时可以发现,从行去看,
R
R
R的上部为单位阵
I
I
I,下部为0矩阵。 此时的方程数多于未知数个数,对于右端结果项b列实则提出了要求,即要么满足为
A
T
A^T
AT各列的线性组合,得到一个特解;要么就无解 。比如对于下面的方程而言,就存在特解
[
1
,
1
]
T
[1,1 ]^T
[1,1]T:
x
1
+
4
x
2
=
5
2
x
1
+
5
x
2
=
7
3
x
2
+
6
x
3
=
9
x_1+4x_2 = 5 \\ 2x_1 + 5x_2 = 7 \\ 3x_2+6x_3 = 9
x1+4x2=52x1+5x2=73x2+6x3=9
换言之,此时b列只有是处于
A
T
A^{T}
AT所在的列空间中的某个向量才会有解。此例中,提出的要求相当于b列要位于3维空间中
A
T
A^T
AT所在的二维平面上。同样可以画出相应的图示,图和代码如下
% b列所在的平面
% 画向量图
quiver3(0,0,0,1,2,3,'m'); hold on; quiver3(0,0,0,4,5,6,'black'); % 基底
hold on; quiver3(0,0,0,5,7,9,'r'); % 满足条件的b
V1 = [1;2;3]; V2 = [4;5;6];
% 求法向量
Vn = cross(V1,V2);
% 画平面
syms x1;syms x2;syms x3;
plane = -(x1*Vn(1)+x2*Vn(2))/Vn(3);
hold on;
fsurf(plane);
% 标注
legend('基底列1','基底列2','满足条件的b','所在平面');
xlabel('b_1'); ylabel('b_2'); zlabel('b_3');
第3种情况:r = n = m
直观地看,这将是前两种情况的公共部分,于是当未知数个数与方程个数相等时,将有且仅有一个解。我们可以推导解的一般形式,由于
r
=
n
=
m
r = n = m
r=n=m,故此时方阵可逆。对于方程两边同时左乘A的逆:
A
X
=
b
⇒
A
−
1
A
X
=
A
−
1
b
⇒
I
X
=
A
−
1
b
⇒
X
=
A
−
1
b
AX=b \Rightarrow A^{-1}AX=A^{-1}b \Rightarrow IX=A^{-1}b \Rightarrow X=A^{-1}b
AX=b⇒A−1AX=A−1b⇒IX=A−1b⇒X=A−1b
于是就有解的形式即为
A
−
1
b
A^{-1}b
A−1b,并可以知道此时
R
R
R就等于单位阵
I
I
I。也举一个例子
B
=
[
1
2
3
4
]
b
=
[
5
6
]
B = \begin{bmatrix} 1 &2 \\ 3 & 4 \end{bmatrix} \ \ \ \ b= \begin{bmatrix} 5 \\ 6 \end{bmatrix}
B=[1324] b=[56]
则计算结果为
X
=
B
−
1
b
=
[
−
2
1
1.5
−
0.5
]
[
5
6
]
=
[
−
4
4.5
]
X = B^{-1}b= \begin{bmatrix} -2 & 1 \\ 1.5 &-0.5\end{bmatrix} \begin{bmatrix} 5 \\ 6 \end{bmatrix}= \begin{bmatrix} -4 \\ 4.5 \end{bmatrix}
X=B−1b=[−21.51−0.5][56]=[−44.5]
用solve函数可验证正确性:
>> syms x1; syms x2;
>> result = solve([x1+2*x2-5,3*x1+4*x2-6]);
>> ans1 = result.x1,ans2 = result.x2
ans1 =
-4
ans2 =
9/2
第4种情况:r < m,r < n
这说明了列和行都存在线性相关项,由前面的推导,我们容易得知,此时的R矩阵应有如下的形式:
R
=
[
I
F
0
0
]
R = \begin{bmatrix} I &F \\ 0 & 0 \end{bmatrix}
R=[I0F0]
当
b
=
0
b=0
b=0时一定有解0,而当
b
≠
0
b \ne 0
b=0时则需要满足b列应在矩阵所在的列空间中。
[
I
F
0
0
]
[
X
(
p
i
v
o
t
)
X
(
f
r
e
e
)
]
=
[
X
(
p
i
v
o
t
)
+
F
X
(
f
r
e
e
)
0
]
\begin{bmatrix} I &F \\ 0 & 0 \end{bmatrix} \begin{bmatrix} X(pivot) \\ X(free) \end{bmatrix} = \begin{bmatrix} X(pivot) +FX(free) \\ 0 \end{bmatrix}
[I0F0][X(pivot)X(free)]=[X(pivot)+FX(free)0]
即此时需要满足b的
m
m
m行中有
m
−
r
m-r
m−r行是其余
r
r
r行的线性组合时,将有解,且有无穷多解;否则将无解。当然这种有无解条件判断的表述与第2种情况中,需要b列位于矩阵所在的列空间的表述等价。
比如修改矩阵B和对应的列b为
B
=
[
1
2
2
4
]
b
=
[
3
6
]
B = \begin{bmatrix} 1 &2 \\ 2 & 4 \end{bmatrix} \ \ \ \ b= \begin{bmatrix} 3 \\ 6 \end{bmatrix}
B=[1224] b=[36]
此时有解,且解可为
[
1
,
1
]
T
[1,1 ]^T
[1,1]T,
[
3
,
0
]
T
[3,0 ]^T
[3,0]T,
[
0
,
1.5
]
T
[0,1.5 ]^T
[0,1.5]T等等,对b提出的要求可以记为是在二维平面中的1条一维直线
b
2
=
2
b
1
b_2=2b_1
b2=2b1,而解空间则需要满足
x
2
=
−
0.5
x
1
+
1.5
x_2=-0.5x_1+1.5
x2=−0.5x1+1.5,容易发现这两个空间恰好是互相垂直的。对应的图片展示和代码如下:
% 解空间和b列所在空间
syms x1;
% b列所在的直线
fplot(2*x1);
% 解空间所在直线
hold on;
fplot(-x1/2+1.5);
% 标注
xlim([0,3.5]); ylim([0,3]);
% 求交点
hold on;
plot(0.6,1.2,'r+');
legend('b列所在的直线','解空间所在直线','交点(0.6,0.8)');
最后,用一张表格梳理解的个数。
秩 r | 解的个数 |
---|---|
r = m < n | 无穷多解 |
r = n < m | 0解或1解 |
r = n = m | 1解 |
r < m,r < n | 0解或无穷多解 |