プロが教えるわが家の防犯対策術!

皆様、先日、色々教えていただきまして、どうも有り難うございました。特に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を変更すると、当然他の値にも影響を与えます、ここには難しくと思っております。
 皆さまに、教えていただければ、幸いなことと思います。よろしくお願い致します!<!!^!!)。

A 回答 (3件)

カテゴリー違い。


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

回路とか電気とか抵抗とかのことは全く解りませんが、ご提示のロジックで間違っているとは思えませんよね。



判定のための変数の中身が想定外に書き換わっているなど不可思議のことが起こっているのかも・・・・。


問題解決のためには、プログラムトレースの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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/13 22:21

不必要の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のループ全てを書き直し)
としても等価です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/13 22:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!