如何使用 IPOPT 在 Pyomo 中指定渐变

How to specify gradient in Pyomo with IPOPT

主要问题

在 Pyomo 中求解 NLP 时,使用 IPOPT 作为求解器,我如何告诉 IPOPT objective 函数 and/or 约束的梯度是什么?我必须传递一个 returns objective 值的可调用函数——我也可以传递一个评估梯度的可调用函数吗?

次要问题

Pyomo+IPOPT默认是怎么处理的?当我用 Pyomo+IPOPT 解决一个简单的 NLP 时,IPOPT 输出的一部分包括 "number of objective gradient evaluations"...但是它是如何评估梯度的?数值有限差分之类的?

我将 Pyomo 5.6 与 Python 3.6 和 IPOPT 3.7 一起使用。

Pyomo 使用 Ampl 求解器库 (ASL) 中的自动微分功能提供一阶和二阶导数信息。调用 IPOPT 时,Pyomo 使用 ASL 读取并链接到 IPOPT 的“.nl”文件格式输出您的模型。因此,您无需执行任何操作即可提供渐变信息,这是自动完成的。

后面的算法叫做Autodiff。基本上,它通过使用表示为原子函数图(加法、减法、乘法、除法,也许还有 exp 和 log)来计算任何函数的梯度。然后它使用来自微积分的链式法则来计算关于任何输入的整个梯度。