Solved

I want to write conditional statement properly

  • 12 April 2023
  • 5 replies
  • 139 views

Userlevel 1
Badge +4

Dear AIMMS Team,

Trust this meets you well? Kindly assist on the problem explained below and find attached the AIMMS file I am working with.  

 

I have a variable StateofCharge(t) in which t is 1 to 24. 

 

I want to place StateofCharge(t) at t = 1 or StateofCharge(01) on the conditional statement below. 

if ( (Charging_Power_kW(01) + SoCMin) > SoCMax) then
     SocMax 
     else

Charging_Power_kW(01) + SoCMin
endif;

Note: Charging_Power_kW(01) is put as the value of variable Charging_Power_kW(t) at t=1

 

While StateofCharge(t) at t = 2,….24 should have the conditional statement below. The index t in the statement applies only from t = 2,….24. 

If Energy_Difference_kW(t) > 0 then
      if (StateofCharge(t-1) + Charging_Power_kW(t)) > SoCMax
       SoCMax
       else
       StateofCharge(t-1) + Charging_Power_kW(t)
     
elseif (Energy_Difference_kW(t)) < 0 then
       if (StateofCharge(t-1) - SoCMin) > Discharging_Power_kW(t)
       else 
       SoCMin
endif;

 

Also, if I have a parameter/variable, P(t), t=1,...24, how can I extract a cell? For example: P(5) or a parameter/variable with a double index P(t, k), t=1,..24 and k=1,...5, how can I write P(2,4)?

 

Thank you.

Kind regards. 

icon

Best answer by Marcel Hunting 17 April 2023, 16:36

View original

5 replies

Userlevel 1
Badge +4

Dear AIMMS Team,

 

Trust this meets you well? Kindly assist on the problem explained below and find attached the AIMMS file I am working with.  

 

I have a variable StateofCharge(t) in which t is 1 to 24. 

 

I want to place StateofCharge(t) at t = 1 or StateofCharge(01) on the conditional statement below. 

if ( (Charging_Power_kW(01) + SoCMin) > SoCMax) then
     SocMax 
     else

Charging_Power_kW(01) + SoCMin
endif;

Note: Charging_Power_kW(01) is put as the value of variable Charging_Power_kW(t) at t=1

 

While StateofCharge(t) at t = 2,….24 should have the conditional statement below. The index t in the statement applies only from t = 2,….24. 

If Energy_Difference_kW(t) > 0 then
      if (StateofCharge(t-1) + Charging_Power_kW(t)) > SoCMax
       SoCMax
       else
       StateofCharge(t-1) + Charging_Power_kW(t)
     
elseif (Energy_Difference_kW(t)) < 0 then
       if (StateofCharge(t-1) - SoCMin) > Discharging_Power_kW(t)
       else 
       SoCMin
endif;

 

Also, if I have a parameter/variable, P(t), t=1,...24, how can I extract a cell? For example: P(5) or a parameter/variable with a double index P(t, k), t=1,..24 and k=1,...5, how can I write the value in cell P(2,4)?

 

Thank you.

Kind regards. 

Userlevel 5
Badge +4

Hi @Lawrence, you can write the definition of StateofCharge as follows:

if ( t = '01' ) then
if (Charging_Power_kW(t) + SoCMin > SoCMax) then
SocMax
else
Charging_Power_kW(t) + SoCMin
endif
elseif (Energy_Difference_kW(t) > 0) then
if (StateofCharge(t-1) + Charging_Power_kW(t) > SoCMax) then
SoCMax
else
StateofCharge(t-1) + Charging_Power_kW(t)
endif
elseif (Energy_Difference_kW(t) < 0) then
if (StateofCharge(t-1) - SoCMin > Discharging_Power_kW(t)) then
StateofCharge(t-1) - SoCMin
else
SoCMin
endif
endif;

Or even better, use First(t) instead of ‘01’. That way you do not have to change this defintion if for some reason the first element changes (e.g., from ‘01’ to ‘1’ or ‘001’).

You should use single quotes if you want to refer to set elements: P(‘2’,’4’).

Userlevel 1
Badge +4

Hello @Marcel Hunting,

 

Thank you for your response. Most of the questions have been answered from the program you wrote. 

However, there is still an issue I am trying to address. 

 

I want the first conditional statement below to hold only for StateofCharge(t) at t = 1 only

if ( (Charging_Power_kW(01) + SoCMin) > SoCMax) then
     SocMax 
     else

Charging_Power_kW(01) + SoCMin
endif;

 

Note: This has been answered from your reply. 

……………………………………………………………………………………………………………………

So here is the issue….

 

However, I want the second conditional statement below to hold only for StateofCharge(t) at t = 2,….24 (or at t= 2 to the end) only

If Energy_Difference_kW(t) > 0 then
      if (StateofCharge(t-1) + Charging_Power_kW(t)) > SoCMax
       SoCMax
       else
       StateofCharge(t-1) + Charging_Power_kW(t)
     
elseif (Energy_Difference_kW(t)) < 0 then
       if (StateofCharge(t-1) - SoCMin) > Discharging_Power_kW(t)
       else 
       SoCMin
endif;

 

Thank you once again. 

Userlevel 5
Badge +4

Hi @Lawrence. The second conditional statement for StateofCharge(t) at t = 2,….24 is also handled in my answer. Note that the definition contains three blocks. The first block

if ( t = '01' ) then
if (Charging_Power_kW(t) + SoCMin > SoCMax) then
SocMax
else
Charging_Power_kW(t) + SoCMin
endif

handles the situation for t=01. For t unequal to ‘01’ the other two blocks will be used:

elseif (Energy_Difference_kW(t) > 0) then
if (StateofCharge(t-1) + Charging_Power_kW(t) > SoCMax) then
SoCMax
else
StateofCharge(t-1) + Charging_Power_kW(t)
endif
elseif (Energy_Difference_kW(t) < 0) then
if (StateofCharge(t-1) - SoCMin > Discharging_Power_kW(t)) then
StateofCharge(t-1) - SoCMin
else
SoCMin
endif
endif;

 

Userlevel 1
Badge +4

Thank you. It is clear!

Reply


Didn't find what you were looking for? Try searching on our documentation pages:

AIMMS Developer & PRO | AIMMS How-To | AIMMS SC Navigator