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

◆ Dgeev()

Sub Dgeev ( Jobvl As  String,
Jobvr As  String,
N As  Long,
A() As  Double,
Wr() As  Double,
Wi() As  Double,
Vl() As  Double,
Vr() As  Double,
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]Wr()配列 Wr(LWr - 1) (LWr >= N)
[out]Wi()配列 Wi(LWi - 1) (LWi >= N)
Wr()およびWi()にはそれぞれ求められた固有値の実数部および虚数部が入る. 複素共役対の固有値は, 虚数部が正の固有値を先頭に, 続けて現れる.
[out]Vl()配列 Vl(LVl1 - 1, LVl2 - 1) (LVl1 >= N, LVl2 >= N)
Jobvl = "V": 左固有ベクトルu(j)が, 対応する固有値と同順にVl()の列に順に格納される.
  j番目の固有値が実数の場合, u(j) = (Vl()のj番目の列).
  j番目とj+1番目の固有値が複素共役対の場合, u(j) = (Vl()のj番目の列) + i*(Vl()のj+1番目の列), u(j+1) = (Vl()のj番目の列) - i*(Vl()のj+1番目の列).
Jobvl = "N": Vl()は参照されない.
[out]Vr()配列 Vr(LVr1 - 1, LVr2 - 1) (LVr1 >= N, LVr2 >= N)
Jobvr = "V": 右固有ベクトルv(j)が, 対応する固有値と同順にVr()の列に順に格納される.
  j番目の固有値が実数の場合, v(j) = (Vr()のj番目の列).
  j番目とj+1番目の固有値が複素共役対の場合, v(j) = (Vr()のj番目の列) + i*(Vr()のj+1番目の列), v(j+1) = (Vr()のj番目の列) - i*(Vr()のj+1番目の列).
Jobvr = "N": Vr()は参照されない.
[out]Info= 0: 正常終了.
= -1: パラメータ Jobvl の誤り. (Jobvl <> "V"および"N")
= -2: パラメータ Jobvr の誤り. (Jobvr <> "V"および"N")
= -3: パラメータ N の誤り. (N < 0)
= -4: パラメータ A() の誤り.
= -5: パラメータ Wr() の誤り.
= -6: パラメータ Wi() の誤り.
= -7: パラメータ Vl() の誤り.
= -8: パラメータ Vr() の誤り.
= i > 0: QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. 固有ベクトルは計算されなかった. Wr()およびWi()の要素i〜n-1には収束した固有値が入る.
出典
LAPACK
使用例
行列Aの固有値・固有ベクトルを求める. ただし,
( 0.20 -0.11 -0.93 )
A = ( -0.32 0.81 0.37 )
( -0.80 -0.92 -0.29 )
とする.
Sub Ex_Dgeev()
Const N = 3
Dim A(N - 1, N - 1) As Double, Wr(N - 1) As Double, Wi(N - 1) As Double
Dim Vl(N - 1, N - 1) As Double, Vr(N - 1, N - 1) As Double, Info As Long
A(0, 0) = 0.2: A(0, 1) = -0.11: A(0, 2) = -0.93
A(1, 0) = -0.32: A(1, 1) = 0.81: A(1, 2) = 0.37
A(2, 0) = -0.8: A(2, 1) = -0.92: A(2, 2) = -0.29
Call Dgeev("V", "V", N, A(), Wr(), Wi(), Vl(), Vr(), Info)
Debug.Print "Eigenvalues (r) =", Wr(0), Wr(1), Wr(2)
Debug.Print "Eigenvalues (i) =", Wi(0), Wi(1), Wi(2)
Debug.Print "Eigenvectors (L) ="
Debug.Print Vl(0, 0), Vl(0, 1), Vl(0, 2)
Debug.Print Vl(1, 0), Vl(1, 1), Vl(1, 2)
Debug.Print Vl(2, 0), Vl(2, 1), Vl(2, 2)
Debug.Print "Eigenvectors (R) ="
Debug.Print Vr(0, 0), Vr(0, 1), Vr(0, 2)
Debug.Print Vr(1, 0), Vr(1, 1), Vr(1, 2)
Debug.Print Vr(2, 0), Vr(2, 1), Vr(2, 2)
Debug.Print "Info =", Info
End Sub
Sub Dgeev(Jobvl As String, Jobvr As String, N As Long, A() As Double, Wr() As Double, Wi() As Double, Vl() As Double, Vr() As Double, Info As Long)
(シンプルドライバ) 固有値・固有ベクトル (一般行列)
実行結果
Eigenvalues (r) = -0.904130023851345 0.812065011925673 0.812065011925673
Eigenvalues (i) = 0 0.48915757543818 -0.48915757543818
Eigenvectors (L) =
-0.610555216308549 6.20242550062375E-02 -0.532191939813679
-0.404592057902723 0.7174496715502 0
-0.680828608770563 -9.02631541142068E-03 0.445094625232521
Eigenvectors (R) =
-0.640873419668578 -0.22876069887917 -0.504184181286349
4.57634889263765E-02 0.671832713345003 0
-0.766281255834689 -0.194097516422216 0.45214357607639
Info = 0