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

6 views (last 30 days)
Noruji Muto
Noruji Muto on 22 Dec 2020
Commented: Noruji Muto on 1 Jan 2021
お世話になります。
以下のようなコード(一部を抜粋したもの)を書いているのですが、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 Comments
Atsushi Ohashi
Atsushi Ohashi on 29 Dec 2020
お世話になっております。
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 on 1 Jan 2021
ありがとうございました。
実際に試してみて、効果を確認致しました。

Sign in to comment.

Answers (0)

Categories

Find more on Condensed Matter & Materials Physics in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!