PP#3~Determinent
寄り道第二回目のテーマは行列式。ドイツの哲学者ライプニッツが行列の祖として知られていますが、愕くことなかれ、それに先立つこと十年前、我が国算聖関孝和が著書「解伏題之法」で自ら発見した行列式の理論を紹介しています。
行列式の導入
行列式の算法は「解伏題之法」の第五生尅斜乗に記載されています。
国立国会図書館近代デジタルライブラリー
漢文縦書きで記載されていますので、 読みやすく横書きにすると、
交式、 各之を布きて、 左右の斜乗により 生剋(正負)を得る也。 換式数奇なるものは、 左斜乗を以って生となし、 右斜乗を以って剋となす。 偶なるものは、 左斜乗、 右斜乗共に生剋相交わる也。
国立国会図書館近代デジタルライブラリー
関孝和が考案した算法のうち三次式は、世界的に著名なフランスの数学者サラスの方法と全く同等です。サラスの発見は孝和に遅れる事163年後の1846年になります。
具体的には、三次元行列\(A\)、$$ \begin{equation} A= \begin{pmatrix} a_{11}&a_{12}&a_{13}\\ a_{21}&a_{22}&a_{23}\\ a_{31}&a_{32}&a_{33} \end{pmatrix} \end{equation} $$の行列式\(detA\)は次式で与えられる。
$$ \begin{align}
detA &= \begin{vmatrix} a_{11}&a_{12}&a_{13}\\ a_{21}&a_{22}&a_{23}\\ a_{31}&a_{32}&a_{33} \end{vmatrix}
\\ &= a_{11} \begin{vmatrix} a_{22}&a_{23}\\ a_{32}&a_{33} \end{vmatrix} – a_{12} \begin{vmatrix} a_{21}&a_{23}\\ a_{31}&a_{33} \end{vmatrix} + a_{13} \begin{vmatrix} a_{21}&a_{22}\\ a_{31}&a_{32} \end{vmatrix}
\\ &= a_{11}a_{22}a_{33} + a_{12}a_{23}a_{31} + a_{13}a_{21}a_{32}
\\ &- ( a_{13}a_{22}a_{31} + a_{12}a_{21}a_{33} + a_{11}a_{23}a_{32} )
\end{align} $$
関孝和の図同様、非常に美しい公式であることが分かります。
詰り、左上から右下に向かう方向に「+」、右上から左下に向かう方向に「-」の符号を付けて積を取りそれらの和を取ることで、行列式の値を求めることができます。因みに、「解伏題之法」では右から始まるので正負(生尅)は逆となっている。
連立方程式の解法
次に連立方程式の解法を考えてみましょう。
古典的な解法の一つであるクラメルの公式を用いると、連立方程式 \({Ax=b}\)の解は、\( x_i= \displaystyle \frac{detA_i}{detA} \)で与えられる。
ここで、\(xi\)は数列\(x\)の第\(i\)成分であり、行列\(Ai\)は行列\(A\)の第\(i\)列の部分を数列\(b\)にしたものである。
例えば、三次式の場合、以下と同義である。
$$ \begin{align} x_1 = \frac { \begin{vmatrix} b_{1}&a_{12}&a_{13}\\ b_{2}&a_{22}&a_{23}\\ b_{3}&a_{32}&a_{33} \end{vmatrix}} {detA}
,\ \ x_2 = \frac { \begin{vmatrix} a_{11}&b_{1}&a_{13}\\ a_{21}&b_{2}&a_{23}\\ a_{31}&b_{3}&a_{33} \end{vmatrix}} {detA}
, \ \ x_3 = \frac { \begin{vmatrix} a_{11}&a_{12}&b_{1}\\ a_{21}&a_{22}&b_{2}\\ a_{31}&a_{32}&b_{3} \end{vmatrix}} {detA} \end{align} $$
サラスの公式同様、非常に美しい。
プログラミングの実際
クラメルの公式は三次迄を適用しているが、四次以上になると計算量が多くなって実用的でないので、ガウスの消去法による解法が一般的である。
subroutine MINVRT(Org, Inv, Noe, EPSMAC) !******************************************************************************** !* Square Matrix Inversion Routine * !******************************************************************************** implicit none integer:: Noe real*8:: det, div real*8:: b1, b2, b3, b4, b5, b6, b7, b8, b9 real*8:: Org(Noe,Noe), Inv(Noe,Noe) !================================================================================ ! Inversion by the cramel method !================================================================================ if (Noe == 1) then det = Org(1,1) if (abs(det) <= EPSMAC) then write(*,'("@Warning: Inverse of the diagonal matrix is zero!")') det = EPSMAC endif Inv(1,1) = 1.0 / det else if (Noe == 2) then det = Org(1,1) * Org(2,2) - Org(2,1) * Org(1,2) if (abs(det) <= EPSMAC) then write(*,'("@Warning: Inverse of the diagonal matrix is zero!")') det = EPSMAC endif div = 1.0 / det Inv(1,1) = div * Org(2,2) Inv(1,2) = - div * Org(1,2) Inv(2,1) = - div * Org(2,1) Inv(2,2) = div * Org(1,1) else if (Noe == 3) then b1 = Org(2,2) * Org(3,3) - Org(2,3) * Org(3,2) b2 = Org(1,3) * Org(3,2) - Org(1,2) * Org(3,3) b3 = Org(1,2) * Org(2,3) - Org(1,3) * Org(2,2) b4 = Org(2,3) * Org(3,1) - Org(2,1) * Org(3,3) b5 = Org(1,1) * Org(3,3) - Org(1,3) * Org(3,1) b6 = Org(1,3) * Org(2,1) - Org(1,1) * Org(2,3) b7 = Org(2,1) * Org(3,2) - Org(2,2) * Org(3,1) b8 = Org(1,2) * Org(3,1) - Org(1,1) * Org(3,2) b9 = Org(1,1) * Org(2,2) - Org(1,2) * Org(2,1) det = Org(1,1) * b1 + Org(2,1) * b2 + Org(3,1) * b3 if (abs(det) <= EPSMAC) then write(*,'("@Warning: Inverse of the diagonal matrix is zero!")') det = EPSMAC endif div = 1.0 / det Inv(1,1) = div * b1 Inv(1,2) = div * b2 Inv(1,3) = div * b3 Inv(2,1) = div * b4 Inv(2,2) = div * b5 Inv(2,3) = div * b6 Inv(3,1) = div * b7 Inv(3,2) = div * b8 Inv(3,3) = div * b9 !================================================================================ ! Inversion by the gaussian elimination !================================================================================ else ..... endif !================================================================================ end subroutine
このガウスの消去法は疎行列解法の根幹をなす解法で、本Scientific Programmingの究極のテーマでもある。
次回はまた寄り道するか、本題に戻るか、分かりませんが、よろしく。
つづく