Recentemente, fiz uma pergunta na mesma linha para matrizes enviesadas-hermitianas. Inspirado pelo sucesso dessa pergunta, e depois de bater minha cabeça contra uma parede por algumas horas, estou olhando para o exponencial da matriz de matrizes assimétricas reais. O caminho para encontrar os autovalores e autovetores parece bastante complicado, e receio ter me perdido.
Antecedentes: Há algum tempo, fiz essa pergunta sobre a física teórica SE. O resultado me permite formular equações mestres como matrizes assimétricas reais. No caso independente do tempo, a equação principal é resolvida exponenciando essa matriz. No caso dependente do tempo, será necessária integração. Só estou preocupado com a independência do tempo no momento.
Ao olhar para as várias sub-rotinas eu acho que deveria ser chamado ( ? Gehrd , ? Orghr , ? Hseqr ...) não está claro se ele seria mais simples para lançar a matriz de real*8
a complex*16
e prossiga com as versões duplas complexos destas rotinas, ou fique com real*8
e tente dobrar o número de minhas matrizes e criar uma matriz complexa delas mais tarde.
Então, quais rotinas devo chamar (e em que ordem) e devo usar as versões duplas reais ou as versões duplas complexas? Abaixo está uma tentativa de fazer isso com versões duplas reais. Eu fiquei preso encontrando os autovalores e autovetores de 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