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

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 2018년 2월 19일
편집: DIP 2018년 2월 19일
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 2018년 2월 19일
편집: DIP 2018년 2월 19일
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 2018년 2월 19일
편집: DIP 2018년 2월 19일
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?
Why not ?

댓글을 달려면 로그인하십시오.

 채택된 답변

Jeff Miller
Jeff Miller 2018년 2월 19일
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

DIP
DIP 2018년 2월 21일
편집: DIP 2018년 2월 21일
Jeff, wouldnt the line
ig(i+1) = IGVals(CurrentIG);
throw dimension mismatch error ? Edit : It does throw a index exceeds bounds error.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Roger Stafford
Roger Stafford 2018년 2월 19일
편집: Roger Stafford 2018년 2월 19일
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

DIP
DIP 2018년 2월 21일
편집: DIP 2018년 2월 21일
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.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Operators and Elementary Operations에 대해 자세히 알아보기

질문:

DIP
2018년 2월 19일

댓글:

2018년 2월 22일

Community Treasure Hunt

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

Start Hunting!

Translated by