2017-06-05 56 views
1

因此,我使用Eigen for C++代碼塊來計算矩陣的特徵值。與此交易的代碼的特定部分如下: -用於C++計算錯誤特徵值的Eigen

EigenSolver<MatrixXd> b(B,false); 
cout<<" Eigen values are: \n "<<b.eigenvalues()<<"\n"; 

我已經遇到的問題是是,我的矩陣B計算的特徵值之一是無處接近實際的特徵值,我發現上calculator.vhex.net。

例如,對於基體

1 0 0 X

0 1×0

0 X 1 Y

X 0 Y 1

其中x = -1/sqrt(2)和y = -0.5,特徵值是0,0.5,1.5和2.

然而,我的代碼計算它們是-4.25e-016,0.5%,1.5和2

我還試圖將本設置用於應該有一個特徵值4E-06的5×5矩陣,但計算出的碼它爲1.4413e-017。

這可能是什麼原因?他們是否近似? 我的猜測是內存問題,並且2的平方根的雙類型值不會完全等於2的平方根,但我不確定這一點。

對此有什麼可能的解決辦法?

+3

請發表[mcve]以顯示您的確切代碼。另外,使用調試器來遍歷代碼,看看它在做什麼。請注意,所有浮點值都是實數的近似值。您還應該瞭解浮點表示的固有限制。 –

+0

如果你瞭解一些數值線性代數理論,它也會有所幫助。 –

+4

「無處不在」 - 4.25e-016從很多角度來看非常接近於0 :) –

回答

5

當矩陣接近奇異時,尋找特徵值可能很困難,用0特徵值表示。你不應該期望數值解的一個確切的特徵值爲0,因爲它只能達到某個數值近似,而這個近似在該點附近開始失效。

0

此外什麼@drglove說,對於對稱的(或自伴)的特徵值問題,你應該使用SelfAdjointEigenSolver

SelfAdjointEigenSolver<MatrixXd> b(B,EigenvaluesOnly); 

這給了當然還是隻有一個數值解,所以你仍然會得到一個解決方案精度有限。