2. 連立一次方程式

注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.


連立一次方程式の XLPack による解き方の例を説明します.

例題

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

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

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

  
  Ax = b

 
ただし,

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

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

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

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

まず, ワークシートの適当な場所に係数行列 A と右辺ベクトル b のデータを入力します(オレンジ色のセル). そして, 解ベクトルを入れる場所として(解の要素数 + 2)個のセルを選択してワークシート関数 WDgesv を入力します(緑色のセル).

WDgesv の必要なパラメータは N, A, B, Nrhs です. N は要素数(この例では 3), A は係数行列 A のセル範囲, B は右辺ベクトル b のセル範囲です. 右辺ベクトルは通常は 1 本ですが, 複数本入力することもでき, Nrhs にはその本数を入力します. Nrhs は入力を省略することができ, その場合は 1 とみなされます.

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

これで, 解 X = (0 -1 1)T が求められました. なお, 表示されている 0.078283 は条件数の推定値の逆数, 一番下の 0 はリターンコード(正常終了を示す)です.

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(5 + I, 1 + J)
        Next
        B(I) = Cells(5 + 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
    For I = 0 To N - 1
        Cells(5 + I, 5) = B(I)
    Next
    Cells(8, 5) = RCond
    Cells(9, 5) = Info
End Sub

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

所定の位置(下のオレンジ色のセル)に係数行列 A と右辺ベクトル b の値を入力し, マクロ Start としてプログラムを実行すると次の結果が得られます. ワークシート関数を使用したときと異なり, 係数行列 A と右辺ベクトル b の値を入力しただけでは結果が得られず, VBA プログラムを実行してやる必要があります.

係数行列が対称な場合

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