3

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

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

现在说我有一个 eigenvalueA = 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
4

2 回答 2

3

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

对称/非对称特征问题的 Lapack 误差界限:

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

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

于 2012-12-15T10:37:46.693 回答
0

首先,求解器不精确。其次,您的示例矩阵条件不佳:对角线元素比非对角线元素大几个数量级。这总是会导致数字问题。

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

这个具体问题之前已经问过了。您可以在此答案中看到如何使用 sympy 以任意精度求解特征值。

于 2012-12-15T13:28:29.797 回答