Matrice esponenziale di una matrice inclinata-ermita con fortran 95 e LAPACK


11

Mi sto solo infilando in fortran 95 per alcune simulazioni di meccanica quantistica. Onestamente, sono stato viziato da Octave, quindi ho dato per scontato l'espiazione della matrice. Data una (piccola, ) inclinazione di matrice hermitiana di dimensioni n × n , qual è il modo più efficiente di usare LAPACK per risolvere questo problema? Non sto usando il wrapper LAPACK95, ma solo chiamate dirette a LAPACK.n36n×n


2
Hai bisogno dell'esponenziale della matrice da solo o hai bisogno dell'esponenziale della matrice moltiplicato per un vettore?
Paul

@Paul: Siamo spiacenti, non l'ho mai visto prima. No, ho bisogno dell'intera matrice.
qubyte

Perché qualcuno dovrebbe sottovalutare questa domanda? Se si annota il voto, si prega di lasciare un motivo nei commenti! Forse la domanda può essere migliorata in questo modo.
qubyte

Facciamo affidamento su DGPADM , ma secondo Jack Poulson potrebbe esserci un modo migliore.
Mike Dunlavey,

Risposte:


16

Gli esponenziali matriciali delle matrici inclinate-eremitiche sono economici da calcolare:

Supponiamo che sia la tua matrice obliqua-eremitica, quindi i A sia eremita e che tramite zheevd e i tuoi amici puoi ottenere la decomposizioneAiA

iA=UΛUH,

dove è la matrice di autovettori unitari e Λ è reale e diagonale. Quindi, banalmente,UΛ

A=U(iΛ)UH.

Una volta che hai e Λ , è facile da calcolareUΛ

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

esponendo prima gli autovalori, impostando tramite zcopy , eseguendo B : = B exp ( - i Λ ) eseguendo zscal su ciascuna colonna con un autovalore esponenziato e infine impostando il risultato suB:=UB:=Bexp(iΛ)

exp(A):=BUH

via zgemm .


Grazie! Ho perso un ovvio trucco lì con l' . Mi hai inserito nelle specifiche subroutine LAPACK di cui ho bisogno, quindi grazie in più per questo. Non lo contrassegnerò come corretto (voglio prima provarlo). i
qubyte

1
Senza fretta. In realtà l'ho implementato prima, quindi sono abbastanza fiducioso :-)
Jack Poulson

Questo sarà uno di quei magici frammenti di codice che uso ovunque. Per quello che vale, ti ringrazio anche in una riga di commento che probabilmente nessun altro vedrà mai.
qubyte

2
@JackPoulson: ben fatto, signore. Questo è quello che ottengo scegliendo un maggiore che non crede nei numeri immaginari (tranne che negli autovalori).
Geoff Oxberry,

1
@JackPoulson: funziona magnificamente. Grazie ancora per questo. Soprattutto il bit zscal. Avevo la maggior parte del resto del codice in un'altra subroutine, ma era qualcosa che avevo trascurato.
qubyte

5

Dal momento che sono sul mio telefono, non riesco a collegare le cose facilmente e aggiungerò collegamenti in seguito. Probabilmente vorrai guardare il documento "19 Dubious Ways to Calculate the Matrix Exponential", la biblioteca Fortran EXPOKIT, il documento di Jitse Niesen sui metodi di Krylov per il calcolo dell'esponenziale di Matrix e alcuni dei recenti articoli di Nick Higham sugli esponenziali di matrice. È più comune avere bisogno del prodotto di una matrice esponenziale e di un vettore rispetto alla sola matrice esponenziale, e qui i metodi di Krylov possono essere molto utili. Per matrici più piccole e dense come quelle che descrivi, i metodi Padé potrebbero essere migliori, ma ho avuto molto successo con i metodi Krylov quando sono stati utilizzati all'interno di metodi esponenziali per l'integrazione numerica di ODE.


Grazie. Sono a conoscenza di 19 modi dubbi e anche di esproprio, ma alcune delle persone con cui sto lavorando sono nel settore, quindi voglio evitarlo per motivi di copyright. Sono impaziente di implementarlo con LAPACK / BLAS poiché mi collego già a queste librerie. Una cosa però; Ho bisogno della matrice esponenziale stessa. Sto lavorando a una variante della tomografia di processo quantistica e il processo in questione è incarnato dalla matrice. Più tardi mi occuperò di un integratore in combinazione con questa matrice esponenziale, che è quando diventa davvero interessante!
qubyte

1

Il complesso approccio di eigensolution è matematicamente corretto, ma fa più lavoro del necessario. Sfortunatamente, l'approccio migliorato che sto per descrivere non può essere implementato con le chiamate LAPACK.

X

X=UDUT

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

exp(0tt0)=(costsintsintcost)

La matrice esponenziale che si desidera viene quindi data da

exp(X)=Uexp(D)UT

Ho usato questo approccio nei miei codici di chimica quantistica per diversi decenni e non ho mai avuto problemi con nessuno dei software coinvolti.


Ciao @Ron Shepard, e benvenuti a Computational Exchange SE. Puoi modificare la tua seconda e terza equazione? Sono un po 'difficili da capire.
Nicoguaro

0

Se tutto ciò di cui hai bisogno è l'esponenziale della matrice moltiplicato per un vettore, allora questa subroutine fortran potrebbe esserti utile. Calcola:

(eA)v

dove v è un vettore e A è una matrice eremita regolare. È una subroutine dalla libreria EXPOKIT

Altrimenti, potresti prendere in considerazione questa subroutine, che funziona per qualsiasi matrice complessa generale A.


Non sembra un riferimento alle librerie Fortran.
Geoff Oxberry,

@GeoffOxberry: l'ho riscritto per includere le subroutine fortran
Paul

@Paul: non va bene, temo. Quello che sto facendo è una variazione a matrice intera sulla tomografia di processo. Inoltre inclinare -Hermitian!
qubyte

Apprezzo che tu abbia riscritto la tua risposta, ma in base alla traccia di modifica, sembra che tu abbia completamente cambiato la tua risposta, preso elementi della mia risposta cronologicamente precedente e aggiunto collegamenti.
Geoff Oxberry,

@GeoffOxberry: Al contrario ... I miei risultati sono arrivati ​​indipendentemente dai tuoi, ma hai pubblicato prima che avessi la possibilità di riscrivere la mia risposta :)
Paul
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.