2017-10-04 74 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'错误的更多细节吗? –