|
|
◆ 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)は次式を満たす. ここで, λ(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 "Eigenvectors (L) ="
Debug.Print "Eigenvectors (R) ="
Debug.Print "Info =", Info
End Sub
Function Cmplx(R As Double, Optional I As Double=0) As Complex 複素数の作成
Function Cimag(A As Complex) As Double 複素数の虚数部
Function Creal(A As Complex) As Double 複素数の実数部
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) (シンプルドライバ) 固有値・固有ベクトル (複素行列)
- 実行結果
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
|