Как мне указать конкретные точки для дискретизации в Pyomo?

У меня есть модель 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, ...

Как я могу указать баллы, которые будут включены в дискретизацию?

1 ответ

Вы можете заставить дискретизатор включать определенные точки, добавляя их в ContinuousSet перед дискретизацией модели (см. онлайн документацию). Самый простой способ для вашего конкретного случая - это включить точки в список инициализации:

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, ...
Другие вопросы по тегам