Я относительно новичок в Pyomo и сейчас тестирую модель оптимизации энергопотребления. Я могу определить все цели и ограничения, но при попытке решить я получаю следующую ошибку:
'ValueError: Нет значения для неинициализированного объекта NumericValue x [batt]'
Вот соответствующие части мой код (вещи, которые я не считаю релевантными, я просто заполнил ... для экономии места):
ders = ["pv", "batt"]
model = ConcreteModel()
model.x = Var(ders, within = NonNegativeReals)
model.p_pv_load = Var(tsIndex, within = NonNegativeReals)
model.p_pv_grid = Var(tsIndex, within = NonNegativeReals)
model.p_pv_batt = Var(tsIndex, within = NonNegativeReals)
model.p_batt_load = Var(tsIndex, within = NonNegativeReals)
model.p_batt_grid = Var(tsIndex, within = NonNegativeReals)
model.soc_batt = Var(tsIndex, within = NonNegativeReals)
model.p_grid_load = Var(tsIndex, within = NonNegativeReals)
model.p_grid_batt = Var(tsIndex, within = NonNegativeReals)
#obj
def obj_rule(model):
return sum(... for ts in tsIndex)
model.obj = Objective(rule = obj_rule, sense = maximize)
#Some potentially relevant Constraints
maxPV = Constraint(expr = model.x["pv"]<=400)
maxBat= Constraint(expr = model.x["batt"]<=400)
socMin = 0.1*model.x["batt"]
socMax = 0.9*model.x["batt"]
socIni = socMin
batt_pMax=model.x["batt"]/3
#Discharge
def battDisc_rule(model, ts):
if ts==0:
return (((model.p_batt_load[ts]+model.p_batt_grid[ts])*(timestep/60))/sqrt(effR_bat) <= model.soc_batt[ts])
else:
return (((model.p_batt_load[ts]+model.p_batt_grid[ts])*(timestep/60))/sqrt(effR_bat) <= model.soc_batt[ts-1])
model.battDisc = Constraint(tsIndex, rule = battDisc_rule)
#Charge
def battCh_rule(model, ts):
if ts==0:
return ((model.p_pv_batt[ts]+model.p_grid_batt[ts])*(timestep/60))*sqrt(effR_bat) <= socMin-model.soc_batt[ts]
else:
return ((model.p_pv_batt[ts]+model.p_grid_batt[ts])*(timestep/60))*sqrt(effR_bat) <= socMin-model.soc_batt[ts-1]
model.battCh = Constraint(tsIndex, rule = battCh_rule)
#Soc
def socBounds_rule(model, ts):
return inequality(socMin, model.soc_batt[ts], socMax)
model.socBounds = Constraint(tsIndex, rule = socBounds_rule)
def update_SOC(model, ts):
if ts==0:
return model.soc_batt[ts]==socIni
else:
return model.soc_batt[ts] == model.soc_batt[ts-1]+(((model.p_pv_batt[ts]+model.p_grid_batt[ts]*sqrt(effR_bat))-((model.p_batt_load[ts]+model.p_batt_grid[ts])/sqrt(effR_bat)))*(timestep/60))
model.updateSOC = Constraint(tsIndex, rule=update_SOC)
def chPower_rule(model, ts):
return model.p_pv_batt[ts]+model.p_grid_batt[ts]*sqrt(effR_bat) <= batt_pMax
model.chPower = Constraint(tsIndex, rule=chPower_rule)
def dchPower_rule(model, ts):
return model.p_batt_load[ts]+model.p_batt_grid[ts]/sqrt(effR_bat) <= batt_pMax
model.dchPower = Constraint(tsIndex, rule=dchPower_rule)
Я не понимаю сообщение об ошибке, поскольку, конечно, x [batt] не инициализирован так как это одна из переменных решения.
Странно, но в JuMP's JuMP я могу запустить его, используя точно такой же GLPK-решатель и описание модели.
Большое спасибо за вашу помощь заранее.