Combine multiple if statements for something more compact

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 Comments

Why don't you just delete all but the last one? The rest doesn't matter anyhow as it is overwritten by the last if statement.
DIP
DIP on 19 Feb 2018
Edited: DIP on 19 Feb 2018
Moritz, im modelling a gear box. Hence the last if statement is the final drive gear. The gear ratios go from 3.78 , 2.06, 1.58, 1.21, 0.82.
Im pretty sure there is a better way to code this although im getting the intended result.
Does i stands for ith gear?
DIP
DIP on 19 Feb 2018
Edited: DIP on 19 Feb 2018
No, i is just the while loop counter. It is a 5 speed gear box - each time I hit a particular RPM, I switch gear. Hence 4 if loops for each gear shifted.
Why do all the four IF statements have the same condition that
N(i+1)>2150
DIP
DIP on 19 Feb 2018
Edited: DIP on 19 Feb 2018
Basil, Each time the engine hits 2150 rpm, the gear shifts one step higher. i am an inefficient coder, somehow this gives me the right answer. However, im looking to modify the code and make it simple.
Do you ant to execute something while
N(i+1)>2150 ?
Something like
while N(i+1)>2150 && count<4
count=count+1;
your code here
end
So i define a while loop within a while loop?

Sign in to comment.

 Accepted Answer

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 Comment

Jeff, wouldnt the line
ig(i+1) = IGVals(CurrentIG);
throw dimension mismatch error ? Edit : It does throw a index exceeds bounds error.

Sign in to comment.

More Answers (1)

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 Comments

DIP
DIP on 21 Feb 2018
Edited: DIP on 21 Feb 2018
Roger, i get an error Matrix dimensions must agree for the third line of your suggestion.
@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.

Sign in to comment.

Categories

Find more on Operators and Elementary Operations in Help Center and File Exchange

Asked:

DIP
on 19 Feb 2018

Commented:

on 22 Feb 2018

Community Treasure Hunt

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

Start Hunting!