• ベストアンサー

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
質問者

お礼

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

関連するQ&A

  • fortran go to 文

    以下のgo to文で書かれたプログラムをdoループのプログラムに書き直したいのですがどのように直してよいかわかりません。どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。 subroutine fft_eth(n,cx,icon,irr) implicit none integer :: n, m, ii, l, lb, llb, k, kl, kb, klb, & j, jl, jl2, jlb, jb, jb2, jb4, jj, j1, j2, jjb, jf1, jf2, jff, jf real(8) :: fn, ff, fkl, fjl, fm, ffm, fklb, fjlb, th, th2, st, tt real(8) :: icon real(8) :: irr complex(8) :: ct, cu, ca, cx, cuc dimension cx(n) real(8), parameter :: pi = 3.141592653589793238462643d0 if(n < 2) go to 900 fn = n m = idnint(dlog(fn)/dlog(2.0d0)) ii = 2**m-n if(ii /= 0) go to 910 do 50 l = 1, m kl = 2**(l-1) fkl =kl fjl = 0.5d0*fn/fkl jl = fjl jl2 = 2*jl th = 2.0d0*pi*fkl/fn th2 = 0.5d0*th st = dsin(th) tt = -2.0d0*dsin(th2)*dsin(th2) ct = dcmplx(tt,st) do 40 k = 1, kl jj = jl2*(k-1) cu = (1.0d0,0.0d0) do 30 j = 1, jl j1 = j+jj j2 = j1+jl ca = cx(j1)-cx(j2) if(icon < 0) go to 10 cuc = dconjg(cu) cx(j2) = ca*cuc go to 20 10 continue cx(j2) = ca*cu 20 continue cu = cu+cu*ct 30 continue 40 continue 50 continue !================= ! BIT REVERSAL !================= fm = m ffm = 0.5d0*fm llb = ffm do 80 lb = 1, llb klb = 2**(lb-1) fklb =klb fjlb = 0.25d0*fn/fklb jlb = fjlb jb2 = 2*jlb jb4 = 4*jlb do 70 kb = 1, klb jjb = jb4*(kb-1) jf1 = jjb+klb jf2 = jjb+jb2 do 60 jb = 1, jlb ff = jb-1 ff = ff/fklb jff = ff jf = jb+jff*klb j1 = jf+jf1 j2 = jf+jf2 ct = cx(j1) cx(j1) = cx(j2) cx(j2) = ct 60 continue 70 continue 80 continue !======================= ! ERROR CONDITION CODE !======================= irr = 0 return 900 continue irr = -1 return 910 continue irr = -2 return end subroutine

  • Fortranの素数のプログラム

    5000万までの素数を求めるプログラムなのですが、私の作ったプログラムは実行時間26秒くらいかかります。 先生が言うには10秒台が出るとのことですが、私は頑張っても時間を短くすることができません。 下に私の作ったプログラムを載せますので短くする方法を教えて下さい。 integer table(2:50000000),pno(50000000),cnt,m,i,j m=sqrt(50000000.) do 10 i=2,m do 10 j=i*2,50000000,i table(j)=1 10 continue do 20 i=2,50000000 if(table(i).eq.0)then cnt=cnt+1 end if 20 continue write(6,610)cnt 610 format('sosu no goukei =',i8) end

  • FortranをCに書き直すにはどうしたらいいでしょうか?

    Foratranで書かれている下記のコードをCのコードに置き換えたいのですが、分かりません。 お願いします=(^v^)= C *---------------------------------------------------------* C サブルーチンWGEN C *---------------------------------------------------------* SUBROUTINE WGEN(EM,R,NN,IR,ACC,ND,DT,AMAX,VMAX,MXCYCL,ERR,UW1, * UW2) C implicit real*8(a-h,o-z) COMPLEX*16 C(4096) DIMENSION ACC(ND),UW1(ND),UW2(ND) DIMENSION E(33),X(33),EE(33) DIMENSION PDIF(2046),PHI(2049),F(2049),T(2049),SV(2049),H(1), * RES(2049,1),RR(2049) PARAMETER (PI2=6.283185) DATA DX/0.03125/,H0/0./,H/0.05/ C C DO 150 K=1,NN2-2 P=RAND2(IR) C DO 130 J=2,33 IF(P.LE.EE(J)) GO TO 140 C 130 CONTINUE C 140 PDIF(K)=-(X(J-1)+(P-EE(J-1))/(EE(J)-EE(J-1))*DX)*PI2 C 150 CONTINUE C C *---------------------------------------------------------* C ファンクションRAND01 C *---------------------------------------------------------* REAL*8 FUNCTION RAND2(I) C INTEGER*4 L,C,T30 REAL MU PARAMETER(L=843314861,C=453816693,T30=2**30,MU=2.0**31) C I=L*I+C IF(I.LT.0) I=(I+T30)+T30 RAND2=REAL(I)/MU END C

  • FORTRANをご存じの方がいらっしゃいましたら、間違いを指摘していただきたいです。

    大学で現在FORTRANのシンプソン公式の課題が出ています。 自分で考えて下記プログラムを作ったのですが、どうしても 正しい答えが出力されません。 正しい答えとしては、分割数4とか5とかで πに限りなく近い値になるそうです。 (下に添付した物は、分割数を4にしています。) もしFORTRANをご存じの方がいらっしゃいましたら どこがどのように間違っているのか、ご指摘いただけないでしょうか? よろしくお願いいたします。 問題 4/(1+x^2)を、積分範囲:0~1 を、シンプソン公式を使って求めよ。 区間分割数については、各自適当に与え 分割数が多くなると精度が良くなる事を確認せよ。 シンプソン公式を使うと台形公式を使う場合より 少ない分割数で解(=π)に近づくか確認せよ。 ***ここから*** c numerical value integral c trapezoid formula c *** main program *** real a,b parameter (n=4) a=0 b=1 call simpson(a,b,n,sumf) write(*,*) 'sumf=',sumf end c *** end of main program *** c *** sub program *** subroutine simpson(a,b,n,sumf) dimension f(1000) m=2*n h=(b-a)/float(m) do 10 i=1,m+1 x=a+h*float(i-1) f(i)=func(x) 10 continue sumf=h/3.0*(f(1)+f(m+1)+4*f(m)) do 20 i=2,m sumf=sumf+4.0*(h/3)*f(2*i+1) 20 continue do 30 i=2,m sumf=sumf+2.0*(h/3)*f(2*i) 30 continue end c *** end of sub program *** c *** function sub program *** function func(x) func=4.0/(1.0+x**2) return end c *** end of function sub program *** ***ここまで*** もしお分かりになる方がいらっしゃいましたら、 お手数ですがご指導いただけないでしょうか? お願いいたします。

  • 質問(Fortran)について

    おはようございます。 下記のFortranでここから~ここまでと---で囲んでいる 部分の意味が分かりません。 乱数Pを発生させてPがEE以下になったら、140へ行けとあるのですが。。 それと(1)の部分をCに書き換えるとどうなるか、知っている方教えてください。 よろしくお願いいたします。 C *---------------------------------------------------------* C サブルーチンWGEN C *---------------------------------------------------------* SUBROUTINE WGEN(EM,R,NN,IR,ACC,ND,DT,AMAX,VMAX,MXCYCL,ERR,UW1, * UW2) C implicit real*8(a-h,o-z) COMPLEX*16 C(4096) DIMENSION ACC(ND),UW1(ND),UW2(ND) DIMENSION E(33),X(33),EE(33) DIMENSION PDIF(2046),PHI(2049),F(2049),T(2049),SV(2049),H(1), * RES(2049,1),RR(2049) PARAMETER (PI2=6.283185) DATA DX/0.03125/,H0/0./,H/0.05/,IR/101/ C C ------------------- ここから ------------------- DO 150 K=1,NN2-2 P=RAND2(IR) ← (1) C DO 130 J=2,33 IF(P.LE.EE(J)) GO TO 140 C 130 CONTINUE C 140 PDIF(K)=-(X(J-1)+(P-EE(J-1))/(EE(J)-EE(J-1))*DX)*PI2 C 150 CONTINUE C ------------------- ここまで ------------------- C *---------------------------------------------------------* C ファンクションRAND01 C *---------------------------------------------------------* REAL*8 FUNCTION RAND2(I) C INTEGER*4 L,C,T30 REAL MU PARAMETER(L=843314861,C=453816693,T30=2**30,MU=2.0**31) C I=L*I+C IF(I.LT.0) I=(I+T30)+T30 RAND2=REAL(I)/MU END C

  • fortran 初心者です。

    fortranでフィボナッチ数列 A0 = 0 , A1 = 1 , Ai+1 = Ai + Ai-1 (i =2,3...) を計算するプログラムを作っています。 得られた値が奇数の時には、数値の右横に*をつけ、奇数かつ3の倍数なら**をつけます。 が、以下のようにプログラムしましたが、*印がつきません。どこが、間違っているのか、アドバイスよろしくお願いします。 C Question A0 = 0.0 A1 = 1.0 A2 = 1.0 WRITE(6,*)'A0 = 0.0' WRITE(6,*)'A1 = 1.0' DO 10 I = 2,10,1 A2 = A1 + A0 N = A2-(A2/2)*2 M = A2-(A2/3)*3 IF ( M .NE. 0 .AND. N .NE.0) THEN WRITE(6,*)'A',I,'=' ,A2,'*' ELSE IF ( M .NE. 0.AND. N .EQ.0)THEN WRITE(6,*)'A',I,'=' ,A2,'**' ELSE WRITE(6,*) 'A',I,'=' ,A2 END IF A0 = A1 A1 = A2 10 CONTINUE STOP END

  • fortranで・・・

    実行の画面に数字を入力すると、 英語の文章と 0.0 0.0 0.0 -NaN -NaN -NaN という文字が出てくるだけなんですが、これはプログラムが組めていないということなのでしょうか? ちなみに、打ったプログラムは、 C 判別関数 WRITE(*,100) 100 FORMAT(1H1/22X,'判別関数モデル'//19X,'消費量',3X,'消費比率'//19X, +'清酒',5X,'焼酎',5X,'ビール',7X,'清酒',6X,'ビール',7X,'M'10X,'D'/ +/) DO 10 I=1,47 CALL SUB1 10 CONTINUE STOP END SUBROUTINE SUB1 DIMENSION B1(3),B2(3),C(3),L(3),P(3) CHARACTER*12 A READ(5,50) A 50 FORMAT(3F8.1,3F7.1) X=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 B2=0.0 B1=0.0 L(J)=(-NINT(B1(J)*10.0/B2(J))) S1=Y1+X**L(J) S2=Y2+L(J)*X**(L(J)-1) Y1=S1 Y2=S2 12 CONTINUE W=X-Y1/Y2 IF(ABS(W-X).LT.1E-10) GO TO 13 X=W 11 CONTINUE 13 WO=W DO 14 J=1,3 C(J)=WO**L(J) 14 CONTINUE R1=0.0 DO 15 J=1,3 R2=R1+B2(J) R1=R2 15 CONTINUE D=0.0 DO 16 J=1,3 P(J)=B2(J)/R1 DO=D+P(J)*ALOG(P(J)/C(J)) D=DO 16 CONTINUE E=0.0 DO 17 J=1,3 EO=E+(B1(J)/B2(J)*P(J)) E=EO 17 CONTINUE WRITE(*,200) A,B2,P,E,D 200 FORMAT(1H,2X,A12,3X,3(F7.1,2X),4X,3(F9.6,X),4X,F9.6,2X,F9.6) RETURN END です。

  • C++言語のプログラムをfortranに変換

    const int N = 100; const double q = 10.0, dt = 0.00001, Dm = 30.0, t0 = 2.0, K = 1.0, pi = 3.141592, f = 3.0; double C[N], dC[N]; double dx = q/N; for (int i = 0; i < N; ++i) C[i] = 0; // 初期条件 for (double t = 0; t < t0; t += dt) {  C[0] = 0; // 境界条件1  C[N - 1] = K*sin(2*pi*f*t); // 境界条件2  for (int i = 1; i < N - 1; ++i) dC[i] = (Dm*(C[i + 1] - 2*C[i] + C[i - 1])/(dx*dx))*dt;  for (int i = 1; i < N - 1; ++i) C[i] += dC[i]; } for (int i = 0; i < N; ++i) cout << C[i] << endl; // t = t0 このプログラムをfortranに変換できる方いますか?

  • 確率密度関数の求め方について

    1.X~N(0,1), f_X(x)=\frac{1}{\sqrt{2\pi}}\exp(\frac{-x^2}{2})のとき、 X^2の確率密度関数を求めよ。 2.X^2の平均と分散を求めよ。 試みてみましたが1からやり方があっているのかよくわかりません。 普通にf_X(x)*f_X(x)=\frac{1}{2\pi}\exp(-x^2)でよいのでしょうか? よろしくお願い致します。

  • FORTRAN…これってどんなプログラムになりますか??

    DO 10 I=1,47 CALL SUB1 10 CONTINUE STOP END SUBROUTINE SUB1 DIMENSION B1(3),B2(3),C(3),L(3),P(3) CHARACTER*12 A READ(5,50) A,B1,B2 50 FORMAT(A12,3F8.1,3F7.1) X=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 L(J)=(-NINT(B1(J)*10.0/B2(J))) Y1=Y1+X**L(J) Y2=Y2+L(J)*X**(L(J)-1) 12 CONTINUE W=X-Y1/Y2 IF(ABS(W-X).LT.1E-10) GO TO 13 X=W 11 CONTINUE 13 WO=W DO 14 J=1,3 C(J)=WO**L(J) 14 CONTINUE R1=0.0 DO 15 J=1,3 R2=R1+B2(J) R1=R2 15 CONTINUE D=0.0 DO 16 J=1,3 P(J)=B2(J)/R1 D=D+P(J)*ALOG(P(J)/C(J)) 16 CONTINUE E=0.0 DO 17 J=1,3 E=E+(B1(J)/B2(J)*P(J)) 17 CONTINUE WRITE(*,200) A,B2,P,E,D 200 FORMAT(1H,2X,A12,3X,3(F7.1,2X),4X,3(F9.6,X),4X,F9.6,2X,F9.6) RETURN END

専門家に質問してみよう