qz#
- scipy.linalg.qz(A, B, вывод='real', lwork=None, sort=None, overwrite_a=False, overwrite_b=False, check_finite=True)[источник]#
QZ-разложение для обобщённых собственных значений пары матриц.
QZ-разложение, или обобщённое разложение Шура, для пары матриц размера n×n (A,B):
(A,B) = (Q @ AA @ Z*, Q @ BB @ Z*)
где AA, BB находятся в обобщенной форме Шура, если BB верхнетреугольная с неотрицательной диагональю и AA верхнетреугольная, или для вещественного QZ разложения (
output='real') блочно верхнетреугольная с блоками 1x1 и 2x2. В этом случае блоки 1x1 соответствуют действительным обобщенным собственным значениям, а блоки 2x2 'стандартизированы' путем приведения соответствующих элементов BB к виду:[ a 0 ] [ 0 b ]
и пара соответствующих блоков 2x2 в AA и BB будет иметь комплексно-сопряженную пару обобщенных собственных значений. Если (
output='complex') или A и B — комплексные матрицы, Z' обозначает сопряженно-транспонированную матрицу Z. Q и Z — унитарные матрицы.Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.
- Параметры:
- A(N, N) array_like
2-D массив для разложения
- B(N, N) array_like
2-D массив для разложения
- вывод{'real', 'complex'}, опционально
Построить вещественное или комплексное QZ-разложение для вещественных матриц. По умолчанию — 'real'.
- lworkint, необязательный
Размер рабочего массива. Если None или -1, вычисляется автоматически.
- sort{None, callable, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, опционально
ПРИМЕЧАНИЕ: ЭТОТ ВВОД ОТКЛЮЧЕН. Используйте ordqz.
Определяет, должны ли верхние собственные значения быть отсортированы. Может быть передан вызываемый объект, который для данного собственного значения возвращает логическое значение, обозначающее, должно ли собственное значение быть отсортировано в верхний левый угол (True). Для пар действительных матриц функция сортировки принимает три действительных аргумента (alphar, alphai, beta). Собственное значение
x = (alphar + alphai*1j)/beta. Для комплексных пар матриц или output=’complex’, функция сортировки принимает два комплексных аргумента (alpha, beta). Собственное значениеx = (alpha/beta). Альтернативно, могут использоваться строковые параметры:‘lhp’ Левая полуплоскость (x.real < 0.0)
'rhp' Правая полуплоскость (x.real > 0.0)
‘iuc’ Внутри единичного круга (x*x.conjugate() < 1.0)
‘ouc’ Вне единичной окружности (x*x.conjugate() > 1.0)
По умолчанию None (без сортировки).
- overwrite_abool, необязательно
Перезаписывать ли данные в a (может улучшить производительность)
- overwrite_bbool, необязательно
Перезаписывать ли данные в b (может улучшить производительность)
- check_finitebool, необязательно
Если true, проверяет элементы A и B являются конечными числами. Если false, проверка не выполняется, и матрица передается нижележащему алгоритму.
- Возвращает:
- AA(N, N) ndarray
Обобщенная форма Шура матрицы A.
- BB(N, N) ndarray
Обобщенная форма Шура матрицы B.
- Q(N, N) ndarray
Левые векторы Шура.
- Z(N, N) ndarray
Правые векторы Шура.
Смотрите также
Примечания
Q транспонирована по сравнению с эквивалентной функцией в Matlab.
Добавлено в версии 0.11.0.
Примеры
>>> import numpy as np >>> from scipy.linalg import qz
>>> A = np.array([[1, 2, -1], [5, 5, 5], [2, 4, -8]]) >>> B = np.array([[1, 1, -3], [3, 1, -1], [5, 6, -2]])
Вычислите разложение. QZ-разложение не является уникальным, поэтому в зависимости от используемой базовой библиотеки могут быть различия в знаках коэффициентов в следующем выводе.
>>> AA, BB, Q, Z = qz(A, B) >>> AA array([[-1.36949157, -4.05459025, 7.44389431], [ 0. , 7.65653432, 5.13476017], [ 0. , -0.65978437, 2.4186015 ]]) # may vary >>> BB array([[ 1.71890633, -1.64723705, -0.72696385], [ 0. , 8.6965692 , -0. ], [ 0. , 0. , 2.27446233]]) # may vary >>> Q array([[-0.37048362, 0.1903278 , 0.90912992], [-0.90073232, 0.16534124, -0.40167593], [ 0.22676676, 0.96769706, -0.11017818]]) # may vary >>> Z array([[-0.67660785, 0.63528924, -0.37230283], [ 0.70243299, 0.70853819, -0.06753907], [ 0.22088393, -0.30721526, -0.92565062]]) # may vary
Проверьте QZ-разложение. С вещественным выводом нам нужен только транспонированный
Zв следующих выражениях.>>> Q @ AA @ Z.T # Should be A array([[ 1., 2., -1.], [ 5., 5., 5.], [ 2., 4., -8.]]) >>> Q @ BB @ Z.T # Should be B array([[ 1., 1., -3.], [ 3., 1., -1.], [ 5., 6., -2.]])
Повторите разложение, но с
output='complex'.>>> AA, BB, Q, Z = qz(A, B, output='complex')
Для краткости вывода мы используем
np.set_printoptions()для установки точности вывода массивов NumPy в 3 и отображения малых значений как 0.>>> np.set_printoptions(precision=3, suppress=True) >>> AA array([[-1.369+0.j , 2.248+4.237j, 4.861-5.022j], [ 0. +0.j , 7.037+2.922j, 0.794+4.932j], [ 0. +0.j , 0. +0.j , 2.655-1.103j]]) # may vary >>> BB array([[ 1.719+0.j , -1.115+1.j , -0.763-0.646j], [ 0. +0.j , 7.24 +0.j , -3.144+3.322j], [ 0. +0.j , 0. +0.j , 2.732+0.j ]]) # may vary >>> Q array([[ 0.326+0.175j, -0.273-0.029j, -0.886-0.052j], [ 0.794+0.426j, -0.093+0.134j, 0.402-0.02j ], [-0.2 -0.107j, -0.816+0.482j, 0.151-0.167j]]) # may vary >>> Z array([[ 0.596+0.32j , -0.31 +0.414j, 0.393-0.347j], [-0.619-0.332j, -0.479+0.314j, 0.154-0.393j], [-0.195-0.104j, 0.576+0.27j , 0.715+0.187j]]) # may vary
С комплексными массивами мы должны использовать
Z.conj().Tв следующих выражениях для проверки разложения.>>> Q @ AA @ Z.conj().T # Should be A array([[ 1.-0.j, 2.-0.j, -1.-0.j], [ 5.+0.j, 5.+0.j, 5.-0.j], [ 2.+0.j, 4.+0.j, -8.+0.j]]) >>> Q @ BB @ Z.conj().T # Should be B array([[ 1.+0.j, 1.+0.j, -3.+0.j], [ 3.-0.j, 1.-0.j, -1.+0.j], [ 5.+0.j, 6.+0.j, -2.+0.j]])