如何在Pyomo中指定离散化的特定点?

2024-10-02 00:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个连续时间的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, ...

如何指定要包含在离散化中的点?你知道吗


Tags: from模型importdefaultparam时间environcomponent
1条回答
网友
1楼 · 发布于 2024-10-02 00:29:11

在对模型进行离散化之前,可以通过将特定点添加到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, ...

相关问题 更多 >

    热门问题