2012-12-15 36 views
3

首先我通過使用numpy.linalg.eigvalsh找到(4000x4000)矩陣的特徵值。然後,我改變了邊界條件,只希望特徵值發生微小的變化。numpy的特徵值的精度h

減去特徵值容易出現浮點錯誤,所以我使用了一些相對容差。

現在說我有一個特徵值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 

回答

3

我不知道如果LAPACK使用eigvalsh下方,但是這可能會感興趣:

的對稱/非對稱特徵值問題LAPACK誤差界限:

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

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

+0

謝謝,@ aka.nice,似乎是正確的方向。我是否理解精確度與epsilon乘以最大特徵值? – jarondl

+1

是的,在對稱情況下,這也是我的理解。 –

+0

讓我補充說,通常在等級計算特徵值小於N倍epsilon倍時,最大特徵值被認爲等於零。 (所有計算量級)。 –

0

首先,解算器並不確切。其次,你的例子矩陣條件很差:對角線元素比非對角線元素大幾個數量級。這總是會導致數字問題。

從簡單的代數,第二矩陣的行列式是(1 * 3) - (1e5 * 1e5) = 3 - 1e-10。您已經可以看到精度問題實際上是最小元素精度的兩倍。 (這同樣適用於特徵值。)即使linalg使用雙精度,因爲求解器是近似的,你會得到相同的答案。如果將小數值更改爲1e-3,則開始看到差異,因爲現在精度與數值近似的數量級相同。

這個具體問題has been asked before。您可以在this answer中看到如何使用sympy以任意精度解出特徵值。

+0

謝謝@tiago。矩陣只是例子,誇大了手頭的問題,而不是我實際使用的。問題不在於爲什麼結果不同,或者如何解決這個問題。問題是什麼是特徵值結果的有效性機制,因爲我想比較兩組之間的細微差別。你回答了完全不同的東西。 – jarondl

+1

@jarondl,再看一眼我的確沒有想到你問題的最後一段......我以爲你更擅長任意精確的線性代數。 – tiago