MatLab code runs indefinitely since adding while loop
3 views (last 30 days)
Show older comments
I had a code which ran but wasn't giving me the right output so I changed an if lop to use a while loop instead and now when I run the code it runs indefinitely and I'm not sure why or what I can do to fix it. Have tried closing & reopening, removing while loop and then running without, using a different computer but all to no avail! Any help greatly appreciated! Cheers P.s, have tried to use the {} brackets but not sure it's all coming out right :/
Code {
m=4000; %kg
g=9.81;
L=4; %m
r_min=1.2; %m
r_max=2.2; %m
r=linspace(1.2,2.2,37); %m
theta_min=-20; %degrees
theta_max=80; %degrees
theta=linspace(-20,80,37); %degrees
phi=linspace(0,180,37); %degrees
gamma=phi+20; %degrees
%-----------------------------------
F_max=0;
for i=1:37
c_2(i)=((r_max^2)-(r_min^2))./(cosd(gamma(i)+theta_min)-cosd(gamma(i)+theta_max));
c_1(i)=(r_min^2)+c_2(i).*cosd(gamma(i)+theta_max);
a(i)=real(0.5*(((c_1(i)+c_2(i)).^(1/2))+((c_1(i)-c_2(i)).^(1/2))));
b(i)=real(c_2(i)/(2*a(i)));
for j=1:37
r(i,j)=sqrt((a(i)^2)+(b(i)^2)-(2*a(i)*b(i)*cosd(gamma(i)+theta(j))));
F(i,j)=(r(i,j)*m*g*L*cosd(theta(j)))/(b(i)*a(i)*sind(gamma(i)+theta(j)));
plot(theta,F(i,j));
end
while F(i,j)>F_max
F_max_new=F(i,j);
end
F_max=F_max_new
end
}
0 Comments
Accepted Answer
Geoff Hayes
on 26 Oct 2014
Cat - you should format your code so that it is readable. Just highlight the code portion and press the {} Code button.
It looks like your while loop is just the code
while F(i,j)>F_max
F_max_new=F(i,j);
end
So if the condition F(i,j)>F_max is true, then the body of the loop is executed which just sets F_max_new to a new value, then the condition is checked again. But since nothing has changed with respect to either F_max or F(i,j), then the condition is once again satisfied/true, so we execute the body of the loop. This continues without change and so the code becomes "stuck" in this loop.
If you are just trying to find the maximum value of F, then you could do this after you have finished the for loops. Just do
F_max = max(F(:));
and that will return the maximum value of F, and so you can avoid using the while loop.
2 Comments
Geoff Hayes
on 27 Oct 2014
Cat - you are getting Inf and NaN values due to division by zero errors at the calculations for c_2(i), c_1(i) (since it depends upon c_2), and F(i,j). You may want to add some logic to handle these events.
As for the horzcat error, it is because theta_opt is a 37x1 array. Whenever you determine the minimum force, you will want to save the corresponding boom angle as well. This is true for the other attribute too (phi, length, etc.).
More Answers (0)
See Also
Categories
Find more on Logical 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!