numpy特征值的精度

时间:2012-12-15 09:58:28

标签: python numpy floating-point linear-algebra

首先,我使用numpy.linalg.eigvalsh找到(4000x4000)矩阵的特征值。然后,我改变边界条件,期望特征值只有微小的变化。

减去特征值容易受到浮点误差的影响,所以我使用了一些相对容差。

现在说我有一个特征值A = 1.0001e-10和另一个B = 1.0050e-10。根据我对浮点运算的简单了解,A - B != 0。问题是,这些数字来自涉及许多数量级的线性代数计算。其他特征值可以例如是1的顺序。

问题是,使用numpy.linalg.eigvalsh计算的特征值的精度是多少?这个精度是相对于值(A * eps),还是相对于最大特征值?或者相对于原始矩阵的元素?

例如,这个矩阵:

1      1e-20
1e-20  3

给出与此相同的特征值:

1     1e-5
1e-5  3

2 个答案:

答案 0 :(得分:3)

我不确定是否在eigvalsh下使用了Lapack,但这可能是有意义的:

对称/非对称特征问题的拉克错误界限:

http://www.netlib.org/lapack/lug/node89.html

http://www.netlib.org/lapack/lug/node91.html

答案 1 :(得分:0)

首先,解算器不准确。其次,你的示例矩阵条件很差:对角线元素比非对角线元素大几个数量级。这总是会导致数值问题。

从简单代数中,第二个矩阵的行列式是(1 * 3) - (1e5 * 1e5) = 3 - 1e-10。您已经可以看到精度问题实际上是最小元素精度的两倍。 (这同样适用于特征值。)即使linalg使用双精度,因为求解器是近似的,你得到相同的答案。如果将小值更改为1e-3,则会开始看到差异,因为现在精度是数值近似的量级。

此特定问题has been asked before。您可以在this answer中看到如何使用sympy以任意精度求解特征值。