Я пытаюсь закодировать факторизацию LUP (или PLU, это то же самое) в python.У меня есть код, который работает для небольшой матрицы (под размером 4х4).Однако, когда я попробовал это с случайно сгенерированной матрицей, декомпозиция не удалась.
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.Есть идеи ?Спасибо.