Diagonalisation des matrices conditionnées denses et malades

10

J'essaie de diagonaliser des matrices denses et mal conditionnées. En précision machine, les résultats sont inexacts (renvoyant des valeurs propres négatives, les vecteurs propres n'ont pas les symétries attendues). Je suis passé à la fonction Eigensystem [] de Mathematica pour profiter d'une précision arbitraire, mais les calculs sont extrêmement lents. Je suis ouvert à toutes sortes de solutions. Existe-t-il des packages / algorithmes bien adaptés aux problèmes mal conditionnés? Je ne suis pas un expert en préconditionnement, donc je ne sais pas combien cela pourrait aider. Sinon, je ne pense qu'à des solveurs de valeurs propres de précision arbitraire parallélisés, mais je ne connais rien au-delà de Mathematica, MATLAB et C ++.

Pour donner un aperçu du problème, les matrices sont grandes, mais pas énormes (4096x4096 à 32768x32768 tout au plus). Ils sont réels, symétriques et les valeurs propres sont limitées entre 0 et 1 (exclusif), de nombreuses valeurs propres étant très proches de 0 et aucune proche de 1. La matrice est essentiellement un opérateur de convolution. Je n'ai pas besoin de diagonaliser toutes mes matrices, mais plus je peux agrandir, mieux c'est. J'ai accès à des clusters informatiques avec de nombreux processeurs et des capacités informatiques distribuées.

Je vous remercie

Leigh
la source
2
Quelle routine utilisez-vous pour diagonaliser vos vraies matrices symétriques? Et dans quel sens la décomposition des valeurs propres est-elle inexacte?
Jack Poulson
Voici une idée liée à la réponse d'Arnold: effectuez une décomposition Cholesky de votre matrice SPD, puis trouvez les valeurs singulières du triangle Cholesky que vous venez d'obtenir, en utilisant éventuellement un algorithme de type dqd pour préserver la précision.
JM
1
@JM: La formation de la décomposition de Cholesky d'une matrice définie positive numériquement singulière est numériquement instable avec la méthode habituelle, car on rencontre probablement des pivots négatifs. (Par exemple, le chol de Matlab (A) échoue généralement.) Il faudrait les mettre à zéro et anéantir les lignes correspondantes des facteurs. Faire cela donne un moyen d'obtenir de manière fiable l'espace nul numérique.
Arnold Neumaier
@Arnold, si la mémoire est bonne, il existe des adaptations de Cholesky qui utilisent le pivotement symétrique pour les cas où la matrice est positive semi- définie (ou presque). Peut-être que ceux-ci pourraient être utilisés ...
JM
@JM: Il n'est pas nécessaire de pivoter pour résoudre le cas semi-défini; la recette que j'ai donnée suffit. Je voulais juste souligner que l'on ne peut pas utiliser les programmes standard en conserve mais doit les modifier soi-même.
Arnold Neumaier

Réponses:

7

Calculez la SVD à la place de la décomposition spectrale. Les résultats sont les mêmes en arithmétique exacte, car votre matrice est définie positivement symétrique, mais en arithmétique de précision finie, vous obtiendrez les petites valeurs propres avec beaucoup plus de précision.

Edit: Voir Demmel & Kahan, Accurate Singular Values ​​of Bidiagonal Matrices, SIAM J. Sci. Stat. Comput. 11 (1990), 873-912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

Edit2; Notez qu'aucune méthode ne sera en mesure de résoudre des valeurs propres plus petites que les temps normaux de la précision de la machine utilisée, car la modification d'une seule entrée par un ulp peut déjà changer une petite valeur propre de cette façon. Ainsi, obtenir des valeurs propres nulles à la place de très petites valeurs est approprié, et aucune méthode (sauf travailler avec une plus grande précision) ne démêlera les vecteurs propres correspondants, mais renverra simplement une base pour l'espace nul numérique commun.

Arnold Neumaier
la source
[0,BT;B,0]
2
@JackPoulson: Le fait est que la forme bidiagonale détermine beaucoup mieux les petites valeurs singulières. La forme tridiagonale symétrique associée a des zéros sur la diagonale, qui sont préservés par la réduction bidiagonale en diagonale, mais pas par QR appliqué à la tridiagonale.
Arnold Neumaier
1
Référence? La méthode de Jacobi est connue pour être très précise (quoique lente).
Jack Poulson
@JackPoulson: Essayez de voir. Demmel & Kahan, Accurate Singular Values ​​of Bidiagonal Matrices, 202.38.126.65/oldmirrors/ftp.netlib.org/lapack/lawnspdf/…
Arnold Neumaier
[0,BT;B,0]
1

Merci pour cette suggestion. J'ai essayé la commande SVD de Mathematica, mais je n'obtiens aucune amélioration notable (il manque toujours les symétries appropriées, les `` valeurs propres '' sont incorrectement nulles alors qu'elles sortaient incorrectement négativement auparavant). Peut-être aurais-je besoin d'implémenter l'un des algorithmes que vous décrivez ci-dessus au lieu d'une fonction intégrée? Je voudrais probablement éviter de me donner la peine d'utiliser une méthode spécifique comme celle-ci, sauf si j'étais sûr à l'avance qu'elle offrirait une amélioration significative.

@JackPoulson, j'ai parcouru le document sur la méthode de Jacobi que vous avez mentionnée, et cela semble prometteur. Pouvez-vous ou quelqu'un d'autre recommander un bon moyen de mettre en œuvre la méthode de Jacobi pour trouver des systèmes électroniques? Je suppose que si je le codais moi-même (dans MATLAB), ce serait extrêmement lent.

Leigh
la source
Je ne l'ai pas testé, mais il y a une implémentation MATLAB ici: groups.google.com/forum/?fromgroups#!msg/sci.math.num-analysis/…
Jack Poulson
Notez qu'aucune méthode ne sera en mesure de résoudre des valeurs propres plus petites que les temps normaux de la précision de la machine utilisée, car la modification d'une seule entrée par un ulp peut déjà changer une petite valeur propre de cette façon. Ainsi, obtenir des valeurs propres nulles à la place de très petites valeurs est approprié, et aucune méthode (sauf travailler avec une plus grande précision) ne démêlera les vecteurs propres correspondants, mais renverra simplement une base pour l'espace nul numérique commun. Pour quoi avez-vous besoin des valeurs propres?
Arnold Neumaier
@ArnoldNeumaier: J'ai exécuté des tests dans MATLAB avec des valeurs propres dans la plage de [0,1], avec une valeur propre définie manuellement sur des valeurs telles que 6.3e-16, et la routine SVD d'Octave (basée sur dgesvd, qui utilise la réduction en bidiagonale et alors QR) capte ces valeurs beaucoup plus précisément que le octet d'Octave. Le code Jacobi lié semble être trop lent à utiliser, même sur des matrices de taille modeste.
Jack Poulson
@JackPoulson: Oui. Mais Leigh semble se plaindre de plusieurs très petites valeurs propres, et leurs vecteurs propres seront rarement ceux conçus mais se mélangeront librement, quelle que soit la méthode utilisée. Et des valeurs positives très minuscules positives (inférieures à 1e-16) seront bien sûr trouvées nulles.
Arnold Neumaier
@ArnoldNeumaier a raison de dire que je trouve plusieurs très petites valeurs propres, ce qui, je suppose, aggrave le problème. Je ne savais pas (bien que rétrospectivement, c'est évident) que les valeurs propres inférieures à 1e-16 seront nulles en virgule flottante. Je suppose que même si le nombre peut être stocké, une erreur d'arrondi se produit lors de l'ajout à un plus grand nombre. Les vecteurs propres me disent si un certain problème est résoluble. Le vecteur propre permet la décomposition du problème en parties résolubles et non résolubles. Si je suis fondamentalement limité par la précision, pouvez-vous recommander des packages pour une solution plus rapide?
Leigh