矩阵分解的概念:初中我们接触过数的分解,如:;推广到矩阵,一个矩阵也可以分解为几个矩阵乘积的形式,矩阵分解具有不同的目的。
矩阵的LU分解的定义是将矩阵分解为一个下三角矩阵()和上三角矩阵()乘积的方式: ,其目的是为了提高计算效率。
L:Lower Triangle Matrix U:Upper Triangle Matrix
上三角矩阵
在LU分解中,通常将一个矩阵分解成一个下三角单位矩阵和一个上三角矩阵(不保证对角线为)
联系"高斯消元"过程:系数矩阵和结果矩阵拼接成的增广矩阵通过一系列初等变换,就是把一个矩阵变成了上三角矩阵的过程。即
根据这条式子进行拓展有:
从中可以看出,高斯消元过程的逆操作变换矩阵就是下三角矩阵:
一个矩阵可以进行LU分解的前提条件:对矩阵的消元过程中不能涉及行交换操作(只有主元位置为0的矩阵在高斯消元过程需要进行行变换)。因为分解得到的矩阵是由单位矩阵得到的,如果消元过程发生了行交换,也就意味着单位矩阵发生了行交换,对应的L矩阵就不是一个下三角矩阵。
证明如下:
假设矩阵可以进行LU分解。
根据LU分解的定义,则矩阵可以分解得到一个下三角矩阵和一个上三角矩阵
通过矩阵乘法,可以得出
.
.
当一个矩阵不用发生行交换进行消元过程的时候,那么对应获取它的矩阵直接可以通过矩阵取反得到,发生行交换后,矩阵不能直接由矩阵取反得到。
对于主元位置为零的矩阵(也就是发生行交换才能进行LU分解的矩阵,可以使用PLU分解方法,P矩阵是置换矩阵)
分解的时间复杂度的计算
其中 是矩阵下三角区域需要化为的元素的个数(一共约为个),完成这些元素的消元约需要进行次初等变换,而每次初等变换意味着对矩阵内一行的个元素都进行了一次运算,所以由高斯消元过程总共约发生了次数据运算},时间复杂度约为。由于高斯消元过程在得到矩阵的同时,每次初等变换操作的值取反往单位矩阵相应的位置进行填充就可以得到矩阵,所以整体上分解过程的时间消耗近乎等于过程的时间。
分解加速线性系统求解
对于解线性系统
设 , 方程变为 ,求出的时间复杂度约为。
同样,对于,求出的时间复杂度也约为
从而,将矩阵通过分解,时间复杂度总体为
分解计算时间复杂度相比求解矩阵的逆的过程求解.
矩阵通过增广矩阵的形式求逆的时间复杂度为,增广矩阵有个元素要执行消元操作。然后再求解的时间复杂度有次操作,所以通过矩阵的逆的方法求解线性系统的时间复杂度为。
综上,LU分解求解线性系统的效率是比较高的。
简单LU过程的python写法
import numpy as np
A = np.array([[1,2,3],[4,5,6],[3,-3,5]]) ### 创建一个用于分解的测试矩阵
L = [[1.0 if i==j else 0 for i in range(n)] for j in range(n)] ### 初始化L矩阵为单位矩阵
n = len(A) ### 创建变量n记录矩阵的行数
for i in range(n): #行遍历
for j in range(i+1,n): #处理主元行下面的所有行化为0
p = A[j][i] / A[i][i] ##求算主元行下面行主元列位置的元素是当前主元的倍数
A[j] = A[j] - p*A[i] ##主元行下面行主元列位置的元素减去p倍主元化为0
L[j][i] = p ### p直接填充到L矩阵
L