首页 文章

如何在pyomo中将Integral定义为目标函数?

提问于
浏览
1

我希望能够在 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 的其他资源的建议/链接持开放态度 .

2 回答

  • 1

    Gabe是对的,这确实是Integral类中的一个错误,它已在github存储库中修复 . 示例模型中的另一个错误是Objective组件的规范 . 你应该使用'rule'关键字而不是'expr'

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

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

  • 2

    这看起来像一个bug . 你应该在这里打开一张票:https://github.com/Pyomo/pyomo/issues

相关问题