有两种方法可以在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'错误的更多细节吗? –