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としてプログラムを実行すると次の結果が得られます。

Top