LUP(PLU)分解因随机矩阵而失败

时间:2019-04-08 22:15:02

标签: python algorithm math matrix

我尝试在python中编码LUP(或PLU相同)分解。我有一个适用于小型矩阵(小于4x4大小)的代码。但是,当我尝试使用随机生成的矩阵进行分解时,分解就失败了。

import numpy as np


def LUP_factorisation(A):
    """Find P, L and U : PA = LU"""
    U = A.copy()
    shape_a = U.shape
    n = shape_a[0]
    L = np.eye(n)
    P = np.eye(n)
    for i in range(n):
        print(U)
        k = i
        comp = abs(U[i, i])
        for j in range(i, n):
            if abs(U[j, i]) > comp:
                k = j
                comp = abs(U[j, i])
        line_u = U[k, :].copy()
        U[k, :] = U[i, :]
        U[i, :] = line_u
        print(U)
        line_p = P[k, :].copy()
        P[k, :] = P[i, :]
        P[i, :] = line_p
        for j in range(i + 1, n):
            g = U[j, i] / U[i, i]
            L[j, i] = g
            U[j, :] -= g * U[i, :]
    return L, U, P


if __name__ == "__main__":
    A = np.array(
        [[1.0, 2.2, 58, 9.5, 42.65], [6.56, 58.789954, 4.45, 23.465, 6.165], [7.84516, 8.9864, 96.546, 4.654, 7.6514],
         [45.65, 47.985, 1.56, 3.9845, 8.6], [455.654, 102.615, 63.965, 5.6, 9.456]])
    L, U, P = LUP_factorisation(A)
    print(L @ U)
    print(P @ A)

在我给出的示例中,它起作用了:我们有PA = LU。但是当我这样做时:

A = np.random.rand(10, 10)

然后,由于PA与LU不同,所以我没有得到很好的结果。有任何想法吗 ?谢谢。

2 个答案:

答案 0 :(得分:1)

确保输入矩阵A的对角线占优势。因此,将一些值添加到A的对角线,例如

A = A + np.eye(A.shape)

A = A + 100* np.eye(A.shape)

希望对您有帮助!

答案 1 :(得分:1)

@MattTimmermans写道,您应该在L和U中交换行。

通常,这是通过将LU存储在A中来隐式处理的,然后将交换自动应用于L和U。请参见https://en.wikipedia.org/wiki/LU_decomposition#C_code_examples

但是您已经分割了它们,所以必须添加

    line_l = L[k, :].copy()
    L[k, :] = L[i, :]
    L[i, :] = line_l

仅使用对角占优矩阵进行测试确实很糟糕;并且只测试具有随机矩阵的线性代数例程是不好的,因为它们的属性非常具体-而不是“随机”的。请参阅Trefethen及其学生的作品,例如http://dspace.mit.edu/handle/1721.1/14322

测试的目标应该是发现错误-而不是使测试用例变得如此简单以至于无法正常工作。