Python numpy的精度';特征值sh

Python numpy的精度';特征值sh,python,numpy,floating-point,linear-algebra,Python,Numpy,Floating Point,Linear Algebra,首先,我通过使用求(4000x4000)矩阵的特征值。然后,我改变了边界条件,只期望特征值有微小的变化 减去特征值容易受到浮点错误的影响,所以我使用了一些相对公差 现在假设我有一个特征值a=1.0001e-10,另一个B=1.0050e-10。根据我对浮点运算的拙劣知识,A-B!=0。问题是,这些数字来自线性代数计算,涉及许多数量级。例如,其他特征值的顺序可能是1 问题是,使用numpy.linalg.eigvalsh计算的特征值的精度是多少?该精度是相对于值(A*eps)还是相对于最大特征值?

首先,我通过使用求(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

我不确定是否在eigvalsh下面使用Lapack,但这可能会引起兴趣:

对称/非对称特征问题的Lapack误差范围:


首先,解算器不精确。其次,您的示例矩阵条件较差:对角元素比非对角元素大几个数量级。这总是会引起数字问题

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


这是一个具体的问题。您可以在中看到如何使用Symphy以任意精度求解特征值

谢谢,@aka.nice这似乎是正确的方向。我对精度的理解是不是就像ε乘以最大特征值一样?是的,在对称情况下,我也这么理解。让我补充一下,通常在秩计算中,小于N乘以ε乘以最大特征值的特征值被认为等于零。(所有计算都在数量级上)。谢谢@tiago。这些矩阵只是一些例子,用来夸大手头的问题,而不是我实际使用的。问题不在于结果为何不同,也不在于如何解决。问题是特征值结果的有效性机制是什么,因为我想比较两个有微小差异的集合。你的回答完全不同。@jarondl,再看一眼,我确实错过了你问题的最后一段。。。我以为你更喜欢任意精度的线性代数。