线性代数:矩阵的分解(LU分解n阶方阵)

矩阵分解的概念: 初中我们接触过数的分解,如:  66=3∗3∗11(质因数分解)\ \ 66 = 3*3*11(\color{skyblue} {\small 质因数分解})  66=3311(质因数分解); 推广到矩阵,一个矩阵也可以分解为几个矩阵乘积的形式,矩阵分解具有不同的目的。

矩阵的LU分解的定义是将矩阵AAA分解为一个下三角矩阵(矩阵的有效信息都在下三角区域\small 矩阵的有效信息都在下三角区域矩阵的有效信息都在下三角区域)和上三角矩阵($ \small 矩阵的有效信息都在上三角区域$)乘积的方式: A=L⋅U\begin{aligned} &A = L \cdot U \end{aligned}A=LU ,其目的是为了提高计算效率。

L : Lower Triangle Matrix U:Upper Triangle Matrix
下三角单位矩阵                  .\color{red} {\small 下三角单位矩阵}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ .下三角单位矩阵                  . 上三角矩阵
[1000∗100∗∗10∗∗∗1]           [∗∗∗∗0∗∗∗00∗∗000∗]\begin{bmatrix} 1&0&0&0 \\ *&1&0&0 \\ *&*&1&0 \\ *&*&*&1\end{bmatrix} \ \ \ \ \ \ \ \ \ \ \ \begin{bmatrix} *&*&*&* \\ 0&*&*&* \\ 0&0&*&* \\ 0&0&0&*\end{bmatrix}1010010001           000000
在LU分解中,通常将一个矩阵分解成一个下三角单位矩阵和一个上三角矩阵(不保证对角线为 111 )

联系"高斯消元"过程: 系数矩阵和结果矩阵拼接成的增广矩阵通过一系列初等变换,就是把一个矩阵变成了上三角矩阵的过程。即 Ep⋅...⋅E3⋅E2⋅E1⋅A=UE_{p}\cdot ... \cdot E_{3} \cdot E_{2} \cdot E_{1} \cdot A =UEp...E3E2E1A=U
根据这条式子进行拓展有:
∵(Ep−1⋅...⋅E3−1⋅E2−1⋅E1−1)⋅(Ep⋅...⋅E3⋅E2⋅E1)⋅A=(Ep−1⋅...⋅E3−1⋅E2−1⋅E1−1)⋅U\because (E_{p}^{-1}\cdot ... \cdot E_{3}^{-1} \cdot E_{2}^{-1} \cdot E_{1}^{-1})\cdot (E_{p}\cdot ... \cdot E_{3} \cdot E_{2} \cdot E_{1} )\cdot A = (E_{p}^{-1}\cdot ... \cdot E_{3}^{-1} \cdot E_{2}^{-1} \cdot E_{1}^{-1})\cdot U(Ep1...E31E21E11)(Ep...E3E2E1)A=(Ep1...E31E21E11)U
∴I⋅A=(Ep−1⋅...⋅E3−1⋅E2−1⋅E1−1)⋅U\therefore I \cdot A = (E_{p}^{-1}\cdot ... \cdot E_{3}^{-1} \cdot E_{2}^{-1} \cdot E_{1}^{-1})\cdot UIA=(Ep1...E31E21E11)U
从中可以看出,高斯消元过程的逆操作变换矩阵就是下三角矩阵LLL
∴A=L⋅U→L=(Ep−1⋅...⋅E3−1⋅E2−1⋅E1−1)\therefore A=L\cdot U \color{red}{\to} L= (E_{p}^{-1}\cdot ... \cdot E_{3}^{-1} \cdot E_{2}^{-1} \cdot E_{1}^{-1})A=LUL=(Ep1...E31E21E11)

一个矩阵可以进行LU分解的前提条件:对矩阵AAA的消元过程中不能涉及行交换操作(只有主元位置为0的矩阵在高斯消元过程需要进行行变换)。因为分解得到的LLL矩阵是由单位矩阵得到的,如果消元过程发生了行交换,也就意味着单位矩阵发生了行交换,对应的L矩阵就不是一个下三角矩阵。
证明如下:

假设矩阵A=[0111]A= \begin{bmatrix} 0&1 \\ 1&1 \end{bmatrix}A=[0111]可以进行LU分解。
根据LU分解的定义,则矩阵AAA可以分解得到一个下三角矩阵LLL和一个上三角矩阵UUU
令 L=[l110l21l22]and [u11u120u22]令 \ L= \begin{bmatrix} l_{11}&0 \\ l_{21}& l_{22} \end{bmatrix} and \ \begin{bmatrix} u_{11}&u_{12} \\ 0& u_{22} \end{bmatrix} L=[l11l210l22]and [u110u12u22]
通过矩阵乘法,可以得出
$\because a_{11} = l_{11} \cdot u_{11}=0, 所以必然存在 l_{11}=0 \ 或 \ u_{11} =0 $
如果是l11=0,那么就有a12=l11⋅u12=0,然而这就与矩阵A中a12=1的结果相矛盾{\small 如果是}l_{11}=0 ,{\small 那么就有}a_{12}=l_{11} \cdot u_{12} = 0,{\small 然而这就与矩阵}A 中a_{12}=1{\small 的结果相矛盾}如果是l11=0那么就有a12=l11u12=0然而这就与矩阵Aa12=1的结果相矛盾.
如果是u11=0,那么就有a21=l21⋅u11=0,然而这就与矩阵A中a21=1的结果相矛盾{\small 如果是}u_{11}=0 ,{\small 那么就有}a_{21}=l_{21} \cdot u_{11} = 0,{\small 然而这就与矩阵}A 中a_{21}=1{\small 的结果相矛盾}如果是u11=0那么就有a21=l21u11=0然而这就与矩阵Aa21=1的结果相矛盾.
∴综上,矩阵A不能进行LU分解\therefore{\small \textbf{综上,矩阵A不能进行LU分解} }综上,矩阵A不能进行LU分解

当一个矩阵不用发生行交换进行消元过程的时候,那么对应获取它的LLL矩阵直接可以通过EEE矩阵取反得到,发生行交换后,LLL矩阵不能直接由EEE矩阵取反得到。


对于主元位置为零的矩阵(也就是发生行交换才能进行LU分解的矩阵,可以使用PLU分解方法A=P⋅L⋅UA=P\cdot L \cdot UA=PLU,P矩阵是置换矩阵)

LULULU分解的时间复杂度的计算   O(0.5n3)\ \ \ O(0.5n^{3})   O(0.5n3)
其中nnn 是矩阵An∗nA_{n*n}Ann下三角区域需要化为000的元素的个数(一共约为12n2\frac {1}{2}n^{2}21n2个),完成这些元素的消元约需要进行12n2\frac {1}{2}n^{2}21n2次初等变换,而每次初等变换意味着对矩阵内一行的nnn个元素都进行了一次运算,所以由A→UA \to UAU高斯消元过程总共约发生了0.5n2⋅n0.5n^{2} \cdot n0.5n2n次数据运算}, OOO 时间复杂度约为 O(0.5n3)O(0.5n^{3})O(0.5n3)。由于高斯消元过程在得到UUU矩阵的同时,每次初等变换操作的值取反往单位矩阵III相应的位置进行填充就可以得到LLL矩阵,所以整体上LULULU分解过程的时间消耗近乎等于 A→UA \to UAU过程的时间。

LULULU分解加速线性系统求解

对于解线性系统Ax=bAx=bAx=b
矩阵A被分解为A=L⋅U\small{ 矩阵A被分解为A=L\cdot U}矩阵A被分解为A=LU
→L⋅U⋅x=b\to L \cdot U \cdot x =bLUx=b
Ux=yUx=yUx=y, 方程变为 L⋅y=bL \cdot y =bLy=b ,求出yyy的时间复杂度约为O(n2)O(n^2)O(n2)
同样,对于U⋅xU\cdot xUx,求出xxx的时间复杂度也约为O(n2)O(n^{2})O(n2)
从而,将矩阵AAA通过LULULU分解,时间复杂度总体为O(0.5n3)+2O(n2)O(0.5n^{3}) + 2O(n^{2})O(0.5n3)+2O(n2)

LULULU分解计算时间复杂度相比求解矩阵的逆的过程求解A⋅x=b→x=A−1⋅bA\cdot x=b \to x = A^{-1}\cdot bAx=bx=A1b.
矩阵通过增广矩阵的形式求逆的时间复杂度为O2n3O{2n^{3}}O2n3,增广矩阵有2n22n^{2}2n2个元素要执行消元操作。然后再求解A−1⋅bA^{-1}\cdot bA1b的时间复杂度有O(n2)O(n^2)O(n2)次操作,所以通过矩阵的逆的方法求解线性系统的时间复杂度为O(2n3)+O(n2)>O(0.5n3)+2O(n2)O(2n^{3})+O(n^2) \gt O(0.5n^{3}) + 2O(n^{2})O(2n3)+O(n2)>O(0.5n3)+2O(n2)

综上,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪桦

有帮助的话请杯咖啡吧,谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值