提问者:小点点

非线性pyomo约束在给定点的梯度


I(重复)需要给定点处非线性pyomo约束的数值梯度信息con(即,对应pyomo模型的变量均设置为特定值)。我读了这篇文章,并决定(稍微修改)行

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实现错误:“在表达式的运算符映射中找不到sympy表达式类型'exp'

所以,我的问题是:pyomo是否能够区分指数函数/平方根等表达式?我的例子是否只是一个不幸的巧合,很容易修复?我将处理MINLPLIB中的各种模型,一些用于区分出现的表达式的工具是至关重要的。


共1个答案

匿名用户

这个错误存在于Pyomo 5.2中,并在Pyomo 5.3中得到解决。升级到5.3修复了这个问题,并且您的示例工作正常(在从pyomo.core.base.symbolic导入区分后)。