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. P>
Je n'arrive pas à le trouver ici: http://www.boost.org/doc /Libs/1_39_0/libs/numérique/ublas/doc/index.htm p>
6 Réponses :
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. p>
Quoi qu'il en soit, recherchez une bibliothèque de Lapack qui fonctionne sur votre système. P>
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.
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. P>
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. P>
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 ) "? P>
note. Il peut y avoir un bogue d'index subtil dans le code source (certains code utilise un index de tableau de 1) p>
Ce n'est pas un bug, c'est une fonctionnalité! C'était de rendre les algorithmes plus agréables aux utilisateurs de Fortrans.
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. p>
L'un des meilleurs solveurs pour AX = B, quand A est rare, est Tim Davis's UMFPACK code>
p>
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. p> UMFPACK code> 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 code> (et A est clairsemé
et carré).
UMFPACK code> est le logiciel libre (GPL) p>
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: 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. p> p>
Si tout ce dont vous avez besoin est une solution pour AX = Y, utilisez simplement permutation_matrix
y code> est remplacé par la solution.
Cela ne devrait-il pas être l'équation pour x? x = (trans (a) * a) ^ - 1 * trans (a) * y code>
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.