Biblioteca de algoritmo de Lanczos adaptativo y solo para encabezado
Lambda Lanczos calcula el valor propio más pequeño o más grande y el vector propio correspondiente de una matriz simétrica (hermitiana).
La característica característica es la rutina de multiplicación de vector matriz utilizada en el algoritmo de Lanczos es adaptable:
#include <lambda_lanczos/lambda_lanczos.hpp> usando lambda_lanczos :: lambdalanczos;/ * Algunos incluyen y usando declaraciones se omiten */void sample () {const int n = 3; Matriz doble [n] [n] = {{2.0, 1.0, 1.0}, {1.0, 2.0, 1.0}, {1.0, 1.0, 2.0}}; // Sus valores propios son {4, 1, 1} / * Preparar la rutina de multiplicación de vector matriz utilizado en el algoritmo de Lanczos */ Auto mv_mul = [&] (const vector <doble> & in, vector <bouble> & out) {for (int i = 0; i <n; i ++) {for (int j = 0; j <n; j ++) { out [i] += matrix [i] [j]*en [j]; } } }; / * Ejecutar el algoritmo Lanczos */ Lambdalanczos <doble> motor (mv_mul, n, true, 1); // encontrar 1 valor propio máximo Vector <doble> valores propios; vector <vector <doble>> eigenvectores; motor.run (valores propios, vectores propios); //// Si C ++ 17 está disponible, la siguiente notación hace lo mismo: // Auto [EigenValues, EigenVectores] = Engine.run () / * Imprimir resultado */ cout << "EigenValue:" << setPrecision (16) << EigenValues [0] << endl; cout << "EigenVector:"; para (int i = 0; i <n; i ++) { cout << eigenvectores [0] [i] << ""; } cout << endl; }
Esta característica te permite
Combine fácilmente Lambda Lanczos con bibliotecas de matriz existentes (por ejemplo, Eigen; consulte un código de muestra).
Use una matriz cuyos elementos se dan parcialmente, por ejemplo, una matriz dispersa cuyos elementos distintos de cero se almacenan como una lista de tuplas {índice de fila, columna, valor}.
Lambda Lanczos proporciona las siguientes dos interfaces:
La clase LambdaLanczos
calcula los valores propios máximos (mínimos) y los vectores propios correspondientes. Los valores propios degenerados se tienen en cuenta. Esta clase apunta a problemas que requieren uno o unos pocos puntos propios (por ejemplo, excitación de baja energía de un sistema cuántico).
La clase Exponentiator
calcula el siguiente tipo de multiplicación de vector matriz:
dónde
Como aplicación, esta clase puede usarse para la evolución del tiempo de un sistema cuántico de muchos cuerpos:
y algoritmos más sofisticados, como TDVP y otras redes de tensor.
Ver aquí.
Referencia de API
C ++ 11 entorno compatible
Lambda Lanczos en sí no depende de ninguna biblioteca.
Para ejecutar pruebas, se requiere la prueba de Google.
Lambda Lanczos es una biblioteca solo de encabezado. Entonces, el paso de instalación es el siguiente:
Clon o descargue la última versión de GitHub.
Coloque el directorio include/lambda_lanczos
en cualquier lugar donde su proyecto pueda encontrar.
MIT
mrcdr