Me estoy metiendo en Fortran 95 para algunas simulaciones de mecánica cuántica. Honestamente, Octave me ha echado a perder, así que he dado por sentado la exponenciación de matrices. Dada una (pequeña, ) sesgo -matriz hemitiana de tamaño n × n , ¿cuál es la forma más eficiente de usar LAPACK para resolver este problema? No estoy usando el contenedor LAPACK95, solo llamadas directas a LAPACK.
11
Respuestas:
Las exponenciales matriciales de las matrices oblicuas-hermitianas son baratas de calcular:
Suponga que es su matriz oblicua - ermitaña , luego i A es hermitiana y, a través de zheevd y sus amigos, puede obtener la descomposiciónUNA i A
donde es la matriz unitaria de vector propio y Λ es real y diagonal. Entonces, trivialmente,U Λ
Una vez que tienes y Λ , es fácil calcularU Λ
exponiendo primero los valores propios, estableciendo mediante zcopy , realizando B : = B exp ( - i Λ ) ejecutando zscal en cada columna con un valor propio exponencial, y finalmente estableciendo su resultado enB : = U B : = B exp( - i Λ )
a través de zgemm .
fuente
Como estoy en mi teléfono, no puedo vincular las cosas fácilmente, y agregaré enlaces más tarde. Probablemente querrá ver el documento "19 formas dudosas de calcular la matriz exponencial", la biblioteca de Fortran EXPOKIT, el documento de Jitse Niesen sobre los métodos de Krylov para calcular la matriz exponencial, y algunos de los documentos recientes de Nick Higham sobre exponenciales de matriz. Es más común necesitar el producto de una matriz exponencial y un vector que la matriz exponencial sola, y aquí, los métodos de Krylov pueden ser bastante útiles. Para matrices más pequeñas y densas como las que usted describe, los métodos de Padé pueden ser mejores, pero he tenido mucho éxito con los métodos de Krylov cuando se usan dentro de métodos exponenciales para la integración numérica de EDO.
fuente
El enfoque complejo de la solución propia es matemáticamente correcto, pero hace más trabajo del necesario. Desafortunadamente, el enfoque mejorado que estoy a punto de describir no se puede implementar con llamadas LAPACK.
La matriz exponencial que desea viene dada por
He usado este enfoque en mis códigos de química cuántica durante varias décadas y nunca he tenido ningún problema con ninguno de los software involucrados.
fuente
Si todo lo que necesita es la matriz exponencial multiplicada por un vector, entonces esta fortr subrutina puede serle útil. Calcula:
donde v es un vector y A es una matriz hermitiana regular. Es una subrutina de la biblioteca EXPOKIT.
De lo contrario, puede considerar esta subrutina, que funciona para cualquier matriz compleja general A.
fuente