Dans mon projet, je dois résoudre quelques matrices tridiagonales à chaque pas de temps, il est donc crucial d'avoir un bon solveur pour celles-ci. J'ai fait ma propre implémentation, juste la manière classique de le faire décrite sur Wikipedia. J'ai ensuite essayé d'utiliser Lapack à la place, et à ma grande surprise, c'était plus lent!
Maintenant, à l'intérieur de Lapack, il semble que ce soit la résolution par factorisation LU et je me demande pourquoi, n'est-ce pas plus complexe qu'il ne pourrait l'être?
De plus, j'ai trouvé un algorithme dans le livre "Recettes numériques" de nr.com qui divise récursivement le système en petits problèmes tridiagonaux. Cela semblait prometteur. Y a-t-il d'autres goodies là-bas?
Mise à jour: la taille du problème est d'environ 1000x1000. J'ai utilisé GotoBLAS, cela vous donne également une bibliothèque Lapack 3.1.1. Le problème n'est pas symétrique. J'ai utilisé la routine Lapack pour les matrices tridiagonales générales.
la source
Réponses:
Vous utilisez une implémentation de référence qui effectue un pivotement partiel. Les résolutions tridiagonales font très peu de travail et ne font pas appel au BLAS. Il est probablement plus lent que votre code car il pivote partiellement. Le code source de dgtsv est simple.
Si vous résolvez plusieurs fois avec la même matrice, vous souhaiterez peut-être stocker les facteurs en utilisant dgttrf et dgttrs . Il est possible que les implémentations dans un LAPACK optimisé tel que MKL, ACML ou ESSL soient plus performantes.
la source