将目标和jacobian结合在一起以使Python的scipy最小化

时间:2019-07-20 10:31:13

标签: python scipy scipy-optimize

我想知道是否可以使用一个同时返回目标值和jacobian的函数,以便该程序不必两次计算某些值。

我想在Python的scipy优化最小化例程中使用它。在示例https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html中,他们没有这样做,所以我只是想知道是否有可能。

我正在寻找的东西是这样的:

 def obj_jac(c1):
    A2 = RR*A1 + y1 - c1

    obj = some_fun1(A2)
    jac = some_fun2(A2)
    return obj,jac

然后:

  sol = minimize(obj_jac[0],c1_0,jac=obj_jac[1])

目标是obj_jac的第一个返回值,而jacobian是第二个。但是,以上格式给出了错误:“ TypeError:'function'对象不可下标”。

这是当前有效的代码,但是两次计算A2:

 def obj_fun(c1):

    A2 = RR*A1 + y1 - c1

    obj = some_fun1(A2)
    return obj


 def jac_fun(c1):

    A2 = RR*A1 + y1 - c1

   jac = some_fun2(A2)
   return jac


sol = minimize(obj_fun,c1_0,jac=jac_fun)

是否有避免两次计算A2的方法? (这只是一个非常简单的示例)。

1 个答案:

答案 0 :(得分:2)

minimize的文档说:

  

jac{callable, ‘2-point’, ‘3-point’, ‘cs’, bool}, optional

     

如果jac是布尔值且为True,则假定将fun与目标函数一起返回。

所以只需使用:

sol = minimize(obj_jac, c1_0, jac=True)

请参阅https://stackoverflow.com/a/37735355/1358308