[PR]当サイトはアフィリエイト広告を利用しています。
はじめに
今回は連立方程式を行列計算で解いてみようという回です。
本格的な変数3つ以上の連立方程式は大学数学で線形代数を学ぶ必要があるのですが、変数2つまでは高校数学レベルで解けるのでそれをやってみます。
今回の例題
以前このブログで取り上げた例題(一次方程式の例題でゴールシークとソルバーの練習)を違う方法で解くことにします。
家から500[m]離れたスーパーまで行くのに、はじめは分速50[m]で歩き、途中から速く歩いて分速70[m]で移動した。
出発してから9分でスーパーに着くには、分速70[m]で何m歩けばよいだろうか。
手計算で解く場合
分速50mでx分、分速70mでy分歩くとする。
次の連立方程式を解く。
\[
x+y=9\\
50x+70y=500
\]
これを行列で表すと次のようになる。
\[
\begin{bmatrix}
1 & 1 \\
50 & 70 \\
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
\end{bmatrix}
=
\begin{bmatrix}
9 \\
500 \\
\end{bmatrix}
\]
\[
\begin{bmatrix}
1 & 1 \\
50 & 70 \\
\end{bmatrix}
=A
\]
とする。
\[
Δ=1×70-1×50=20
\]
よって
\[
A^{-1}=\frac{1}{\Delta}\begin{bmatrix}
70 & -1 \\
-50 & 1 \\
\end{bmatrix}
\]
\[
A
\begin{bmatrix}
x \\
y \\
\end{bmatrix}
=
\begin{bmatrix}
9 \\
500 \\
\end{bmatrix}
\]
だから
\[
\begin{bmatrix}
x \\
y \\
\end{bmatrix}
=
A^{-1}
\begin{bmatrix}
9 \\
500 \\
\end{bmatrix}
\]
\[
\begin{bmatrix}
x \\
y \\
\end{bmatrix}
=
\begin{bmatrix}
6.5 \\
2.5 \\
\end{bmatrix}
\]
となる。
よって分速70mで
70×2.5=175[m]
歩けばよい。
2次の正方行列の逆行列の計算方法や行列同士の掛け算のやり方については割愛します。
エクセル関数で求める場合
行列を地道に計算すると大変なので、ワークシート関数でパパっと求めます。
G3: =MINVERSE(D3:E4)
G7: =MMULT(G3#,D7:D8)
「G3#」はG3:H4をドラッグすると入力できます。
MINVERSE関数は逆行列を求める関数。
MMULT関数は行列の積を求める関数です。
VBAで求める場合
次のコードを入力します。
ちなみに逆行列と行列の積の計算部分は一から作っていくと時間がかかるので、ワークシート関数をVBAで呼び出して対応します。
VBAでのワークシート関数の呼び出しは、よろしければこちらも参考にしてください(三角関数の例題(VBA関数とワークシート関数の活用))。
Sub equations()
Dim A
A = Range("D3:E4")
Dim B
B = WorksheetFunction.MInverse(A)
Dim C
C = Range("D7:D8")
Range("H7:H8") = WorksheetFunction.MMult(B, C)
End Sub
変数に複数セルのRangeを入れたいときは、
Dim 変数名
の後に
変数名=Range()
で入ります。
同様に逆行列の計算結果を変数Bに格納します。
最後にH7セルとH8セルに行列BとCの積を出力します。
まとめ
今回は連立方程式を行列計算で解きました。
大学の自然科学系に進むと行列がごちゃごちゃ出てきて、行列計算をするときが来るかもしれません。
おそらく手計算でテストに臨むと思われますが、レポートで計算問題を解くときは検算に今回やったようなやり方が使えるかもしれませんね。
まあ逆行列と行列の積を計算するプログラムを一から作らなければいけないかもしれませんが…(プログラミングがそれなりにできて、線形代数もある程度理解できている必要があるので結構大変かもしれません…)。