数学基础之代数学(3)——线性方程组求解
1、基础概念
求解线性方程组,顾名思义,线性代表是一次变量,方程组则代表是多元变量,因此,我们在这里可以给出线性方程组的一般性格式:
{
a
1
,
1
x
1
+
a
1
,
2
x
2
+
⋯
+
a
1
,
n
x
n
=
b
1
⋮
a
m
,
1
x
1
+
a
m
,
2
x
2
+
⋯
+
a
m
,
n
x
n
=
b
m
\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\vdots\\\\a_{m,1}x_1+a_{m,2}x_2+\cdots+a_{m,n}x_n=b_m\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧a1,1x1+a1,2x2+⋯+a1,nxn=b1 ⋮am,1x1+am,2x2+⋯+am,nxn=bm
也可以借助矩阵的概念,将其简化为
A
x
=
b
Ax=b
Ax=b,其中
A
A
A是
m
×
n
m\times n
m×n的矩阵,
x
x
x是
n
n
n维列向量(即
n
n
n行
1
1
1列),
b
b
b是
m
m
m维列向量,即
(
a
1
,
1
⋯
a
1
,
n
⋮
⋱
⋮
a
m
,
1
⋯
a
m
,
n
)
(
x
1
⋮
x
n
)
=
(
b
1
⋮
b
m
)
\left(\begin{matrix}a_{1,1}&\cdots&a_{1,n}\\\\\vdots&\ddots&\vdots\\\\a_{m,1}&\cdots&a_{m,n}\end{matrix}\right)\left(\begin{matrix}x_1\\\\\vdots\\\\x_n\end{matrix}\right)=\left(\begin{matrix}b_1\\\\\vdots\\\\b_m\end{matrix}\right)
⎝⎜⎜⎜⎜⎜⎛a1,1⋮am,1⋯⋱⋯a1,n⋮am,n⎠⎟⎟⎟⎟⎟⎞⎝⎜⎜⎜⎜⎜⎛x1⋮xn⎠⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎛b1⋮bm⎠⎟⎟⎟⎟⎟⎞。
2、高斯消元法
高斯消元法在本质上还是借助了行列式的算法——先进行初等变换,将矩阵消成上三角矩阵,最终进行求解。这里我们先来看一下矩阵的初等变换:
(
1
)
(1)
(1) 行初等变换:
a. 互换矩阵任意两行
b. 矩阵任意一行乘以任意非
0
0
0常数
c. 将矩阵任意一行的
k
k
k倍加到另一行上
(
2
)
(2)
(2) 列初等变换:
a. 互换矩阵任意两列
b. 矩阵任意一列乘以任意非
0
0
0常数
c. 将矩阵任意一列的
k
k
k倍加到另一列上
下面我们还要简单了解一下增广矩阵:增广矩阵(又称扩增矩阵)就是在系数矩阵的右边添上一列,这一列是线性方程组的等号右边的值,即
(
a
1
,
1
⋯
a
1
,
n
b
1
⋮
⋱
⋮
⋮
a
m
,
1
⋯
a
m
,
n
b
m
)
\left(\begin{matrix}a_{1,1}&\cdots&a_{1,n}&b_1\\\\\vdots&\ddots&\vdots&\vdots\\\\a_{m,1}&\cdots&a_{m,n}&b_m\end{matrix}\right)
⎝⎜⎜⎜⎜⎜⎛a1,1⋮am,1⋯⋱⋯a1,n⋮am,nb1⋮bm⎠⎟⎟⎟⎟⎟⎞
而将矩阵化为上三角矩阵的一般性做法是对每列进行依次处理,比如当前处理到第
j
j
j列,第
i
i
i行以前的行已经固定了,需要将第
i
i
i行一下该列所有系数都消
0
0
0。若第
i
i
i行以下包括第
i
i
i行本身的第
j
j
j个元素已经全部都是
0
0
0了,就直接处理下一列。否则选取一个第
j
j
j个元素不为
0
0
0的行与第
i
i
i行交换,这里注意,若第
i
i
i行的第
j
j
j列本身就不等于
0
0
0,则需跳过本步骤。此时称第
i
i
i行为主行,主行的第
j
j
j个元素称为主元,再利用行初等变换将第
j
j
j列上第
i
i
i行以下的所有系数消
0
0
0,然后处理下一行和下一列,直至初始矩阵被消为上三角矩阵。
下面我们来看一个简单的例子,现在我们有方程组待求解
{
1
×
x
1
+
1
×
x
2
+
1
×
x
3
=
1
1
×
x
1
+
1
×
x
2
+
2
×
x
3
=
2
1
×
x
1
+
2
×
x
2
+
3
×
x
3
=
6
\begin{cases}1\times x_1+1\times x_2+1\times x_3=1\\\\1\times x_1+1\times x_2+2\times x_3=2\\\\1\times x_1+2\times x_2+3\times x_3=6\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧1×x1+1×x2+1×x3=11×x1+1×x2+2×x3=21×x1+2×x2+3×x3=6,首先我们可以得到一个增广矩阵
(
1
1
1
1
1
1
2
2
1
2
3
6
)
\left(\begin{matrix}1&1&1&1\\\\1&1&2&2\\\\1&2&3&6\end{matrix}\right)
⎝⎜⎜⎜⎜⎛111112123126⎠⎟⎟⎟⎟⎞,下面开始高斯消元:
1.处理第一列,第一行第一列的元素
1
1
1自动成为主元,处理第二行,将第一行的
−
1
-1
−1倍加在第二行上,原矩阵化为
(
1
1
1
1
0
0
1
1
1
2
3
6
)
\left(\begin{matrix}1&1&1&1\\\\0&0&1&1\\\\1&2&3&6\end{matrix}\right)
⎝⎜⎜⎜⎜⎛101102113116⎠⎟⎟⎟⎟⎞,下面处理第三行,将第一行的
−
1
-1
−1倍加在第三行上,矩阵化为
(
1
1
1
1
0
0
1
1
0
1
2
5
)
\left(\begin{matrix}1&1&1&1\\\\0&0&1&1\\\\0&1&2&5\end{matrix}\right)
⎝⎜⎜⎜⎜⎛100101112115⎠⎟⎟⎟⎟⎞。
2.处理第二列,第一行已经固定,第二行第二列的元素为
0
0
0,因此第三行第二列的元素
1
1
1自动成为主元,调换第二行与第三行顺序,矩阵化为
(
1
1
1
1
0
1
2
5
0
0
1
1
)
\left(\begin{matrix}1&1&1&1\\\\0&1&2&5\\\\0&0&1&1\end{matrix}\right)
⎝⎜⎜⎜⎜⎛100110121151⎠⎟⎟⎟⎟⎞。
处理完毕,得到简化后的方程组
{
1
×
x
1
+
1
×
x
2
+
1
×
x
3
=
1
1
×
x
2
+
2
×
x
3
=
5
1
×
x
3
=
1
\begin{cases}1\times x_1+1\times x_2+1\times x_3=1\\\\1\times x_2+2\times x_3=5\\\\1\times x_3=1\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧1×x1+1×x2+1×x3=11×x2+2×x3=51×x3=1,解得
{
x
1
=
−
3
x
2
=
3
x
3
=
1
\begin{cases} x_1=-3\\\\x_2=3\\\\x_3=1\end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x1=−3x2=3x3=1,经检验成立。
注意,有时候我们最终会遇见
0
×
x
i
=
0
0\times x_i=0
0×xi=0或者
0
×
x
i
=
a
0\times x_i=a
0×xi=a的情况,前者代表有无穷多组解,后者则意味着无解,其余的情况都是唯一解。这些其实可以通过矩阵的秩看出来,这里就不细说了,有机会的话再写点线性代数的博客。
3、克莱姆法则
当基础概念中的系数矩阵
A
A
A规格为
n
×
n
n\times n
n×n时,我们可以使用克莱姆法则进行求解,直接得到
x
i
=
D
i
D
x_i=\frac{D_i}{D}
xi=DDi,其中
D
D
D是
A
A
A的行列式(即
D
D
D=|A|),
D
i
D_i
Di是将
A
A
A中第
i
i
i列替换为
b
b
b后得到的矩阵的行列式。继续看上述上述例子,易知
D
=
∣
1
1
1
1
1
2
1
2
3
∣
=
−
1
,
D
2
=
∣
1
1
1
1
2
2
1
6
3
∣
=
−
3
⇒
x
2
=
D
2
D
=
3
D=\left|\begin{matrix}1&1&1\\\\1&1&2\\\\1&2&3\end{matrix}\right|=-1,D_2=\left|\begin{matrix}1&1&1\\\\1&2&2\\\\1&6&3\end{matrix}\right|=-3\Rightarrow x_2=\frac{D_2}{D}=3
D=∣∣∣∣∣∣∣∣∣∣111112123∣∣∣∣∣∣∣∣∣∣=−1,D2=∣∣∣∣∣∣∣∣∣∣111126123∣∣∣∣∣∣∣∣∣∣=−3⇒x2=DD2=3。
4、算法妙用
矩阵求逆:对于一个
n
×
n
n\times n
n×n的非奇异矩阵,在矩阵右侧添加一个
n
×
n
n\times n
n×n的单位矩阵,形成一个规格为
n
×
2
n
n\times 2n
n×2n的矩阵,对其进行高斯消元,当左侧原非奇异矩阵被化为单位矩阵时,右侧添加的
n
×
n
n\times n
n×n单位矩阵也被化为了原非奇异矩阵的逆。
5、注意
a. 由于在消元过程中需要用到除法,所有会有浮点数运算带来的精度问题。不同的消元顺序可能也会带来差异,因此推荐使用绝对值较大的主元进行消元。
b. 可以使用辗转相除法代替直接除,这样可以确保系数永远是整数,从而规避浮点数运算的精度问题,但是这样也会导致数值较大,如何取舍需要依具体情况而定。