2016-06-11 2 views
0

J'ai un modèle Pyomo temps continu de la forme:Comment spécifier des points particuliers pour la discrétisation dans 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) 

Mais, quand je lance le code ci-dessus, je reçois l'erreur suivante:

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

regardant list(m.t), je vois que , bien sûr, 122 ne sont pas inclus comme point de discrétisation:

..., 121.73257700000001, 122.467423, ... 

Comment puis-je spécifier des points à inclure dans la discrétisation?

Répondre

1

Vous pouvez forcer le discretizer à inclure des points spécifiques en les ajoutant à la ContinuousSetavant discrétisation le modèle (voir la ligne documentation). Le moyen le plus simple pour votre cas particulier est probablement d'inclure les points dans une liste d'initialisation:

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, ...