如何修复此代码,以便在条件成立时停止?

时间:2015-12-09 13:37:08

标签: matlab if-statement

我编写了下面的代码来估计epsilon的特定值,代码应该在条件变为真时停止模拟(即w(t)-f < error)。不幸的是,当条件成立时,代码并没有停止。

clear;clc;
tic
m=360;   n=20;  d=240;  l=240;error=1e-5;RF=1.8;erin=0;
error_alt=(5e-4)*180/pi;
deltheta=2*pi/m;    delz=1/n;
pin=0;f=1;
s=(d*d)/(l*l);
R=1/deltheta^2;
cor=(deltheta^2/delz^2)*s;
x=0:deltheta:2*pi;
y=0:delz:1;
iter=1000; 
sum=zeros(iter);
[epsilon]=0.01:0.01:0.9;
[theta]=0:deltheta:2*pi;
p0=zeros(m+1,n+1);
p=zeros(m+1,n+1);
cc=zeros(m+1,n+1);
mm=zeros(m+1,n+1);
wr=zeros(length(epsilon));
wt=zeros(length(epsilon));
w=zeros(length(epsilon));
for t=1:length(epsilon)
    h=zeros(m+1);
    p0=zeros(m+1,n+1);
    p=zeros(m+1,n+1);
    cc=zeros(m+1,n+1);
    mm=zeros(m+1,n+1);
    wt(t)=0;wr(t)=0;w(t)=0;
    phi1(t)=0;phi(t)=0;
    for i=1:m+1  
        h(i)=1+epsilon(t).*cos(theta(i));
    end
    sum(1)=0;
    phi1(t)=atan(sqrt(1.0-epsilon(t).^2)./epsilon(t));
    phi1(t)=m+1-(phi1(t)*180/pi);
    for k=1:iter
        sumij=0.0;
        at=round(phi1(t));
        for j=2:n
            for i=(at-9):(at+9);
                p0(i,j)=pin;
            end
        end
        for j=2:n
            p0(m+1,j)=p0(1,j);
        end
        for j=2:n
            for i=1:m
                if (i==1)
                    h1=1+epsilon(t).*cos(theta(i)+0.5*deltheta);
                    h2=1+epsilon(t).*cos(theta(i)-0.5*deltheta);
                    conh=h1-h2;
                    const=2*(1+cor)*R*h(i)^3;
                    A=3*h(i)^2*R*conh/const;
                    C=h(i)^3*R/const;
                    E=h(i)^3*R*cor/const;
                    G=-3*sqrt(R)*conh/const;
                    p(i,j)=(C+A/2)*p0(i+1,j)+(C-A/2)*p0(m,j)+E*(p0(i,j+1)+p0(i,j-1))+G;           
                else
                    conh=(h(i+1)-h(i-1))/2;
                    const=2*(1+cor)*R*h(i)^3;
                    A=3*h(i)^2*R*conh/const;
                    C=h(i)^3*R/const;
                    E=h(i)^3*R*cor/const;
                    G=-3*sqrt(R)*conh/const;
                    p(i,j)=(C+A/2)*p0(i+1,j)+(C-A/2)*p0(i-1,j)+E*(p0(i,j+1)+p0(i,j-1))+G;
                end
                if p(i,j)<0
                    p(i,j)=0.0;
                else
                    sumij=sumij+p(i,j);
                end
            end
        end
    for j=2:n
        p(m+1,j)=p(1,j);
    end
    for j=2:n
        for i=(at-9):(at+9)
            p(i,j)=pin;
        end
    end
    sum(k+1)=sumij;
    errorp=abs(sum(k+1)-sum(k))/abs(sum(k+1));
    if (errorp > error)
        for j=2:n
            for i=1:m
                p0(i,j)=RF*p(i,j)+(1-RF)*p0(i,j);
            end
        end
    else
    end
    end
    for j=2:n
        for i=2:m
            cc(i,j)=p(i,j).*sin(theta(i));  
            mm(i,j)=p(i,j).*cos(theta(i)); 
        end
    end
    wr(t)=trapz(y,trapz(x,cc));
    wt(t)=trapz(y,trapz(x,mm));
    w(t)=sqrt(wr(t).^2+wt(t).^2);
    phi(t) = atan2(wt(t), wr(t));
    phi(t)=m+1+(phi(t)*180/pi);
    erin=abs(phi(t)-phi1(t))/abs(phi(t));
    if (erin > error_alt)
        phi1=RF*phi+(1-RF)*phi1;
        at=round(phi1); 
    else
        if abs((w(t)-f)) < error
        break        
        end
    end
    if abs((w(t)-f)) < error
       epsilon(t)
       break        
    end
end
iterations=k;
itera=epsilon;
figure(1)
surf(p)
figure(2)
plot(p)
toc

1 个答案:

答案 0 :(得分:1)

您正在寻找关键作品return

breakreturn之间的区别在于

即使认为return是为退出函数而构建的,它也可以在脚本中运行。

因此,在您的示例中,您应该将break替换为return

if abs((w(t)-f)) < error
    return       
end

请注意,无论您在嵌套循环中有多深,此键工作都能正常工作。举个例子:

for ii = 1:2
    for jj = 1:2
        for kk = 1:2
            disp(kk)
            return
        end
    end
end
  

1

虽然break关键字只会结束一个循环:

for ii = 1:2 
    for jj = 1:2 
        for kk = 1:2
            disp(kk)
            break
        end 
    end 
end
  

1

     

1

     

1

     

1

相关问题