|
|
◆ Dgeevx()
| Sub Dgeevx |
( |
Balanc As |
String, |
|
|
Jobvl As |
String, |
|
|
Jobvr As |
String, |
|
|
Sense As |
String, |
|
|
N As |
Long, |
|
|
A() As |
Double, |
|
|
Wr() As |
Double, |
|
|
Wi() As |
Double, |
|
|
Vl() As |
Double, |
|
|
Vr() As |
Double, |
|
|
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)は次式を満たす. ここで, λ(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] | 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] | Ilo | |
| [out] | Ihi | Iloと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: パラメータ Wr() の誤り.
= -8: パラメータ Wi() の誤り.
= -9: パラメータ Vl() の誤り.
= -10: パラメータ Vr() の誤り.
= -13: パラメータ Scal() の誤り.
= -14: パラメータ RConde() の誤り.
= -15: パラメータ RCondv() の誤り.
= i > 0: QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. 固有ベクトルおよび条件数は計算されなかった. Wr()およびWi()の要素 0〜Ilo-2 および 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_Dgeevx()
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
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) = 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 Dgeevx("N", "V", "V", "N", N, A(), Wr(), Wi(), Vl(), Vr(), Ilo, Ihi, Scal(), AbNrm, RConde(), RCondv(), 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 Dgeevx(Balanc As String, Jobvl As String, Jobvr As String, Sense As String, N As Long, A() As Double, Wr() As Double, Wi() As Double, Vl() As Double, Vr() As Double, Ilo As Long, Ihi As Long, Scal() As Double, AbNrm As Double, RConde() As Double, RCondv() 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
|