python - 在 pyomo 中如何从目标函数中提取二阶导数

标签 python derivative pyomo

我正在使用 pyomo,并且已经定义了一个模型,并带有一个目标函数。模型求解后,目标函数就附加了某些参数。所以如果我有一个多索引变量 [x1, x2, x3] ,我的二次目标函数看起来像这样:(x1^2 + 13*x2^2 + 10*x3^2) + (2*x1 +......)

我的问题是:鉴于我实际上可以从目标中以字符串格式访问此表达式,是否有任何方法可以获得此函数相对于所有变量的二阶导数?

最佳答案

Pyomo 中有两种获取衍生信息的方法。

如果您需要单点的数值导数,您可以使用“gjh_asl_json”工具( https://github.com/ghackebeil/gjh_asl_json )之类的工具,它可以获取 Pyomo 生成的 NL 文件,并生成包含 Jacobian 和 Hessian 信息的 JSON 文件。

如果您想要符号导数,Pyomo 可以直接提供这些导数,前提是您还安装了 sympy:

from pyomo.core.base.symbolic import differentiate
from pyomo.core.base.expr import identify_variables
# assuming model.objective is your Objective component
varList = list( identify_variables(model.objective.expr) )
firstDerivs = differentiate(model.objective.expr, wrt_list=varList)
# Note this calculates d^2/dx_i^2; if you want the full Hessian matrix
#   ( \delta^2/{\delta x_i \delta x_j} ) replace "wrt=v" with "wrt_list=varList"
secondDerivs = [ differentiate(firstDerivs[i], wrt=v) for i,v in enumerate(varList) ]

当然,鉴于您的表达式是二次的,符号微分和数值微分都会给您相同的答案。

关于python - 在 pyomo 中如何从目标函数中提取二阶导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46570022/

相关文章:

python - Pyomo 特定范围的约束

c++ - 多项式积分的自动偏导数

python - Pyomo:使用python脚本时,有没有快速的方法可以在解决ILP后显示目标值?

python-3.x - 在python中为cplex求解器pyomo设置optimalitytarget参数

python - python中的命名坐标

检索函数的积分表达式

python - 为什么这个与门神经网络没有朝着最佳权重方向发展?

python - 难以捕获执行就地状态更新的子流程的输出

python - 如何使用 boto 检查 python (django) 应用程序是否正在 EC2 中运行?

python - 使用 Python/Scrapy 处理返回 HTTP 500 代码的页面