Pyomo Blocks:关于时间相关问题的索引与非索引块

时间:2018-05-21 15:32:26

标签: block pyomo

Pyomo书提出了这种时间相关问题的块结构。 The electrical grid model can

有一个Pyomo Block'电网模型'对于每个时间步重复,意味着按时间序列索引。

model.T = range(120)

def electrical_grid_block(grid, t):
    <containing: bus, transmission line, generator>
model.Grid = Block(model.T,rule=electrical_grid_block)

对我来说完全有道理,直到我想要模拟必须引用过去时间步的块。例如,存储需要从上次时间步开始的存储级别的值。我想到的唯一解决方案:跳过索引块的想法并将时间序列传递到存储块中,如下所示:

def storage(s):
    s.storage_level = Var(model.T, bounds=(0,300))
    s.power = Var(model.T, bounds=(-2,2))

    # Constraints
    def constr_rule_speicher(s,t):
        if t >= 2:
            return s.storage_level[t] == - s.power[t] * dt + s.storage_level[t-1]
        elif t == 1:
            return s.storage_level[t] == 150.0
    s.storage_constraints = Constraint(model.T, rule=constr_rule_speicher)

model.storage = Block(rule=storage)

我不太喜欢这个解决方案,因为我相信问题建模的面向对象方式会丢失。

我的任何不同的想法?

不幸的是,Pyomo周围的文档没有给出这种情况的任何例子。

1 个答案:

答案 0 :(得分:1)

已经很晚了,但是我在一些有关Pyomo的讲座中找到了一个例子(Pyomo研讨会的资料来自2018年,但发布问题之后)。可以在此处找到一个示例(pdf幻灯片187):https://software.sandia.gov/downloads/pub/pyomo/Pyomo-Workshop-Summer-2018.pdf。这个想法大概是这样的:

model.T = range(120)

def electrical_grid_block(grid, t):
    <containing: bus, transmission line, generator>
model.Grid = Block(model.T,rule=electrical_grid_block)

def past_step_rule(m, t):
    if t == m.T.first():
        return Constraint.Skip
    return m.Grid[t].storage_level == m.Grid[t].power*dt - m.Grid[t-1].storage_level
model.past_step = Constraint(model.T, rule=past_step_rule)

简而言之,需要两个(或更多)时间步长的约束是在模块外部定义的。