Matrice esponenziale di una vera matrice asimmetrica con Fortran 95 e LAPACK


10

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*8a complex*16e procedere con le complesse versioni doppie di queste routine, oppure attenersi real*8e 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

Risposte:


8

Prima di tutto penserei davvero a fondo se la matrice sia davvero completamente arbitraria: c'è qualche trasformazione che la renderebbe ermita? La fisica garantisce che la matrice dovrebbe essere diagonalizzabile (con una matrice autovettore ragionevolmente condizionata)?

Se si scopre che non c'è davvero alcuna simmetria da sfruttare, allora dovresti iniziare leggendo Nineteen Dubious Ways to Compute the Matrix Exponential , che è il riferimento standard (ed è scritto dall'autore di MATLAB e dal coautore di G & vL) .


1
2×24×4

1
Mi piace questa risposta; il caso asimmetrico possiede abbastanza insidie ​​che vale la pena considerare se potrebbe esserci una formulazione del tuo problema che porta a matrici simmetriche anziché a quelle asimmetriche.
JM,

@ MarkS.Everitt: Sembri esserci quasi ... quanto sono grandi le matrici? ~ 36 x 36 di nuovo?
Jack Poulson,

16×1636×36

2
@ MarkS.Everitt: Quindi il tuo problema è effettivamente ora come esponenziare le matrici 4x4. Questo è sufficientemente piccolo perché l'analisi asintotica sia irrilevante, quindi la risposta dipenderà interamente dai valori. Non posso più dirlo se non traduci il tuo post di fisica collegata in algebra lineare (che cos'è un superoperatore?!?).
Jack Poulson,

7

Per basarsi su ciò che Jack ha detto, l'approccio standard che sembra essere utilizzato nel software (come EXPOKIT, menzionato nella tua domanda precedente) è il ridimensionamento e la quadratura seguiti dall'approssimazione di Padé (metodi 2 e 3) o dai metodi del sottospazio di Krylov (metodo 20). In particolare, se stai osservando gli integratori esponenziali, ti consigliamo di considerare i metodi del sottospazio Krylov e guardare i documenti sugli integratori esponenziali (alcuni riferimenti sono menzionati insieme al Metodo 20 nel documento Moler & van Loan).

Se sei intenzionato a usare gli autovettori, considera l'utilizzo di sistemi triangolari di autovettori (Metodo 15); poiché la tua matrice potrebbe non essere diagonale, questo approccio potrebbe non essere il migliore, ma è meglio che provare a calcolare direttamente gli autovettori e gli autovalori (cioè il Metodo 14).

La riduzione alla forma di Hessenberg non è una buona idea (Metodo 13).

Non mi è chiaro se verrai servito meglio con l'aritmetica reale o complessa, dal momento che l'aritmetica complessa di Fortran è veloce, ma potrebbe traboccare / underflow (vedi "Quanto sono davvero migliori i compilatori Fortran?" ).

Puoi tranquillamente ignorare i Metodi 5-7 (i metodi basati sul solutore ODE sono inefficienti), i Metodi 8-13 (costosi), il Metodo 14 (il calcolo degli autovettori di matrici di grandi dimensioni è difficile senza struttura speciale e soggetto a errori numerici in casi mal condizionati) e Metodo 16 (il calcolo della decomposizione Jordan di una matrice è numericamente instabile). I metodi 17-19 sono più difficili da implementare; in particolare, i metodi 17 e 18 richiederebbero più letture. Il metodo 1 è un'opzione di fallback per il ridimensionamento e la quadratura se le approssimazioni di Padé non funzionano bene.

Bj

Bj=γjI+Ej,

γjjEj


1
O(n2)O(n3)

Senza dubbio sanno cosa stanno facendo; Non sono preoccupato per l'implementazione di LAPACK. Sono più sorpreso del comportamento del compilatore Fortran.
Geoff Oxberry,

2
Sì, il compilatore potrebbe essere più un problema di LAPACK ben scritto. Può essere sconcertante scoprire che il tuo programma non andava a buon fine solo perché le implementazioni per il valore assoluto e la divisione utilizzate dal compilatore erano fallite ...
JM,

-1

Ho una semplice subroutine Fortran che calcola l'esponente di una matrice arbitraria. L'ho verificato con il comando Matlab e va bene. Si basa sul ridimensionamento e sulla quadratura. L'ho scritto qualche anno fa.

Vorrei multare un'altra subroutine, come quelle che scarico da gams.nist.gov. Ma ancora niente fortuna.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.