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]を三角行列に変換することにより、連立方程式を簡単な形にします。このため、未知数を求めることができます。アルゴリズムの手順は以下の通りです。
- 係数行列[A]と定数ベクトル[B]を用意する。
- 第1列の1行目の要素を基準として、その列の全ての要素を基準と同じ倍数を引くことにより、列の要素が0になるように変形する。
- 2つ目の列以降についても同様の操作を繰り返し行い、係数行列[A]を上三角行列に変換する。
- 上三角行列に変換した係数行列[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元数で計算を行う場合はよいですが、一瞬で計算は可能ですが、多元変数となる場合は計算量については注意が必要です。