书中讲解不是很详细,理解之后总结一下
首先说一下,之所以要理解选主元的Doolittle分解是因为书中对于该分解过程的讲解比较违和。本文的目的是为了说明:选主元的Doolittle分解法分解得到的LU矩阵所计算得到的方程组的解与普通的Doolittle分解计算得到的解是同一个解,因而也是原方程组的解。
申明
- Doolittle分解在计算L矩阵和U举证的时候需要进行 n n n次循环,本文用 k k k表示当前循环次数,在文中我把它称之为 第 k k k轮分解。
- 通常在计算 L L L矩阵和 U U U矩阵的时候通常将两者写在一个矩阵中,所以在文中我直接称之为 L U LU LU矩阵。
- 读懂本文首先你要对Doolittle分解和选主元的Doolittle分解已事先有了解,或者说你是带着疑问看的,否则不保证你能看懂。
正文开始
对于方程组:
A
x
=
b
Ax=b
Ax=b
Doolittle分解法最核心的是对目标求解矩阵
A
A
A做LU分解,考虑到计算机计算精度的问题需要上三角矩阵U的对角元素不能过小,于是有了选主元的Doolittle分解法,选主元本质上是对矩阵
A
A
A 做行变换使矩阵
U
U
U对角元素绝对值尽可能大。可以表示成下面公式的样子(左乘表示行变换):
Q
A
=
L
U
QA=LU
QA=LU
但是实际算法操作的时候并不是一次性的得到变换矩阵
Q
Q
Q ,或者说矩阵
Q
Q
Q在实际操作过程中并没有真正的出现过。那是怎么做的呢?接下来我假设从
k
=
1
k=1
k=1开始演算这个过程:
k = 1 k=1 k=1时
选取在矩阵第一列找出最大的元素,并且将最大元素行与第一行交换顺序,也就是一次选主元的行为,用公式可以表示为:
Q
1
A
Q_1A
Q1A
选主元之后按照常规的Doolittle分解法进行LU分解的第一轮操作,也就是对行变换后矩阵A进行操作,即:
(
L
U
)
k
=
1
(LU)_{k=1}
(LU)k=1
注:我这里用 ( L U ) k = 1 (LU)_{k=1} (LU)k=1 表示计算 L L L矩阵的第一列和 U U U矩阵的第一行,下面的表述类似
k = 2 k=2 k=2时
k = 1 k =1 k=1 时比较特殊,在接着 k = 1 k=1 k=1 讲述 k = 2 k=2 k=2 之前,需要先讲如下一种情况。
假设进行普通的Doolittle分解,在计算 LU 分解的过程中,已经执行完了第 k − 1 k-1 k−1 轮计算,也就是已经计算到了 LU 矩阵的 k − 1 k-1 k−1 列,和 k − 1 k-1 k−1 行,在正要执行第 k k k轮操作的时候,我们单独执行一次选主元操作(为了便于理解,这里用语言描述):
先计算 LU 矩阵第 k k k列的元素,然后比较这一列的元素,选出最大的一行,将这一行与 LU 矩阵的第k 行交换,向量 b b b也做对应的行变换,然后再接着计算 LU 矩阵的第 k k k 行元素。这样完成一次选主元的操作。之后按照一般的操作计算全部LU矩阵元素。最后LU完全分解后表示为
L ′ U ′ L^{'}U^{'} L′U′
之后根据分解后的矩阵计算得到的线性方程组的解与不做选主元得到解在理论上是相等的,虽然他们的系数矩阵放生了变化。也就是等式
L ′ U ’ x = b ′ L^{'}U^{’}x=b^{'} L′U’x=b′
与单纯进行LU分解得到的方程组
L U x = b LUx=b LUx=b
同解。
那么到这里我们再想象一下,上面的操作是否等效于:
- 先对矩阵 A A A 的对应行做交换,(表示为 Q k A Q_k A QkA)。
- 然后再用一般的LU分解对其计算对应的 L ′ ′ U ′ ′ L^{''} U^{''} L′′U′′ 矩阵
- 最后求方程组的解
答案是等效的。也就是说这个时候计算得到的 L ′ ′ = L ′ L^{''}=L^{'} L′′=L′ 、 U ′ ′ = U ′ U^{''}=U^{'} U′′=U′,最后就是下面四个方程同解
Q k A x = Q k b ⇔ L ′ U ’ x = b ′ ⇔ L U x = b ⇔ A x = b Q_kAx=Q_kb \Leftrightarrow L^{'}U^{’}x=b^{'} \Leftrightarrow LUx=b \Leftrightarrow Ax=b QkAx=Qkb⇔L′U’x=b′⇔LUx=b⇔Ax=b
这时候再回到
k
=
2
k=2
k=2 的情况。根据前面
k
=
1
k=1
k=1 情况下的描述,直接对
Q
1
A
Q_1 A
Q1A 做第一轮LU分解得到的LU矩阵的第一列的第一个元素就是本列最大的元素,这个时候如果按照一般Doolittle分解步骤执行,最后计算得出的解和原方程同样是同解的,也就是下面两个方程组同解
Q
1
A
x
=
Q
1
b
⇔
A
x
=
b
Q_1Ax=Q_1b \Leftrightarrow Ax=b
Q1Ax=Q1b⇔Ax=b
接下来我们将
Q
1
A
Q_1 A
Q1A看做一个整体,记为
A
1
A_1
A1,同时
b
1
=
Q
1
b
b_1=Q_1 b
b1=Q1b。
此时再看一下求解 A 1 x = b 1 A_1 x=b_1 A1x=b1 的过程:
-
对 A 1 A_1 A1 进行LU分解,在第二轮LU分解的时候选主元,之后按照一般的操作完成后面的LU分解,得到LU矩阵。
-
根据灰色文字的原理,这就等于先对 A 1 A_1 A1 进行行变换也就是 Q 2 A 1 Q_2 A_1 Q2A1,再按照一般LU分解继续计算得到的LU矩阵。即下面两个公式同解
Q 2 A 1 x = Q 2 b 1 ⇔ A 1 x = b 1 Q_2A_1x=Q_2b_1 \Leftrightarrow A_1x=b_1 Q2A1x=Q2b1⇔A1x=b1 -
这里记 A 2 = Q 2 A 1 b 2 = Q 2 b 1 A_2=Q_2 A_1 b_2=Q_2 b_1 A2=Q2A1b2=Q2b1 ,那么就可以说,上面提到的对 A 2 A_2 A2进行一般LU分解得到的LU矩阵的前两个对角元素就是选主元之后的元素,且理论上下面方程组同解:
A x = b Ax=b Ax=bA 1 x = Q 1 A x = Q 1 b = b 1 A_1x=Q_1Ax=Q_1b=b_1 A1x=Q1Ax=Q1b=b1
A 2 x = Q 2 A 1 x = Q 2 Q 1 A x = Q 2 Q 1 b = Q 2 b 1 = b 2 A_2x=Q_2A_1x=Q_2Q_1Ax=Q_2Q_1b=Q_2b_1=b_2 A2x=Q2A1x=Q2Q1Ax=Q2Q1b=Q2b1=b2
到这里就看出规律来了吧。以此类推,我们按照正常演算的思路顺一下,就可以很好地理解选主元的Doolittle分解法的内在原理了
- 为了计算方程组 A x = b Ax=b Ax=b,按照Doolittle分解法进行LU分解,为了减少计算误差,在第一轮LU分解中我们对LU矩阵第一列选主元,等价于对 A A A 做行变换即 Q 1 A Q_1 A Q1A 做一般LU分解;
- 在第一轮LU分解中对第一列选主元之后,接着在第二轮LU分解时,对其第二列做选主元,等价于对 Q 1 A Q_1 A Q1A 做第一轮一般LU分解后,在第二轮LU分解时选主元,进而等价于对 Q 2 Q 1 A Q_2 Q_1 A Q2Q1A 执行两轮一般LU分解;
- 同理继续做第三轮LU分解时,对LU矩阵第三列进行选主元,等价于对 Q 2 Q 1 A Q_2 Q_1 A Q2Q1A 做两轮一般LU分解后,在第三轮LU分解时,选主元,进而等价于对 Q 3 Q 2 Q 1 A Q_3 Q_2 Q_1 A Q3Q2Q1A 做三轮一般LU分解
- ⋯ ⋯ \cdots\cdots ⋯⋯
- 继续做第 k k k 轮LU分解时,对LU矩阵第 k k k 列进行选主元,等价于对 Q k − 1 ⋯ Q 2 Q 1 A Q_{k-1} \cdots Q_2 Q_1 A Qk−1⋯Q2Q1A 做 k − 1 k-1 k−1 轮一般分解后,在第 k k k 轮分解时,选主元,进而等价于对 Q k ⋯ Q 2 Q 1 A Q_{k} \cdots Q_2 Q_1 A Qk⋯Q2Q1A 做 k k k 轮一般LU分解
- ⋯ ⋯ \cdots\cdots ⋯⋯
- 直到LU矩阵全部计算完成,并且每一轮分解都采用了选主元操作。
- 最终等价于对
Q
n
Q
n
−
1
⋯
Q
2
Q
1
A
Q_{n}Q_{n-1}\cdots Q_2 Q_1 A
QnQn−1⋯Q2Q1A 做
n
n
n 轮一般LU分解。得到的最终LU矩阵所得到的解与原方程同解即。也就是
A x = b ⇔ Q n Q n − 1 ⋯ Q 2 Q 1 A x = Q n Q n − 1 ⋯ Q 2 Q 1 b ⇔ L U x = b n Ax=b \Leftrightarrow Q_{n}Q_{n-1}\cdots Q_2 Q_1 Ax=Q_{n}Q_{n-1}\cdots Q_2 Q_1b \Leftrightarrow LUx=b_n Ax=b⇔QnQn−1⋯Q2Q1Ax=QnQn−1⋯Q2Q1b⇔LUx=bn