2007年11月26日月曜日

対角化

フォートランで配列の宣言で
real*8 A(M:N)のようにすると、要素の番号付けを任意の数字間で行える。
LAPACKでの対角化のサブルーチンはdgeevが実行列に対するもので、zgeevが複素数行列に対するもの。
dgeev,zgeevともに、固有ベクトルの計算も可能である。固有ベクトルには右固有ベクトルと左固有ベクトルがあり、普通使う高校とかで習ったような固有ベクトルが右固有ベクトルである。
サブルーチン呼び出しの形式は
call dgeev(char_jobvl, char_jobvr,integer_n, real*8_a, integer_lda, real*8_wr(n), real*8_wi(n), real*8_vl,integer_ldvl,real*8_vr, integer_ldvr,real*8_work,integer_lwork, integer_info)

jobvl(jobvr):左(右)固有ベクトルを計算するかしないか、Nで計算しない、Vで計算する。
n:対角化する正方行列の次元数
a:n×nの行列。入力・出力の両方に使われる。入力は対角化する行列であり、計算実行時に上書きわれていく。
lda:行列の第一次元のメモリ格納数。通常はnでよい
wr(wi):次元数nの配列。計算された固有値の実部(虚部)が格納される
vl(vr):次元数ldvl(ldvr)×nの配列。左(右)固有ベクトルが格納される
ldvl(ldvr):vl(vr)を格納するのに使うメモリ数jobvl=Nなら、ldvlは一より大きい数を適当に入れておけばよい。jobvl=Vならnより大きい値を入れておく。ldvrついても同様。
work:次元数lworkの配列。
lwork:4nより大きい値を入れておく。計算性能の向上には大きい値を入れておいたほうがよい。
info:計算がうまくいったかどうかを示す。

0 コメント: