Python/NumPyで線形代数!linalgで逆行列を求める方法

  • このエントリーをはてなブックマークに追加

連立方程式を解いたりする時は行列形式のデータをよく扱います。その時に使う逆行列計算は手計算だと非常に面倒ですが、Pythonの線形代数モジュールであれば簡単に求めることが出来ます。

こんにちは。wat(@watlablog)です。
今回は小技として行列の逆行列をPythonで求める方法を紹介します

逆行列を2×2行列の場合で説明

行列式については高校数学で習う人が多いと思いますが、線形代数という分野で学ぶ学問です。

逆行列とは、簡単に言うと行列の場合の逆数を意味します。

方程式で式変換をがちゃがちゃやっている時、例えば\(a\)という実数であれば\(1/a\)が逆数となり、\(a\)に\(1/a\)をかけると1になります。この特性を利用して式を簡単にしたりします。

行列には大きさがあり、式(1)のような2行、2列の行列は2×2行列と呼ばれます。

\[
A= \begin{pmatrix}
a & b\\
c & d
\end{pmatrix} (1)
\]

この行列の逆行列は以下の式(2)で計算可能です。2×2の場合は覚えている方も多いのではないでしょうか。

\[
A^{-1}= \frac{1}{ad-bc}\begin{pmatrix}
d & -b\\
-c & a
\end{pmatrix} (2)
\]

ここで、式(2)内の\(ad-bc\)は行列式とよばれるもので、数学的には\(\left | A \right |\)または\(detA\)と書くこともあります。

逆行列を求める場合は、この\(detA\)が0でないことが条件となります。

3×3行列以上の場合は掃き出し法を利用して逆行列を求める方法が一般的ですが、こちらについてはわかりやすいページがありましたので、以下の参考サイト様を参照して下さい。


横長の行列(AI)に行基本変形を繰り返し行って(IB)になったら,B は A の逆行列である。

高校数学の美しい物語:逆行列を求める2通りの方法と例題

それではPythonでコーディングしていきましょう!

Pythonのlinalgで逆行列を求める

PythonではNumPyを使って計算を行います。まずは2×2行列Aを定義します。

inv_Aが逆行列で、np.linalg.inv関数で計算します。ちなみに、linalgは線形代数(Linear Algebra)から来ています。

ちゃんと逆行列が計算されているかは、行列の積を求めて単位行列になっているかどうかで判別しましょう。

しかし、ここで注意ですが、単純にA*inv_Aとしてしまうと、NumPy配列としての計算がされてしまいます。線形代数のルールで行列の積を計算するためには、ベクトルの内積でも使われるnp.dot関数を使用します。

2×2行列同士の積は以下の式(3)で求めることができます。

\[\begin{bmatrix}
a_{1} &a_{2} \\
a_{3} &a_{4}
\end{bmatrix} \times
\begin{bmatrix}
b_{1} &b_{2} \\
b_{3} &b_{4}
\end{bmatrix} =
\begin{bmatrix}
a_{1}b_{1}+a_{2}b_{3} &a_{1}b_{2}+a_{2}b_{4} \\
a_{3}b_{1}+a_{4}b_{3} &a_{3}b_{2}+a_{4}b_{4}
\end{bmatrix}  (3)\]

上記コードを実行すると以下の結果を得ます。最後の結果が行列Aに逆行列inv_Aをかけた結果ですが、対角が1でそれ以外が0(実際は数値誤差の影響で左下が0でない非常に小さい値になっていますが)という単位行列になっています。

まとめ

今回は行列や行列式、逆行列の概要とPythonによるコーディング方法を紹介しました。

この行列計算は各種Pythonによる科学技術計算で多用することになると思いますので、基本のキとしておさえておきましょう!

今回は簡単な計算だけど、行列は技術計算で基本中の基本!取り扱い方法をマスターしておこう!

Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*