PP#3~Determinent

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の究極のテーマでもある。

次回はまた寄り道するか、本題に戻るか、分かりませんが、よろしく。

つづく

Comments are closed.