Y at-il un moyen d'améliorer la précision de la sortie de numpy.linalg.eig()
et scipy.linalg.eig()
?erreurs d'arrondi dans numpy.linalg.eig() et scipy.linalg.eig()
Je diagonise une matrice non-symétrique, mais je m'attends à ce que, physiquement, j'obtienne un spectre réel de paires de valeurs propres positives et négatives. En effet, les valeurs propres viennent par paires, et j'ai vérifié par un calcul analytique indépendant que deux des paires sont correctes. La paire problématique est celle avec des valeurs propres proches de zéro, qui semblent avoir de petites parties imaginaires. Je m'attends à ce que cette paire soit dégénérée à zéro, donc les parties imaginaires peuvent tout au plus être à la précision de la machine, mais elles sont beaucoup plus grandes. Je pense que cela conduit à une petite erreur dans les vecteurs propres, qui peuvent cependant se propager dans des manipulations ultérieures.
L'exemple ci-dessous montre qu'il existe des restes fictifs imaginaires, en vérifiant la validité de la transformation.
import numpy as np
import scipy.linalg as sla
H = np.array(
[[ 11.52, -1., -1., 9.52, 0., 0. ],
[ -1., 11.52, -1., 0., 9.52, 0., ],
[ -1., -1., 11.52, 0., 0., 9.52,],
[ -9.52, 0., 0., -11.52, 1., 1., ],
[ 0., -9.52, 0., 1., -11.52, 1., ],
[ 0., 0., -9.52, 1., 1., -11.52 ]],
dtype=np.float64
)
#print(H)
E,V = np.linalg.eig(H)
#E,V = sla.eig(H)
H2=reduce(np.dot,[V,np.diag(E),np.linalg.inv(V)])
#print(H2)
print(np.linalg.norm(H-H2))
qui donne
3.93435308362e-09
un certain nombre de l'ordre de la partie imaginaire fictive de zéro des valeurs propres.
Comme mentionné dans les réponses, inversion d'un matrice numériquement conduira généralement à de mauvais résultats. Il y a presque toujours une meilleure façon de résoudre votre problème sans inverser une matrice. –