Recentemente ho posto una domanda sulla stessa linea per le matrici oblique ed eremitiche. Ispirato dal successo di quella domanda, e dopo aver sbattuto la testa contro un muro per un paio d'ore, sto osservando la matrice esponenziale delle vere matrici asimmetriche. Il percorso per trovare gli autovalori e gli autovettori sembra piuttosto contorto, e temo di essermi perso.
Background: Qualche tempo fa ho posto questa domanda sulla fisica teorica SE. Il risultato mi permette di definire le equazioni principali come matrici asimmetriche reali. Nel caso indipendente dal tempo, l'equazione principale viene risolta esponenziando questa matrice. Nel caso dipendente dal tempo richiederà l'integrazione. Al momento mi occupo solo dell'indipendenza dal tempo.
Su guardando le varie subroutine penso che dovrei chiamando ( ? Gehrd , ? Orghr , ? Hseqr ...) non è chiaro se sarebbe più semplice per lanciare la matrice da real*8
a complex*16
e procedere con le complesse versioni doppie di queste routine, oppure attenersi real*8
e prendere il colpo di raddoppiare il numero dei miei array e crearne successivamente una matrice complessa.
Quindi, quali routine dovrei chiamare (e in quale ordine) e dovrei usare le doppie versioni reali o le doppie versioni complesse? Di seguito è un tentativo di farlo con vere versioni doppie. Sono rimasto bloccato nel trovare gli autovalori e gli autovettori di 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