2017-06-05 2 views
1

Donc j'utilise Eigen pour C++ dans les blocs de code pour calculer les valeurs propres de mes matrices. La partie spécifique du code qui traite est la suivante: -Eigen for C++ calcul de la valeur propre erronée

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

Le problème que j'ai rencontrais est est que l'une des valeurs propres calculées pour ma matrice B est nulle part proche de la valeur propre réelle j'ai trouvé sur calculatrice.vhex.net.

Par exemple, pour la matrice

1 0 0 x

0 1 x 0

0 x 1 y

x 0 y 1

où x = -1/sqrt (2) et y = -0,5, les valeurs propres sont 0, 0.5, 1.5 et 2.

Cependant, mon code les calcule pour être -4.25e-016, 0,5, 1,5 et 2.

J'ai aussi essayé cela pour une matrice 5x5 qui aurait eu un 4E-06 valeurs propres, mais le code calculé comme 1.4413e-017.

Quelle pourrait en être la raison? Sont-ils des approximations? Ma conjecture est des problèmes de mémoire et qu'une valeur de type double de racine carrée de 2 ne sera pas exactement égale à la racine carrée de 2, mais je ne suis pas sûr de cela.

Ce qui pourrait être une solution possible pour cela?

+3

Veuillez poster un [mcve] pour montrer votre code exact. En outre, utilisez un débogueur pour parcourir votre code pour voir ce qu'il fait. Notez que toutes les valeurs à virgule flottante sont des approximations de nombres réels. Vous devriez également connaître les limites inhérentes aux représentations à virgule flottante. –

+0

Il sera également utile si vous en apprendre davantage sur certains de la théorie de l'algèbre linéaire numérique. –

+4

"Nowhere close" - 4.25e-016 est assez proche de 0 à partir de nombreux points de vue :) –

Répondre

5

La recherche de valeurs propres peut être difficile lorsque la matrice est proche du singulier, ce qui est indiqué par une valeur propre de 0. Vous ne devriez pas vous attendre à une valeur propre exacte de 0 à partir d'une solution numérique, puisqu'elle ne sera bonne qu'à une approximation numérique qui commence à échouer près de ce point.

0

De plus à ce que @drglove dit, pour symétrique (ou autoadjoint) problèmes aux valeurs propres vous devez utiliser le SelfAdjointEigenSolver:

SelfAdjointEigenSolver<MatrixXd> b(B,EigenvaluesOnly); 

Cela donne bien sûr encore qu'une solution numérique, vous obtiendrez toujours des solutions avec précision limitée.