2017-10-04 56 views
1

我正與pyomo一起工作,並且已經定義了一個模型,並帶有一個目標函數可供使用。在模型解決之後,目標函數具有附加的某些參數。所以,如果我有一個多指標變量[x1, x2, x3],我的二次目標函數將假設如下所示:(x1^2 + 13*x2^2 + 10*x3^2) + (2*x1 +......)在pyomo中如何從目標函數中提取二階導數

我的問題是:鑑於我實際上可以從目標中以字符串格式訪問這個表達式,有沒有辦法獲得這個函數關於所有變量的二階導數?

回答

1

有兩種方法可以在Pyomo中獲得派生信息。

如果您需要單點數值導數,您可以使用類似於「gjh_asl_json」工具(https://github.com/ghackebeil/gjh_asl_json)的工具,該工具可以獲取由Pyomo生成的NL文件並生成雅可比和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) ] 

當然,考慮到你的表情是二次的,符號和數字的分化都將給予你同樣的回答。

+0

我會試試這個,謝謝 –

+0

不幸的是,這個失敗時會出現'invalid syntax'錯誤。我的表達式對於解析器來說太複雜了,或者變量名稱有問題。太糟糕了,因爲它看起來是如此優雅的解決方案 –

+0

你可以提供一些關於'invalid syntax'錯誤的更多細節嗎? –