while文の条件が​falseになっても​ループが続いてしまい​ます

21 views (last 30 days)
Yuriko
Yuriko on 10 Dec 2020
Commented: Shunichi Kusano on 16 Dec 2020
while文の条件がfalseになってもループが続いてしまい,困っています.
添付したプログラムの22行目のwhile文において,
xの値を見てみると,while文の条件(D<=0)がfalseになっても,同じwhile文内をループしているようです.
何が原因なのでしょうか?

Answers (1)

Shunichi Kusano
Shunichi Kusano on 10 Dec 2020
コード拝見しましたが、2点ほど気になる点があります。
1.rLがベクトルなので、xもベクトルになってしまう。結果としてDもベクトルになってしまう。
D<=0という条件でのwhileなので、おそらくDは単一の数字(スカラ)を想定されているのではないかと思います。ですが現在の仕様だと初期値ではスカラなのにwhile文が始まったらベクトルに書き換わっています。これは想定通りでしょうか?
2.whie文の中をみると常に同じ計算が繰り返されるだけで値が更新されない
whileループの中を見てみますと、演算をしている部分は次の3行です。
x=p;
x=x+rL; % x = p + rL
D=abs(p)-abs(x);
これが繰り返されることになりますので、毎度同じ結果が出ることになります。おそらくpがループの度に更新されるべきだと思うのですが、いかがでしょうか。
  2 Comments
Yuriko
Yuriko on 12 Dec 2020
回答いただきありがとうございます.
更新したプログラムを添付いたします.
1.乱数(rL,rS)がスカラになるように変更したところ,うまく計算できたようです.
2.更新する値について間違っていました.ご指摘の通り変更したところ,うまくいきました.
ここで,もう一つ問題があり,最終的にxの値が変化するごとにプロットして挙動を可視化したいのですが,どのようにしたら良いのでしょうか?
添付のプログラムですと,xの最終値だけプロットされたグラフが出てしまいます.
Shunichi Kusano
Shunichi Kusano on 16 Dec 2020
値をプロットするには2つやり方があります。
プロットだけが欲しい場合、
plot(x1,y1); % x1,y1は適当な値
hold on; % 描画結果を残す
plot(x2,y2); % 描画(hold onしているので結果として重ね書きとなる)
という形で、一度プロットした結果はhold onで保持できるので、whileの中でhold on とplotをセットで使うことで、最終的には全データのプロットを見ることができます。
データも欲しい場合(こちらが推奨)、
whileの中で、xを保存しておく用の配列を用意しておいて、それに随時xの値を格納していきます。
xdata = zeros(想定するxの全データ数(不明なら適当に大きい数にしておいて、計算後不要部分をカットでもいいです));
i = 1;
while ...
x = ほにゃらら; % xの値を計算
xdata(i) = x; % xdataにxを保存
i = i+1; % iを更新
end

Sign in to comment.

Categories

Find more on ループと条件付きステートメント in Help Center and File Exchange

Tags

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!