Hace poco hice una pregunta en la misma línea para las matrices ermitas sesgadas. Inspirado por el éxito de esa pregunta, y después de golpearme la cabeza contra la pared durante un par de horas, estoy mirando la matriz exponencial de las matrices asimétricas reales. La ruta para encontrar los valores propios y los vectores propios parece bastante complicada, y me temo que me he perdido.
Antecedentes: Hace algún tiempo hice esta pregunta sobre la física teórica SE. El resultado me permite formular ecuaciones maestras como matrices asimétricas reales. En el caso independiente del tiempo, la ecuación maestra se resuelve exponiendo esta matriz. En el caso dependiente del tiempo, requerirá integración. Solo me preocupa la independencia temporal en este momento.
Al mirar las diversas subrutinas creo que debería estar llamando a ( ? Gehrd , ? Orghr , ? Hseqr ...) no está claro si sería más sencillo para emitir la matriz a partir real*8
de complex*16
y proceder con las versiones dobles complejas de estas rutinas, o quédate real*8
y toma el éxito de duplicar el número de mis matrices y hacer una matriz compleja de ellas más tarde.
Entonces, ¿a qué rutinas debería llamar (y en qué orden), y debería usar las versiones dobles reales o las versiones dobles complejas? A continuación hay un intento de hacer esto con versiones dobles reales. Me he quedado atascado encontrando los valores propios y los vectores propios 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
fuente
Para construir sobre lo que Jack ha dicho, el enfoque estándar que parece usarse en software (como EXPOKIT, mencionado en su pregunta anterior) es escalar y cuadrar seguido de aproximación de Padé (Métodos 2 y 3) o métodos de subespacio de Krylov (Método 20) En particular, si está buscando integradores exponenciales, querrá considerar los métodos del subespacio de Krylov y mirar los documentos sobre integradores exponenciales (se mencionan algunas referencias junto con el Método 20 en el documento Moler & van Loan).
Si está empeñado en usar vectores propios, considere usar sistemas triangulares de vectores propios (Método 15); Como su matriz puede no ser desglosable, este enfoque podría no ser el mejor, pero es mejor que tratar de calcular los vectores y valores propios directamente (es decir, Método 14).
La reducción a la forma de Hessenberg no es una buena idea (Método 13).
No es evidente para mí si estaría mejor servido con aritmética real o compleja, ya que la aritmética compleja de Fortran es rápida, pero podría desbordarse / subdesbordarse (consulte "¿Cuánto mejor son realmente los compiladores de Fortran?" ).
Puede ignorar los Métodos 5-7 (los métodos basados en solucionadores de EDO son ineficientes), los Métodos 8-13 (caros), el Método 14 (calcular vectores propios de matrices grandes es difícil sin una estructura especial y propenso a errores numéricos en casos mal condicionados) y Método 16 (calcular la descomposición de Jordan de una matriz es numéricamente inestable). Los métodos 17-19 son más difíciles de implementar; en particular, los métodos 17 y 18 requerirían más lectura. El método 1 es una opción alternativa para escalar y cuadrar si las aproximaciones de Padé no funcionan bien.
fuente
Tengo una subrutina Fortran simple que calcula el exponente de una matriz arbitraria. Lo comprobé con el comando de Matlab y está bien. Se basa en escalar y cuadrar. Lo escribí hace unos años.
Me hubiera gustado encontrar otra subrutina, como las que descargo de gams.nist.gov. Pero aún no hay suerte.
fuente