Fortranの問題3問目です。急いでます><
以下のプログラムを実行すると結果がNAN(数値エラー)となり、表示されない。
これは、ガウスの消去法における、ある問題に起因する。
正しい結果がでるようにするには、どうしたらよいか?
答えが正しく表示されない原因を究明し、正しい結果を表示する、
修正済みソースコードを提出しなさい。
ヒント:
一般に、どのような行列でも計算できるプログラムにするためには、
「ピボット」と呼ばれる操作を行う必要があるが、
今回は、ピボットをあらかじめ人間が行うことで回避してよい.
プログラムの処理内容(アルゴリズム)を修正する必要はない。
program gauss
implicit none
c aは係数行列(4x3)、xは解、w は一時変数
double precision a(5,4),x(4),w
integer i,j,k
c キーボードから読み込む場合
write(6,*) 'input a(5,4)'
c read(5,*) a
c data文で一括初期化(代入)する方法
data a /
& 0d0, 3d0, 7d0, 2d0, 65d0,
& 2d0, 8d0, 5d0, 1d0, 65.4d0,
& 5d0, 3d0,-5d0, 2d0, 3.8d0,
& -2d0, 4d0, 0d0, -6d0, -35.6d0
& /
write(6,*) 'データの確認表示'
write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a
c 前進消去
do k=1,3
do j=k+1,4
w = -a(k,j)/a(k,k)
write(6,*) w,'*行',k,'を、行',j,'に足すと'
do i=1,5
a(i,j) = a(i,j) + w*a(i,k)
end do
write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a
write(6,*) ''
end do
end do
write(6,*) '前進消去 終了'
write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a
c 後退代入
do k=4,1,-1
x(k) = a(5,k)
do i=k+1,4
c 注:k=3のとき, do i=4,3 となるためループ内は1回も実行しない
c k=2のとき, do i=3,3 となり、ループ内はi=3 で1回だけ実行
x(k) = x(k) - a(i,k)*x(i)
end do
x(k) = x(k) / a(k,k)
end do
c 解を表示
write(6,*) 'x = ',x
stop
end
お礼
ありがとうございました。ご提示をもとに検討してみます。