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) array_like
待分解矩阵
- output{‘real’, ‘complex’},可选
当 a 的 dtype 为实数时,这指定是计算实数还是复数 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
在以下三种情况下抛出错误
算法失败,因为 QR 算法未能计算所有特征值。
如果请求了特征值排序,则由于无法分离特征值而导致特征值无法重新排序,通常是由于条件差。
如果请求了特征值排序,则舍入误差导致主导特征值不再满足排序条件。
另请参阅
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
一个按正虚部排序的自定义特征值排序条件只被一个特征值满足。
>>> _, _, 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 会增加 两 个。>>> _, _, sdim = schur(A, output='real', sort=lambda x, y: y > 1e-15) >>> sdim 2