|
|
◆ Zggev()
| Sub Zggev |
( |
Jobvl As |
String, |
|
|
Jobvr As |
String, |
|
|
N As |
Long, |
|
|
A() As |
Complex, |
|
|
B() As |
Complex, |
|
|
Alpha() As |
Complex, |
|
|
Beta() As |
Complex, |
|
|
Vl() As |
Complex, |
|
|
Vr() As |
Complex, |
|
|
Info As |
Long |
|
) |
| |
(シンプルドライバ) 一般化固有値問題 (複素行列)
- 目的
- 本ルーチンはN×N複素行列のペア(A, B)の一般化固有値, および, 必要により左および/または右一般化固有ベクトルを求める.
行列のペア(A, B)の一般化固有値は, A - λB が特異となるようなスカラーλあるいは比α/β=λである. β = 0 あるいは両方共0の場合に適当な解釈ができるため, これは通常ペア(α, β)で表される.
(A, B)の一般化固有値λ(j)に対応する右一般化固有ベクトルv(j)は次式を満たす. A * v(j) = λ(j) * B * v(j)
(A, B)の一般化固有値λ(j)に対応する左一般化固有ベクトルu(j)は次式を満たす. u(j)^H * A = λ(j) * u(j)^H * B
ここで, u(j)^Hはu(j)の共役転置である.
- 引数
-
| [in] | Jobvl | = "N": 左一般化固有ベクトルを求めない.
= "V": 左一般化固有ベクトルを求める. |
| [in] | Jobvr | = "N": 右一般化固有ベクトルを求めない.
= "V": 右一般化固有ベクトルを求める. |
| [in] | N | 行列A, B, VLおよびVRの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る) |
| [in,out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] ペア(A, B)の行列 A.
[out] A()は上書きされる. |
| [in,out] | B() | 配列 B(LB1 - 1, LB2 - 1) (LB1 >= N, LB2 >= N)
[in] ペア(A, B)の行列 B.
[out] B()は上書きされる. |
| [out] | Alpha() | 配列 Alpha(LAlpha - 1) (LAlpha >= N) |
| [out] | Beta() | 配列 Beta(LBeta - 1) (LBeta >= N)
Alpha(j)/Beta(j) (j = 0〜N-1) は一般化固有値である.
注: 商Alpha(j)/Beta(j)はオーバーフローあるいはアンダーフローし易く, Beta(j)が0になることさえある. 従って, 比α/βを単純に計算することは避けなければならない. しかし, Alphaは常にnorm(A)より小さく, 通常は同程度の大きさである. また, Betaは常にnorm(B)より小さく, 通常は同程度の大きさである. |
| [out] | Vl() | 配列 Vl(LVl1 - 1, LVl2 - 1) (LVl1 >= N, LVl2 >= N)
Jobvl = "V": 左一般化固有ベクトルu(j)が固有値と同じ順にVl()の列に入る. 固有ベクトルは, 最大要素が |実数部| + |虚数部| = 1 となるように正規化される.
Jobvl = "N": 参照されない. |
| [out] | Vr() | 配列 Vr(LVr1 - 1, LVr2 - 1) (LVr1 >= N, LVr2 >= N)
Jobvr = "V": 右一般化固有ベクトルv(j)が固有値と同じ順にVr()の列に入る. 固有ベクトルは, 最大要素が |実数部| + |虚数部| = 1 となるように正規化される.
Jobvr = "N": 参照されない. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ Jobvl の誤り. (Jobvl <> "V"および"N")
= -2: パラメータ Jobvr の誤り. (Jobvr <> "V"および"N")
= -3: パラメータ N の誤り. (N < 0)
= -4: パラメータ A() の誤り.
= -5: パラメータ B() の誤り.
= -6: パラメータ Alpha() の誤り.
= -7: パラメータ Beta() の誤り.
= -8: パラメータ Vl() の誤り.
= -9: パラメータ Vr() の誤り.
= i (0 < i <= N): QZ反復が収束しなかった. 固有ベクトルは計算されないが, Alpha(j), Beta(j) (j = i〜N-1) は正しい値である.
= N+1: ZhgeqzにおいてQZ反復の収束以外のエラーが起きた.
= N+2: Ztgevcにおいてエラーがあった. |
- 出典
- LAPACK
- 使用例
- 行列のペア(A, B)の一般化固有値および左および右一般化固有ベクトルを求める. ただし,
( 0.2-0.11i -0.93-0.32i 0.81+0.37i )
A = ( -0.8-0.92i -0.29+0.86i 0.64+0.51i )
( 0.71+0.59i -0.15+0.19i 0.2+0.94i )
( 0.57-0.91i -0.28-0.45i 0.25+0.91i )
B = ( 0.83-0.46i 0.63-0.19i -0.69+0.09i )
( 0.24-1.33i -0.56-0.67i 0.9+1.25i )
とする. Sub Ex_Zggev()
Const N = 3
Dim A(N - 1, N - 1) As Complex, B(N - 1, N - 1) As Complex
Dim Alpha(N - 1) As Complex, Beta(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)
B(0, 0) = Cmplx(0.57, -0.91): B(0, 1) = Cmplx(-0.28, -0.45): B(0, 2) = Cmplx(0.25, 0.91)
B(1, 0) = Cmplx(0.83, -0.46): B(1, 1) = Cmplx(0.63, -0.19): B(1, 2) = Cmplx(-0.69, 0.09)
B(2, 0) = Cmplx(0.24, -1.33): B(2, 1) = Cmplx(-0.56, -0.67): B(2, 2) = Cmplx(0.9, 1.25)
Call Zggev("V", "V", N, A(), B(), Alpha(), Beta(), 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 Cdiv(A As Complex, B As Complex) As Complex 複素数の除算
Function Cimag(A As Complex) As Double 複素数の虚数部
Function Creal(A As Complex) As Double 複素数の実数部
Function Beta(A As Double, B As Double, Optional Info As Long) As Double ベータ関数 B(a, b)
Sub Zggev(Jobvl As String, Jobvr As String, N As Long, A() As Complex, B() As Complex, Alpha() As Complex, Beta() As Complex, Vl() As Complex, Vr() As Complex, Info As Long) (シンプルドライバ) 一般化固有値問題 (複素行列)
- 実行結果
Eigenvalues =
-0.4784814787767 -0.640760182519056 1.62433774044009 1.10642263894432
-0.149178317709927 5.63446258373312
Eigenvectors (L) =
-0.488182728920006 0.511817271079994 0.112214636564846 -0.78086108170552
-0.493389319144031 1.33311637129139E-02 -0.132533171028514 -0.347190877300084
0.339735049171677 -6.82051937200691E-02 0.672543628409034 0.327456371590966
0.902635460243872 9.73645397561283E-02
-0.178648471173719 0.129164561360569
-0.730361156069673 7.60898456031052E-02
Eigenvectors (R) =
-0.573248979253811 -0.426751020746189 0.644105768156504 -0.298230968832631
-0.249087460228498 -9.31247915124554E-02 -0.701765691258405 -0.298234308741595
0.271914164828682 -0.477707190075455 0.274425774522266 -0.280815941661082
2.08352227991442E-02 2.31726206010056E-02
-0.737220272842649 -0.262779727157351
-0.474367740415068 -4.82054262401725E-02
Info = 0
|