2016-10-07 2 views
0

Je veux être en mesure de définir une intégrale dans pyomo dans le cadre d'une fonction objectif.Comment définir un Integral comme une fonction objective dans pyomo?

Je ne peux pas comprendre quel type d'expression est nécessaire pour l'intégrale.
Voilà ma meilleure estimation:

model = ConcreteModel() 
model.t = ContinuousSet(bounds = (0,1)) 
model.y = Var(model.t) 
model.dydt = DerivativeVar(model.y, wrt=(model.t)) 

def myintegral(model,i): 
    return model.dydt[i] 

model.n = Integral(model.t, wrt=model.t, rule=myintegral) # this line is the trouble 

def myobjective(model): 
    return model.n 

model.obj = Objective(rule=myobjective) 

L'erreur est: TypeError: A callable type that is not a Pyomo expression can not be used to initialize an Expression object. Use 'rule' to initalize with function types.

Mais, je ne comprends pas pourquoi l'expression à l'intérieur de l'intégrale est un problème, car ces variables semblent être totalement indexable par l'indice model.t:

# but, this is totally fine: 
print model.dydt[0] 
print model.dydt[1] 

Suis-je mal compris quelque chose à ce sujet?

Voici quelques ressources que je consultés au préalable:

https://groups.google.com/forum/#!topic/pyomo-forum/6RhEXEMDTPc https://software.sandia.gov/downloads/pub/pyomo/PyomoOnlineDocs.html#_parameters https://projects.coin-or.org/Coopr/browser/pyomo/trunk/examples/dae/Heat_Conduction.py?rev=9315

Je suis ouvert aux suggestions/liens sur d'autres ressources sur pyomo.

Répondre

1

Cela ressemble à un bug. Vous devriez ouvrir un ticket ici: https://github.com/Pyomo/pyomo/issues

+0

Peut-être pouvez-vous me montrer un exemple d'expression intégrale valide? Comment savez-vous que c'est un bug? – simple

+1

Désolé, je n'ai aucun exemple utilisant 'Integral'. Peut-être que l'un des mainteneurs de pyomo.dae interviendra plus tard. –

+1

Cependant, je suis certain que le composant 'Integral' appelle incorrectement le constructeur de la classe de base, donc vous devriez ouvrir un ticket pour vous assurer que le développeur de ce paquet est conscient du problème. –

2

Gabe a raison, c'est effectivement un bug dans la classe Integral et il a été corrigé sur le dépôt github. Une autre erreur dans votre exemple de modèle est la spécification du composant Objective. Vous devez utiliser la « règle » mot-clé au lieu de « expr »

def myobjective(model): 
    return model.n 
model.obj = Objective(rule=myobjective) 

, je veux aussi réitérer quelque chose mentionné dans la documentation en ligne pyomo.dae. Le composant Integral est un prototype et n'est pas entièrement développé. Je ne recommande pas de l'utiliser pour des intégrales complexes ou des modèles nécessitant des solutions de haute précision. La classe Integral utilise la règle trapézoïdale pour l'intégration numérique. Je recommanderais de convertir toutes les intégrales de votre problème en équations différentielles et de les résoudre en utilisant les transformations de discrétisation automatiques fournies.

+0

Salut @BethanyNicholson, Était-ce fixé dans la nouvelle version de pyommo? – simple

+1

Oui, ce bug est corrigé dans la version la plus récente de Pyomo –

+0

Alors, comment convertir les intégrales en équations différentielles? @BethanyNicholson, des suggestions pour cela? – simple