Matriz exponencial de una matriz oblicua-ermitaña con fortran 95 y LAPACK

11

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.n36n×n

qubyte
fuente
2
¿Necesita la matriz exponencial por sí misma, o necesita la matriz exponencial multiplicada por un vector?
Paul
@Paul: Lo siento, no vi esto antes. No, necesito toda la matriz.
qubyte
¿Por qué alguien rechazaría esta pregunta? Si votas en contra, ¡ deja un motivo en los comentarios! Quizás la pregunta pueda mejorarse de esta manera.
qubyte
Confiamos en DGPADM , pero según Jack Poulson, podría haber una mejor manera.
Mike Dunlavey

Respuestas:

16

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ónAiA

iA=UΛUH,

donde es la matriz unitaria de vector propio y Λ es real y diagonal. Entonces, trivialmente,UΛ

A=U(iΛ)UH.

Una vez que tienes y Λ , es fácil calcularUΛ

exp(A)=exp(U(iΛ)UH)=Uexp(iΛ)UH

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:=UB:=Bexp(iΛ)

exp(A):=BUH

a través de zgemm .

Jack Poulson
fuente
¡Gracias! Me perdí un truco obvio con el . Me has puesto en las subrutinas específicas de LAPACK que necesito, así que muchas gracias por eso. No marcaré esto como correcto todavía (quiero probarlo primero). i
qubyte
1
Sin prisa. De hecho, lo he implementado antes, así que estoy bastante seguro :-)
Jack Poulson
Este va a ser uno de esos códigos mágicos que uso por todas partes. Por lo que vale, también pondré un agradecimiento en una línea de comentarios que probablemente nadie más verá.
qubyte
2
@JackPoulson: Bien jugado, señor. Esto es lo que obtengo por elegir una especialidad que no cree en números imaginarios (que no sean valores propios).
Geoff Oxberry
1
@JackPoulson: Funciona muy bien. Gracias de nuevo por esto. Especialmente el bit zscal. Tenía la mayor parte del resto del código en otra subrutina, pero esto era algo que había pasado por alto.
qubyte
5

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.

Geoff Oxberry
fuente
Gracias. Estoy al tanto de 19 formas dudosas , y también expokit, pero algunas de las personas que trabajo están en la industria, por lo que quiero evitar que por razones de derechos de autor. Estoy interesado en implementarlo con LAPACK / BLAS ya que ya estoy vinculado a estas bibliotecas. Una cosa sin embargo; Necesito la matriz exponencial en sí misma. Estoy trabajando en una variante de tomografía de proceso cuántico, y el proceso en cuestión está encarnado por la matriz. Más adelante trataré con un integrador en combinación con esta matriz exponencial, ¡que es cuando se vuelve realmente interesante!
qubyte
1

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.

X

X=UDUT

UD2×21×11×1exp(0)=12×2

exp(0tt0)=(costsintsintcost)

La matriz exponencial que desea viene dada por

exp(X)=Uexp(D)UT

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.

Ron Shepard
fuente
Hola @Ron Shepard, y bienvenido a Computational Exchange SE. ¿Puedes editar tu segunda y tercera ecuaciones? Son un poco difíciles de entender.
nicoguaro
0

Si todo lo que necesita es la matriz exponencial multiplicada por un vector, entonces esta fortr subrutina puede serle útil. Calcula:

(eA)v

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.

Paul
fuente
Eso no parece una referencia a las bibliotecas de Fortran.
Geoff Oxberry
@ GeoffOxberry: lo reescribí para incluir las subrutinas fortran
Paul
@Paul: No está bien, me temo. Lo que estoy haciendo es una variación de toda la matriz en la tomografía de proceso. Además sesgo -Hermitian!
qubyte
Aprecio que haya reescrito su respuesta, pero según el rastro de edición, parece que cambió por completo su respuesta, tomó elementos de mi respuesta cronológicamente anterior y agregó enlaces.
Geoff Oxberry
@GeoffOxberry: Por el contrario ... Mis resultados fueron independientes de los suyos, pero publicó antes de que tuviera la oportunidad de volver a escribir mi respuesta :)
Paul