• 締切済み

fortran 繰り返し計算の問題

皆様、先日、色々教えていただきまして、どうも有り難うございました。特にfunoe様からのお答えがとても助かりました。ただし、どうも一つの条件だけが満足されると、計算が終了に行ってしまいました。 再度問題を整理したうえで、質問させて頂けませんでしょうか。 (例えば、電気回路の例) do j=1, n  Ra(j),Qi(j) !予めある回路に初期の抵抗値と得たい電流値を与える end do Tr=1.0 / / / 10 continue / do j=1,n Vi(j)=V/Ra(j) !Vを一定値とする / do 100 j=1, n if (abs(Vi(j)-Qi(j)) > 0.1) then Ra(j)= Ra(j)+ Tr goto 100 !nまで繰り返し else goto 500 !終了する end if 100 continue 1000 continue goto 10 !戻り、再計算 500 continue stop end ***************************************** 例えば(n=10),予め与えた10本の回路のQi値がすべて同じな場合には、上記のプログラムでは、うまく行っていますが、10本回路のQi値が違い場合には、そのうち1本回路の値が満足されると、終了していしまいました。  また、elseの前に、 「elseif (Vi(j)-Qi(j) <= 0.1) then Ra(j)= Ra(j) 」 を追加すると、ループから抜き出せなくなりました。  また、初期条件としては、始めに小さいRaを与えて、最初計算したViがQiより大きくして、それから、Raを増やして、ViをQiに近づけるように考えていますが、なかなかうまく行っていないのです。また、回路ですので、一箇所のRaを変更すると、当然他の値にも影響を与えます、ここには難しくと思っております。  皆さまに、教えていただければ、幸いなことと思います。よろしくお願い致します!<!!^!!)。

みんなの回答

  • masa2211
  • ベストアンサー率43% (178/411)
回答No.3

不必要のgotoがあり、混乱の元となっていると思いますが。 (FORTRAN90かそれ以降ですよね?) >do j=1,n >Vi(j)=V/Ra(j) !Vを一定値とする このdo文に受け皿がありあません。(最新の文法でコレが大丈夫なら撤回。) Vi(j)=V/Ra(j)の次行に、end doが入るはず。 >do 100 j=1, n >  if (abs(Vi(j)-Qi(j)) > 0.1) then >   Ra(j)= Ra(j)+ Tr >   goto 100 !nまで繰り返し >  else >   goto 500 !終了する >  end if >100 continue >  goto 10 !戻り、再計算 質問文趣旨を、(abs(Vi(j)-Qi(j)) <= 0.1) がjの全てについて成立したときループ脱出 の意味に取ります。 この場合、ループ脱出時には、必ずjはnまで回ります。 よって、 Icount=0 do j=1, n   if (abs(Vi(j)-Qi(j)) > 0.1) then    Ra(j)= Ra(j)+ Tr   else    Icount=Icount+1 !高々1個成立したからといってループを脱出してはダメ。   end if end do   if (Icount.NE.n) goto 10 !戻り、再計算   以下、ループ成立時の計算 なお、ループの順序を入れ替え、 do j=1,n  Vi(j)=V/Ra(j)  do while (abs(Vi(j)-Qi(j)) > 0.1)   Ra(j)= Ra(j)+ Tr   Vi(j)=V/Ra(j)  end do end do 以下、ループ成立時の計算 (10continueのループ全てを書き直し) としても等価です。

wonwon99
質問者

お礼

教えて頂きまして、どうも有難うございました。 整理しながら、実行し見たいです。有難う!!!!<^^>

  • funoe
  • ベストアンサー率46% (222/475)
回答No.2

回路とか電気とか抵抗とかのことは全く解りませんが、ご提示のロジックで間違っているとは思えませんよね。 判定のための変数の中身が想定外に書き換わっているなど不可思議のことが起こっているのかも・・・・。 問題解決のためには、プログラムトレースのWRITE文をセットして実行すれば「何が起こっているか」がわかると思います。 do 100 j=1, n  write(6,*) '#1',j,Vi(j),Qi(j) ←ここと if (abs(Vi(j)-Qi(j)) > 0.1) then write(6,*) '#2',j,Vi(j),Qi(j) ←ここと Ra(j)= Ra(j)+ Tr goto 100 !nまで繰り返し else write(6,*) '#3',j,Vi(j),Qi(j) ←ここと goto 500 !終了する end if 100 continue  write(6,*) '#4',j,Vi(j),Qi(j) ←ここと 1000 continue goto 10 !戻り、再計算 500 continue  write(6,*) '#5',j,Vi(j),Qi(j) ←ここに追記する。 stop end

wonwon99
質問者

お礼

有難う、有難う!! 正確な計算方法までに行っていないと思う。 色々教えていただき、大変助かりました。また、教えてくださいね!<~~**~~>

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.1

カテゴリー違い。 形式的に、プログラムに関する質問であるか どうかは、問題ではありませんが、 内容的に、ルーブの組み方を 繰り返し、数学カテで質問し続けているのは、 マナー上、問題だと思います。

関連するQ&A

専門家に質問してみよう