ordqz#
- scipy.linalg.ordqz(A, B, sort='lhp', output='real', overwrite_a=False, overwrite_b=False, check_finite=True)[源代码]#
用于一对具有重新排序的矩阵的 QZ 分解。
- 参数:
- A(N, N) 类数组
要分解的二维数组
- B(N, N) 类数组
要分解的二维数组
- sort{可调用对象, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, 可选
指定是否应对上部特征值进行排序。可以传递一个可调用对象,该对象在给定一个表示特征值
x = (alpha/beta)
的有序对(alpha, beta)
时,返回一个布尔值,表示是否应将特征值排序到左上角(True)。对于实矩阵对,beta
为实数,而alpha
可以是复数;对于复矩阵对,alpha
和beta
都可以是复数。可调用对象必须能够接受 NumPy 数组。或者,可以使用字符串参数‘lhp’ 左半平面 (x.real < 0.0)
‘rhp’ 右半平面 (x.real > 0.0)
‘iuc’ 单位圆内 (x*x.conjugate() < 1.0)
‘ouc’ 单位圆外 (x*x.conjugate() > 1.0)
使用预定义的排序函数,无限特征值(即,
alpha != 0
且beta = 0
)被认为既不位于左半平面也不位于右半平面,但它被认为位于单位圆之外。对于特征值(alpha, beta) = (0, 0)
,预定义的排序函数都返回 False。- outputstr {‘real’,’complex’}, 可选
为实矩阵构造实数或复数 QZ 分解。默认为 ‘real’。
- overwrite_abool, 可选
如果为 True,则 A 的内容将被覆盖。
- overwrite_bbool, 可选
如果为 True,则 B 的内容将被覆盖。
- check_finitebool, 可选
如果为 true,则检查 A 和 B 的元素是否为有限数。如果为 false,则不进行检查,并将矩阵传递给底层算法。
- 返回:
- AA(N, N) ndarray
A 的广义 Schur 形式。
- BB(N, N) ndarray
B 的广义 Schur 形式。
- alpha(N,) ndarray
alpha = alphar + alphai * 1j。请参阅注释。
- beta(N,) ndarray
请参阅注释。
- Q(N, N) ndarray
左 Schur 向量。
- Z(N, N) ndarray
右 Schur 向量。
另请参阅
注释
在退出时,
(ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N
将是广义特征值。ALPHAR(j) + ALPHAI(j)*i
和BETA(j),j=1,...,N
是复数 Schur 形式 (S,T) 的对角线,如果使用复数酉变换将 (A,B) 的实广义 Schur 形式的 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)