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

◆ Zsteqr()

Sub Zsteqr ( Compz As  String,
N As  Long,
D() As  Double,
E() As  Double,
Z() As  Complex,
Info As  Long 
)

エルミート行列を変換した対称三重対角行列の固有値・固有ベクトル (QL/QR法)

目的
本ルーチンはエルミート行列を変換した対称行列のすべての固有値, および, 必要により固有ベクトルを Implicit QL または QR法により求める. Zhetrd, Zhptrd または Zhbtrd を使用して三重対角形に変換した場合は, 元のエルミート行列またはエルミート帯行列の固有ベクトルを求めることもできる.
引数
[in]Compz= "N": 固有値のみ求める.
= "V": 元のエルミート行列の固有値・固有ベクトルを求める. 元の行列から三重対角形への変換を行ったユニタリ行列を Z() に入れておかなければならない.
= "I": 三重対角行列の固有値・固有ベクトルを求める. Z() は単位行列に初期化される.
[in]N行列の行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in,out]D()配列 D(LD - 1) (LD >= N)
[in] 三重対角行列の対角要素.
[out] Info = 0 であれば固有値が昇順に入る.
[in,out]E()配列 E(LE - 1) (LE >= N - 1)
[in] 三重対角行列の N - 1 個の副対角要素.
[out] E() は破壊される.
[in,out]Z()配列 Z(LZ1 - 1, LZ2 - 1) (LZ1 >= N, LZ2 >= N)
[in] Compz = "V" の場合, 三重対角形への変換を行ったユニタリ行列を Z() に入れる.
[out] Info = 0 であれば, Compz = "V" の場合, 元のエルミート行列の正規直交化した固有ベクトルが Z() に入る. Compz = "I" の場合, 対称三重対角行列の正規直交化した固有ベクトルが Z() に入る. Compz = "N" の場合, Z() は参照されない.
[out]Info= 0: 正常終了.
= -1: パラメータ Compz の誤り. (Compz <> "N", "V" および "I")
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ D() の誤り.
= -4: パラメータ E() の誤り.
= -5: パラメータ Z() の誤り.
= i > 0: 30*N 回以内の反復ですべての固有値を見つけることはできなかった. E() の i 個の要素が 0 に収束しなかった. 終了時, D() と E() には元の行列にユニタリ相似な対称三重対角行列の要素が入る.
出典
LAPACK
使用例
エルミート行列Aの固有値・固有ベクトルを求める. ただし,
( 0.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i -0.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i -0.29 )
とする.
Zhetrdで実対称三重対角形に変換したのち, ZungtrとZsteqrを適用する.
Sub Ex_Zhetrd_Zsteqr()
Const N = 3
Dim A(N - 1, N - 1) As Complex, Info As Long
Dim D(N - 1) As Double, E(N - 2) As Double, Tau(N - 2) As Complex
A(0, 0) = Cmplx(0.2, 0)
A(1, 0) = Cmplx(-0.11, -0.93): A(1, 1) = Cmplx(-0.32, 0)
A(2, 0) = Cmplx(0.81, 0.37): A(2, 1) = Cmplx(-0.8, -0.92): A(2, 2) = Cmplx(-0.29, 0)
Call Zhetrd("L", N, A(), D(), E(), Tau(), Info)
If Info <> 0 Then
Debug.Print "Error in Zhetrd: Info =", Info
Exit Sub
End If
Call Zungtr("L", N, A(), Tau(), Info)
If Info <> 0 Then
Debug.Print "Error in Zungtr: Info =", Info
Exit Sub
End If
Call Zsteqr("V", N, D(), E(), A(), Info)
If Info <> 0 Then
Debug.Print "Error in Zsterf: Info =", Info
Exit Sub
End If
Debug.Print "Eigenvalues =", D(0), D(1), D(2)
Debug.Print "Eigenvectors ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0)), Creal(A(0, 1)), Cimag(A(0, 1))
Debug.Print Creal(A(1, 0)), Cimag(A(1, 0)), Creal(A(1, 1)), Cimag(A(1, 1))
Debug.Print Creal(A(2, 0)), Cimag(A(2, 0)), Creal(A(2, 1)), Cimag(A(2, 1))
Debug.Print Creal(A(0, 2)), Cimag(A(0, 2))
Debug.Print Creal(A(1, 2)), Cimag(A(1, 2))
Debug.Print Creal(A(2, 2)), Cimag(A(2, 2))
End Sub
実行結果
Eigenvalues = -2.05348849668514 0.124622388617308 1.51886610806783
Eigenvectors =
-0.449276526719113 -0 0.654793596518192 0
0.227247885813611 -0.597641779578735 0.519997178670921 -3.19846835072552E-02
0.621236109316913 -5.83009495222984E-02 0.204907317474214 -0.507777757881847
-0.607779522934083 0
0.392237107311198 0.407323787101333
-0.23846608290599 -0.503959683819116