9
votes

Solution algébrique linéaire de Boost pour y = hache

Boost en a un? Où A, Y et X sont une matrice (clairsemé et peuvent être très grands) et des vecteurs respectivement. Y ou X peut être inconnu.

Je n'arrive pas à le trouver ici: http://www.boost.org/doc /Libs/1_39_0/libs/numérique/ublas/doc/index.htm


2 commentaires

Comme je ne connais rien sur Boost ou C ++, je vais simplement commenter qu'il existe une solution si et seulement si A est une matrice inversée. Si A n'est pas inversible, la solution des moindres carrés x = (a ^ t a) ^ (- 1) a ^ t y est la chose la plus proche.


Ce n'est généralement pas la voie que les équations matricielles sont résolues (les inverses sont généralement mauvaises, à la fois pour la stabilité numérique et la vitesse), plutôt que vous verrez la factorisation QR ou LU suivi de la substitution du dos.


6 Réponses :


5
votes

Les solveurs linéaires font généralement partie de la bibliothèque de lapack qui est une extension de niveau plus élevée de la bibliothèque de Blas. Si vous êtes sur Linux, l'Intel MKL a de bons solveurs, optimisé à la fois pour les matrices denses et clairsemées. Si vous êtes sur Windows, MKL dispose d'un essai d'un mois gratuitement ... et d'être honnête, je n'ai essayé aucun des autres là-bas. Je sais que le paquet ATLAS a une implémentation de phack gratuite, mais je ne sais pas à quel point il est difficile de faire fonctionner des fenêtres.

Quoi qu'il en soit, recherchez une bibliothèque de Lapack qui fonctionne sur votre système.


2 commentaires

Remarque: Lapack n'est pas un solveur rare, de sorte qu'il ne stocke pas les matrices clairsemées de manière très efficace, il ne résoudra pas non plus de systèmes de nettoyage de manière particulièrement efficace. L'Intel MKL contient des solveurs clairsemés ( logiciel.intel.com/ Sites / Produits / Collateral / HPC / MKL / ... ), en particulier le solveur de Pardiso Direct Sparse ( Pardiso -Project.org ). Un bon aperçu des logiciels algébrax linéaires numériques denses et clairsemés peut être trouvé sur NETLIB .org / utk / personnes / jackdongarra / la-sw.html


En effet, cela fait, et sauf si vous construisez un produit commercial, je suggérerais de la bibliothèque MKL et de passer à Pardiso, vous économiserez de l'argent et sauvegarderez avoir à gérer les problèmes de licence.



3
votes

Lecture de la documentation de boost, il ne semble pas que la résolution de W.R.T X soit mise en œuvre. La résolution de Y n'est qu'une question de produit de matrice-vectoriel, qui semble implémentée dans Ublas.

Une chose à garder à l'esprit est que Blas n'applique que des opérations «faciles», telles que l'addition, la multiplication, etc. des types de vecteur et de matrice. Tout ce qui est plus avancé (résolution de problèmes linéaires, comme votre "résolution de x y = A x", des vecteurs d'Eigen et de CO) fait partie de lapack, qui construit sur le dessus des Blas. Je ne sais pas ce que Boost fournit à cet égard.


0 commentaires

3
votes

Le réglage de l'emballage d'algèbre linéaire de Boost axé sur les "matrices denses". Autant que je sache, le paquet de Boost n'a pas de solutionniste de système linéaire. Qu'en est-il d'utiliser le code source dans "Recette numérique en C ( http://www.nr.com/oldververswitcher. HTML ) "?

note. Il peut y avoir un bogue d'index subtil dans le code source (certains code utilise un index de tableau de 1)


1 commentaires

Ce n'est pas un bug, c'est une fonctionnalité! C'était de rendre les algorithmes plus agréables aux utilisateurs de Fortrans.



3
votes

Jetez un coup d'œil à JAMA / TNT . Je ne l'ai utilisé que pour les matrices non clairsemées (vous voulez probablement que les factorisations QR ou Lu, qui ont tous deux des méthodes de solveur utilitaire), mais il dispose apparemment de certaines installations pour des matrices clairsemées.


0 commentaires

4
votes

L'un des meilleurs solveurs pour AX = B, quand A est rare, est Tim Davis's UMFPACK

UMFPACK Calcule une décomposition de LU de R A. C'est l'algorithme que s'habitue dans les coulisses dans matlab lorsque vous tapez x = a \ b (et A est clairsemé et carré). UMFPACK est le logiciel libre (GPL)

Notez également si y = Axe, et x est connu, mais y n'est pas, vous calculez Y en effectuant un vecteur de matrice clairsemé multiplié, non pas en résolvant un système linéaire.


0 commentaires

18
votes

Oui, vous pouvez résoudre des équations linéaires avec la bibliothèque Ublas de Boost. Voici un court chemin à l'aide de LU-Factorisize et de substitution du dos pour obtenir l'inverse: xxx

afin de résoudre un système linéaire AX = Y, vous résoudriez l'équation Trans (A) AX = Trans (a) Y en prenant l'inverse de (trans (a) a) ^ - 1 pour obtenir x: x = (trans (a) a) ^ - 1ay.


2 commentaires

Si tout ce dont vous avez besoin est une solution pour AX = Y, utilisez simplement permutation_matrix PM (A.SIZE1 ()); lu_factorize (A, PM); lu_substitute (A, PM, Y); et y est remplacé par la solution.


Cela ne devrait-il pas être l'équation pour x? x = (trans (a) * a) ^ - 1 * trans (a) * y