• 締切済み

fortarn 二分法

プログラミング全くの初心者です fortarnを用いて二分法でf=x^2-2 の解を求めるプログラミングを作りたいのですがエラーがたくさんでます 学校の先生に聞いたりして途中まではできたのですが、結局よくわかりませんでした いろいろ間違っているところがあると思いますが、特によくわからないのは、f1*f2が0以上になるときどうすればよいか、範囲の再設定をどうすればよいか、です。 以下、途中までのプログラムです。 このプログラムが完成したものを知りたいです。 少し説明も付けてくださると助かります。 program main parameter(errmax=1.0d-10) parameter(nmax=100) real*8 x0,x1,x2 real*8 f0,f1,f2 real*8 err integer n,i *initial range x0:x1 x0=0.0D0 x1=2.0D0 f0=(x0)^2-2 f1=(x1)^2-2 if(f0*f1>0)then endif err=abs(x1-x0) do n-1,nmax x2=(x0+x1)/2 f2=x2^2-2 if(f0*f2<0)then x1=x2*2-x0 else if(f1*f2<0)then x0=x2*2-x1 else if(f2=0) write(*) x2 err=abs(x1-x0) if(err>f0)then stop'Ended with success' end if end do write(*,*)x0,f0 write(*,*)x1,f1 write(*,*)'Error: not converged' end

みんなの回答

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

> 特によくわからないのは、f1*f2が0以上になるときどうすればよいか 0になるのなら,解がわかったということです。 0よりも大きくなるのなら,初期範囲が悪いと表示して終わればよいでしょう。 > 範囲の再設定をどうすればよいか あなたのような初級者に,再設定を自動的に行うことまでは求められていないと思う。 > このプログラムが完成したものを知りたいです。 これを見て考えてね。 http://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%B3%95

回答No.1

で、肝心のエラーメッセージはなんでしょう? ひょっとして、実行時のエラーではなく、コンパイル時のエラーですか?

関連するQ&A

  • fortran ニュートン法

    program main real*8 x,xold,y,yold,func,dfunc,dx real*8 eps integer nmax nmax=100 eps=1.0d-9 *initial xold=2.0 do n=1,max yold=xold**2-2 x=xold-yold/xold*2 err=abs(x-xold) if(0.01>err)then write(6,*)x stop'Ended with succes' else y=x**2-2 xold=y end if end do write(6,*)x end を実行すると 4.94065645841246544E-324 という結果になってしまいます。 1.41421356 という解がほしいのに、、 ずっと考えたのですがどこがおかしいかわかりません お願いします、どうすれば正しい解が得られますか?

  • 二分法(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.」とかになってしまいます。 お願いします。

  • テイラー展開のプログラムについて

    テイラー展開のプログラムについて テイラー展開のプログラムについて プログラミングはまだ始めたばかりですが、宿題がいきなり出されました。 指数関数をテイラー展開する際に次のプログラムがありましたが、これを表している意味がよく分かりません。 (1)EPSとは??(2)Tnnは何?(3)format('EXP(', f10.5, ') ')の「10.5」は何か? ここら辺が特によく分かりません。 また、同じようにsinxや対数関数でテーラ展開のプログラムのとき気をつけなくちゃいけない点なども教えていただければ嬉しいです。   subroutine expotn (x) c   real Tn, ans, err   integer n c   EPS = 1.0e-6   n = 0   Tn = 1.0   ans = Tn   write(6,10) x 10 format('EXP(', f10.5, ') ') 50 if( abs(Tn) .gt. EPS) then n = n + 1 Tn = Tn * x / n ans = ans + Tn err = ans - exp(x)   write(6,11) n, ans, err 11 format(I3,' exp(X) = ',f12.7,' err = ',f15.10) go to 50 end if write(6,*) ' Exp( ',x,' )= ',ans return end

  • ニュートン法

    フォートランでf(x)=0の解を求めるこのようなプログラムを作りました。 program nyu-ton implicit none real::x,f,dfdx read(*,*)x do call FDF(x,f,dfdx) x=x-f/dfdx write(*,*)x,f if(abs(f)<1e-7)exit end do stop end program nyu-ton subroutine FDF(x,f,dfdx) implicit none real::x,f,dfdx f=x*(x-2.0) dfdx=2.0*x-2.0 end subroutine FDF このプログラムをニュートン法で複素関数の解を求めるプログラムにするには、どこをどのように変えればよいのかわかりません。 z^3+z=0 や z^3=512iのような問題を数値的に解くプログラムを作りたいんですが、教えてください願いします。

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

    ニュートン法のプログラムを書き換える問題なのですが、考えたものを実行してみても上手く値が求められなかったので質問させてください。 ・問題 ニュートン法で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)に 改変するという方法だったんですが… 考え方とどのように改変すればこの値が求められるのか、わかる方教えてください! ちょっと急ぎなのでできれば簡潔に書いていただけると助かります… よろしくお願いします!

  • プログラミング ニュートン法簡単な例の説明が欲しい

    これはニュートン法で√nを求めるプログラムですけど このプログラムを一行ずつ説明してもいいですか? DEF f(x)=x^2-a DEF g(x)=2*x ! g(x)=f'(x) PRINT "input" INPUT a LET x=a LET E=EPS(1)*10 <----これは何? DO  LET x1=x-f(x)/g(x)  PRINT x1   IF ABS((x1-x)/x)<E THEN EXIT DO  LET x=x1 LOOP END

  • 二分法の近似解について

    二分法の近似解について 問題の解釈に自信が持てません。 お手数をお掛けします 以下問題です。 ”f(x)=x^2-a (aは正数とする)として、二分法によって方程式f(x)=0の 近似解を小数点以下4桁まで正しく求めるプログラムを作成せよ。” というものですが、これはaの平方根を小数点以下四桁まで求めろと解釈すればいいのですか? 主にプラス側とマイナス側からその差を0に収束するイメージがあります。 あと、aは何らかの数値を代入して良いものと解釈しました。 代入しないとアルゴリズムとして成立しませんよね? 以下コード(basic)です。 PRINT "f(x)=x^2-aのaを入力" INPUT a PRINT "区間の両端を入力" INPUT i INPUT j IF (i^2-a)*(j^2-a)<0 THEN DO WHILE ABS(i-j)>=0.00001 LET m=(i+j)/2 IF (i^2-a)*(m^2-a)<0 THEN LET j=m ELSE LET i=m END IF LOOP PRINT "f(x)=0の近似解はx=";i ELSE PRINT "両端の符号が同一です" END IF END

  • Matlabについて質問2

    二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 y=-x^2+5x+2 (以下のページ http://www8.plala.or.jp/uemura/sim2.html を参照しています。) (二分法) DOUBLE PRECISION X,AX,X1,X2,Y1,Y2,YA,Y X=1 H=0.1 X1=0 !低い方のxの初期値 X2=5 !高い方のxの初期値 100 AX = (X1 + X2) / 2 !2つの初期値の平均 Y1 = Y(X1) Y2 = Y(X2) YA = Y(AX) IF (YA.EQ.Y1.AND.YA.EQ.Y2) GOTO 200 IF (Y1.GE.Y2) THEN  X2 = AX  GOTO 100 END IF IF (Y2.GE.Y1) THEN  X1 = AX  GOTO 100 END IF 200 WRITE(*,*) 'X*= ', X1 WRITE(*,*) 'Y*= ', Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END これを実行すると以下のようになる。 X*= 2.499999981373549 Y*= 8.250000000000000 (ニュートン法) DOUBLE PRECISION X,H,DY1,DY2,DY3,Y1,Y,DY X=1 !xの初期値 H=0.1 !ステップ幅の初期値 100 DY1 = DY(X) DY2 = DY(X + H) DY3 = DY(X - H) IF (ABS(DY1).LT..000001) GOTO 200 !収束判定 IF (ABS(DY2).LT.ABS(DY1).AND.ABS(DY2).LT.ABS(DY3)) THEN  X = X + H  GOTO 100 END IF IF (ABS(DY3).LT.ABS(DY1).AND.ABS(DY3).LT.ABS(DY2)) THEN  X = X - H  GOTO 100 END IF IF (ABS(DY1).LE.ABS(DY2).AND.ABS(DY1).LE.ABS(DY3)) THEN  H = H / 10  GOTO 100 END IF 200 Y1 = Y(X) WRITE(*,*) 'X*= ',X WRITE(*,*) 'Y*= ',Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END DOUBLE PRECISION FUNCTION DY(X) !微分式の定義 DOUBLE PRECISION X DY=-2*X+5 END これを実行すれば以下のようになる。 X*= 2.500000022351742 Y*= 8.250000000000000

  • fortran if文

    以下のコードで、xとthetaに5,5と入力しても、出力が5となってしまいます。500になってほしかったんですが・・・ どこが悪いのか教えて下さい。 ----------------------------------------------- read(5,*)x,theta if(0.0d0.LE.x.LE.4.0d0) then eta=theta go to 20 else if(4.0d0.LT.x.LT.7.0d0) then eta=100.0d0*theta go to 20 else if(7.0d0.LE.x.LE.10.0d0) then eta=sqrt(3.0d0*sqrt(2.0d0))*theta go to 20 end if 20 write(6,30) eta 30 format(F10.5) stop end -----------------------------------

  • pascal二分木の課題

    レポート課題で、pascalの二分木についての問題が出たのですが、うまくソースコードを作ることができません! 誰かお手伝いよろしくお願いします! 課題:progに木をバランスよく組みなおす関数repackを追加せよ program prog(input,output); const maxRange = 100; type dataType = integer; tree = ^treeCall; treeCall = record data:dataType; left,right:tree end; var root:tree; command:char; value:dataType; function search(d:dataType; t:tree):tree; begin if t=nil then search:=nil(*ブレーク*) else if t^.data=d then search:=t(*見つけた*) else if t^.data>d then search:=search(d,t^.left)(*左を検索*) else search:=search(d,t^.right)(*右を検索*) end; procedure insert(d:dataType; var t:tree); begin (**) if t=nil then begin new(t); t^.data:=d; t^.left:=nil; t^.right:=nil end else if t^.data=d then (*すでに登録されているので何もしない*) else if t^.data>d then insert(d,t^.left) else insert(d,t^.right); end; procedure delete(d:dataType; var t:tree); var temp:tree; procedure deleteMin(var r:tree); var temp:tree; begin temp:=r; while temp^.left<>nil do temp:=temp^.left; t^.data:=temp^.data; delete(temp^.data,r) end; begin if t=nil then writeln('Not Exist.') else if t^.data=d then if (t^.left<>nil) and (t^.right<>nil) then deleteMin(t^.right) else begin temp:=t; if t^.left<>nil then t:=t^.left else t:=t^.right; dispose(temp); end else if t^.data>d then delete(d,t^.left) else delete(d,t^.right) end; procedure writeSet(t:tree); begin if t=nil then (*何もしない*) else begin writeSet(t^.left);(*左へ左へ・・・*) write(t^.data:1,' '); writeSet(t^.right)(*右へ・・・*) end end; (****** Body ******) begin root:=nil; repeat write('> '); read(command); if command in ['i','d','s','w'] then begin (*もしもコマンドがw以外なら値を読み込む*) if command='w' then readln else readln(value); case command of (*数値をバイナリーツリーに挿入 ここでソーティングしたい*) 'i': insert(value,root); 'd': delete(value,root);

専門家に質問してみよう