我尝试在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不同,所以我没有得到很好的结果。有任何想法吗 ?谢谢。
答案 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
测试的目标应该是发现错误-而不是使测试用例变得如此简单以至于无法正常工作。