scipy.linalg.

ldl#

scipy.linalg.ldl(A, lower=True, hermitian=True, overwrite_a=False, check_finite=True)[源代码]#

计算对称/厄米矩阵的 LDLt 分解或 Bunch-Kaufman 分解。

此函数返回一个由至多 2x2 大小的块组成的对角线块矩阵 D,还返回一个可能已置换的单位下三角矩阵 L,使得分解 A = L D L^HA = L D L^T 成立。如果 lower 为 False,则会再次返回(可能置换的)上三角矩阵作为外部因子。

排列数组可以通过行改组将外因数三角化,即 lu[perm, :] 是一个上/下三角矩阵。这还等同于使用置换矩阵 P.dot(lu) 进行乘法,其中 P 是列置换恒等矩阵 I[:, perm]

根据布尔值 lower 的值,仅引用输入数组的上或下三角部分。因此,入口处的三角矩阵将产生与提供完整矩阵相同的结果。

参数:
A类似数组

方形输入数组

lower布尔,可选

此参数可在因式分解的下三角或上三角外因数间切换。下三角(lower=True)是默认值。

hermitian布尔,可选

针对复值数组,此参数定义了假设为 A = A.conj().T 还是 A = A.T。此开关对实值数组无效。

overwrite_a布尔,可选

允许覆盖 A 中的数据(可能会提升性能)。默认值为 False。

check_finite布尔,可选

用以检查输入矩阵是否仅包含有限数字。禁用此项可能会提升性能,但如果输入包含无穷大或 NaN,则可能会导致问题(崩溃、未终止)。

返回值:
lundarray

因式分解的(可能被置换的)上/下三角外因数。

dndarray

因式分解的块对角乘数。

permndarray

将 lu 变为三角形的行置换索引数组。

引发:
ValueError

如果输入数组不是方形。

ComplexWarning

如果给定的是对角线存在非零虚部的复值数组,且 hermitian 被设置为 True。

另请参见

choleskylu

注释

此函数对对称矩阵使用 ?SYTRF 例程,对厄米矩阵使用 LAPACK 中的 ?HETRF 例程。有关算法详细信息,请参阅 [1]

根据 lower 关键字值,仅引用输入数组的较低或较高三角形部分。此外,此关键字还定义因子分解的外部因子的结构。

在版本 1.1.0 中新增。

参考

[1]

J.R. Bunch、L. Kaufman,用于计算惯性和求解对称线性系统的某些稳定方法,Math. Comput. Vol.31,1977。 DOI:10.2307/2005787

示例

给定表示完整对称数组及其项的上三角形数组 a,获取 l、'd' 和排列向量 perm

>>> import numpy as np
>>> from scipy.linalg import ldl
>>> a = np.array([[2, -1, 3], [0, 2, 0], [0, 0, 1]])
>>> lu, d, perm = ldl(a, lower=0) # Use the upper part
>>> lu
array([[ 0. ,  0. ,  1. ],
       [ 0. ,  1. , -0.5],
       [ 1. ,  1. ,  1.5]])
>>> d
array([[-5. ,  0. ,  0. ],
       [ 0. ,  1.5,  0. ],
       [ 0. ,  0. ,  2. ]])
>>> perm
array([2, 1, 0])
>>> lu[perm, :]
array([[ 1. ,  1. ,  1.5],
       [ 0. ,  1. , -0.5],
       [ 0. ,  0. ,  1. ]])
>>> lu.dot(d).dot(lu.T)
array([[ 2., -1.,  3.],
       [-1.,  2.,  0.],
       [ 3.,  0.,  1.]])