Combine multiple if statements for something more compact
    3 views (last 30 days)
  
       Show older comments
    
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
Accepted Answer
  Jeff Miller
      
 on 19 Feb 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
  ...
More Answers (1)
  Roger Stafford
      
      
 on 19 Feb 2018
        
      Edited: Roger Stafford
      
      
 on 19 Feb 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 Comments
  Roger Stafford
      
      
 on 22 Feb 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.
See Also
Categories
				Find more on Green Vehicles 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!