J'ai l'intention de résoudre Ax = b où A est une matrice carrée ou rectangulaire complexe, clairsemée, asymétrique et très mal conditionnée (nombre de conditions ~ 1E + 20). J'ai pu résoudre le système avec ZGELSS dans LAPACK avec précision. Mais à mesure que les degrés de liberté dans mon système augmentent, il faut beaucoup de temps pour résoudre le système sur un PC avec ZGELSS car la rareté n'est pas exploitée. Récemment, j'ai essayé SuperLU (en utilisant le stockage Harwell-Boeing) pour le même système, mais les résultats étaient inexacts pour le numéro de condition> 1E + 12 (je ne suis pas sûr que ce soit un problème numérique avec le pivotement).
Je suis plus enclin à utiliser des solveurs déjà développés. Existe-t-il un solveur robuste qui peut résoudre le système que j'ai mentionné rapidement (c'est-à-dire en exploitant la rareté) et de manière fiable (au vu des nombres de conditions)?
__float128
Réponses:
Lorsque vous utilisez ZGELSS pour résoudre ce problème, vous utilisez la décomposition de valeurs singulières tronquées pour régulariser ce problème extrêmement mal conditionné. il est important de comprendre que cette routine de bibliothèque n'essaie pas de trouver une solution des moindres carrés à , mais plutôt d'essayer d'équilibrer la recherche d'une solution qui minimisecontre la minimisation. ‖ x ‖ ‖ A x - b ‖A x = b ∥ x ∥ ∥ A x - b ∥
Notez que le paramètre RCOND passé à ZGELSS peut être utilisé pour spécifier quelles valeurs singulières doivent être incluses et exclues du calcul de la solution. Toute valeur singulière inférieure à RCOND * S (1) (S (1) est la plus grande valeur singulière) sera ignorée. Vous ne nous avez pas dit comment vous avez défini le paramètre RCOND dans ZGELSS, et nous ne savons rien du niveau de bruit des coefficients dans votre matrice ou dans le côté droit , il est donc difficile de dire si vous avez utilisé une régularisation appropriée. bUNE b
Vous semblez être satisfait des solutions régularisées que vous obtenez avec ZGELSS, il semble donc que la régularisation effectuée par la méthode SVD tronquée (qui trouve une solution minimale parmi les solutions les moins carrées qui minimisent sur l'espace des solutions couvertes par les vecteurs singuliers associés aux valeurs singulières supérieures à RCOND * S (1)) vous satisfait. ‖ A x - b ‖∥ x ∥ ∥ A x - b ∥
Votre question pourrait être reformulée comme "Comment puis-je obtenir efficacement des solutions de moindres carrés régularisés à ce problème de moindres carrés linéaires volumineux, clairsemé et très mal conditionné?"
Ma recommandation serait d'utiliser une méthode itérative (comme CGLS ou LSQR) pour minimiser le problème des moindres carrés explicitement régularisés
où le paramètre de régularisation est ajusté pour que le problème des moindres carrés amortis soit bien conditionné et que vous soyez satisfait des solutions régularisées résultantes.α
la source
Jed Brown l'a déjà souligné dans les commentaires à la question, mais il n'y a vraiment pas grand-chose que vous puissiez faire en double précision habituelle si votre numéro de condition est grand: dans la plupart des cas, vous n'obtiendrez probablement pas un seul chiffre de précision dans votre solution et, pire, vous ne pouvez même pas le dire car vous ne pouvez pas évaluer avec précision le résidu correspondant à votre vecteur de solution. En d'autres termes: il ne s'agit pas de savoir quel solveur linéaire choisir - aucun solveur linéaire ne peut faire quelque chose d'utile pour de telles matrices.
Ce genre de situations se produit généralement parce que vous choisissez une base inappropriée. Par exemple, vous obtenez de telles matrices mal conditionnées si vous choisissez les fonctions comme base d'une méthode de Galerkin. (Cela conduit à la matrice de Hilbert, qui est notoirement mal conditionnée.) La solution dans de tels cas n'est pas de demander quel solveur peut résoudre le système linéaire, mais de demander s'il existe de meilleures bases qui peuvent être utilisées. Je vous encourage à faire de même: pensez à reformuler votre problème pour ne pas vous retrouver avec ce genre de matrices.1,x,x2,x3,...
la source
Le moyen le plus simple / le plus rapide de résoudre des problèmes mal conditionnés consiste à augmenter la précision des calculs (par force brute). Une autre manière (pas toujours possible) consiste à reformuler votre problème.
Vous devrez peut-être utiliser une précision quadruple (34 chiffres décimaux). Même si 20 chiffres seront perdus dans un cours (en raison du numéro de condition), vous obtiendrez toujours 14 chiffres corrects.
Si cela présente un intérêt, des solveurs clairsemés à quadruple précision sont également disponibles dans MATLAB.
(Je suis l'auteur de la boîte à outils mentionnée).
la source