【Excel VBAでガウスの消去法を実装】

ExcelVBA

Excel VBAで多元1次方程式の解法の一つであるガウスの消去法を実装してみました。

ガウスの消去法とは

ガウスの消去法は、線形方程式を解くためのアルゴリズムの一つであり、連立方程式を行列の形式に変換して、簡単な形にすることで、未知数を求める方法です。

以下に、n元の線形方程式を考えます。

a11x1 + a12x2 + … + a1nxn = b1
a21x1 + a22x2 + … + a2nxn = b2

an1x1 + an2x2 + … + annxn = bn

この線形方程式を行列の形式に変換すると、

[A][x] = [B]

となります。ここで、

[A] = (aij) (i=1,…,n, j=1,…,n) は係数行列
[x] = (x1, x2, …, xn)^T は未知数ベクトル
[B] = (b1, b2, …, bn)^T は定数ベクトル

となります。

ガウスの消去法では、係数行列[A]を三角行列に変換することにより、連立方程式を簡単な形にします。このため、未知数を求めることができます。アルゴリズムの手順は以下の通りです。

  1. 係数行列[A]と定数ベクトル[B]を用意する。
  2. 第1列の1行目の要素を基準として、その列の全ての要素を基準と同じ倍数を引くことにより、列の要素が0になるように変形する。
  3. 2つ目の列以降についても同様の操作を繰り返し行い、係数行列[A]を上三角行列に変換する。
  4. 上三角行列に変換した係数行列[A]を用いて、後退代入により未知数ベクトル[x]を求める。

ガウスの消去法は、高速に線形方程式を解くことができるため、科学技術分野や工学分野、経済学分野などで幅広く使用されています。

Excel VBAでの実装例

以下の通りの実装例を示します。
※3つの未知数を持つ3元の線形方程式をガウスの消去法を用いて解くためのサンプルコードです。

Option Explicit

Sub gauss_elimination()

    ' 行列AとベクトルBを定義する
    Dim A(1 To 3, 1 To 3) As Double
    Dim B(1 To 3) As Double
    
    A(1, 1) = 4: A(1, 2) = 1: A(1, 3) = -2: B(1) = 6
    A(2, 1) = 1: A(2, 2) = 6: A(2, 3) = 3: B(2) = -2
    A(3, 1) = 2: A(3, 2) = 1: A(3, 3) = 9: B(3) = -7
    
    ' ガウスの消去法で解を求める
    Dim n As Integer: n = UBound(A, 1)
    Dim i As Integer, j As Integer, k As Integer
    For k = 1 To n - 1
        For i = k + 1 To n
            Dim factor As Double: factor = A(i, k) / A(k, k)
            For j = k + 1 To n
                A(i, j) = A(i, j) - factor * A(k, j)
            Next j
            B(i) = B(i) - factor * B(k)
        Next i
    Next k
    
    ' 後退代入で解を求める
    Dim X(1 To 3) As Double
    X(n) = B(n) / A(n, n)
    For i = n - 1 To 1 Step -1
        Dim sum As Double: sum = 0
        For j = i + 1 To n
            sum = sum + A(i, j) * X(j)
        Next j
        X(i) = (B(i) - sum) / A(i, i)
    Next i
    
    ' 結果を表示する
    For i = 1 To n
        MsgBox "X(" & i & ") = " & X(i)
    Next i

End Sub

まず、変数Aには3行3列の係数行列が、変数Bには3つの定数ベクトルが格納されています。
次に、forループを用いて、Aを上三角行列に変換します。具体的には、変数kを用いて1列目からn-1列目までを1つずつ見ていき、変数iを用いてk+1行目からn行目までを1つずつ見ていきます。
その後、変数factorを用いて、i行k列の要素をk行k列の要素で割ります。このfactorを用いて、i行目のk列以降の全ての要素を変換することで、係数行列Aを上三角行列に変換します。
また、Bについても、同じfactorを用いて定数ベクトルを変換しています。

次に、後退代入を用いて未知数ベクトルxを求めています。
具体的には、変数Xを用意して、まずn番目の未知数を求めます。その後、forループを用いてiをn-1から1まで1つずつ減らしていき、変数sumを用いてi+1行目からn行目までのXの値を足し合わせたものを求めます。このsumを用いて、i行目の未知数を求めます。

最後に、forループを用いて、各未知数の解を表示します。

まとめ

ガウスの消去法を用いることで、複雑な線形方程式でも比較的簡単に解を求めることができます。
計算量がO(n^3)となるため、今回のように3元数で計算を行う場合はよいですが、一瞬で計算は可能ですが、多元変数となる場合は計算量については注意が必要です。