当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy linalg.qz用法及代码示例


本文简要介绍 python 语言中 scipy.linalg.qz 的用法。

用法:

scipy.linalg.qz(A, B, output='real', lwork=None, sort=None, overwrite_a=False, overwrite_b=False, check_finite=True)#

一对矩阵的广义特征值的 QZ 分解。

一对 n-by-n 矩阵 (A,B) 的 QZ 或广义 Schur 分解为:

(A,B) = (Q @ AA @ Z*, Q @ BB @ Z*)

其中 AA、BB 是广义 Schur 形式,如果 BB 是具有非负对角线的上三角且 AA 是上三角,或者对于实数 QZ 分解 (output='real') 具有 1x1 和 2x2 块的块上三角。在这种情况下,1x1 块对应于实广义特征值,2x2 块通过使 BB 的相应元素具有以下形式而成为‘standardized’:

[ a 0 ]
[ 0 b ]

AA 和 BB 中对应的 2x2 块对将具有广义特征值的复共轭对。如果 (output='complex') 或 A 和 B 是复矩阵,则 Z' 表示 Z 的 conjugate-transpose。Q 和 Z 是酉矩阵。

参数

A (N, N) 数组

二维数组分解

B (N, N) 数组

二维数组分解

output {‘real’, ‘complex’},可选

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

lwork 整数,可选

工作数组大小。如果 None 或 -1,它会自动计算。

sort {无,可调用,‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’},可选

注意:此输入目前已禁用。请改用 ordqz。

指定是否应该对上特征值进行排序。可以传递一个可调用对象,给定一个特征值,返回一个布尔值,表示特征值是否应该排序到左上角 (True)。对于实数矩阵对,排序函数采用三个实数参数(alphar、alphai、beta)。特征值 x = (alphar + alphai*1j)/beta 。对于复数矩阵对或 output='complex',排序函数采用两个复数参数(alpha,beta)。特征值 x = (alpha/beta) 。或者,可以使用字符串参数:

  • ‘lhp’ Left-hand plane (x.real < 0.0)

  • ‘rhp’ Right-hand plane (x.real > 0.0)

  • ‘iuc’ Inside the unit circle (x*x.conjugate() < 1.0)

  • ‘ouc’ Outside the unit circle (x*x.conjugate() > 1.0)

默认为无(无排序)。

overwrite_a 布尔型,可选

是否覆盖 a 中的数据(可能会提高性能)

overwrite_b 布尔型,可选

是否覆盖b中的数据(可能会提高性能)

check_finite 布尔型,可选

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

返回

AA (N, N) 数组

A 的广义 Schur 形式。

BB (N, N) 数组

B 的广义 Schur 形式。

Q (N, N) 数组

左 Schur 向量。

Z (N, N) 数组

右 Schur 向量。

注意

Q 与 Matlab 中的等效函数进行了转置。

例子

>>> 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]])

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.qz。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。