scipy.linalg.

ordqz#

scipy.linalg.ordqz(A, B, sort='lhp', output='real', overwrite_a=False, overwrite_b=False, check_finite=True)[source]#

具有重排序功能的矩阵对的 QZ 分解。

文档编写时假设数组参数具有指定的“核心(core)”形状。但是,此函数的数组参数可以在核心形状之前添加额外的“批次(batch)”维度。在这种情况下,数组被视为低维切片的批次;详情请参阅 批量线性运算。请注意,不支持零大小批次的调用,否则将引发 ValueError

参数:
A(N, N) array_like

要分解的二维数组

B(N, N) array_like

要分解的二维数组

sort{callable, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, optional

指定是否应按顺序排列上方的特征值。可以传递一个可调用对象,该对象接受一个有序对 (alpha, beta),该有序对表示特征值 x = (alpha/beta),并返回一个布尔值,指示该特征值是否应排序到左上角(True)。对于实矩阵对,beta 是实数,而 alpha 可以是复数;对于复矩阵对,alphabeta 都可以是复数。该可调用对象必须能够接受 NumPy 数组。或者,可以使用字符串参数

  • ‘lhp’ 左半平面(x.real < 0.0)

  • ‘rhp’ 右半平面(x.real > 0.0)

  • ‘iuc’ 单位圆内(x*x.conjugate() < 1.0)

  • ‘ouc’ 单位圆外(x*x.conjugate() > 1.0)

使用预定义的排序函数,无限特征值(即 alpha != 0beta = 0)被认为既不在左半平面也不在右半平面,但被认为在单位圆外。对于特征值 (alpha, beta) = (0, 0),预定义的排序函数都返回 False

outputstr {‘real’,’complex’}, optional

为实矩阵构造实数或复数 QZ 分解。默认值为 ‘real’。

overwrite_abool, 可选

如果为 True,则会覆盖 A 的内容。

overwrite_bbool, 可选

如果为 True,则会覆盖 B 的内容。

check_finitebool, optional

如果为 true,则检查 A 和 B 的元素是否为有限数。如果为 false,则不进行检查并将矩阵传递给底层算法。

返回:
AA(N, N) ndarray

A 的广义舒尔形式。

BB(N, N) ndarray

B 的广义舒尔形式。

alpha(N,) ndarray

alpha = alphar + alphai * 1j。请参阅注释。

beta(N,) ndarray

请参阅注释。

Q(N, N) ndarray

左舒尔向量。

Z(N, N) ndarray

右舒尔向量。

另请参阅

qz

附注

在退出时,(ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N 将是广义特征值。ALPHAR(j) + ALPHAI(j)*iBETA(j),j=1,...,N 是复舒尔形式 (S,T) 的对角线,如果 (A,B) 的实广义舒尔形式的 2x2 对角块使用复酉变换进一步简化为三角形式,则会得到该形式。如果 ALPHAI(j) 为零,则第 j 个特征值为实数;如果为正数,则第 j 个和第 (j+1) 个特征值是一对复共轭,且 ALPHAI(j+1) 为负数。

0.17.0 版本中添加。

示例

>>> import numpy as np
>>> from scipy.linalg import ordqz
>>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
>>> B = np.array([[0, 6, 0, 0], [5, 0, 2, 1], [5, 2, 6, 6], [4, 7, 7, 7]])
>>> AA, BB, alpha, beta, Q, Z = ordqz(A, B, sort='lhp')

由于我们已对左半平面特征值进行排序,因此负数排在前面

>>> (alpha/beta).real < 0
array([ True,  True, False, False], dtype=bool)