J'ai une matrice NxN symétrique et tridiagonale calculée par un code Python et je souhaite la diagonaliser.Diagonalisation d'une matrice tridimensionnelle symétrique tridimensionnelle avec Python
Dans le cas spécifique, j'ai affaire à N = 6000
, mais la matrice peut devenir plus grande. Comme il est clairsemé, j'ai supposé que la meilleure façon de diagonaliser était d'utiliser l'algorithme scipy.sparse.linalg.eigsh()
, qui a fonctionné extrêmement bien avec d'autres matrices creuses et symétriques (pas tridiagonales, cependant) avec lesquelles j'ai travaillé. En particulier, puisque je n'ai besoin que de la partie basse du spectre, je spécifie k=2
et which='SM'
dans la fonction.
Cependant, dans ce cas, cet algorithme ne semble pas fonctionner, car au bout d'environ 20 minutes de calcul, je reçois l'erreur suivante:
ArpackNoConvergence: ARPACK error -1: No convergence (60001 iterations, 0/2 eigenvectors converged)
Pourquoi est-ce qui se passe? Est-ce un problème lié à certaines propriétés des matrices tridiagonales? Quelle routine Python (et s'il vous plaît, seulement Python!) Est-ce que je peux utiliser pour diagonaliser efficacement ma matrice?
Voici le code minimal demandé de reproduire mon erreur:
import scipy.sparse.linalg as sl
import numpy as np
dim = 6000
a = np.empty(dim - 1)
a.fill(1.)
diag_up = np.diag(a, 1)
diag_bot = np.diag(a, -1)
b = np.empty(dim)
b.fill(1.)
mat = np.diag(b) + diag_up + diag_bot
v, w = sl.eigsh(mat, 2, which = 'SM')
Sur mon pc la construction de la matrice prend 364ms, alors que la diagonalisation donne l'erreur signalée.
Pourriez-vous donner un exemple de travail minimal? Pourrait-il y avoir un problème avec le casting? Les fonctions 'scipy.sparse' fonctionnent avec des tableaux clairsemés, qui ont une représentation différente en mémoire et peut-être que ce que vous observez est lié à cela? Avez-vous essayé de profiler votre code? – norok2
Vous pouvez trouver [this] (http://www.sciencedirect.com/science/article/pii/S1063520312001042) très utile. * O (nlogn) * roches – Marco
@ norok2 fait, merci de répondre. –