scipy.linalg.

eig#

scipy.linalg.eig(a, b=None, left=False, right=True, overwrite_a=False, overwrite_b=False, check_finite=True, homogeneous_eigvals=False)[源代码]#

求解一个方形矩阵的普通或广义特征值问题。

找到一个一般矩阵的特征值 w 和左或右特征向量

a   vr[:,i] = w[i]        b   vr[:,i]
a.H vl[:,i] = w[i].conj() b.H vl[:,i]

其中 .H 是 Hermitian 共轭。

文档编写时假设数组参数具有指定的“核心(core)”形状。但是,此函数的数组参数可以在核心形状之前添加额外的“批次(batch)”维度。在这种情况下,数组被视为低维切片的批次;详情请参阅 批量线性运算。请注意,不支持零大小批次的调用,否则将引发 ValueError

参数:
a(M, M) array_like

一个复数或实数矩阵,将计算其特征值和特征向量。

b(M, M) array_like, 可选

广义特征值问题中的右侧矩阵。默认值为 None,假定为单位矩阵。

leftbool, 可选

是否计算并返回左特征向量。默认值为 False。

rightbool, 可选

是否计算并返回右特征向量。默认值为 True。

overwrite_abool, 可选

是否覆盖 a;可能提高性能。默认值为 False。

overwrite_bbool, 可选

是否覆盖 b;可以提高性能。默认值为 False。

check_finitebool, optional

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

homogeneous_eigvalsbool, 可选

如果为 True,则以齐次坐标返回特征值。在这种情况下 w 是一个 (2, M) 数组,使得

w[1,i] a vr[:,i] = w[0,i] b vr[:,i]

默认值为 False。

返回:
w(M,) 或 (2, M) double 或 complex ndarray

特征值,每个特征值根据其重数重复。形状为 (M,),除非 homogeneous_eigvals=True

vl(M, M) double 或 complex ndarray

左特征向量对应于特征值 w[i] 是列 vl[:,i]。仅当 left=True 时才返回。左特征向量未归一化。

vr(M, M) double 或 complex ndarray

归一化的右特征向量对应于特征值 w[i] 是列 vr[:,i]。仅当 right=True 时才返回。

引发:
LinAlgError

如果特征值计算不收敛。

另请参阅

eigvals

一般数组的特征值

eigh

对称/Hermitian 数组的特征值和右特征向量。

eig_banded

对称/Hermitian 带状矩阵的特征值和右特征向量

eigh_tridiagonal

对称/埃尔米特三对角矩阵的特征值和右特征向量

示例

>>> import numpy as np
>>> from scipy import linalg
>>> a = np.array([[0., -1.], [1., 0.]])
>>> linalg.eigvals(a)
array([0.+1.j, 0.-1.j])
>>> b = np.array([[0., 1.], [1., 1.]])
>>> linalg.eigvals(a, b)
array([ 1.+0.j, -1.+0.j])
>>> a = np.array([[3., 0., 0.], [0., 8., 0.], [0., 0., 7.]])
>>> linalg.eigvals(a, homogeneous_eigvals=True)
array([[3.+0.j, 8.+0.j, 7.+0.j],
       [1.+0.j, 1.+0.j, 1.+0.j]])
>>> a = np.array([[0., -1.], [1., 0.]])
>>> linalg.eigvals(a) == linalg.eig(a)[0]
array([ True,  True])
>>> linalg.eig(a, left=True, right=False)[1] # normalized left eigenvector
array([[-0.70710678+0.j        , -0.70710678-0.j        ],
       [-0.        +0.70710678j, -0.        -0.70710678j]])
>>> linalg.eig(a, left=False, right=True)[1] # normalized right eigenvector
array([[0.70710678+0.j        , 0.70710678-0.j        ],
       [0.        -0.70710678j, 0.        +0.70710678j]])