【问题标题】:How do I specify particular points for discretization in Pyomo?如何在 Pyomo 中指定离散化的特定点?
【发布时间】:2016-06-11 23:31:08
【问题描述】:

我有以下形式的连续时间 Pyomo 模型:

from pyomo.environ import *
from pyomo.dae import *

m      = ConcreteModel()
m.t    = ContinuousSet(bounds=(0,150)) 
m.T    = Param(default=150)
m.S    = Var(m.t, bounds=(0,None))
m.Sdot = DerivativeVar(m.S)

discretizer = TransformationFactory('dae.collocation')
discretizer.apply_to(m,nfe=100,ncp=3,scheme='LAGRANGE-RADAU')

m.obj  = Objective(expr=m.S[122],sense=maximize)

但是,当我运行上面的代码时,我得到了以下错误:

KeyError: "Error accessing indexed component: Index '120' is not valid for array component 'S'"

查看list(m.t),我看到,果然没有将122作为离散化点包括在内:

..., 121.73257700000001, 122.467423, ...

如何指定要包含在离散化中的点?

【问题讨论】:

    标签: python optimization pyomo


    【解决方案1】:

    您可以通过将特定点添加到ContinuousSet 来强制离散化器包含特定点对模型进行离散化之前(参见在线documentation)。对于您的特定情况,最简单的方法可能是将这些点包含在初始化列表中:

    m.t = ContinuousSet(bounds=(0,150), intialize=[122])
    print list(m.t)
    # [0, 122, 150]
    
    m.S    = Var(m.t, bounds=(0,None))
    m.Sdot = DerivativeVar(m.S)
    discretizer = TransformationFactory('dae.collocation')
    discretizer.apply_to(m,nfe=100,ncp=3,scheme='LAGRANGE-RADAU')
    print list(m.t)
    # ..., 121.323184, 122, 122.271339, ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 2014-12-06
      • 1970-01-01
      • 2019-09-09
      • 2013-11-01
      • 1970-01-01
      • 2017-05-30
      • 2023-01-19
      相关资源
      最近更新 更多