首页 文章

在pyomo中如何从目标函数中提取二阶导数

提问于
浏览
1

我正在使用pyomo,并且已经定义了一个模型,具有与之相关的目标函数 . 模型解决后,目标函数附加了某些参数 . 所以如果我有一个多索引变量 [x1, x2, x3] ,我的二次目标函数会看起来像这样: (x1^2 + 13*x2^2 + 10*x3^2) + (2*x1 +......) .

我的问题是:鉴于我实际上可以从目标中以字符串格式访问此表达式,有没有办法获得关于所有变量的此函数的二阶导数?

1 回答

  • 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) ]
    

    当然,鉴于你的表达式是二次的,符号和数字区分都会给你相同的答案 .

相关问题