XLPack 6.1
Excel VBA 数値計算ライブラリ・リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Zgeevx()

Sub Zgeevx ( Balanc As  String,
Jobvl As  String,
Jobvr As  String,
Sense As  String,
N As  Long,
A() As  Complex,
W() As  Complex,
Vl() As  Complex,
Vr() As  Complex,
Ilo As  Long,
Ihi As  Long,
Scal() As  Double,
AbNrm As  Double,
RConde() As  Double,
RCondv() As  Double,
Info As  Long 
)

(エキスパートドライバ) 固有値・固有ベクトル (複素行列)

目的
本ルーチンはn×n複素行列Aの固有値, および, 必要により左および/または右固有ベクトルを求める.
また, 必要により固有値および固有ベクトルの条件を改善するための均衡化の変換(Ilo, Ihi, ScalおよびAbNrm), 固有値の条件数の逆数(RConde), および, 右固有ベクトルの条件数の逆数(RCondv)を求める.

Aの右固有ベクトルv(j)は次式を満たす.
A * v(j) = λ(j) * v(j)
ここで, λ(j)は固有値である.
Aの左固有ベクトルu(j)は次式を満たす.
u(j)^H * A = λ(j) * u(j)^H
ここで, u(j)^H はu(j)の共役転置を表す.
求められた固有ベクトルはユークリッドノルムが1で最大成分が実数になるように正規化される.

行列の均衡化は, 上三角行列に近づくように行と列の入替えを行い, そして行と列のノルムを近づけて固有値および固有ベクトルの条件数を小さくするために対角相似変換D*A*D^(-1)を適用することを意味する. ここで, Dは対角行列である. 求められた条件数の逆数は均衡化後の行列のものである. 行と列の入替えにより条件数は(厳密な計算においては)変わらない. しかし, 対角スケーリングは変わる. 均衡化についてのさらなる説明は LAPACK Users' Guide Third Edition Section 4.8.1 を参照のこと.
引数
[in]Balanc入力された行列の固有値の条件の改善のための対角スケーリングおよび/または入れ替えの方法を指定.
= "N": 対角スケーリングおよび入替えを行わない.
= "P": 上三角行列に近づくように入替えを行う. 対角スケーリングは行わない.
= "S": 対角スケーリングを行う. すなわち, AをD*A*D^(-1)で置き換える. ここで, DはAの行および列のノルムをより等しくするように選ばれた対角行列である. 入替えは行わない.
= "B": Aの対角スケーリングおよび入替えを行う.
[in]Jobvl= "N": Aの左固有ベクトルを求めない.
= "V": Aの左固有ベクトルを求める.
Sense = "E"または"B"の場合, Jobvl = "V"でなければならない.
[in]Jobvr= "N": Aの右固有ベクトルを求めない.
= "V": Aの右固有ベクトルを求める.
Sense = "E"または"B"の場合, Jobvr = "V"でなければならない.
[in]Senseどの条件数の逆数を計算するかを決定する.
= "N": 何も計算しない.
= "E": 固有値についてのみ計算する.
= "V": 右固有ベクトルについてのみ計算する.
= "B": 固有値および右固有ベクトルについて計算する.
Sense = "E"または"B"の場合, 左および右固有ベクトルも計算しなければならない (Jobvl = "V" かつ Jobvr = "V").
[in]N行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in,out]A()配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] N×N行列 A.
[out] A()は上書きされる. Jobvl = "V"あるいはJobvr = "V"の場合, A()には均衡化された入力行列Aのシュール形が入る.
[out]W()配列 W(LW - 1) (LW >= N)
W()に求められた固有値が入る.
[out]Vl()配列 Vl(LVl1 - 1, LVl2 - 1) (LVl1 >= N, LVl2 >= N)
Jobvl = "V": 左固有ベクトルu(j)が, 対応する固有値と同順にVl()の列に順に格納される (u(j) = Vl()のj番目の列).
Jobvl = "N": Vl()は参照されない.
[out]Vr()配列 Vr(LVr1 - 1, LVr2 - 1) (LVr1 >= N, LVr2 >= N)
Jobvr = "V": 右固有ベクトルv(j)が, 対応する固有値と同順にVr()の列に順に格納される (v(j) = Vr()のj番目の列).
Jobvr = "N": Vr()は参照されない.
[out]Ilo
[out]IhiIloとIhiは, 均衡化を行ったときに決まる整数値である. i > j かつ j = 0〜Ilo-2 または i = Ihi〜N-1 であれば, 均衡化された A(i, j) = 0 である.
[out]Scal()配列 Scal(LScal - 1) (LScal >= N)
Aを均衡化したときに適用された入替とスケーリング因子の詳細. p(j)を行および列jと入替を行った行および列のインデックス, 行および列jに適用されたスケーリング因子をd(j)としたとき次のようになる.
  Scal[j] = p(j) (j = 0 〜 Ilo-2)
    = d(j) (j = Ilo-1 〜 Ihi-1)
    = p(j) (j = Ihi 〜 N-1)
入替の順番はN-1からIhi, そして0からIlo-2である.
[out]AbNrm均衡化された行列の1ノルム(任意の列の要素の絶対値の和の最大値).
[out]RConde()配列 RConde(LRConde - 1) (LRConde >= N)
RConde(j)はj番目の固有値の条件数の逆数である.
sense = "N" または "V" の場合, 参照されない.
[out]RCondv()配列 RCondv(LRCondv - 1) (LRCondv >= N)
RCondv(j)はj番目の右固有ベクトルの条件数の逆数である.
sense = "N" または "E" の場合, 参照されない.
[out]Info= 0: 正常終了.
= -1: パラメータ Balanc の誤り. (Balanc <> "N", "P", "S"および"B")
= -2: パラメータ Jobvl の誤り. (Jobvl <> "V"および"N")
= -3: パラメータ Jobvr の誤り. (Jobvr <> "V"および"N")
= -4: パラメータ Sense の誤り. (Sense <> "N", "E", "V"および"B")
= -5: パラメータ N の誤り. (N < 0)
= -6: パラメータ A() の誤り.
= -7: パラメータ W() の誤り.
= -8: パラメータ Vl() の誤り.
= -9: パラメータ Vr() の誤り.
= -12: パラメータ Scal() の誤り.
= -13: パラメータ RConde() の誤り.
= -14: パラメータ RCondv() の誤り.
= i > 0: QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. 固有ベクトルおよび条件数は計算されなかった. W()の要素 0〜Ilo-2 およびi〜N-1 には収束した固有値が入る.
出典
LAPACK
使用例
行列Aの固有値・固有ベクトルを求める. ただし,
( 0.20-0.11i -0.93-0.32i 0.81+0.37i )
A = ( -0.80-0.92i -0.29+0.86i 0.64+0.51i )
( 0.71+0.59i -0.15+0.19i 0.20+0.94i )
とする.
Sub Ex_Zgeevx()
Const N = 3
Dim A(N - 1, N - 1) As Complex, W(N - 1) As Complex
Dim Vl(N - 1, N - 1) As Complex, Vr(N - 1, N - 1) As Complex, Info As Long
Dim Ilo As Long, Ihi As Long, Scal(N - 1) As Double, AbNrm As Double
Dim RConde(N - 1) As Double, RCondv(N - 1) As Double
A(0, 0) = Cmplx(0.2, -0.11): A(0, 1) = Cmplx(-0.93, -0.32): A(0, 2) = Cmplx(0.81, 0.37)
A(1, 0) = Cmplx(-0.8, -0.92): A(1, 1) = Cmplx(-0.29, 0.86): A(1, 2) = Cmplx(0.64, 0.51)
A(2, 0) = Cmplx(0.71, 0.59): A(2, 1) = Cmplx(-0.15, 0.19): A(2, 2) = Cmplx(0.2, 0.94)
Call Zgeevx("N", "V", "V", "N", N, A(), W(), Vl(), Vr(), Ilo, Ihi, Scal(), AbNrm, RConde(), RCondv(), Info)
Debug.Print "Eigenvalues ="
Debug.Print Creal(W(0)), Cimag(W(0)), Creal(W(1)), Cimag(W(1))
Debug.Print Creal(W(2)), Cimag(W(2))
Debug.Print "Eigenvectors (L) ="
Debug.Print Creal(Vl(0, 0)), Cimag(Vl(0, 0)), Creal(Vl(0, 1)), Cimag(Vl(0, 1))
Debug.Print Creal(Vl(1, 0)), Cimag(Vl(1, 0)), Creal(Vl(1, 1)), Cimag(Vl(1, 1))
Debug.Print Creal(Vl(2, 0)), Cimag(Vl(2, 0)), Creal(Vl(2, 1)), Cimag(Vl(2, 1))
Debug.Print Creal(Vl(0, 2)), Cimag(Vl(0, 2))
Debug.Print Creal(Vl(1, 2)), Cimag(Vl(1, 2))
Debug.Print Creal(Vl(2, 2)), Cimag(Vl(2, 2))
Debug.Print "Eigenvectors (R) ="
Debug.Print Creal(Vr(0, 0)), Cimag(Vr(0, 0)), Creal(Vr(0, 1)), Cimag(Vr(0, 1))
Debug.Print Creal(Vr(0, 2)), Cimag(Vr(0, 2))
Debug.Print Creal(Vr(1, 0)), Cimag(Vr(1, 0)), Creal(Vr(1, 1)), Cimag(Vr(1, 1))
Debug.Print Creal(Vr(1, 2)), Cimag(Vr(1, 2))
Debug.Print Creal(Vr(2, 0)), Cimag(Vr(2, 0)), Creal(Vr(2, 1)), Cimag(Vr(2, 1))
Debug.Print Creal(Vr(2, 2)), Cimag(Vr(2, 2))
Debug.Print "Info =", Info
End Sub
実行結果
Eigenvalues =
-1.15894122423918 -0.50662892448174 1.05593587167591 0.900255855387815
0.21300535256327 1.29637306909393
Eigenvectors (L) =
0.726762536559492 0 0.745087513477756 0
0.40101372244835 0.223056722666262 -0.548738777432301 0.10279479855183
-0.452267225989726 -0.238126572710138 0.359068258370214 6.50658637328971E-02
-0.391231614535526 2.26113409959926E-02
0.678149166093442 0
0.525054725907303 0.332953141411018
Eigenvectors (R) =
0.655198201453898 0.10938206993791 0.525205999936112 -0.383296457133484
0.66866018276349 0 -0.232889741084349 0.144310270362231
-0.320734618856182 -0.093668264858228 0.708646172603559 0
0.144705961537036 4.20675407039488E-02
0.647153050768732 -0.150897418413783
0.731924452871704 0
Info = 0