> 文章列表 > Python矩阵LU分解

Python矩阵LU分解

Python矩阵LU分解

文章目录

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+UI,其中III为单位阵;piv表示矩阵PPP中不为零的元素的位置。

lu_solve

lu_solve是根据LULULU分解求解PLUx−bPLUx-bPLUxb的问题,其输入为(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