最近、スキューエルミート行列について同じ質問をしました。その質問の成功に触発され、数時間壁に頭をぶつけた後、本当の非対称行列の行列指数を調べています。固有値と固有ベクトルを見つける方法はやや複雑で、迷ってしまったようです。
背景:先ほど、私は理論物理学SEについてこの質問をしました。その結果、マスター方程式を実際の非対称行列として表現できます。時間に依存しないケースでは、マスター方程式はこの行列をべき乗することによって解かれます。時間に依存するケースでは、統合が必要になります。現時点では、時間に依存しないことだけに関心があります。
様々なサブルーチンを見ている時に、私は私が呼び出しされるべきだと思う(?gehrd、?orghr、?hseqr ...)それから行列をキャストする方が簡単だろう場合、それは不明であるreal*8
とcomplex*16
、これらのルーチンの複雑な二重のバージョンでと進み、またはreal*8
、私の配列の数を2倍にして、後でそれらの複雑な行列を作成するという制限を守ってください。
では、どのルーチンを(どのような順序で)呼び出す必要があり、実際のdoubleバージョンまたは複素doubleバージョンを使用する必要がありますか?以下は、実際のダブルバージョンでこれを行う試みです。の固有値と固有ベクトルを見つけるのに行き詰まってい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