scipy.linalg.

lu#

scipy.linalg.lu(a, permute_l=False, overwrite_a=False, check_finite=True, p_indices=False)[источник]#

Вычислить LU-разложение матрицы с частичным выбором ведущего элемента.

Разложение удовлетворяет:

A = P @ L @ U

где P является матрицей перестановки, L нижняя треугольная с единичными диагональными элементами, и U верхняя треугольная. Если permute_l установлено в True затем L возвращается уже переставленным и, следовательно, удовлетворяющим A = L @ U.

Параметры:
a(M, N) array_like

Массив для разложения

permute_lbool, необязательно

Выполнить умножение P*L (по умолчанию: не переставлять)

overwrite_abool, необязательно

Перезаписывать ли данные в a (может улучшить производительность)

check_finitebool, необязательно

Проверять ли, что входная матрица содержит только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, незавершению) если входные данные содержат бесконечности или NaN.

p_indicesbool, необязательно

Если True информация о перестановке возвращается как индексы строк. По умолчанию False по причинам обратной совместимости.

Возвращает:
(Если `permute_l` равно ``False``)
p(..., M, M) ndarray

Массивы или векторы перестановок в зависимости от p_indices

l(…, M, K) ndarray

Нижняя треугольная или трапециевидная матрица с единичной диагональю. K = min(M, N)

u(…, K, N) ndarray

Верхняя треугольная или трапециевидная матрица

(Если `permute_l` равно ``True``)
pl(…, M, K) ndarray

Переставленная матрица L. K = min(M, N)

u(…, K, N) ndarray

Верхняя треугольная или трапециевидная матрица

Примечания

Матрицы перестановок затратны, поскольку они представляют собой не что иное, как переупорядочивание строк L и поэтому настоятельно рекомендуется использовать индексы вместо этого, если требуется перестановка. Соотношение в 2D случае тогда становится просто A = L[P, :] @ U. В более высоких измерениях лучше использовать permute_l чтобы избежать сложных приемов индексации.

В 2D случае, если есть индексы, но по какой-то причине все еще нужна матрица перестановок, то ее можно построить с помощью np.eye(M)[P, :].

Примеры

>>> import numpy as np
>>> from scipy.linalg import lu
>>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
>>> p, l, u = lu(A)
>>> np.allclose(A, p @ l @ u)
True
>>> p  # Permutation matrix
array([[0., 1., 0., 0.],  # Row index 1
       [0., 0., 0., 1.],  # Row index 3
       [1., 0., 0., 0.],  # Row index 0
       [0., 0., 1., 0.]]) # Row index 2
>>> p, _, _ = lu(A, p_indices=True)
>>> p
array([1, 3, 0, 2], dtype=int32)  # as given by row indices above
>>> np.allclose(A, l[p, :] @ u)
True

Мы также можем использовать n-мерные массивы, например, демонстрация с 4D массивом:

>>> rng = np.random.default_rng()
>>> A = rng.uniform(low=-4, high=4, size=[3, 2, 4, 8])
>>> p, l, u = lu(A)
>>> p.shape, l.shape, u.shape
((3, 2, 4, 4), (3, 2, 4, 4), (3, 2, 4, 8))
>>> np.allclose(A, p @ l @ u)
True
>>> PL, U = lu(A, permute_l=True)
>>> np.allclose(A, PL @ U)
True