簡體   English   中英

在pyomo中如何從目標函數中提取二階導數

[英]In pyomo how can one extract the second derivative from the objective function

我正在使用 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 信息。

如果你想要符號導數,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) ]

當然,鑒於您的表達式是二次的,符號微分和數值微分都會給您相同的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM