Matriz exponencial de uma matriz enviesada-Hermitiana com fortran 95 e LAPACK


11

Só estou me metendo no fortran 95 para algumas simulações de mecânica quântica. Honestamente, eu fui mimada pela Octave, então tomei como certa a exponenciação da matriz. Dado um (pequeno, ) inclinação matriz -Hermitian de tamanho , qual é a maneira mais eficiente de usar LAPACK para resolver este problema? Não estou usando o wrapper LAPACK95, apenas chamadas diretas para o LAPACK.n × nn36n×n


2
Você precisa da exponencial da matriz por si só ou precisa da exponencial da matriz multiplicada por um vetor?
Paul

@ Paul: Desculpe, não vi isso antes. Não, eu preciso de toda a matriz.
qubyte

Por que alguém rebaixou essa pergunta? Se você recusar, deixe um motivo nos comentários! Talvez a questão possa ser melhorada dessa maneira.
qubyte

Contamos com o DGPADM , mas, segundo Jack Poulson, poderia haver uma maneira melhor.
precisa saber é o seguinte

Respostas:


16

Exponenciais de matriz de matrizes enviesadas-Hermitianas são baratas para calcular:

Suponha que seja sua matriz hermitiana enviesada, então i A seja hermitiana e, através de zheevd e amigos, você pode obter a decomposiçãoAiA

iA=UΛUH,

onde é a matriz de vetor próprio e Λ é real e diagonal. Então, trivialmente,UΛ

A=U(iΛ)UH.

Depois de ter e Λ , é fácil calcularUΛ

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

exponenciando primeiro os autovalores, configurando via zcopy , executando B : = B exp ( - i Λ ) executando zscal em cada coluna com um autovalor exponencial e, finalmente, configurando seu resultado paraB:=UB:=Bexp(iΛ)

exp(A):=BUH

via zgemm .


Obrigado! Eu perdi um truque óbvio lá com o . Você me colocou nas sub-rotinas específicas do LAPACK de que preciso, então muito obrigado por isso. Ainda não vou marcar isso como correto (quero testá-lo primeiro). i
qubyte

1
Sem pressa. Eu realmente implementado antes, então eu estou bastante confiante :-)
Jack Poulson

Este será um daqueles trechos mágicos de código que eu uso em todo o lugar. Pelo que vale, também colocarei um agradecimento em uma linha de comentários que provavelmente ninguém mais verá.
qubyte

2
@ JackPoulson: Bem jogado, senhor. É isso que recebo ao escolher um curso que não acredita em números imaginários (exceto em valores próprios).
Geoff Oxberry

1
@JackPoulson: Funciona lindamente. Obrigado novamente por isso. Especialmente o bit zscal. Eu tinha o resto do código em outra sub-rotina, mas isso era algo que eu havia esquecido.
qubyte

5

Como estou no meu telefone, não consigo vincular as coisas facilmente e adicionarei links posteriormente. Você provavelmente vai querer ler o artigo "19 maneiras dúbias de calcular o exponencial da matriz", a biblioteca Fortran EXPOKIT, o artigo de Jitse Niesen sobre métodos de Krylov para o cálculo do exponencial da matriz e alguns dos trabalhos recentes de Nick Higham sobre exponenciais da matriz. É mais comum precisar do produto de um exponencial da matriz e de um vetor do que o exponencial da matriz sozinho, e aqui os métodos de Krylov podem ser bastante úteis. Para matrizes menores e densas como as que você descreve, os métodos Padé podem ser melhores, mas tive muito sucesso com os métodos de Krylov quando usado em métodos exponenciais para integração numérica de ODEs.


Obrigado. Estou ciente de 19 maneiras dúbias e também expô-las, mas algumas das pessoas com quem trabalho estão no setor, por isso quero evitá-las por motivos de direitos autorais. Estou interessado em implementá-lo com o LAPACK / BLAS, já que já vinculo a essas bibliotecas. Uma coisa, porém; Eu preciso da própria matriz exponencial. Estou trabalhando em uma variante da tomografia quântica de processos, e o processo em questão é incorporado pela matriz. Mais tarde, lidarei com um integrador em combinação com esse exponencial da matriz, que é quando fica realmente interessante!
qubyte

1

A abordagem complexa de auto-resolução é matematicamente correta, mas faz mais trabalho do que o necessário. Infelizmente, a abordagem aprimorada que estou prestes a descrever não pode ser implementada com chamadas LAPACK.

X

X=UDUT

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

exp(0tt0)=(costsintsintcost)

A matriz exponencial que você deseja é dada por

exp(X)=Uexp(D)UT

Eu usei essa abordagem nos meus códigos de química quântica por várias décadas e nunca tive problemas com nenhum software envolvido.


Olá @ Ron Shepard, e bem-vindo ao Computational Exchange SE. Você pode editar sua segunda e terceira equações? Eles são um pouco difíceis de entender.
nicoguaro

0

Se tudo o que você precisa é a exponencial da matriz multiplicada por um vetor, essa sub - rotina fortran pode ser útil para você. Ele calcula:

(eA)v

onde v é um vetor e A é uma matriz eremita regular. É uma sub-rotina da biblioteca EXPOKIT

Caso contrário, você pode considerar essa sub - rotina, que funciona para qualquer matriz complexa geral A.


Isso não parece uma referência às bibliotecas do Fortran.
Geoff Oxberry

@GeoffOxberry: reescrevi para incluir as sub
Paul

@ Paul: Não é bom, eu tenho medo. O que estou fazendo é uma variação de toda a matriz na tomografia de processo. Além disso inclinar -Hermitian!
qubyte

Aprecio que você reescreveu sua resposta, mas, com base na trilha de edição, parece que você mudou completamente sua resposta, pegou elementos da minha resposta cronologicamente anterior e adicionou links.
9602 Geoff Oxberry

@GeoffOxberry: Pelo contrário ... Meus resultados foram independentes dos seus, mas você postou antes que eu tivesse a chance de reescrever minha resposta :)
Paul
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.