代码之家  ›  专栏  ›  技术社区  ›  Davtho1983

Scipy-linalg-LU分解给我的教科书带来了不同的结果

  •  3
  • Davtho1983  · 技术社区  · 7 年前

    我正在学习索尔·I·加斯的《线性规划》第五版。

    他给出了以下文本和示例: “给定一个n x n非奇异矩阵 A. 然后 A. 可以表示为产品 A. = LU公司 ... ...如果我们让 U (或 L )都等于1,则 LU公司 分解将是唯一的。。。"

    A=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.]]
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   MB-F    7 年前

    可以选择哪个矩阵( 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 所以另一个矩阵得到对角线上的。瞧,结果和课本上的一样。

    (注意,如果置换矩阵 P 如果没有单位矩阵,结果会略有不同。)