- ベストアンサー
fortranでのプログラムで最大値を計算する方法
- fortranでプログラムを作成して、関数の最大値を計算する方法について質問があります。
- 質問者は、関数の最大値を求めるために「func」関数を使用していますが、正しい結果が得られないようです。
- 質問者は、関数内の条件分岐部分に問題があるのではないかと考えていますが、具体的な原因がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> if (func(maxx)<func(mx2) .and. func(minx)<func(mx2)) then > ymax=func(mx2) > elseif (func(mx2)<func(maxx) .and. func(maxx)>func(minx)) then > ymax=func(maxx) > else > ymaxx = func(minx) >endif でymaxx= ... となっているのが気になる。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
なんとなく implicit none してないのが敗因のような気がする.
お礼
何度も回答頂いて本当にありがとうございました。 もっとしっかり練習してきます(・∀・)
- Tacosan
- ベストアンサー率23% (3656/15482)
「どうも最大値がうまく計算されません。」とは, 具体的にはどのように「うまく計算されない」のですか? あと, プログラムにコメントがほしい.... 「こういう感じ」というのをもっときちんと書いてほしいなぁ....
補足
すいませんあんまり長いと見づらいかと思い省いてしまってました…。 ! 関数を決定する real function func(x) real, intent(in) ::x func = x**3-3*(x**2)-2*x+14 return end function func ! yの最大値を設定する real function ymax( minx, maxx) real, intent(in) :: minx,maxx real :: y1,y2,y3 real :: mx1,mx2 ! func(x)の微分関数=0 の解 =1±±√15/3=1±1.2 くらい mx1 = (6.0+sqrt((-6.0)*(-6.0) - 4.0*3.0*(-2)))/(3.0*2.0) mx2 = (6.0-sqrt((-6.0)*(-6.0) - 4.0*3.0*(-2)))/(3.0*2.0) ! mx2が極大 mx1が極小 !極大値が区間に入ってるか? ! 入っている if (minx <= mx2 .and. mx2<maxx ) then if (func(maxx)<func(mx2) .and. func(minx)<func(mx2)) then ymax=func(mx2) elseif (func(mx2)<func(maxx) .and. func(maxx)>func(minx)) then ymax=func(maxx) else ymaxx = func(minx) ! func(minx) func(maxx) func(mx2) の最大値が最大値 endif ! 入っていない else if (func(minx)>func(maxx)) then ymax=func(minx) else yamx=func(maxx) ! func(minx) func(maxx) の最大値が最大値 endif endifend function ymax ! yの最小値を設定する real function ymin( minx, maxx) real, intent(in) :: minx,maxx real :: y1,y2,y3 real :: mx1,mx2 mx1 = (6.0+sqrt((-6.0)*(-6.0) - 4.0*3.0*(-2)))/(3.0*2.0) mx2 = (6.0-sqrt((-6.0)*(-6.0) - 4.0*3.0*(-2)))/(3.0*2.0) ! 極小値は区間に入ってるか? ! 入っている if (minx <= mx1 .and. mx1<maxx) then if (func(mx1)<func(minx) .and. func(mx1)<func(maxx)) then ymin = func(mx1) elseif (func(mx1)>func(minx) .and. func(minx)<func(maxx)) then ymin = func(minx) else ymin = func(maxx) ! func(minx) func(maxx) func(mx1)の最小値が最小値 endif ! 入っていない else if (func(minx)<func(maxx)) then ymin = func(minx) else ymin = func(maxx) ! func(minx) func(maxx)の最小値が最小値 endif endif end function ymin ! 画面上のy座標に変換 function transy(y,MINY,MAXY) real,intent(in) :: MINY, MAXY real,parameter :: CRTMINY=23.0, CRTMAXY=1 real,intent(in):: y transy = (CRTMAXY-CRTMINY)/(MAXY-MINY)* (y-MINY) +CRTMINY return end function transy このプログラムに対して 描画部内で iy = transy(y,miny,maxy) としたところ、正と負の数、負の数二つ、正の差の小さい二数を入力した時は正しく動くのですが、 正の3以上離れた数2つを入力したときiyが23を超えてしまいエラーが出てしまいます。 またyの値自体は正しく計算されているのに、ymaxを表示したときに ymax=0.0000000E+00 となってしまいます。 至らない所が多くて恐縮ですが、もしよろしければ回答お願いします。
お礼
他の場所にあったタイプミスが原因でした…。 何度も見直したつもりでしたがこんな初歩的なミスで申し訳ないです。 本当にありがとうございました。