I(重复地)需要在给定点处的非线性pyomo约束con
的数值梯度信息(即,相应的pyomo模型的变量都被设置为特定值)。我已阅读this post并决定(稍加修改)行
from pyomo.core.base.symbolic import differentiate
var_list = list(model.component_objects(Var, active=True))
grad_num = [value(partial) for partial in differentiate(g_nu.body, wrt_list=vars)]
应该符合我的目的。
但是,下面的示例已经失败,可能是由于指数函数的出现:
from pyomo.environ import *
model = ConcreteModel()
model.x_1 = Var()
model.x_2 = Var()
model.constr = Constraint(expr = 2*(model.x_1)**4+exp(model.x_2)<=3)
model.x_1.set_value(1)
model.x_2.set_value(1)
varList = list(model.component_objects(Var, active=True))
grad = [value(partial) for partial in differentiate(model.constr.body, wrt_list=varList)]
DeveloperError:内部Pyomo实现错误: &#34;同情表达类型&#39; exp&#39;在表达式&gt; exp(x1)&#34;的运算符映射中找不到 请向Pyomo开发者报告。
所以,我的问题是:pyomo一般可以区分像指数函数/平方根等表达式,并且我的例子只是一个可以很容易修复的不幸巧合吗?我将处理来自MINLPLIB的各种模型,并且用于区分出现的表达式的一些工具是至关重要的。
答案 0 :(得分:2)
此错误通过Pyomo 5.2存在,并在Pyomo 5.3中得到解决。升级到5.3修复了问题,您的示例正常工作(添加from pyomo.core.base.symbolic import differentiate
后)。