Как мне указать конкретные точки для дискретизации в 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, ...