【问题标题】:is it possible to write a nonlinear piecewise function inside the objective function in Pyomo?是否可以在 Pyomo 的目标函数中编写非线性分段函数?
【发布时间】:2021-07-29 22:03:03
【问题描述】:

我想使用 Pyomo 来解决使用 Ipopt 的非线性优化。在这方面,我在我的代码中设计了一个函数作为目标函数,它本身在其中使用另一个函数。内函数是非线性分段的,定义如下。

def U3(x,omega,U_alpha3):
       if x<=omega/U_alpha3:
              return omega*x-U_alpha3/2*x**2
       else:
              return 0.5*omega**2/U_alpha3

但是这个函数会导致这个错误:

TypeError: '<=' not supported between instances of 'IndexedComponent_slice' and 'numpy.float64'

考虑到我的决策变量位于 x 内部(即“IndexedComponent_slice”类型),而 omega 和 U_alpha3 是固定参数(即“numpy.float64”类型)

【问题讨论】:

    标签: python pyomo ipopt


    【解决方案1】:

    是的。 Ipopt 的 Pyomo NL 文件接口通过 Expr_If 表达式类支持这一点,考虑到您定义的函数的标准警告是两次连续可微分等(我们不会为您验证)。

    【讨论】:

    • 非常感谢,但是两个以上的条件呢?!为了方便起见,有什么方法可以比较“IndexedComponent_slice”和“numpy.float64”数据类型的实例?!
    • 您可以将 Expr_If 子句嵌入到其他 Expr_If 子句中,以编程方式生成更复杂的表达式。这是访问 AMPL 求解器库的一个非常低级的功能,像 Ipopt 这样的非线性求解器用于计算导数。只有在您绝对知道自己在做什么的情况下才应该使用它。
    • 感谢您的回答。我也在互联网上进行了一些搜索后,意识到当我使用 value(x) 而不是 x 时,我的错误消失了!但我不确定这个“value()”函数的用法在这里是否正确。我可以在这里使用“value()”吗?! (注意 x 是我的决策变量)
    • 不,在这里使用 value() 可能不是您想要的。您不应将这些约束规则视为求解器将看到的回调函数。它们为每个索引调用一次以收集一组静态符号表达式,然后将其转换为求解器理解的输入。在 Ipopt 的情况下,我们将这些表达式写入所谓的 NL 文件,这是构建在 AMPL 求解器库之上的求解器使用的常见输入格式。
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多