Combine multiple if statements for something more compact

4 vues (au cours des 30 derniers jours)
DIP
DIP le 19 Fév 2018
Commenté : Roger Stafford le 22 Fév 2018
Friends,
I'm trying to refine my code.It works fine but I have four if conditions which I want to make more efficient. Is there an alternative way to do it?
i=1;
while (VMPH<=60)
% Vehicle speed
t(i+1) = t(i)+delt;
Vmps(i+1) = Vmps(i)+((delt*(Facc(i)))/Vm);
VMPH(i+1) = Vmps(i+1)/0.44704;
% Vehicle forces
Fr(i+1) = Fr(1);
Fd(i+1) = 0.5*Af*Cd*(Vmps(i+1))^2;
% Speed conditions
ig(i+1) = 3.78;
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
if N(i+1) > 2150
ig(i+1) = 2.06;
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
end
if N(i+1) > 2150
ig(i+1) = 1.58;
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
end
if N(i+1) > 2150
ig(i+1) = 1.21;
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
end
if N(i+1) > 2150
ig(i+1) = 0.82;
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
end
% Power and performance
Tao_b(i+1) = interp1(Speed,Torque,N(i+1));
Tao_w(i+1)= Tao_b(i+1)*io*ig(i+1)*etadrive;
Ft(i+1) = Tao_w(i+1)/Dt*2;
Pb(i+1) = 2*pi*Tao_b(i+1)*N(i+1)/60;
% Acceleration force
Facc(i+1) = Ft(i+1)-Fd(i+1)-Fr(i+1);
i=i+1;
end
Thank You!
  10 commentaires
DIP
DIP le 19 Fév 2018
So i define a while loop within a while loop?
M
M le 21 Fév 2018
Why not ?

Connectez-vous pour commenter.

Réponse acceptée

Jeff Miller
Jeff Miller le 19 Fév 2018
Maybe something like this:
IGVals = [3.78 2.06 1.58 1.21 0.82];
CurrentIG = 1;
i=1;
while (VMPH<=60)
...
% Speed conditions
ig(i+1) = IGVals(CurrentIG);
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
if N(i+1) > 2150
CurrentIG = CurrentIG + 1;
ig(i+1) = IGVals(CurrentIG);
N(i+1) = Vmps(i+1)*io*ig(i+1)*60/(pi*Dt);
end
% Power and performance
...
  1 commentaire
DIP
DIP le 21 Fév 2018
Modifié(e) : DIP le 21 Fév 2018
Jeff, wouldnt the line
ig(i+1) = IGVals(CurrentIG);
throw dimension mismatch error ? Edit : It does throw a index exceeds bounds error.

Connectez-vous pour commenter.

Plus de réponses (1)

Roger Stafford
Roger Stafford le 19 Fév 2018
Modifié(e) : Roger Stafford le 19 Fév 2018
You can replace the part of the code after "%Speed Conditions" but before "% Power and performance" by these lines:
t = Vmps(i+1)*io*60/(pi*Dt);
x = [3.78,2.06,1.58,1.21,0.82];
ig(i+1) = x(sum(2150<(x(1:4)*t))+1);
N(i+1) = ig(i+1)*t;
They should produce an equivalent result.
  2 commentaires
DIP
DIP le 21 Fév 2018
Modifié(e) : DIP le 21 Fév 2018
Roger, i get an error Matrix dimensions must agree for the third line of your suggestion.
Roger Stafford
Roger Stafford le 22 Fév 2018
@DIP: That line should work. The expression
sum(2150<(x(1:4)*t))+1
should provide an integer value ranging from 1 to 5. This in turn should be a valid index in the vector x. You can do some checking by writing
ix = sum(2150<(x(1:4)*t))+1;
disp(ix)
to display the values of ix. By the way, it is assumed that the variable t is a scalar. If not, you would probably get a similar error message at the ix calculation.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing 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