SSブログ

連立方程式の解法1 掃き出し法 [数値解析]

連立方程式の解法1 掃き出し法

 

次の連立3元方程式を例に、数値計算で用いられる、連立方程式を解くための掃き出し法――中学で習う連立方程式の解法の一つである、加減法とほとんど同じもの――について説明する。

  ren1-001.png

まず、係数だけを取り出し、次のような表(行列)を作る。

  ren1-002.png

①に1/2を掛けて、xの係数を1にする。

  ren1-003.png

次に、②、③のxの係数を0にするために、②−5×①’、③−3×①’を計算する。

  ren1-004.png

②の係数を1にするために、②’に−2/11を掛ける。

  ren1-005.png

①’と③’のyの係数を0にするために、

①’−3/2×②’’、③’−1/2×②’’を計算する。

  ren1-006.png

③’’のzの係数を1にするために、
③’’×11/94
を計算する。

  ren1-007.png

①’’と②’’のzの係数を0にするために、

①’’−7/11×③’’’、②’’+1/11×③’’’を計算する。

  ren1-008.png

①’’’、②’’’、③’’’を連立方程式の形に書き換えると、

  

だから、この連立方程式の解は(x,y,z)=(1,1,0)である。

 

要するに、連立方程式

  

の係数行列を

  

を単位行列

  

に変形することによって連立方程式の解(x,y,z)を求める方法を掃き出し法という。

 

連立3元方程式だと書くのが大変なので、次の連立2元方程式を掃き出し法で、もう一度、解くことにする。

  

係数だけを取り出すと次のようになる。

  

×1/2

  

②−3×①’

  

(-2/25)×②’

  

①’−7/2×②’’

  

よって求める解は

  

 

この作業をコンピュータにさせるためにプログラムを書くことは大変そうだけど、実は、簡単に書けてしまう。

Fortranによるサンプルプログラムを以下に示す。

 

! 掃き出し法で連立方程式を解く

real a(50,51)

 

! sample data

a(1,1)=2; a(1,2)=3; a(1,3)=1; a(1,4)=4

a(2,1)=4; a(2,2)=1; a(2,3)=-3; a(2,4)=-2

a(3,1)=-1; a(3,2)=2; a(3,3)=2; a(3,4)=2

 

n=3 ! 3元連立方程式だからn=3

 

call hakidashi(a,n) ! 掃き出し法を呼び出す

 

do i=1, n

  write(6,100) 'x(',i,')=', a(i,n+1)

end do

100 format(a,i2, a,f10.6)

end

 

! 掃き出し法

subroutine hakidashi(a,n)

real a(50,51)

 

do k =1, n

   p= a(k,k)

   do j=k+1, n+1

     a(k,j)= a(k,j)/p

   end do

   do i=1, n

      if (i.ne.k) then

        do j=k+1, n+1

          a(i,j)=a(i,j)-a(i,k)*a(k,j)

        end do

      end if

    end do

end do

 

end

 

解いているのは、次の連立方程式。

  

上のプログラムは、より一般の

  

すなわち、

  

も解けるようになっている。

 

プログラム使用上の注意は、に格納し、サブルーティンhakidashiを呼び出し後には、解に格納されていること。

これは、連立方程式(1)を

  ren1-009.png

という行列に置き換え、この行列の操作によって連立方程式の解を求めているためで、この行列のn+1列目を

  

としているためである。

 

上のプログラムを見るとわかると思うけれど、n元連立1次方程式を解くための反復計算の回数は、3重(do)ループになっているので、およそ、n³/2回。

したがって、nが10倍になると、反復回数は10³、すなわち1000倍になり、この計算に要する時間もおよそ1000倍になる。

nが100倍になると、なんと、100³=100万倍!!

このため、単純計算を超高速で行えるコンピュータといえども、多元連立1次方程式を解くということは大変な手間のかかる作業なのであった。

 


nice!(1)  コメント(0) 

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。