Ошибка значения Pyomo: нет значения для неинициализированного объекта NumericValue - PullRequest
0 голосов
/ 16 апреля 2020

Я относительно новичок в 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-решатель и описание модели.

Большое спасибо за вашу помощь заранее.

1 Ответ

0 голосов
/ 17 апреля 2020

Проблема заключалась в функции ограничения неравенства () в сочетании с тем, что я дважды забыл добавить «модель» в объявление ограничения.

...