【问题标题】:Defining cyclic/periodic boundary conditions in Pyomo constraints在 Pyomo 约束中定义循环/周期性边界条件
【发布时间】:2020-04-11 09:42:56
【问题描述】:

我正在尝试在利用循环条件的 Pyomo 模型上定义一个约束。以下是我认为它应该如何工作(来自 GAMS 的循环语法)。

from __future__ import division
from pyomo.environ import *

model = ConcreteModel()

## define sets
model.t                 = Set(initialize = [i for i in range(8760)]) 

## define variables
model.ESS_SOC           = Var(model.t, domain = NonNegativeReals) # battery state of charge
model.ESS_c             = Var(model.t, domain = NonNegativeReals) # battery charging
model.ESS_d             = Var(model.t, domain = NonNegativeReals) # battery discharging

## skip obj for this example

## define constraints
#SOC constraint
model.SOC_const = ConstraintList()
for i in model.t: 
    model.SOC_const.add( model.ESS_SOC[i] == model.ESS_SOC[i--1] + model.ESS_c[i] - model.ESS_d[i] )

但是当我运行上面的示例时,我收到以下错误消息:

KeyError: "Index '8760' is not valid for indexed component 'ESS_SOC'"

我同意给定model.t 的定义的错误,但该错误让我相信它几乎正在做我想要它做的事情,那就是:

model.ESS_SOC[0] == model.ESS_SOC[8759] + model.ESS_c[0] - model.ESS_d[0]
model.ESS_SOC[1] == model.ESS_SOC[0] + model.ESS_c[1] - model.ESS_d[1]
...
model.ESS_SOC[8759] == model.ESS_SOC[8758] + model.ESS_c[8759] - model.ESS_d[8759] 

有没有办法定义约束,这就是我得到的?

【问题讨论】:

    标签: python optimization constraints pyomo cyclic


    【解决方案1】:

    我建议使用索引约束而不是ConstraintList

    from __future__ import division
    from pyomo.environ import *
    
    model = ConcreteModel()
    
    ## define sets
    model.t                 = Set(initialize = [i for i in range(8760)], ordered=True) 
    
    ## define variables
    model.ESS_SOC           = Var(model.t, domain = NonNegativeReals) # battery state of charge
    model.ESS_c             = Var(model.t, domain = NonNegativeReals) # battery charging
    model.ESS_d             = Var(model.t, domain = NonNegativeReals) # battery discharging
    
    ## skip obj for this example
    
    ## define constraints
    #SOC constraint
    def _SOC_const(m, i):
        if i == m.t.first():
            return model.ESS_SOC[i] == model.ESS_SOC[m.t.last()] + model.ESS_c[i] - model.ESS_d[i]
        return model.ESS_SOC[i] == model.ESS_SOC[i-1] + model.ESS_c[i] - model.ESS_d[i]
    model.SOC_const = Constraint(model.t, rule=_SOC_const)
    

    请注意,您需要在Set 上设置ordered=True 选项才能使first()last() 方法起作用。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2016-06-24
      • 2019-04-02
      • 2016-10-30
      • 2015-10-29
      • 2019-10-07
      • 2020-03-19
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多