qz#
- scipy.linalg.qz(A, B, output='real', lwork=None, sort=None, overwrite_a=False, overwrite_b=False, check_finite=True)[源代码][源代码]#
QZ 分解用于一对矩阵的广义特征值。
QZ 分解,或广义 Schur 分解,对于一对 n×n 矩阵 (A,B) 是:
(A,B) = (Q @ AA @ Z*, Q @ BB @ Z*)
其中 AA, BB 处于广义 Schur 形式,如果 BB 是上三角矩阵且对角线元素为非负,AA 是上三角矩阵,或者对于实数 QZ 分解(
output='real'
)是块上三角矩阵,包含 1x1 和 2x2 块。在这种情况下,1x1 块对应于实数广义特征值,2x2 块被’标准化’,使得 BB 中相应的元素具有以下形式:[ a 0 ] [ 0 b ]
并且 AA 和 BB 中对应的 2x2 块将有一对共轭的广义特征值。如果 (
output='complex'
) 或 A 和 B 是复数矩阵,Z’ 表示 Z 的共轭转置。Q 和 Z 是酉矩阵。- 参数:
- A(N, N) array_like
2-D 数组分解
- B(N, N) array_like
2-D 数组分解
- 输出{‘实数’, ‘复数’}, 可选
构造实矩阵或复矩阵的实数或复数QZ分解。默认是’real’。
- lworkint, 可选
工作数组大小。如果为 None 或 -1,则自动计算。
- 排序{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, 可选
是否覆盖数据(可能会提高性能)
- overwrite_bbool, 可选
是否覆盖b中的数据(可能会提高性能)
- check_finitebool, 可选
如果为真,则检查 A 和 B 的元素是否为有限数。如果为假,则不进行检查,并将矩阵传递给底层算法。
- 返回:
- AA(N, N) ndarray
A 的广义 Schur 形式。
- BB(N, N) ndarray
B 的广义 Schur 形式。
- 问(N, N) ndarray
左舒尔向量。
- Z(N, N) ndarray
右舒尔向量。
参见
注释
Q 相对于 Matlab 中的等效函数进行了转置。
Added in version 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]])