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

◆ Zgeev()

Sub Zgeev ( Jobvl As  String,
Jobvr As  String,
N As  Long,
A() As  Complex,
W() As  Complex,
Vl() As  Complex,
Vr() As  Complex,
Info As  Long 
)

(シンプルドライバ) 固有値・固有ベクトル (複素行列)

目的
本ルーチンはN×N複素行列Aの固有値, および, 必要により左および/または右固有ベクトルを求める.

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で最大成分が実数になるように正規化される.
引数
[in]Jobvl= "N": Aの左固有ベクトルを求めない.
= "V": Aの左固有ベクトルを求める.
[in]Jobvr= "N": Aの右固有ベクトルを求めない.
= "V": Aの右固有ベクトルを求める.
[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()は上書きされる.
[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]Info= 0: 正常終了.
= -1: パラメータ Jobvl の誤り. (Jobvl <> "V"および"N")
= -2: パラメータ Jobvr の誤り. (Jobvr <> "V"および"N")
= -3: パラメータ N の誤り. (N < 0)
= -4: パラメータ A() の誤り.
= -5: パラメータ W() の誤り.
= -6: パラメータ Vl() の誤り.
= -7: パラメータ Vr() の誤り.
= i > 0: QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. 固有ベクトルは計算されなかった. W()の要素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_Zgeev()
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
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 Zgeev("V", "V", N, A(), W(), Vl(), Vr(), 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(1, 0)), Cimag(Vr(1, 0)), Creal(Vr(1, 1)), Cimag(Vr(1, 1))
Debug.Print Creal(Vr(2, 0)), Cimag(Vr(2, 0)), Creal(Vr(2, 1)), Cimag(Vr(2, 1))
Debug.Print Creal(Vr(0, 2)), Cimag(Vr(0, 2))
Debug.Print Creal(Vr(1, 2)), Cimag(Vr(1, 2))
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