问题描述
我是Pyomo的新手,并试图找到一种方法来优化我的电池算法,使其具有未定义的电池容量(Smax)和逆变器尺寸(Rmax)。
我的目标是找到Smax和Rmax的组合,以最大程度地减少电池的总充电成本。
但是我得到这个错误: “未初始化的NumericValue对象Ein [0]没有值”
这是我的代码:
############################################# ######################
model = ConcreteModel()
# Define model parameters
model.T = Set(doc='hour of the period',initialize=df.hour.tolist(),ordered=True)
model.Rmax = Var( within=PositiveIntegers )
model.Smax = Var( within=PositiveIntegers )
model.Ein = Var(model.T,bounds = (0,None)) " Energy charged in battery at period t"
model.Eout = Var(model.T,None)) "Energy discharged from battery at period t"
model.Z = Var(model.T,None)) "Energy stored in battery at the end of the hour
model.L = Var(model.T) "Energy bought from the grid at every period t"
# DEFINE ALL CONSTRAINTS OF THE MODEL
"Initial storage state = 0 and constraint on SOC flow"
def storage_state(model,t):
if t == model.T.first():
return model.Z[t] == 0
else:
return (model.Z[t] == (model.Z[t-1] + (model.Ein[t]) - (model.Eout[t])))
model.charge_state = Constraint(model.T,rule=storage_state)
"Max SOC constraint"
def SOC_maxconstraint(model,t):
return model.Z[t] <= model.Smax
model.soC_maxconstraint = Constraint(model.T,rule=SOC_maxconstraint)
"Min SOC constraint"
def SOC_minconstraint(model,t):
return model.Z[t] >= 0
model.soC_minconstraint = Constraint(model.T,rule=SOC_minconstraint)
"Maximum dischage within a single hour"
def discharge_constraint(model,t):
return model.Eout[t] <= model.Rmax
model.discharge = Constraint(model.T,rule=discharge_constraint)
"Maximum charge within a single hour"
def charge_constraint(model,t):
return model.Ein[t] <= model.Rmax
model.charge = Constraint(model.T,rule=charge_constraint)
"Limit discharge to the amount of the charge in the battery"
def positive_charge(model,t):
return model.Eout[t] <= model.Z[t]
model.positive_charge = Constraint(model.T,rule=positive_charge)
"Demand of energy constraint"
def demand_constraint(model,t):
return (model.L[t] == (df.loc[t,'MktDemand'] + (model.Ein[t]) - (model.Eout[t])))
model.demand_constraint = Constraint(model.T,rule=demand_constraint)
"Non-negativity of total demand"
def negativity_demand_constraint(model,t):
return model.L[t] >= 0
model.negativity_demand_constraint = Constraint(model.T,rule=negativity_demand_constraint)
## Objective function
original_costs = sum(df.loc[t,'TOU'] * df.loc[t,'MktDemand'] for t in model.T)
model.costs = sum(df.loc[t,'TOU'] * (df.loc[t,'MktDemand'] + (model.Ein[t]) - (model.Eout[t]))
for t in model.T)
model.objective = Objective(expr=model.costs,sense=minimize)
results = SolverFactory('glpk').solve(model)
print("Profits % =",round((model.objective() / original_costs ) * 100,2))
print("Smax:",model.Smax.get_values().values())
print("Rmax:",model.Rmax.get_values().values())
我得到:
pyomo\core\expr\numvalue.pyx in pyomo.core.expr.numvalue.value()
ValueError: No value for uninitialized NumericValue object Ein[0]
你们知道我做错了吗?
谢谢!
解决方法
通常这意味着您的求解器没有得到结果。因此,基本上,如果这是错误,通常是不可行的。
也许尝试使用tee = True来查看求解器信息。
solver = SolverFactory('glpk')
结果= resolver.solve(model,tee = True)
如果它表明您的模型不可行,则说明您的约束条件,界限或其他问题(我没有看过方程式)
,您要建立ESS模型吗?我的意思是储能系统。