您提出了两个问题:
- 返回的特征值
scipy.linalg.eig
不是实数。 - 一些特征值是负的。
这两个问题都是由截断和舍入错误引入的错误的结果,而在使用浮点算术的迭代算法中总是会发生这种错误。请注意,Matlab结果也产生了负的特征值。
现在,对于问题的一个更有趣的方面:为什么Matlab的结果是真实的,而SciPy的结果却包含一些复杂的成分?
Matlab
eig检测输入矩阵是实对称的还是Hermitian的,并在输入时使用Cholesky因式分解。请参阅文档中对自
chol变量的描述。这不是在SciPy中自动完成的。
eig
如果要使用利用实数对称或Hermitian矩阵结构的算法,请使用
scipy.linalg.eigh。对于问题中的示例:
>>> eigh(C, eigvals_only=True)array([ -3.73825923e-17, -1.60154836e-17, 8.11704449e-19, 3.65055777e-17, 7.90175615e-01])
如果四舍五入到与Matlab打印的精度相同的位数,则此结果与Matlab的结果相同。



