• 締切済み

FORTRANのプログラムです。

FORTRANのプログラムです。 下に記載したプログラムを、行列値の計算にするプログラムに改良するにはどうすればよいでしょうか? アドバイスお願いします。 c *************************** if(root.LT.x0) GOTO 11 x0=root; x1=xs0; x2=xs1 GOTO 99 11 x0=root; x1=xs0; x2=xs2 GOTO 99 c c *************************** OPEN(6,FILE='sum.dat') 1002 FORMAT(E12.5,3x,4(E12.5,4x)) CLOSE(6) STOP 100 END c ************************* SUBROUTINE FRES(x,F) DOUBLE PRECISION x,F c f=3.*x+DSIN(x)-DEXP(x) f=(x-1.)*(x-2.)*(x-3.)*(x-4.)*(x-5.)*(x-6.) RETURN END よろしくお願いいたします。

みんなの回答

  • f272
  • ベストアンサー率46% (8003/17108)
回答No.2

補足によってプログラムの方は分かるけど, | x-1 3 2-x | | 5 x-2 x^3-4 | | 3 x-1 x-x^2 | = 0 | 3 5 x^2-4 | これが何を意味しているのか分かりません。見たところ行列式を意味しているようにもみえるが4x3行列に対しては無意味です。

  • f272
  • ベストアンサー率46% (8003/17108)
回答No.1

「下に記載したプログラムを、行列値の計算にするプログラムに改良するにはどうすればよいでしょうか?」 と言っているが,記載されているのはプログラムの断片にすぎないし,そのうえ行列値に計算にするプログラムというのが何のことか意味不明です。もう少し質問を明確にしてもらわなければ,どうしようもありません。

ayaka_v--v
質問者

補足

あいまいな質問で申し訳ございません。 プログラム全文です。 DOUBLE PRECISION f0,f1,f2,x0,x1,x2,h1,h2,gam DOUBLE PRECISION aa,bb,cc,f,root,b1,b2,BT DOUBLE PRECISION xs0,xs1,xs2,EXPS,umin,umax EXPS=1.e-3 umin=0.1; umax=5.5; x0=3.3 x2=umin; x1=umax 99 xs0=x0; xs1=x1; xs2=x2 h1=x1-x0; h2=x0-x2; gam=h2/h1 CALL FRES(x0,f0); CALL FRES(x1,f1); CALL FRES(x2,f2) aa=(gam*f1-f0*(1.+gam)+f2)/(gam*h1**2.*(1.+gam)) bb=(f1-f0-aa*h1**2.)/h1 cc=f0 b1=bb+DSQRT(bb**2.-4.*aa*cc) b2=bb-DSQRT(bb**2.-4.*aa*cc) if (bb.GT.0.) BT=b1 if (bb.LT.0.) BT=b2 if (bb.EQ.0.) BT=2.*x0-x1 root=x0-2.*cc/BT write(*,1002) x0,x1,x2 write(*,1002) f0,f1,f2 write(*,1002) h1,h2,gam write(*,1002) aa,bb,cc,root if(DABS((root-x0)/root).LT.EXPS) GOTO 100 if(root.LT.x0) GOTO 11 x0=root; x1=xs0; x2=xs1 GOTO 99 11 x0=root; x1=xs0; x2=xs2 GOTO 99 c OPEN(6,FILE='sum.dat') 1002 FORMAT(E12.5,3x,4(E12.5,4x)) CLOSE(6) STOP 100 END SUBROUTINE FRES(x,F) DOUBLE PRECISION x,F f=(x-1.)*(x-2.)*(x-3.)*(x-4.)*(x-5.)*(x-6.) RETURN END ------------------------------------------------------------------- このプログラムを、 | x-1 3 2-x | | 5 x-2 x^3-4 | | 3 x-1 x-x^2 | = 0 | 3 5 x^2-4 | 上式のxの値を求めるプログラムに改良したいです。

関連するQ&A

  • fortranのプログラム

    fortranのプログラム 現在、fortranの勉強をしております。 そこで、質問があるのですが、 ある関数f(x,y,z)の座標(x,y,z)の値がデータとして与えられているとき、 S=10+f をfortranで計算したいと考えております。 ただ、関数fは複数(f1、f2、f3)あり、次々とfに代入してSを計算したいのですが、どのようにプログラムしたらいいか思いつきません。 どなたか、ヒントだけでもいいので、教えてください。 ちなみに、私が考えたプログラムは(下のプログラムはポイントだけ書いてあります。endやその他関係ないと思われるところは省いております。) do 100 k=1,3 S=S+fk(x,y,z) continue function f1 f1(s,t,u)=・・・ return end f2(s,t,u)=・・・ return end 使用しているバージョンは、fortran77(本当は90を使っているのですが、77だけで書いています)です。

  • fortran77教えてください

    fortran77のプログラムについての質問です。 次のプログラムを実行するとどのような結果になるか教えてください REAL A,B,C,D,E,F A=7.0 B=5.0 CALL WASA(A,B,C,D) CALL WASA(C,D,E,F) WRITE(*,*)E,F STOP END SUBROUTINE WASA(P,Q,R,S) REALP,Q,R,S R=P+Q S=P-Q RETURN END

  • Do文で副プログラムの増やす【Fortran】

    Fortranを使用してます。 DO文で副プログラムをループさせて増やしたいのですが、どうすればいいか分りません。 具体的には、副プログラムの「SUBROUTINE」文+サブルーチン名 であるサブルーチン名の後にループを使って番号を付けたいのですが・・・ 簡易なイメージとして以下のソースでtest0、test1、test2、・・・・・test10となるようなサブルーチン名にしたいのです。 do x=0,10 SUBROUTINE test+x y=x+10 retun end end do Fortran初心者ですが、解決したいので難しい解説でも大丈夫です。 分る方は宜しくお願いいたします。

  • 二分法(FORTRAN)

    大学の情報処理演習で、FORTRANのプログラミングをやっています。 で、二分法の問題なんですが、X^3-X-1の解で、[0.2] にあるものを計算するプログラムを作る課題が出されたのですが、うまくいきません。 そこで、自分の作ったプログラムを添削してください。 program nibunnhou1 c real x1,x2,c,x,f,r f(x)=x**3-x-1 c x1=0.000 x2=2.000 r=f(x1) c write(6,*)'start' c do n=1,100 c=(x1+x2)/2 if(r*f(c).gt.0) then x1=c else x2=c end if c if(f(c).lt.0.0000) go to 1 continue end do c 1 write(6,*)'ans=' write(6,*) c c stop end です。これだと、答えが「1.」とかになってしまいます。 お願いします。

  • 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

  • fortran 外部サブルーチンの読み込みについて

    c c main.f c dimension x(2) x(1)=1 x(2)=2 y=5 call sub(x,y,z) write(*,*)'x1=',x(1) write(*,*)'x2=',x(2) write(*,*)'y=',y write(*,*)'z=x1+x2+y=',z stop end c---------------------------------- c sub.f c subroutine sub(a,b,c) dimension a(2) c=a(1)+a(2)+b write(*,*)'b=',b return end  以上のようなプログラムをmain.fとsub.fに分離して、別々にコンパイル。最後にそれぞれの実行ファイルをつなげるといったことがしたいのですが、どのようにすればいいのでしょうか。 サブルーチンをメインプログラムが参照するといったことがしたいです。

  • fortranでプログラムを実行するとEnd of fileと表示されてしまいます

    fortran初心者です。 以下のプログラムのコンパイルは出来るのですが、実行すると At line 9 of file ./rennsyu1.f90 Fortran runtime error: End of file というエラーがでてしまいます。 End of fileが何を意味するのか解からず対処が出来ません。 一つ言えることは、open文を使用すると必ずこのエラーが出てしまうということです。 どなたか、End of fileの意味と対処法を教えてください。 プログラム  既存のファイルxx.txtからx1とx2の値を読み取り、画面に出力させる。 program rennsyu1 implicit none real :: x(2) integer :: i open (17 , file = ' xx.txt ' ) do i = 1 , 2 read (17 , *) , x(i) write (6 , *) " x = " , x(i) end do close(17) stop end program rennsyu1

  • frotranプログラムについて

    教えて下さい。お願いします。 あるFrotranプログラムをコンパイルし、実行すると次のエラーが帰ってきました。 *** FORTRAN I/O ERROR 915: READ UNEXPECTED CHARACTER FILE: ., UNIT: 99 ( 0) 0xc11c1ad0 __io_ded + 0x408 [/usr/lib//libcl.2] ( 1) 0xc11b7744 ____F90_END_IO + 0x99c [/usr/lib//libcl.2] ( 2) 0x00004120 _start + 0x1e0 [././test-new] このエラーの内容がわかりません。わかる方教えてください。

  • FORTRANのプログラミングについて

    たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。

  • ニュートン法のプログラムの問題です。

    ニュートン法のプログラムを書き換える問題なのですが、考えたものを実行してみても上手く値が求められなかったので質問させてください。 ・問題 ニュートン法でbのn乗根を求めるプログラムです。 これを、bを与えたときx/(x^2+1)=bとなるxを求めるプログラムに書き換えなさい。 10 input "n,b";n,b 20 x=1 30 f=x^n-b 40 d1=n*x^(n-1) 50 x1=x-f/d1 60 e=1*10^(-6) 70 if abs(f)<e then goto 100 80 x=x1 85 print x 90 goto 30 100 end 考えたものとしては、 f(x) = x^n - b を f(x) = x/(x^2 + 1) - b に、 d1(x) = n*x^(n - 1) を d1(x) = 1/(x^2 + 1) - 2*x^2*/((x^2 + 1)^2)に 改変するという方法だったんですが… 考え方とどのように改変すればこの値が求められるのか、わかる方教えてください! ちょっと急ぎなのでできれば簡潔に書いていただけると助かります… よろしくお願いします!

専門家に質問してみよう