我正在完成Saul I. Gass的第5版“线性规划”。
他给出了以下文字和例子: "给定nxn非奇异矩阵 A ,则 A 可表示为 A = LU ......如果我们让 U (或 L )的对角线元素都等于1,那么 LU 分解将独一无二......"
我设法从这个SO问题中找到了这个代码的可逆上下分解:Is there a built-in/easy LDU decomposition method in Numpy?
但我仍然无法分辨出发生了什么以及为什么 L 和 U 与我的教科书如此不同。任何人都可以向我解释一下吗?
所以这段代码:
import numpy as np
import scipy.linalg as la
a = np.array([[1, 1, -1],
[-2, 1, 1],
[1, 1, 1]])
(P, L, U) = la.lu(a)
print(P)
print(L)
print(U)
D = np.diag(np.diag(U)) # D is just the diagonal of U
U /= np.diag(U)[:, None] # Normalize rows of U
print(P.dot(L.dot(D.dot(U)))) # Check
给出了这个输出:
[[ 0. 1. 0.]
[ 1. 0. 0.]
[ 0. 0. 1.]]
[[ 1. 0. 0. ]
[-0.5 1. 0. ]
[-0.5 1. 1. ]]
[[-2. 1. 1. ]
[ 0. 1.5 -0.5]
[ 0. 0. 2. ]]
[[ 1. 1. -1.]
[-2. 1. 1.]
[ 1. 1. 1.]]
答案 0 :(得分:2)
可以选择哪个矩阵( L 或 U )应该在对角线上有一个矩阵。教科书示例选择了 U ,但是scipy的实现选择了 L 。这解释了差异。
为了说明这一点,我们可以扭转局面:
(P, L, U) = la.lu(a.T)
print(P.T)
# [[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]
print(L.T)
# [[ 1. 1. -1. ]
# [ 0. 1. -0.33333333]
# [ 0. 0. 1. ]]
print(U.T)
# [[ 1. 0. 0.]
# [-2. 3. 0.]
# [ 1. 0. 2.]]
通过转置矩阵,我们基本上交换了 U 和 L ,以便其他矩阵在对角线上得到1。而且,瞧,结果和教科书一样。
(请注意,如果置换矩阵 P 不是单位矩阵,结果看起来会有所不同。)