Ich habe kürzlich eine ähnliche Frage für schief-hermitische Matrizen gestellt. Inspiriert vom Erfolg dieser Frage und nachdem ich ein paar Stunden lang meinen Kopf gegen eine Wand geschlagen habe, betrachte ich die Exponentialmatrix realer asymmetrischer Matrizen. Der Weg zum Finden der Eigenwerte und Eigenvektoren scheint ziemlich kompliziert zu sein, und ich fürchte, ich habe mich verlaufen.
Hintergrund: Vor einiger Zeit habe ich diese Frage zur theoretischen Physik SE gestellt. Das Ergebnis ermöglicht es mir, Master-Gleichungen als echte asymmetrische Matrizen zu formulieren. Im zeitunabhängigen Fall wird die Hauptgleichung durch Exponentiierung dieser Matrix gelöst. Im zeitabhängigen Fall ist eine Integration erforderlich. Im Moment geht es mir nur um Zeitunabhängigkeit.
Wenn ich mir die verschiedenen Subroutinen ansehe , die ich aufrufen sollte ( ? Gehrd , ? Orghr , ? Hseqr ...), ist es unklar, ob es einfacher wäre, die Matrix von real*8
nach zu gießen complex*16
und mit den komplexen Doppelversionen dieser Routinen fortzufahren. oder bleiben Sie dabei real*8
und versuchen Sie, die Anzahl meiner Arrays zu verdoppeln und später eine komplexe Matrix daraus zu erstellen.
Also, welche Routinen sollte ich aufrufen (und in welcher Reihenfolge) und sollte ich die echten Doppelversionen oder die komplexen Doppelversionen verwenden? Im Folgenden finden Sie einen Versuch, dies mit echten Doppelversionen zu tun. Ich bin festgefahren, die Eigenwerte und Eigenvektoren von zu finden L*t
.
function time_indep_master(s,L,t)
! s is the length of a side of L, which is square.
! L is a real*8, asymmetric square matrix.
! t is a real*8 value corresponding to time.
! This function (will) compute expm(L*t).
integer, intent(in) :: s
real*8, intent(in) :: L(s,s), t
real*8 :: tau(s-1), work(s), wr(s), wi(s), vl
real*8, dimension(s,s) :: time_indep_master, A, H, vr
integer :: info, m, ifaill(2*s), ifailr(2*s)
logical :: sel(s)
A = L*t
sel = .true.
call dgehrd(s,1,s,A,s,tau,work,s,info)
H = A
call dorghr(s,1,s,A,s,tau,work,s,info)
call dhseqr('e','v',s,1,s,H,s,wr,wi,A,s,work,s,info)
call dhsein('r','q','n',sel,H,s,wr,wi,vl,1,vr,s,2*s,m,work,ifaill,ifailr,info)
! Confused now...
end function