Skip to content

Commit

Permalink
* Introduce variable prediction horizons and scaling of decision vari…
Browse files Browse the repository at this point in the history
…ables, #47
  • Loading branch information
MBaranskiEBC committed May 1, 2019
1 parent 640e8c9 commit c358446
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 27 deletions.
46 changes: 28 additions & 18 deletions pyDMPC/ControlFramework/Init.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
""" Settings for BExMoC algorithm """
# So far: For all subsystems the same settings
factors_BCs = [6, 0.03] # order: BC1, BC2, ...
center_vals_BCs = [30, 0.001]
amount_lower_vals = [1, 0]
amount_upper_vals = [1, 1]
center_vals_BCs = [16, 0.001]
amount_lower_vals = [2, 0]
amount_upper_vals = [2, 1]
exp_BCs = [1, 1]
amount_vals_BCs = [1, 1]

Expand All @@ -31,15 +31,15 @@

""" Set objective function """
obj_function = 'Monetary' #choices: 'Exergy', 'Monetary'
set_point = [30.0, 0.005] #set points of the controlled variables
set_point = [22.0, 0.005] #set points of the controlled variables
tolerance = 0.4
cost_factor = 0.5

""" Time and Interval Settings """
sim_time_global = 10000 # -> not used yet
sync_rate = 5*60 # Synchronisation rate in seconds
optimization_interval = 10*60 # After one interval the optimization is repeated
prediction_horizon = 3600 #Common prediction horizon in seconds
prediction_horizon = 3600.0 #Common prediction horizon in seconds

""" Directories and Modelica libraries """
# Path where the main working directory shall be created
Expand Down Expand Up @@ -120,11 +120,13 @@
output_vars = []
initial_names= [] #for simulation
IDs_initial_values= [] #for simulation
IDs_initial_offsets = [] # offsets to add to the initial values
cost_par = [] #for MassFlowRate
variation = []
IDs_inputs = []
cost_factor = []
model_type = []
pred_hor = []

""" Subsystems """

Expand All @@ -139,17 +141,19 @@
num_VarsOut.append(2)
bounds_DVs.append([0,100])
start_DVs.append([10])
factor_DVs.append([30])
factor_DVs.append([25])
model_path.append('')
names_DVs.append(['TempSensors.TempAHUReheaterTSetAir'])
output_vars.append(["AHU_Bacnet.HumSUP","AHU_Bacnet.TempSUP"])
initial_names.append(None)
IDs_initial_values.append(None)
IDs_initial_offsets.append(None)
IDs_inputs.append(["AHU_Bacnet.HumODA","AHU_Bacnet.TempODA"])
cost_par.append(None)
variation.append(False)
variation.append(True)
cost_factor.append(0.5)
model_type.append("lin")
pred_hor.append(3600)

# Hall
name.append('Hall-short')
Expand All @@ -161,18 +165,19 @@
num_VarsOut.append(2)
bounds_DVs.append([0,0])
start_DVs.append([-10])
factor_DVs.append([0.3])
factor_DVs.append([30])
model_path.append('ModelicaModels.SubsystemModels.DetailedModels.Hall_short')
names_DVs.append(None)
output_vars.append(["supplyAirTemperature.T","supplyAirHumidity.phi"])
initial_names.append(["concreteFloor.T","AirVolumeFlow.k","volume.T_start","currentWaterTemperature.k"])
IDs_initial_values.append(["GVL_Bacnet.CCA_SenT_Ret","AHU_Bacnet.AirflowSUP","AHU_Bacnet.TempETA","GVL_Bacnet.CCA_SenT_Sup"])
IDs_initial_values.append(None)
IDs_inputs.append(None)
initial_names.append(["AirVolumeFlow.k","volume.T_start"])
IDs_initial_values.append(["AHU_Bacnet.AirflowSUP","AHU_Bacnet.TempETA"])
IDs_initial_offsets.append([0,273])
IDs_inputs.append(["AHU_Bacnet.HumSUP","AHU_Bacnet.TempSUP"])
cost_par.append(None)
variation.append(True)
cost_factor.append(0.5)
model_type.append("Modelica")
pred_hor.append(3600)

# Steam_humidifier
name.append('Room_1')
Expand All @@ -193,11 +198,13 @@
initial_names.append(None)
#IDs_initial_values.append(["Room2T","Room2del"])
IDs_initial_values.append(["AHU_Bacnet.HumSUP","AHU_Bacnet.TempSUP"])
IDs_initial_offsets.append([0,0])
IDs_inputs.append(None)
cost_par.append('None')
variation.append(True)
cost_factor.append(0.5)
model_type.append("fuzzy")
pred_hor.append(3600)

# Steam_humidifier
name.append('Room_2')
Expand All @@ -218,11 +225,13 @@
initial_names.append(None)
#IDs_initial_values.append(["Room2T","Room2del"])
IDs_initial_values.append(["AHU_Bacnet.HumSUP","AHU_Bacnet.TempSUP"])
IDs_initial_offsets.append([0,0])
IDs_inputs.append(None)
cost_par.append(None)
variation.append(True)
cost_factor.append(0.5)
model_type.append("fuzzy")
pred_hor.append(3600)

# Hall
name.append('Hall-long')
Expand All @@ -233,16 +242,17 @@
num_DecVars.append(1)
num_VarsOut.append(2)
bounds_DVs.append([0,100])
start_DVs.append([-10])
factor_DVs.append([0.3])
start_DVs.append([0])
factor_DVs.append([30])
model_path.append('ModelicaModels.SubsystemModels.DetailedModels.Hall_long')
names_DVs.append(['TempSensors.TempCCAT_amb_mean'])
output_vars.append(["supplyAirTemperature.T","supplyAirHumidity.phi"])
initial_names.append(["concreteFloor.T","AirVolumeFlow.k","volume.T_start"])
IDs_initial_values.append(["GVL_Bacnet.CCA_SenT_Ret","AHU_Bacnet.AirflowSUP","AHU_Bacnet.TempETA"])
IDs_initial_values.append(None)
IDs_inputs.append(None)
initial_names.append(["AirVolumeFlow.k","volume.T_start"])
IDs_initial_values.append(["AHU_Bacnet.AirflowSUP","AHU_Bacnet.TempETA"])
IDs_initial_offsets.append([0,273])
IDs_inputs.append(["AHU_Bacnet.HumSUP","AHU_Bacnet.TempSUP"])
cost_par.append(None)
variation.append(False)
cost_factor.append(0.5)
model_type.append("Modelica")
pred_hor.append(2*86400)
17 changes: 8 additions & 9 deletions pyDMPC/ControlFramework/Objective_Function.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,12 @@ def Obj(values_DVs, BC, s):
if isinstance (values_DVs, np.ndarray):
DV_array = np.empty([1,2])
DV_array[0,0] = 0
DV_array[0,1] = float(values_DVs)
DV_array[0,1] = s.start_DVs + float(values_DVs)/100*s.factor_DVs
else:
DV_array = np.empty([1,len(values_DVs)+1])
DV_array[0,0] = 0
for i2,val2 in enumerate(values_DVs):
DV_array[0][i2+1] = val2
DV_array[0][i2+1] = s.start_DVs + val2/100*s.factor_DVs

"""Store the decision variables and boundary conditions as .mat files"""
subsys_path = Init.path_res +'\\'+Init.name_wkdir+'\\' + s._name
Expand All @@ -123,7 +123,7 @@ def Obj(values_DVs, BC, s):
simStat = dymola.simulateExtendedModel(
problem=s._model_path,
startTime=Init.start_time,
stopTime=Init.stop_time,
stopTime=s._pred_hor,
outputInterval=Init.incr,
method="Dassl",
tolerance=Init.tol,
Expand All @@ -134,7 +134,7 @@ def Obj(values_DVs, BC, s):
simStat = dymola.simulateExtendedModel(
problem=s._model_path,
startTime=Init.start_time,
stopTime=Init.stop_time,
stopTime=s._pred_hor,
outputInterval=Init.incr,
method="Dassl",
tolerance=Init.tol,
Expand Down Expand Up @@ -171,13 +171,12 @@ def Obj(values_DVs, BC, s):
import functions.fuzzy as fuz

traj = BC[0] + 273.15
Tset = fuz.control(s._initial_values[2],1)
Tset = fuz.control(s._initial_values[1],0)
output_list = []

if s._output_vars is not None:
output_traj = [traj, (0.3+random.uniform(0.0,0.01))]
output_traj = [traj, (0.3+random.uniform(0.0,0.01))]

output_list = output_traj
output_list = output_traj

print(values_DVs)
print(BC[0])
Expand All @@ -187,7 +186,7 @@ def Obj(values_DVs, BC, s):

### Linear model ###
elif s._model_type == "lin":
traj = values_DVs/100*40 + 273.15
traj = float(s.factor_DVs[0]*values_DVs/100 + s.start_DVs[0]) + 273.15
Tset = 303

if s._output_vars is not None:
Expand Down

0 comments on commit c358446

Please sign in to comment.