3. 固有値・固有ベクトル

対称行列の固有値問題のXLPackによる解き方の例を示します.

例題

次の対称行列の固有値と固有ベクトルを求める.

    A = (10 -3  5)
        (-3  2 -1)
        ( 5 -1  5)

以下, ワークシート関数WDsyevとVBAサブルーチンDsyevを使った2種類の解き方を説明します. これらは, すべての固有値と対応する固有ベクトル, あるいは, すべての固有値だけを求めることができます.

ワークシート関数を使用した解き方

まず, ワークシートの適当な場所に行列Aのデータを入力します. そして, 解を入れる場所として(解の領域+1行のセル)を選択します(図ではλとXで示されているセル). ここでは対称行列Aのすべての要素の値を入力していますが, WDsyevは指定された上または下三角部分と対角要素しか 使わないので, 残りの三角部分は入力しなくても構いません.

ここで, fxをクリックすると使用する関数を聞かれるので, 関数の分類XLPackよりWDsyevを選択します.

必要なパラメータ(ここでは, Jobz, Uplo, N, A())の入力を要求されるので, それぞれに適切な値を入力します. Jobz=”N”ならば固有値のみ求め, Jobz=”V”ならば固有値と固有ベクトルを求めます. Uplo=”U”ならばAの上三角部分を参照し, Uplo=”L”ならばAの下三角部分を参照します. Nは要素数 (この例では3), A()は行列Aの範囲です.

入力が終了したらCtrl+Shift+Enterを押します.

これで, 3つの固有値λとそれぞれに対応する固有ベクトルx(縦ベクトル)が求められました. 固有値の下に表示されている0はリターンコード(正常終了を示す)です.

VBAプログラムを使用した解き方

上と同じ例をVBAプログラムにより解いてみます. VBAサブルーチンDsyevを使ったVBAプログラム例を示します.

Sub Start()
    Const NMax = 10
    Dim N As Long, A(NMax, NMax) As Double, W(NMax) As Double
    Dim Info As Long, I As Long, J As Long
    '--- Input data
    N = 3
    For I = 0 To N - 1
        For J = 0 To N - 1
            A(I, J) = Cells(4 + I, 1 + J)
        Next
    Next
    '--- Compute eigenvalues and eigenvectors
    Call Dsyev("V", "L", N, A(), W(), Info)
    '--- Output result
    Cells(7, 4) = Info
    If Info = 0 Then
        For I = 0 To N - 1
            For J = 0 To N - 1
                Cells(4 + I, 5 + J) = A(I, J)
            Next
            Cells(4 + I, 4) = W(I)
        Next
    Else
        MsgBox "** Error ** Info = " + Str(Info)
    End If
End Sub

所定の位置に係数行列Aの値を入力し, マクロStartとしてプログラムを実行すると次の結果が得られます.