Stopping a loop on the peak

1 vue (au cours des 30 derniers jours)
Shimon Katzman
Shimon Katzman le 23 Nov 2019
Commenté : Star Strider le 23 Nov 2019
Hi
I want to stop the loop when i get to the peak of the M
b=300; %mm
d=400; %mm
fc=40; %Mpa
Ecm=22*(fc/10)^0.3*10^3; %Mpa
Es=200000; %Mpa
As=2400; %mm^2
fy=400; %Mpa
epsc1=min(2.8/1000,0.7*fc^0.31/1000);
epscu=3.5/1000;
k=1.05*Ecm*epsc1/fc;
epscmv = linspace(0.05, 3.5, 50)*1E-3;
for i=1:50(epscmv);
epscm = epscmv(i);
funC=@(epsc) (k*epsc/epsc1-(epsc/epsc1).^2)./(1+(k-2)*epsc/epsc1);
compression=@(c) b*fc*c/epscm*integral(funC,0,epscm)/1000;
tension=@(c) min(Es*(d-c)/c*epscm*As/1000,fy*As/1000);
c(i)=fsolve(@(c) compression(c)-tension(c),1);
funM=@(epsc)(k*epsc./epsc1-(epsc./epsc1).^2)./(1+(k-2)*epsc./epsc1).*(d-c(i)+(c(i)./epscm).*epsc);
M(i)=b*fc*c(i)/epscm*integral(funM,0,epscm)/1000000;
phi(i)=epscm/c(i);
if M(i)<M(i-1)
break;
end
end
[Mmax,idx]=max(M)
phiAtMmax=phi(idx)
plot(phi, M)
grid on
xlabel('phi [1/mm]')
ylabel('Moment [kNm]')
A kind forum member helped me but now I get the Error:
Attempted to access M(0); index must be a positive integer or logical.
Error in advencedconcrete32a (line 22)
if M(i)<M(i-1)

Réponse acceptée

Star Strider
Star Strider le 23 Nov 2019
Change the if block to:
if (i > 1) & (M(i)<M(i-1))
break;
end
and your code appears to give the desired result.
This avoids the ‘zero index’ problem by comparing only the second and later values of ‘M’.
  4 commentaires
Shimon Katzman
Shimon Katzman le 23 Nov 2019
That is GREAT!!!
THANK YOU SO MUCH!
Star Strider
Star Strider le 23 Nov 2019
As always, my pleasure!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by