2. 連立一次方程式

連立一次方程式のXLPackによる解き方の例を示します。

例題

次の連立一次方程式を解く。

    10x1 - 7x2 = 7
    -3x1 + 2x2 + 6x3 = 4
    5x1 - x2 + 5x3 = 6

これは、行列で表すと次のようになります。

    Ax = b

ただし、

    A = (10 -7  0)
        (-3  2  6)
        ( 5 -1  5)
    b = (7  4  6)T
    x = (x1 x2 x3)T

ここで、Aは係数行列、bは右辺ベクトル、xは解ベクトルです。

ここでは、ワークシート関数WDgesvを使う方法とVBAサブルーチンDgesvを使う方法の2種類の解き方について説明します。

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

まず、ワークシートの適当な場所に係数行列Aと右辺ベクトルbのデータを入力します。そして、解ベクトルを入れる場所として(解の要素数+2)個のセルを選択します(図でXで示されているセル)。

ここで、数式バーのfxをクリックすると、使用する関数を聞かれるので、関数の分類XLPackよりWDgesvを選択します。

必要なパラメータ(ここでは、N, Nrhs, A(), B())の入力を要求されるので、それぞれに適切な値を入力します。Nには要素数(この例では3)、Nrhsには右辺の列数(この例では1)、A()には係数行列Aの範囲、B()には右辺ベクトルbの範囲を入力します。

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

これで、解 X = (0 -1 1)T が求められました。なお、表示されている0.078283は条件数の推定値の逆数、一番下の0はリターンコード(正常終了を示す)です。Xの場所を2つ余計に確保したのはこれらを表示させるためですが、余計な場所は確保しなくても構わなくて(この例では3セルだけ選択)、その場合には解だけが表示されます。

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

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

Sub Start()
    Const NMax = 10
    Dim N As Long, A(NMax, NMax) As Double, B(NMax) As Double
    Dim Anorm As Double, RCond As Double
    Dim Ipiv(NMax) As Long, 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
        B(I) = Cells(4 + I, 4)
    Next
    '--- Solve equation and compute condition number
    Anorm = Dlange("1", N, N, A())
    Call Dgesv(N, A(), Ipiv(), B(), Info)
    If Info = 0 Then
        Call Dgecon("1", N, A(), Anorm, RCond, Info)
    End If
    '--- Output solution
    Cells(8, 5) = Info
    If Info = 0 Then
        For I = 0 To N - 1
            Cells(4 + I, 5) = B(I)
        Next
        Cells(7, 5) = RCond
    Else
        MsgBox "** Error ** Info = " + Str(Info)
    End If
End Sub

プログラム中、DlangeとDgeconは条件数を求めるためのもので方程式を解くだけならば不要です。

所定の位置に係数行列Aと右辺ベクトルbの値を入力し、マクロStartとしてプログラムを実行すると次の結果が得られます。

係数行列が対称な場合

係数行列Aが対称行列の場合にはWDposvとDposvを使うことができます。手順は上と同様ですが、Aのデータは上または下三角部分(対角要素を含む)だけ設定すればよくなります。残りの部分は参照されません。

Top