Puede usar la transformación espectral shift-invert [1] y calcular el espectro banda por banda.
La técnica también se explica en mi artículo [2]. Además de la implementación en [1], hay una implementación disponible en C ++ en mi software Graphite [3] ( actualización 17 de enero : ahora todo está portado a la versión 3 de geogram / graphite ), que utilicé para calcular las funciones propias del operador de Laplace para mallas con hasta 1 millón de vértices (un problema similar al suyo).
Cómo funciona:
La idea es que si es invertible, entonces si es un par propio de , es un par propio de . El método iterativo en ARPACK es muy eficiente para calcular los valores propios grandes (frecuencias altas), pero mucho menos eficiente para los pequeños (frecuencias pequeñas). Por lo tanto, cuando uno necesita calcular frecuencias pequeñas, es una buena idea reemplazar con . Ahora, dado que ARPACK solo necesita calcular productos de vectores de matriz, no es necesario invertir realmente : en su lugar, se puede factorizar (usando, por ejemplo, una LU escasa o una factorización escasa ), luego resolverUN( V, λ )UN( V, 1 / λ )UN- 1UNUN- 1UNL LtA x = bcada vez que ARPACK solicita un producto matriz-vector. Esta es la transformación "invertida". Ahora, cuando el número de valores propios se vuelve grande, ARPACK se vuelve lento, pero hay otro truco / transformación que se puede usar, y uno calcula los valores propios de donde es un "cambio" que determina qué parte del espectro es explorado (esta es la transformación "shift"). Combinando ambas transformaciones, uno calcula un cierto número de valores propios de , y luego explora todo el espectro banda por banda, aumentando . Los detalles están en [1], [2].A - σyoreσ( A - σyore)- 1σ
[1] http://www.mcs.anl.gov/uploads/cels/papers/P1263.pdf
[2] http://alice.loria.fr/index.php/publications.html?redirect=0&Paper=ManifoldHarmonics@2008
[3] http://alice.loria.fr/software/graphite/doc/html/