变量[t]的未初始化NumericValue对象没有值-Pyomo

问题描述

我是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模型吗?我的意思是储能系统。