Python矩阵LU分解
文章目录
-
- L和U
- lu分解
- lu_solve
scipy.linalg
中提供了一系列矩阵分解函数,其中最基础的肯定是LU分解。
L和U
LU分解,即使得矩阵AAA分解为LULULU,其中LLL为下三角阵,UUU为上三角阵。对于这两种矩阵,scipy.linalg
中提供了tril, triu
,可以将第kkk条对角线下面或上面的所有元素置零,即可以此获取L矩阵或者U矩阵。
import numpy as np
import scipy.linalg as sl
x = np.random.rand(4,4)
print(sl.tril(x,-1)) # 返回见[1]
[0.0.0.0.0.625942160.0.0.0.160437170.58205870.0.0.245608280.765995720.19223790.]\\begin{bmatrix} 0.&0.&0.&0.\\\\ 0.62594216&0.&0.&0.\\\\ 0.16043717&0.5820587&0.&0.\\\\ 0.24560828&0.76599572&0.1922379& 0.\\\\ \\end{bmatrix} 0.0.625942160.160437170.245608280.0.0.58205870.765995720.0.0.0.19223790.0.0.0.
print(sl.triu(x,2)) #
[0.0.0.919437580.25317330.0.0.0.765144520.0.0.0.0.0.0.0.]\\begin{bmatrix} 0.&0.&0.91943758&0.2531733 \\\\ 0.&0.&0.&0.76514452\\\\ 0.&0.&0.&0.\\\\ 0.&0.&0.&0. \\end{bmatrix} 0.0.0.0.0.0.0.0.0.919437580.0.0.0.25317330.765144520.0.
lu分解
LU
分解几乎是任何有关矩阵算法的书籍中,第一个出现的矩阵分解方法。在scipy.linalg
中,提供了lu, lu_factor, lu_solve
等函数,分别用于LU分解,以及通过LU分解求解Ax=b
类似的问题。
LU
分解示例如下
import numpy as np
from scipy.linalg import lu
A = np.random.rand(4,4)
p, l, u = lu(A)
np.allclose(A - p @ l @ u, np.zeros((4, 4)))
# True
lu
函数除了a
和用于有限性校验以及a
可覆盖性的参数之外,还有一个permute_l
,默认为False
,当其为True
时,将返回两个参数pl, u
。其中pl==p@l
。
lu_factor(a)
以另一种形式返回LU
分解的结果。其返回值有二,分别是lu, piv
,其中LU
就是L+U−IL+U-IL+U−I,其中III为单位阵;piv
表示矩阵PPP中不为零的元素的位置。
lu_solve
lu_solve
是根据LULULU分解求解PLUx−bPLUx-bPLUx−b的问题,其输入为(lu, piv)
和b
,测试如下
>>> b = np.array([1,2,3,4])
>>> lu, pix = sl.lu_factor(A)
>>> x = lu_solve((lu, pix), b)
>>> A@x-b
array([ 2.22044605e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00])
其中A
就是上面生成的随机矩阵,值为
[0.24959950.591795710.342368030.785595520.394277090.360157620.237897320.092232440.797012820.402917630.932155310.104867470.468129080.584262020.165601060.96889267]\\begin{bmatrix} 0.2495995&0.59179571&0.34236803&0.78559552\\\\ 0.39427709&0.36015762&0.23789732&0.09223244\\\\ 0.79701282&0.40291763&0.93215531&0.10486747\\\\ 0.46812908&0.58426202&0.16560106&0.96889267 \\end{bmatrix} 0.24959950.394277090.797012820.468129080.591795710.360157620.402917630.584262020.342368030.237897320.932155310.165601060.785595520.092232440.104867470.96889267