C ++ Biblioteca de algoritmo adaptável e somente para cabeçalho
Lambda Lanczos calcula o menor ou o maior valor próprio e o vetor próprio correspondente de uma matriz simétrica (hermitiana).
O recurso característico é a rotina de multiplicação de vetor de matriz usada no algoritmo Lanczos é adaptável:
#include <lambda_lanczos/lambda_lanczos.hpp> usando lambda_lanczos :: lambdalanczos;/ * Alguns incluem e usando declarações são omitidos */void sample () {const int n = 3; matriz dupla [n] [n] = {{2.0, 1.0, 1.0}, {1.0, 2.0, 1.0}, {1.0, 1.0, 2.0}}; // seus valores próprios são {4, 1, 1} / * Prepare rotina de multiplicação de matriz-vetor usada no algoritmo Lanczos */ Auto mv_mul = [&] (const Vector <boun> & in, Vector <boun> & out) {for (int i = 0; i <n; i ++) {for (int j = 0; j <n; j ++) { out [i] += Matrix [i] [j]*em [j]; } } }; / * Execute o algoritmo Lanczos */ Lambdalanczos <boun> motor (mv_mul, n, true, 1); // Encontre 1 autovalor máximo Vector <ouble> autovalores; vetor <vetor <boun>> vetores próprios; motor.Run (autovalores, autovetores); //// Se C ++ 17 estiver disponível, a seguinte notação faz a mesma coisa: // Auto [autovalores, autovetores] = Engine.run () / * Resultado de impressão */ cout << "EigenValue:" << SetPrecision (16) << EigenValues [0] << endl; cout << "EigenVector:"; for (int i = 0; i <n; i ++) { cout << eigenVectors [0] [i] << ""; } cout << endl; }
Este recurso permite que você
Combine facilmente Lambda Lanczos com as bibliotecas da matriz existentes (por exemplo, Eigen; consulte um código de amostra).
Use uma matriz cujos elementos são parcialmente dados, por exemplo, uma matriz esparsa cujos elementos diferentes de zero são armazenados como uma lista de tuplas {índice de linha, coluna-índice, valor}.
Lambda Lanczos fornece as duas interfaces a seguir:
A classe LambdaLanczos
calcula valores próprios máximos (mínimos) e os autovetores correspondentes. Os autovalores degenerados são levados em consideração. Esta classe visa problemas que exigem um ou alguns autopenpairs (por exemplo, excitação de baixa energia de um sistema quântico).
A classe Exponentiator
calcula o seguinte tipo de multiplicação de vetor de matriz:
onde
Como aplicativo, esta classe pode ser usada para a evolução do tempo de um sistema quântico de muitos corpos:
e algoritmos mais sofisticados, como TDVP e outras redes tensoras.
Veja aqui.
Referência da API
C ++ 11 Ambiente compatível
O próprio Lambda Lanczos não depende de nenhuma biblioteca.
Para executar testes, o teste do Google é necessário.
Lambda Lanczos é uma biblioteca somente para cabeçalho. Portanto, a etapa de instalação é a seguinte:
Clone ou faça o download da versão mais recente do GitHub.
Coloque o diretório include/lambda_lanczos
em qualquer lugar que seu projeto possa encontrar.
Mit
mrcdr