Я думаю, вы, возможно, неправильно поняли, что должна делать декомпозиция .потому что это выглядит правильно для меня ... Давайте рассмотрим результаты вашего примера с некоторыми дополнительными деталями и комментариями:
import numpy as np
import scipy.linalg
B = np.array([[2,-1,-2],[-4,6,3],[-4,-2,8]])
P,L,U = scipy.linalg.lu(B)
# Now let's see if P is a permutation matrix (a single 1 in each row and column, all the rest should be zero):
print(P)
>> [[ 0. 0. 1.]
[ 1. 0. 0.]
[ 0. 1. 0.]]
# Yup! That's a successful permutation matrix
# Now let's see if L is a lower triangular matrix (anything above the main diagonal should be zero):
print(L)
>> [[ 1. 0. 0. ]
[ 1. 1. 0. ]
[-0.5 -0.25 1. ]]
# Yup! still doing good.
# Now let's see if U is a upper triangular matrix (anything below the main diagonal should be zero):
print(U)
>> [[-4. 6. 3. ]
[ 0. -8. 5. ]
[ 0. 0. 0.75]]
# And last but not least, let's see if this works as a decomposition of B (i.e. PLU==B):
print(np.matmul(P, np.matmul(L, U)))
>> [[ 2. -1. -2.]
[-4. 6. 3.]
[-4. -2. 8.]]
# :-)
Надеюсь, это немного прояснит ситуацию.Если вы все еще не уверены, то, возможно, перечитайте матрицы перестановок , треугольные матрицы , lu-разложение , scipy.linalg.lu и тесно связанные темы.
Удачи!
Похоже, разъяснение на месте:
LU-разложение не является - в общем случае - обязательно уникальным.
Если вам нужны подробности, оставьте в стороне для соответствующую подпункт-chapter в приведенной выше ссылке на википедию, я рекомендую первый и третий ответы на этот вопрос об обмене стеками.
Так что, если вам случится получить два разных ответа на разные реализации или методы,это не значит, что одно или другое неправильно.Если у вас есть матрица перестановок P (даже если это тривиальная единичная матрица), нижняя матрица L, верхняя матрица U, и они разлагают вашу матрицу, то вы получаете себя a разложение.Надеюсь, что все прояснилось!