所定の値が書き込まれ​た時に表の書き込みを​止める方法(またはそ​の部分を削除する方法​)

1 次查看(过去 30 天)
Noruji Muto
Noruji Muto 2020-12-22
お世話になります。
以下のようなコード(一部を抜粋したもの)を書いているのですが、V2が一度最大値を出したら、
それ以降の繰り返し計算や票の書き込みを終了したいのですが、やり方がわかりません。
たとえば、下記のコードでA2の表の4列目のV2最大値にはnum(仮にnum=500とします)の値が使用されます。
そうすると
498,
499
500
500
500 ...
といったように、500を一度だけ書き込みたいのに、複数回書かれてしまう事が問題になっています。
これを、一度numの値が書き込まれたら、それ以上同じ値が使用されないようにしたいのです。
clc
clear
close all
e=1.602176634*10^-19;
%r=5*10^-6
por=0.5;
S=0.88;
Cf=(4.3*10^-20)/0.0000000000000000033;%エクセルvol.4改より。ネクミ指定
ep=8.85*(10^-12);%真空の誘電率[F/m]
E0=0;%初期電場0[V/m]
Tee=2.5;%放出された電子温度
dc=1.2*(10^-8);%接触力からの分離距離[m]
Vg=5000;
d2=0.08;
Ef=Vg/d2;
row=3000;
Current=[1 2 5 8 10 16];%μA
DLR1=[1.6 5 10 25 30 60]*10^4;
DLR1=[1 5 10 24 30 60]*10^4/(0.01^2);
A=[0.01;0.1;1];
Vcon=0.1*0.1*0.01;%[m-3]
g=0;
num=500;
count1=1;
for i=0.1:0.1:18
r=i*10^-6;
A1(count1,1)={r};
% count1=count1+1
m=(4/3)*pi*r^3*row;%レゴリス粒子一粒の重量
%currentとDLR1は対応している。(2μA→5)
m_dot=A*m.*DLR1;%質量流量kg/s
%vex=F./m_dot;%理論上「必要となる」排気速度[m/s]
% vex=F./m_dot
Vdust=(4/3)*pi*(r^3);%粒子の体積
nd=(Vcon./Vdust)*por;
nd=nd';
md=Vdust*row;%粒子の質量
mall=md*nd;
Cc=4*pi*ep*(r);%キャパシタンス[J/m2]
d1=200*r;%貯蔵部~グリッド1までの距離[m]
s=2*r;%微小空洞の広さ
et=(s/Tee)*sqrt(((2*Cf*(S^2))/(pi*ep*r))-2*E0^2);%放電電荷数η。ここまであってる
Qm=-0.5*et.*Cc*Tee;%負であるべき
V1=Qm/Cc;%粒子の持つ電位
A2(count1,1:4)={r,Qm,Cc,V1};
count1=count1+1;
Fef1=Qm*Ef;%電場から受ける力
h=2/m;
a=Qm^2/(4*pi*ep*s);
b=2*pi*ep*r^2*E0^2;
c=m*g;
f=2*Cc*S^2*r*dc;
Vini=(h*(a+((b-c)*d1)-f))^0.5;
g=9.8;
y=Vini^2/(2*g);
D=0.05;%粒子堆積層から最初のグリッドまでの距離[m]
t=sqrt((Vini^2)-(2*g*D));%堆積層表面から最初のグリッドに至るまでにかかる時間
S2=(r^2)*pi;%粒子断面積(円として近似)[m2]
e=1.602*10^-19;%電気素量[C]
V1=Qm/Cc;
En1=Qm*V1;%浮遊する粒子が持つエネルギー[eV]
count2=1;
for V2=100:1:num%V2=浮上中の粒子に照射する電子の電位
eV2=V2;%エネルギーの単位が[eV]の時、その値は電位の値と同じ。
if abs(V1)<=abs(eV2);
A2(count2,1:4)={r,V1,V2,eV2};
%A2=cell2mat(A2);
Q_new=V2*Cc;%
%Fef2=(abs(Qm+abs(Q_new))*Ef
Vini=abs(((2/md)*(((Qm.^2)./(4*pi*ep.*s))+(2*pi*ep*(r.^2)*(E0^2)).*d1-(2*Cf*(S^2).*r*b)))^0.5);
%この時の電場による速度増分dltV
dltV1=sqrt((2*abs(Qm)*Ef*d2)/md);
Vex1=abs(Vini+dltV1);
F1=Vex1*m_dot;
%A=0.01m2の時
F11=F1(1,1:6);
%A=0.1m2の時
F12=F1(2,1:6);
%A=1m2の時
F13=F1(2,1:6);
%↓行列の各要素を個別に書きだし。
%F11_1=F11(1,1);
AF11(count2,1:2)={F11,r};
AF12(count2,1:2)={F12,r};
AF13(count2,1:2)={F13,r};
dltV2=sqrt((2*(abs(Qm)+abs(Q_new))*Ef*d2)/md);%1*3=I*1
Vex2=abs(Vini+dltV2);%I=1*6
F21=Vex2*m_dot;
F211=F21(1,:);%A=0.01m2の時
F212=F21(2,:);%A=0.1m2の時
F213=F21(3,:);%A=1m2の時
AF211(count2,1)={F211};
AF212(count2,1:3)={F212,r,V2};
AF213(count2,1)={F213};
AFr(count2,1)={r};
AFr211(count2,1:3)={r,F211,V2};
AFV2(count2,1)={V2};
AFr212(count2,1:3)={r,F212,V2};
AFr213(count2,1:3) ={r,F213,V2};
count2=count2+1;
end
end
%ここにbreakを用いようとしましたがダメでした。
end
%%以下に表示される最終的出力結果「AF~」に表示されるV2の値で、V2=numの時、複数回書き込まれてしまう。
AFA2=cell2mat(A2);
AF11=cell2mat(AF11);
AF12=cell2mat(AF12);
AF13=cell2mat(AF13);
AF211=cell2mat(AF211);
AF212=cell2mat(AF212);
AF213=cell2mat(AF213);
AFr=cell2mat(AFr);
AFV2=cell2mat(AFV2);
AFr211=cell2mat(AFr211);
AFr212=cell2mat(AFr212);
AFr213=cell2mat(AFr213);
breakを用いてみたりもしたのですが、うまくいきませんでした。
どなたか良い方法をご存じでないでしょうか?
  2 个评论
Atsushi Ohashi
Atsushi Ohashi 2020-12-29
お世話になっております。
break を実行するための条件フラグを用意するとご所望のことができると思います。
修正内容としては、
1.最初にフラグを用意
runFlag = true;
フラグの変数を作る箇所は最初のFor文( for i=0.1:0.1:18 ) の前になります。
2.条件が成立したら、フラグをFalseにする
AFr(count2,1)={r};
AFr211(count2,1:3)={r,F211,V2};
AFV2(count2,1)={V2};
% このような記述
if V2 == num
runFlag = false;
end
3.For文の最後でフラグの値を確認し、フラグがFalseならばBreak
(%ここにbreakを用いようとしましたがダメでした。のところになります)
%ここにbreakを用いようとしましたがダメでした。
if ~runFlag
break;
end
結果は
491
492
493
494
495
496
497
498
499
500
のようになると思いますので、お試しご確認いただければと思います。よろしくお願い致します。
Noruji Muto
Noruji Muto 2021-1-1
ありがとうございました。
実際に試してみて、効果を確認致しました。

请先登录,再进行评论。

回答(0 个)

类别

Help CenterFile Exchange 中查找有关 MATLAB 的更多信息

Community Treasure Hunt

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

Start Hunting!