Niedawno zadałem pytanie w tym samym stylu dla matryc skośno-hermitowskich. Zainspirowany sukcesem tego pytania i po kilku godzinach uderzenia głową o ścianę patrzę na wykładniczą macierz prawdziwych matryc asymetrycznych. Droga do znalezienia wartości własnych i wektorów własnych wydaje się dość skomplikowana i obawiam się, że się zgubiłem.
Tło: Jakiś czas temu zadałem to pytanie na temat fizyki teoretycznej SE. Wynik pozwala mi sformułować równania wzorcowe jako rzeczywiste macierze asymetryczne. W przypadku niezależnym od czasu równanie wzorcowe rozwiązuje się przez wykładnik tej macierzy. W przypadku zależnym od czasu będzie wymagało integracji. W tej chwili interesuje mnie tylko niezależność czasowa.
Po patrząc na różnych podprogramów myślę, że powinno być wywołanie ( ? Gehrd , ? Orghr , ? Hseqr ...) nie jest jasne, czy byłoby prostsze do oddania matrycę od real*8
celu complex*16
i postępować ze skomplikowanymi podwójnymi wersje tych funkcji, lub trzymaj się real*8
i podbij trafienie podwojenia liczby moich tablic i zrobienia ich złożonej macierzy później.
Więc do jakich procedur mam dzwonić (i w jakiej kolejności) i czy powinienem używać prawdziwych podwójnych wersji czy złożonych podwójnych wersji? Poniżej znajduje się próba zrobienia tego z prawdziwymi podwójnymi wersjami. Utknąłem, szukając wartości własnych i wektorów własnych 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