【问题标题】:How to define an Integral as an objective function in pyomo?如何在pyomo中将积分定义为目标函数?
【发布时间】:2017-02-15 22:33:58
【问题描述】:

我希望能够将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 的其他资源的建议/链接。

【问题讨论】:

    标签: python pyomo


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨@BethanyNicholson,这个问题在新版本的pyommo中修复了吗?
    • 是的,此错误已在最新的 Pyomo 版本中修复
    • 那么,如何将积分转换为微分方程? @BethanyNicholson,对此有何建议?
    • 没有自动基础设施,您必须手动重新制定模型。看这里:gauravtiwari.org/2014/12/20/integral-differential-equations
    【解决方案2】:

    这看起来像一个错误。你应该在这里开票:https://github.com/Pyomo/pyomo/issues

    【讨论】:

    • 也许你可以给我看一个有效积分表达式的例子?你怎么知道这是一个错误?
    • 抱歉,我没有任何使用Integral 的示例。也许 pyomo.dae 的维护者之一会在稍后加入。
    • 但是,我确信Integral 组件错误地调用了基类构造函数,因此您应该开一张票以确保该包的开发人员知道该问题。跨度>
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2022-01-19
    • 2020-07-01
    • 2021-08-04
    • 2021-08-27
    • 2018-11-16
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多