how to identify the mistakes in loop in the given following code?
    5 views (last 30 days)
  
       Show older comments
    
I have to find q, n value and TC.  we need to find the these three values in iteration way. How to solve it?
clc
clear all
pr=7;
p=2500;
D=1600;
z=4;
zr=4;
m=10;
hr=5;
h1=12;
h2=11;
h3=13;
cL=4;
c=20;
c0=2;
c1=3;
c2=2;
ce=15;
k=0.1;
alpha=0.1;
beta=0.9;
u=1-alpha+alpha.*beta;
s=250;
A=110;
g0=15;
g1=20;
theta1=1;
theta2=0.6;
w0=0.3;
w1=0.2;
TC1=inf
q=1:10:191
n=1:1:20
j=1;
l=1;
for i=1:length(q)
    n=sqrt((D.*zr.*m+s+c.*g0+(A.*((q(i).*h2)/2))))/(q(i).*(((hr+cL.*k).*((D.*q(i))/(m.*p)))+((h1.*q(i)).*((1/2)-(((2.*u-1).*D)/(2.*p.*u))-D))+(D.*ce.*g1.*theta1)+(ce.*((w1.*(1-(((2.*u-1).*D)./(2.*D.*u))).*q(i))-(q(i)./2)).*theta2)));
    q=sqrt((2.*D.*(zr.*m+s+g0.*(c+n(i).*ce.*theta1)+A+n(i).*h3))./(n(i).^2.*(((hr+cL.*k).*(D./m.*p))+(h1.*(1-(((2.*u-1).*D)./(2.*p.*u)))+(ce.*(w1.*(2-(((2.*u-1).*D)./(p.*u))-1).*theta2))))));
    N(i+1)=n;
    Q(i+1)=q;
    j=j+1;
end
N
Q
z1=1;
for z=2:1:20
    if ((N(z)~=N(z-1)) | Q(z)~=Q(z-1))
        z1=z1+1;
    else
        break
    end
end
z1
j=1;
for i=1:20
    Q=Q(i);
    N=N(i);
    TC1=(pr.*D)+(z.*(m.*D./N(i).*Q(i)))+((hr+cL.*k).*(D.*N(i).*Q(i)./2.*m.*p))+(h1.*(1-(((2.*u-1).*D)./(2.*p.*u))).*N(i).*Q(i))-(h1.*N(i).*Q(i)/2)+(s.*D./N(i).*Q(i))+(D.*A./N(i).*Q(i))+(D.*h3./Q(i))+(D.*h2./2.*N(i))+((D./u).*(c0+(c1.*alpha)+(c0.*alpha)+(c2.*(1-beta).*alpha)))+((c.*D./N(i).*Q(i)).*(g0+g1.*N(i).*Q(i)))+(((D.*ce.*N(i).*theta1)./(N(i).*Q(i))).*(g0+g1.*N(i).*Q(i)))+((w0+w1.*(((1-(((2.*u-1).*D)./(2.*p.*u))).*N(i).*Q(i))-(N(i).*Q(i)/2))).*ce.*theta2);
    TC(i)=TC1;
    j=j+1;
end
round(TC)
for m=2:5
    if(TC1 >=TC)
        TC1=TC;
    else
        ansn = m+1;
        break
    end
end
round(TC)
6 Comments
  Adam Danz
    
      
 on 10 Oct 2022
				
      Edited: Adam Danz
    
      
 on 10 Oct 2022
  
			Thanks @Jan
@M.Rameswari Sudha, I ran your formatted code to reveal the error message.  
  Jan
      
      
 on 10 Oct 2022
				@M.Rameswari Sudha: Codes like this must fail:
for i=1:20
    Q=Q(i);
    N=N(i);
    ...
end
In the first iteration the arrays Q and N are set to the scalar value of their first elements. Then there is no 2nd element in Q and N in the next iteration. The same problem here:
for i=1:length(q)
    n = sqrt((D.*zr.*m+s+c.*g0+(A.*((q(i) ...
    q = ... n(i) ...
    % Now q and n are scalars and in the 2nd iteration "q(i)" and "n(i)" will fail.
end
By the way, the code can be made much more readable. Comapre
j = 1;
for i=1:length(q)
    n=sqrt((D.*zr.*m+s+c.*g0+(A.*((q(i).*h2)/2))))/(q(i).*(((hr+cL.*k).*((D.*q(i))/(m.*p)))+((h1.*q(i)).*((1/2)-(((2.*u-1).*D)/(2.*p.*u))-D))+(D.*ce.*g1.*theta1)+(ce.*((w1.*(1-(((2.*u-1).*D)./(2.*D.*u))).*q(i))-(q(i)./2)).*theta2)));
    q=sqrt((2.*D.*(zr.*m+s+g0.*(c+n(i).*ce.*theta1)+A+n(i).*h3))./(n(i).^2.*(((hr+cL.*k).*(D./m.*p))+(h1.*(1-(((2.*u-1).*D)./(2.*p.*u)))+(ce.*(w1.*(2-(((2.*u-1).*D)./(p.*u))-1).*theta2))))));
    N(i+1)=n;
    Q(i+1)=q;
    j=j+1;
end
with
R = (2 * u - 1) * D;
S = R / (2 * p * u);
for i = 1:length(q)
    N(i+1) = sqrt(D * zr * m + s + c * g0 + A * q(i) * h2 / 2) / ...
        (q(i) * ((hr + cL * k) * D * q(i) / (m * p) + ...
        h1 * q(i) * (0.5 - S - D) + ...
        D * ce * g1 * theta1 + (ce * q(i) * (w1 * (1 - R / (2 * D * u)) - ...
        0.5) * theta2)));
    Q(i+1) = sqrt((2 * D * (zr * m + s + g0 * (c + n(i) * ce * theta1) + A + ...
        n(i) * h3)) / (n(i)^2 * ((hr + cL * k) * D / m * p + ...
        h1 * (1 - S) + (ce * w1 * (1 - 2 * S) * theta2))));
end
j = 1 + length(q);
Answers (1)
  Adam Danz
    
      
 on 10 Oct 2022
        for i=1:length(q)
    n=sqrt((D.*zr.*m+s+c.*g0+(A.*((q(i).*h2)/2))))/(q(i).*(((hr+cL.*k).*((D.*q(i))/(m.*p)))+((h1.*q(i)).*((1/2)-(((2.*u-1).*D)/(2.*p.*u))-D))+(D.*ce.*g1.*theta1)+(ce.*((w1.*(1-(((2.*u-1).*D)./(2.*D.*u))).*q(i))-(q(i)./2)).*theta2)));
%                                  ^                ^ .... (and more)
    q=sqrt((2.*D.*(zr.*m+s+g0.*(c+n(i).*ce.*theta1)+A+n(i).*h3))./(n(i).^2.*(((hr+cL.*k).*(D./m.*p))+(h1.*(1-(((2.*u-1).*D)./(2.*p.*u)))+(ce.*(w1.*(2-(((2.*u-1).*D)./(p.*u))-1).*theta2))))));
%   ^ oops!     
    N(i+1)=n;
    Q(i+1)=q;
    j=j+1;
end
You're indexing q(i) assuming q is a vector which is the correct assumption on the first iteration of the loop.  But then you're overwriting q and replacing the vector with a scalar.  So when you index q(i) and i>1, you get an indexing error.  
0 Comments
See Also
Categories
				Find more on Loops and Conditional Statements 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!


