schur#
- scipy.linalg.schur(a, вывод='real', lwork=None, overwrite_a=False, sort=None, check_finite=True)[источник]#
Вычисление разложения Шура матрицы.
Разложение Шура:
A = Z T Z^H
где Z унитарна, а T — либо верхнетреугольная, либо для вещественного разложения Шура (output='real') квази-верхнетреугольная. В квази-треугольной форме 2x2 блоки, описывающие комплексные пары собственных значений, могут выступать из диагонали.
Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.
- Параметры:
- a(M, M) array_like
Матрица для разложения
- вывод{'real', 'complex'}, опционально
Когда dtype a является вещественным, это определяет, вычислять ли вещественное или комплексное разложение Шура. Когда dtype a является комплексным, этот аргумент игнорируется, и вычисляется комплексное разложение Шура.
- lworkint, необязательный
Размер рабочего массива. Если None или -1, вычисляется автоматически.
- overwrite_abool, необязательно
Перезаписывать ли данные в a (может улучшить производительность).
- sort{None, callable, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, опционально
Указывает, должны ли верхние собственные значения быть отсортированы. Может быть передана вызываемая функция, которая для данного собственного значения возвращает булево значение, обозначающее, должно ли собственное значение быть отсортировано в верхний левый угол (True).
Если
output='complex'ИЛИ dtype a является комплексным, вызываемый объект должен иметь один аргумент: собственное значение, выраженное как комплексное число.Если
output='real'И тип данных a является вещественным, вызываемый объект должен иметь два аргумента: вещественную и мнимую части собственного значения соответственно.
В качестве альтернативы могут использоваться строковые параметры:
'lhp' Left-hand plane (real(eigenvalue) < 0.0) 'rhp' Right-hand plane (real(eigenvalue) >= 0.0) 'iuc' Inside the unit circle (abs(eigenvalue) <= 1.0) 'ouc' Outside the unit circle (abs(eigenvalue) > 1.0)
По умолчанию None (без сортировки).
- check_finitebool, необязательно
Проверять ли, что входная матрица содержит только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, незавершению) если входные данные содержат бесконечности или NaN.
- Возвращает:
- T(M, M) ndarray
Форма Шура матрицы A. Она является вещественной для вещественного разложения Шура.
- Z(M, M) ndarray
Унитарная матрица преобразования Шура для A. Она вещественнозначна для вещественного разложения Шура.
- sdimint
Если и только если была запрошена сортировка, третье возвращаемое значение будет содержать количество собственных значений, удовлетворяющих условию сортировки. Обратите внимание, что комплексно-сопряжённые пары, для которых условие выполняется для любого из собственных значений, считаются как 2.
- Вызывает:
- LinAlgError
Ошибка возникает при трёх условиях:
Алгоритм завершился неудачей из-за сбоя QR-алгоритма при вычислении всех собственных значений.
Если была запрошена сортировка собственных значений, их не удалось переупорядочить из-за невозможности разделить собственные значения, обычно из-за плохой обусловленности.
Если была запрошена сортировка собственных значений, ошибки округления привели к тому, что ведущие собственные значения больше не удовлетворяют условию сортировки.
Смотрите также
rsf2csfПреобразовать вещественную форму Шура в комплексную форму Шура
Примеры
>>> import numpy as np >>> from scipy.linalg import schur, eigvals >>> A = np.array([[0, 2, 2], [0, 1, 2], [1, 0, 1]]) >>> T, Z = schur(A) >>> T array([[ 2.65896708, 1.42440458, -1.92933439], [ 0. , -0.32948354, -0.49063704], [ 0. , 1.31178921, -0.32948354]]) >>> Z array([[0.72711591, -0.60156188, 0.33079564], [0.52839428, 0.79801892, 0.28976765], [0.43829436, 0.03590414, -0.89811411]])
>>> T2, Z2 = schur(A, output='complex') >>> T2 array([[ 2.65896708, -1.22839825+1.32378589j, 0.42590089+1.51937378j], # may vary [ 0. , -0.32948354+0.80225456j, -0.59877807+0.56192146j], [ 0. , 0. , -0.32948354-0.80225456j]]) >>> eigvals(T2) array([2.65896708, -0.32948354+0.80225456j, -0.32948354-0.80225456j]) # may vary
Пользовательское условие сортировки собственных значений, которое сортирует по положительной мнимой части, удовлетворяется только одним собственным значением.
>>> _, _, sdim = schur(A, output='complex', sort=lambda x: x.imag > 1e-15) >>> sdim 1
Когда
output='real'и массив a является вещественным, sort вызываемый объект должен принимать действительную и мнимую части как отдельные аргументы. Обратите внимание, что теперь комплексные собственные значения-0.32948354+0.80225456jи-0.32948354-0.80225456jбудет рассматриваться как комплексно-сопряжённая пара, и в соответствии с sdim документация, комплексно-сопряжённые пары, для которых условие истинно для либо увеличение собственного значения sdim by два.>>> _, _, sdim = schur(A, output='real', sort=lambda x, y: y > 1e-15) >>> sdim 2