此时,矩阵 A 是相同的,而向量(b1,b2,…,bp)是不同的。传统方法是通过直接行列式或高斯消元法来求解每个方程组,但这种方法效率较低,特别是当方程组数量 p 较大时。通过 LU 分解,可以将矩阵 A 分解为两个简单的三角矩阵 L 和 U,然后在第一次求解时进行一次分解,后续的方程组只需要基于这个分解进行较为简单的运算即可。这样,解每个方程组的效率大大提高。具体来说,LU 分解允许我们将方程组 Ax=b 转化为两个更容易求解的方程组:
Ax=(LU)x=L(Ux)=b⇒Ly=b,Ux=y
这两个方程组可以通过前代和回代来分别求解,复杂度远低于直接求解原方程组。请看下面案例:
首先,我们将矩阵 A 分解为下三角矩阵 L 和上三角矩阵 U,使得 A=LU。对于矩阵 A,通过 LU 分解得到:
L=123013001,U=200310102
我们要先求解方程 Ly=b,这是一个前代问题,因为 L 是下三角矩阵。方程形式如下:
123013001y1y2y3=51020⇒y=505
求解方程 Ux=y,这是一个回代问题,因为 U 是上三角矩阵。方程形式如下:
200310102x1x2x3=505⇒x=5/405/2
3. LU 分解算法
LU 分解可以通过初等行变换来实现。我们不断地对矩阵 A 施加初等行变换(左乘初等矩阵)先得到上三角矩阵 U:
(Ep…E1)A=U
我们在上面的等式两边乘以初等矩阵乘积的逆,就可以分解出 L,U:
A=(Ep…E1)−1U=LU
请观察下面分解矩阵 A 的过程:
观察上面的分解过程可以发现,对 A 进行 LU 分解时,我们只使用了行倍加变换 (row replacements),这样做是为了保证 LU 分解是唯一的。要满足只使用行倍加进行矩阵行化简的条件,我们就要保证在矩阵化简的过程中不能出现零主元(也就是矩阵 U 的主元不能出现零),这种方法可以归类为 一般的 LU 分解。
方阵 A 可逆并不能保证它可以进行 LU 分解,例如:A=[0110] 可逆,但它不能进行 LU 分解。
4. PLU 分解
在实际分解过程中,我们通常会遇到主元为零或过小导致无法继续进行分解、或产生数值不稳定的情况。这时,我们会使用到行交换(row interchanges) 来进行 LU 分解,这种分解方式是带行交换的LU分解。它的分解形式为:A=PLU,所以通常我们称这种分解法为 PLU 分解,其中 P 表示 置换矩阵(Permutationmatrix)。请观察下面的示例:
上面这个矩阵 A 的第一个主元就是 0,所以我们需要尝试使用 PLU 分解。注意,分解出的 U 的主元都不为 0。不过,由于我们可以选择不同的行交换方式(也就是置换矩阵 P 不唯一),所以我们不能保证分解得到的 L,U 是唯一的。请观察下面的分解过程:
上面的这次分解中,我们选择不同的置换矩阵,得到了不同的分解结果。除非,我们固定主元选取的策略,例如每次总是选择绝对值最大的元素(对于相等的元素设置固定的选择规则)进行行交换,那么 PLU 分解也可以是唯一的。事实上,所有的方阵都可以写成 PLU 分解的形式。例如下面这个矩阵也可以进行 PLU 分解:
上面的分解过程是一般的 LU 分解,它也可以写成 PLU 的形式,只不过此时的 P 表示单位矩阵。另外,上面的矩阵 A 明显是个奇异矩阵,虽然奇异矩阵也可以进行一般的 LU(PLU)分解,但分解结果通常包含零行或退化结构,因此在解线性方程组或计算矩阵逆等实际应用中价值有限(还不如不分解)。相反,若将 LU(PLU)分解限制于可逆矩阵,不仅能够有效地求解线性方程、计算矩阵的逆,还能保证分解的唯一性和数值稳定性。总之,对可逆矩阵进行 LU(PLU)分解通常更“划算”。
5. LU 分解的计算效率
解线性方程组 Ax=b 的传统方法是高斯消元法,其计算复杂度大约为 O(n3)。这意味着对于一个大小为 n×n 的矩阵,计算量是随矩阵维度 n 的三次方增长的。这在处理大规模矩阵时会变得非常昂贵,尤其是当矩阵规模较大(如数千维度的矩阵)时,计算时间和资源消耗会急剧增加。LU 分解的 复杂度也是 O(n3),与高斯消元法相同,但一旦 LU 分解完成,后续的多次求解只需 O(n2) 的计算量。下面的图表可以直观展示两种不同算法的对比: