• ベストアンサー

FORTRAN初心者です

以下のようなプログラミングを研究室の課題で作ってみたのですがDCSの値がどうしてもINFとなっていしまいます。どなたかエラー箇所を教えてくださいませんか? DIMENSION DCS(0:20) INTEGER*4 I,N DATA EXP1,PI/2.718281828,3.14159/ REAL*8 FKD,FKR,V2,CN,FN1 C FKD=10.0;FKR=20.0;V2=0.5;CN=1.0;FN1=1.0 N = 10 C DO 30 I = 0,N IF(I.EQ.0) THEN DCS = 0.0 GOTO 30 ELSE FNU00 = V2*FLOAT(I) FNU01 = V2*FLOAT(I+1) CN = CN/FN1 DCS1 = (-1.0/(PI*FKD))*(FKR/FKD)**(FNU00) DCS2 = (1.0/PI*SQRT(FNU00*FNU01))*((FNU00/FNU01) 1 *(FKR/FKD))**(FNU00)*(2*FNU01/(EXP1*KD)) DCS3 = (1.0/(PI*FKD))*(FKD/FKR)**(FNU00) DCS4 = -(1.0/(PI*SQRT(FNU00*FNU01))*((FNU00/FNU01) 1 *(FKD/FKR))**(FNU00)*((EXP1*KD)/(2*FNU01))) DCS = CN*(DCS1+DCS2+DCS3+DCS4) END IF 30 CONTINUE C OUTPUT THE RESULTS DO 50 I = 0,N WRITE(6,40) I,DCS(I) 40 FORMAT(2X,'I=',I3,2X,'DCS=',E12.8) 50 CONTINUE END

質問者が選んだベストアンサー

  • ベストアンサー
  • qqtester
  • ベストアンサー率66% (10/15)
回答No.4

FORTRAN もMATLABと同じで暗黙のうちに変数の型を定義します。 なので注意しないといけません。 MATLABは型が柔軟なので問題になりにくいですが、 FORTRANは、変数の型が厳格に適用されるので ”計算結果が違う”となりやすいです。 暗黙の変数型宣言を禁止する implicit none をプログラムの最初に書いておけば、 今回の問題もわかりやすくなると思います。

neko-dog
質問者

お礼

たびたびの回答ありがとうございます。 WRITE文ですべの変数を書き出してみたり、計算式をもっと細かくしてみたり、色々なことをしているうちに何とかコンパイルすることが出来ました。 FORTRANのプログラムを書くのはこれが初めてで、たかがfor文(DO文) を書くのにここまで戸惑うとは思いませんで、自分が今までどれほどMATLABの恩恵に恵まれていたのか思い知らされる出来事でした。

その他の回答 (3)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

30のループないで引用されるDCSに添え字がありません、それがすべてでしょう(多分、配列とは別の場所にDCSが割り当てられている)

neko-dog
質問者

お礼

返信送れて申し訳ありません。 ご指摘ありがとうございます。 ご意見を、参考にさせていただきましてなんとかコンパイルすることが出来ました。

  • qqtester
  • ベストアンサー率66% (10/15)
回答No.2

ヒントだけ DIMENSION DCS(0:20)  <-これは配列の定義ですよね で定義した DCS と DCS1 = (-1.0/(PI*FKD))*(... で使っている DCS1 はまったく別の変数です。

neko-dog
質問者

お礼

お礼のカキコ遅れて申し訳ありませんでした。 当方MATLABでしか、プログラミングの経験がないので、現在FORTRANに四苦八苦しているところです。参考にさせていただきます。

回答No.1

DCS(i)に値を入れてないのに、最後のDOで書き出してるからです。

neko-dog
質問者

お礼

返信送れて申し訳ありませんでした。 なんとかコンパイルすることが出来ました。 ご回答ありがとうございます、大変参考になりました。