Bibliothèque d'algorithme Lanczos adaptative et en tête C ++
Lambda Lanczos calcule la valeur propre la plus petite ou la plus grande et le vecteur propre correspondant d'une matrice symétrique (hermitienne).
La caractéristique est la routine de multiplication matricielle-vecteur utilisée dans l'algorithme Lanczos est adaptable:
#include <Lambda_lanczos / Lambda_lanczos.hpp> Utilisation de lambda_lanczos :: lambdalanczos; / * Certains incluent et en utilisant les déclarations sont omises * / void sample () {const int n = 3; double matrice [n] [n] = {{2.0, 1.0, 1,0}, {1.0, 2.0, 1.0}, {1.0, 1.0, 2.0}}; // ses valeurs propres sont {4, 1, 1} / * Préparez la routine de multiplication de la matrice-vecteur utilisée dans l'algorithme de Lanczos * / auto mv_mul = [&] (const vector <pouct> & in, vector <pouble> & out) {for (int i = 0; i <n; i ++) {for (int j = 0; j <n; j ++) { out [i] + = matrice [i] [j] * dans [j]; } } }; / * Exécuter l'algorithme Lanczos * / Moteur Lambdalanczos <bouble> (mv_mul, n, true, 1); // trouver 1 valeur propre maximale Vector <bouble> Values Eigen; Vector <vector <bouble>> vecteurs propres; moteur.Run (valeurs propres, vecteurs propres); //// Si C ++ 17 est disponible, la notation suivante fait la même chose: // Auto [valeurs propres, vecteurs propres] = moteur.run () / * Imprimer le résultat * / cout << "eigenvalue:" << setPrecision (16) << eigenValues [0] << endl; cout << "Vector Eigen:"; pour (int i = 0; i <n; i ++) { cout << vecteurs eigen [0] [i] << ""; } cout << endl; }
Cette fonctionnalité vous permet de
Combinez facilement les Lambda Lanczos avec les bibliothèques de matrice existantes (par exemple, propre; voir un exemple de code).
Utilisez une matrice dont les éléments sont partiellement donnés, par exemple une matrice clairsemée dont les éléments non nuls sont stockés comme une liste de tuples {index, colonne-index, valeur}.
Lambda Lanczos fournit les deux interfaces suivantes:
La classe LambdaLanczos
calcule les valeurs propres maximales (minimales) et les vecteurs propres correspondants. Les valeurs propres dégénérées sont prises en compte. Cette classe vise des problèmes qui nécessitent un ou quelques paires de chemins (par exemple, l'excitation à basse énergie d'un système quantique).
La classe Exponentiator
calcule le type suivant de multiplication de vecteur matriciel:
où
En tant qu'application, cette classe peut être utilisée pour l'évolution du temps d'un système quantique à plusieurs corps:
et des algorithmes plus sophistiqués, tels que TDVP et d'autres réseaux de tenseur.
Voir ici.
Référence de l'API
C ++ 11 Environnement compatible
Lambda Lanczos lui-même ne dépend d'aucune bibliothèque.
Pour exécuter des tests, Google Test est requis.
Lambda Lanczos est une bibliothèque d'en-tête uniquement. L'étape d'installation est donc la suivante:
Clone ou téléchargez la dernière version de GitHub.
Placez le répertoire include/lambda_lanczos
partout où votre projet peut trouver.
Mit
MRCDR