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のデータは上または下三角部分(対角要素を含む)だけ設定すればよくなります. 残りの部分は参照されません.