【问题标题】:Computing the gradient of an objective function evaluated at the optimum in a dynamic optimization problem, pyomo计算动态优化问题中最优评估目标函数的梯度,pyomo
【发布时间】:2023-02-10 00:56:33
【问题描述】:
我正在计算动态非线性优化问题的解决方案,我设置了 pyomo 库。我使用一个 ConcreteModel,它有一个目标函数和几个约束,都是时间索引的。
我的目标函数采用 ScalarObjective 的形式(我正在解决一个动态一般均衡问题,我在其中寻求最大化总福利)。我想计算在给定周期 t 相对于模型变量之一的目标梯度,以最佳方式评估。我的问题是一个离散时间问题。
我尝试了很多不同的选择,向 AI 聊天机器人寻求帮助(You Chat 和 ChatGPT),但我给出的每个解决方案都是不正确的——关于这个主题,AI 聊天机器人似乎知之甚少。
我觉得库 pyomo.dae 中的某些方法可能会有所帮助,但我还没有找到解决方案。有人可以帮我吗?
【问题讨论】:
标签:
pyomo
nonlinear-optimization
derivative
【解决方案1】:
您可以使用 Pyomo 的 differentiate 函数来执行此操作。这是一个玩具示例:
import pyomo.environ as pyo
from pyomo.core.expr.calculus.derivatives import differentiate
m = pyo.ConcreteModel()
m.x = pyo.Var()
m.con = pyo.Constraint(expr=m.x<=10)
m.obj = pyo.Objective(expr=m.x**2)
pyo.SolverFactory('ipopt').solve(m)
print(pyo.value(m.x))
# -1.2528349584581178e-10
# Evaluate the derivative at current value of m.x
ddx = differentiate(m.obj, wrt=m.x)
print(ddx)
# -2.5056699169162357e-10
# Return derivative expression
ddx2 = differentiate(m.obj, wrt=m.x, mode='sympy')
print(ddx2)
# 2.0*x
您可以在此处阅读有关此功能的更多信息:https://github.com/Pyomo/pyomo/blob/main/pyomo/core/expr/calculus/derivatives.py#L31