scipy.linalg.

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

Ошибка возникает при трёх условиях:

  1. Алгоритм завершился неудачей из-за сбоя QR-алгоритма при вычислении всех собственных значений.

  2. Если была запрошена сортировка собственных значений, их не удалось переупорядочить из-за невозможности разделить собственные значения, обычно из-за плохой обусловленности.

  3. Если была запрошена сортировка собственных значений, ошибки округления привели к тому, что ведущие собственные значения больше не удовлетворяют условию сортировки.

Смотрите также

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