我希望能够在pyomo中将积分定义为目标函数的一部分。

我无法弄清楚积分需要哪种表达。
这是我最好的猜测:

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)


错误是: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.

但是,我不明白为什么积分内部的表达式是一个问题,因为这些变量似乎可以由索引model.t完全索引:

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


我误会了吗?

到目前为止,我已经参考了一些资源:

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

我愿意接受有关pyomo其他资源的建议/链接。

最佳答案

Gabe是正确的,这确实是Integral类中的错误,并且已在github存储库中修复。示例模型中的另一个错误是Objective组件的规范。您应该使用“ rule”关键字而不是“ expr”

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


另外,我想重申pyomo.dae的在线文档中提到的内容。整体组件是一个原型,尚未完全开发。我不建议将其用于需要高精度解决方案的复杂积分或模型。积分类使用梯形规则进行数值积分。我建议将您问题中的所有积分转换为微分方程,并使用提供的自动离散化变换解决它们。

关于python - 如何在pyomo中将积分定义为目标函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39908555/

10-09 01:15