SSブログ

掃き出し法を用いて行列の逆行列を求めるプログラム [数値解析]

掃き出し法を用いて行列の逆行列を求めるプログラム

 

掃き出し法を用いて行列Aの逆行列A⁻¹を求めるプログラムを作ることにする。

行列A

  

とし、その逆行列をB

  

とすると、

  

となる。

これより、

  

という連立方程式を得ることができ、この(2)、(3)、(4)を掃き出し法のプログラムを用いて解かせればよい。

 

掃き出し法のプログラムは前回作ってあるので、それを利用することにし、たとえば、次のようなプログラムを作ればよいだろう。

 

! 掃き出し法を用いて逆行列を求める
real a(10,10), b(10,10), c(10,10)
data a,b,c/100*0, 100*0, 100*0/ ! 行列の初期化

! sample
    a(1,1)=1; a(1,2)=0; a(1,3)=2
    a(2,1)=4; a(2,2)=1; a(2,3)=3
    a(3,1)= 2; a(3,2)=-1; a(3,3)=0

n=3

call gyaku(a,b,n)

write(6,*) 'matrix'
do i=1,n
    write(6,*) (a(i,j), j=1,n)
end do
write(6,*)

write(6,*) 'inverse matrix'
do i=1,n
    write(6,*) (b(i,j), j=1,n)
end do

write(6,*)
write(6,*) 'check'
! 計算のチェック
do i=1, n
    do j=1,n
        sum = 0
        do k=1,n
            sum = sum + a(i,k)*b(k,j)
        end do
        c(i,j)=sum
    end do
end do

do i=1,n
    write(6,*) (c(i,j), j=1,n)
end do

end

! 逆行列を求める計算部
subroutine gyaku(p,q,n)
real p(10,10), q(10,10)
real a(50,51)

do k=1, n
    ! 連立方程式の係数をセット
    do i=1,n
        do j=1,n
            a(i,j)=p(i,j)
        end do
        if (i.ne.k) then
            a(i,n+1)=0
        else
            a(i,n+1) = 1
        end if
    end do
    ! 掃き出し法で解く
    call hakidashi(a,n)
    ! 逆行列をセット   
    do i=1, n
        q(i,k) = a(i,n+1)
    end do
end do
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


なお、上のプログラムでは、このプログラムで求めたAの逆行列Bが本当にAの逆行列なのか確かめるために、行列Aと行列Bの積ABを求め、それを最後に表示してある。

 

pro.png

 

real p(10,10), q(10,10)

としているので、10行10列以下の逆行列までを求められるようにしてある。この部分を変更すれば、より大きな行列の逆行列を求めることもできる。

 

 


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

nice! 0

コメント 0

コメントを書く

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

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