scipy.linalg.

schur#

scipy.linalg.schur(a, output='real', lwork=None, overwrite_a=False, sort=None, check_finite=True)[源代码]#

计算矩阵的 Schur 分解。

Schur 分解为

A = Z T Z^H

其中 Z 是酉矩阵,T 是上三角矩阵,或者对于实 Schur 分解 (output='real'),是拟上三角矩阵。在拟三角形式中,描述复值特征值对的 2x2 块可能从对角线突出。

参数:
a(M, M) 类似数组

要分解的矩阵

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

a 的 dtype 为实数时,此参数指定是计算实 Schur 分解还是复 Schur 分解。当 a 的 dtype 为复数时,此参数将被忽略,并计算复 Schur 分解。

lworkint, 可选

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

overwrite_abool, 可选

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

sort{None, callable, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, 可选

指定是否应该对上特征值进行排序。可以传递一个可调用对象,给定一个特征值,该对象返回一个布尔值,指示该特征值是否应排序到左上角 (True)。

  • 如果 output='complex' 或者 a 的 dtype 为复数,则可调用对象应具有一个参数:表示为复数的特征值。

  • 如果 output='real' 并且 a 的 dtype 为实数,则可调用对象应具有两个参数:特征值的实部和虚部分别。

或者,可以使用字符串参数

'lhp'   Left-hand plane (real(eigenvalue) < 0.0)
'rhp'   Right-hand plane (real(eigenvalue) >= 0.0)
'iuc'   Inside the unit circle (abs(eigenvalue) <= 1.0)
'ouc'   Outside the unit circle (abs(eigenvalue) > 1.0)

默认为 None(不排序)。

check_finitebool, 可选

是否检查输入矩阵是否仅包含有限数字。禁用可能会提高性能,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、不终止)。

返回:
T(M, M) ndarray

A 的 Schur 形式。对于实 Schur 分解,它是实值的。

Z(M, M) ndarray

A 的酉 Schur 变换矩阵。对于实 Schur 分解,它是实值的。

sdimint

当且仅当请求排序时,第三个返回值将包含满足排序条件的特征值的数量。请注意,对于任何一个特征值条件都为真的复共轭对,计数为 2。

抛出:
LinAlgError

在三种情况下引发的错误

  1. 由于 QR 算法未能计算所有特征值,算法失败。

  2. 如果请求了特征值排序,由于未能分离特征值,通常是由于条件不佳,因此无法重新排序特征值。

  3. 如果请求了特征值排序,则舍入误差导致前导特征值不再满足排序条件。

另请参阅

rsf2csf

将实 Schur 形式转换为复 Schur 形式

示例

>>> import numpy as np
>>> from scipy.linalg import schur, eigvals
>>> A = np.array([[0, 2, 2], [0, 1, 2], [1, 0, 1]])
>>> T, Z = schur(A)
>>> T
array([[ 2.65896708,  1.42440458, -1.92933439],
       [ 0.        , -0.32948354, -0.49063704],
       [ 0.        ,  1.31178921, -0.32948354]])
>>> Z
array([[0.72711591, -0.60156188, 0.33079564],
       [0.52839428, 0.79801892, 0.28976765],
       [0.43829436, 0.03590414, -0.89811411]])
>>> T2, Z2 = schur(A, output='complex')
>>> T2
array([[ 2.65896708, -1.22839825+1.32378589j,  0.42590089+1.51937378j], # may vary
       [ 0.        , -0.32948354+0.80225456j, -0.59877807+0.56192146j],
       [ 0.        ,  0.                    , -0.32948354-0.80225456j]])
>>> eigvals(T2)
array([2.65896708, -0.32948354+0.80225456j, -0.32948354-0.80225456j])   # may vary

一个自定义的特征值排序条件,它按正虚部排序,只有 1 个特征值满足条件。

>>> _, _, sdim = schur(A, output='complex', sort=lambda x: x.imag > 1e-15)
>>> sdim
1

output='real' 并且数组 a 为实数时,sort 可调用对象必须接受实部和虚部作为单独的参数。请注意,现在复特征值 -0.32948354+0.80225456j-0.32948354-0.80225456j 将被视为复共轭对,并且根据 sdim 文档,任何一个特征值条件为 True 的复共轭对都会将 sdim 增加 2

>>> _, _, sdim = schur(A, output='real', sort=lambda x, y: y > 1e-15)
>>> sdim
2