【问题标题】:Scipy linalg LU decomposition gives different results to my textbookScipy linalg LU 分解给我的教科书带来了不同的结果
【发布时间】:2018-05-28 11:38:00
【问题描述】:

我正在阅读 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?

但我仍然不知道发生了什么,为什么LU与我的教科书如此不同。谁能给我解释一下?

所以这段代码:

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.]]

【问题讨论】:

  • 你的教科书没有遵循惯例。

标签: python numpy math matrix scipy


【解决方案1】:

可以选择哪个矩阵(LU)应该在对角线上有一个。教科书示例选择了 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.]]

通过转置矩阵,我们基本上交换了 UL 以便另一个矩阵在对角线上得到一个。而且,瞧,结果和教科书上的一样。

(请注意,如果置换矩阵 P 不是单位矩阵,则结果看起来会有些不同。)

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多