scipy.linalg
中提供了一系列矩阵分解函数,其中最基础的肯定是LU分解。
L和U
LU分解,即使得矩阵
A
A
A分解为
L
U
LU
LU,其中
L
L
L为下三角阵,
U
U
U为上三角阵。对于这两种矩阵,scipy.linalg
中提供了tril, triu
,可以将第
k
k
k条对角线下面或上面的所有元素置零,即可以此获取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.62594216 0. 0. 0. 0.16043717 0.5820587 0. 0. 0.24560828 0.76599572 0.1922379 0. ] \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.91943758 0.2531733 0. 0. 0. 0.76514452 0. 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
−
I
L+U-I
L+U−I,其中
I
I
I为单位阵;piv
表示矩阵
P
P
P中不为零的元素的位置。
lu_solve
lu_solve
是根据
L
U
LU
LU分解求解
P
L
U
x
−
b
PLUx-b
PLUx−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
就是上面生成的随机矩阵,值为文章来源:https://www.toymoban.com/news/detail-719112.html
[ 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 ] \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 文章来源地址https://www.toymoban.com/news/detail-719112.html
到了这里,关于Python矩阵LU分解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!