J'ai récemment posé une question dans le même sens pour les matrices asymétriques-hermitiennes. Inspiré par le succès de cette question, et après m'être cogné la tête contre un mur pendant quelques heures, je regarde la matrice exponentielle de vraies matrices asymétriques. L'itinéraire pour trouver les valeurs propres et les vecteurs propres semble plutôt compliqué, et je crains de m'être perdu.
Contexte: Il y a quelque temps, j'ai posé cette question sur la physique théorique SE. Le résultat me permet d'exprimer les équations principales comme de vraies matrices asymétriques. Dans le cas indépendant du temps, l'équation principale est résolue en exponentiant cette matrice. Dans le cas dépendant du temps, il faudra une intégration. Pour l'instant, je ne m'intéresse qu'à l'indépendance dans le temps.
En regardant les différents sous - programmes , je pense que je devrait appeler ( ? Gehrd , ? Orghr , ? Hseqr ...) on ne sait pas si ce serait plus simple de jeter la matrice à partir real*8
de complex*16
et procéder aux versions complexes doubles de ces routines, ou rester avec real*8
et prendre le coup de doubler le nombre de mes tableaux et d'en faire une matrice complexe plus tard.
Alors, quelles routines dois-je appeler (et dans quel ordre), et dois-je utiliser les vraies versions doubles ou les versions doubles complexes? Vous trouverez ci-dessous une tentative de le faire avec de vraies versions doubles. Je suis devenu coincé à trouver les valeurs propres et les vecteurs propres 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