工程上通常会用矩阵分解来求解线性方程组
LU分解#
将矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积:
A=LU
其中L是下三角矩阵,U是上三角矩阵
- 下三角矩阵:所有元素在主对角线以下的矩阵,主对角线元素可以是任意值
- 上三角矩阵:所有元素在主对角线以上的矩阵,主对角线元素可以是任意值
LU手算方法#
- 将矩阵A进行高斯消元,得到一个上三角矩阵U,消元时Ri−kRj(第i行减去第j行的k倍)的系数k就是下三角矩阵L中元素lij的值
e.g.:
A=[2437]→U=[2031]→L=[1201]NOTE定型文:直接解Ax=b和先LU分解再解方程,复杂度都是O(n3),为什么还要分解?
- LU分解可以复用:如果要解多个方程Ax=bi,只需要一次LU分解,后续每个方程的求解复杂度是O(n2),比直接解每个方程的O(n3)更高效
- 空间复杂度低:LU分解为”原地”操作,可用原A的空间存储L和U
- 行列式计算简单:det(A)=det(L)⋅det(U),其中det(L)=1,所以det(A)=∏i=1nuii,只需要计算上三角矩阵U的对角线元素的乘积即可
- 数值稳定性:LU分解可以通过部分选主元来提高数值稳定性,避免除以小数导致的误差放大
- 求逆更快
QR分解#
将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积:
A=QR
其中Q是正交矩阵,R是上三角矩阵
QR手算方法#
- 使用格拉姆-施密特正交化方法将矩阵A的列向量正交化,得到一个正交矩阵Q,正交化过程中每个列向量的长度就是上三角矩阵R中的元素
e.g.:
A=[3412]A=[a1,a2]Q=[q1,q2]先算q1:
q1=∥a1∥a1=51[34]然后算a2在q1上的投影:
projq1a2=(q1⋅q1a2⋅q1)q1=2511[34]得垂直向量v2:
v2=a2−projq1a2=[12]−2511[34]=251[−86]最后算q2:
q2=∥v2∥v2=101[−86]得到:
Q=51[34−43]→R=QTA=[∥a1∥0∥projq1a2∥∥v2∥]=[502.20.4]
奇异值分解(SVD)#
A=UΣVT
其中U是左奇异矩阵,Σ是对角矩阵,VT是右奇异矩阵的转置
SVD手算#
这你要考手算那我还说啥了,分不要了呗
特征值分解(EVD)#
A=PDP−1
其中P是特征向量矩阵,D是特征值对角矩阵
EVD手算#
- 计算矩阵A的特征值λ,通过求解特征多项式det(A−λI)=0得到
- 对于每个特征值λ,求解特征向量v,通过求解线性方程组(A−λI)v=0得到
- 把特征值摆在D的对角线上,把对应的特征向量摆在P的列向量上
- 还要求P−1,如果是对称矩阵,特征向量相互正交,P是正交矩阵,P−1=PT,否则需要通过其他方法求逆
Cholesky(科列斯基)分解#
A=LLT
其中L是下三角矩阵
Cholesky手算#
LU分解升级版
- 对角线元素:lii=aii−∑k=1i−1lik2
- 非对角线元素:lij=ljj1(aij−∑k=1j−1likljk),其中i>j
e.g.:
A=a11a21a31a12a22a32a13a23a33L=l11l21l310l22l3200l33先算第一列:
l11=a11l21=l11a21l31=l11a31然后算第二列:
l22=a22−l212l32=l221(a32−l31l21)最后算第三列:
l33=a33−(l312+l322)