.................. program 9 .................. C 2*2行列の逆行列 program main real a(2,2),ainv(2,2),check(2,2) C ファイルから行列に値を読み込む do i=1,2 read(*,*)(a(i,j),j=1,2) enddo C 行列式の計算 ad = a(1,1)*a(2,2) bc = a(1,2)*a(2,1) det = ad-bc C 行列式が0に近いと桁落ちで計算精度が悪くなるので計算中止 if( abs((ad-bc)/ad) .lt. 0.00001)then write(*,*)"matrix is near singular" do i=1,2 write(*,*)(a(i,j),j=1,2) enddo write(*,*)"with determinant = ", det stop C 精度が大丈夫なら逆行列を計算 else ainv(1,1)=a(2,2)/det ainv(1,2)=-a(1,2)/det ainv(2,1)=-a(2,1)/det ainv(2,2)=a(1,1)/det endif C 出力 write(*,*)"matrix a:" do i=1,2 write(*,*)(a(i,j),j=1,2) enddo write(*,*)"inverse of a:" do i=1,2 write(*,*)(ainv(i,j),j=1,2) enddo C 念のため、元の行列と求めた逆行列の積を計算 do i=1,2 do j=1,2 check(i,j)=0 do k=1,2 check(i,j)=check(i,j)+a(i,k)*ainv(k,j) enddo enddo enddo C ちゃんと単位行列になっているかどうか出力 write(*,*)"check :" do i=1,2 write(*,*)(check(i,j),j=1,2) enddo end