有兩種方法可以在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) ]
當然,考慮到你的表情是二次的,符號和數字的分化都將給予你同樣的回答。
我會試試這個,謝謝 –
不幸的是,這個失敗時會出現'invalid syntax'錯誤。我的表達式對於解析器來說太複雜了,或者變量名稱有問題。太糟糕了,因爲它看起來是如此優雅的解決方案 –
你可以提供一些關於'invalid syntax'錯誤的更多細節嗎? –