こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2014-02-21 16:37:00

QNo.8484574

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

>& 0d0, 3d0, 7d0, 2d0, 65d0,
>& 2d0, 8d0, 5d0, 1d0, 65.4d0,
>& 5d0, 3d0,-5d0, 2d0, 3.8d0,
>& -2d0, 4d0, 0d0, -6d0, -35.6d0
>c 前進消去
>w = -a(k,j)/a(k,k)

この、最後の割り算のところで、
行と列の番号が同じである要素に0を含んでいる(具体的にはa(1, 1)の0d0)ため、
禁断の0割りが起きているのではないでしょうか。

配列aを使った4元連立方程式を解きたいのであれば、
行と列の番号が同じである要素に0を含まないよう、
data文のところを適当に並べ替えれば、
ロジックそのものには手を入れずにすむような気がします。

投稿日時 - 2014-02-21 16:47:33

あなたにオススメの質問