El siguiente repositorio contiene una implementación del algoritmo estándar de Lanczos.
Instalación
Para jugar con el algoritmo usted mismo, git clone
el repositorio en su máquina local. Luego, en el directorio clonado, inicialice el entorno de condena ejecutando
conda env create --file environment.yml
A partir de ahí, puedes activar el entorno como
conda activate LanczosAlgo
y ejecute el cuaderno en src/lanczos.ipynb
.
Introducción
El algoritmo de Lanczos es un algoritmo directo ideado por Cornelius Lanczos que es una adaptación de los métodos de energía para encontrar el $ m $ Los valores propios "más útiles" (tendiendo hacia los valores propios y los valores propios de un extremo más altos) de un $ n Times n $ Matriz hermitiana, donde $ m $ es a menudo, pero no necesariamente mucho más pequeño que $ n $ .
Algoritmo
El algoritmo procede de la siguiente manera:
- Dada una matriz hermitiana $ A $ de tamaño $ n Times n $ , y un vector arbitrario $ V_1 $ Con la norma euclidea 1, especifique un número predeterminado de llamadas de función $ M = N $
- Dejar $ W_1 '$ = $ Av_1 $
- Dejar $ alpha_1 = w_1 '^* v_1 $
- Dejar $ w_1 = w_1 '^*- alpha_1 v_1 $
Nos referimos a los pasos 2 - 4 como los primeros pasos de iteración. Después,
- Dejar $ beta_j = || w_ {j-1} || $
- Si $ beta_j neq0 $ , dejar $ v_j = frac {w_ {j-1}} { beta_j} $ . De lo contrario, deja $ V_J $ ser un vector arbitrario con la norma euclidiana 1 que es ortogonal a $ v_1, ..., v_ {j-1} $
- Dejar $ w_j '= av_j $
- Dejar $ alpha_j = w_j'v_j $
- Dejar $ w_j = w_j '- alpha_j v_j- beta_j v_ {j-1} $
dónde $ j $ denota el número de iteración y debe satisfacer $ 2 leq j leq m $ . Finalmente, la salida es una matriz tridiagonalizada $ T $ con $ alpha_1, ..., alpha_m $ a lo largo de la diagonal principal, y $ beta_2, ..., beta_m $ a lo largo de los superdiagonales.
Trabajo futuro
Actualmente están en curso los esfuerzos para extender el algoritmo para incluir sistemas de estado de dispersión. ¡Estrata este repositorio si desea que le notifiquen cuándo eso se pone en marcha!