objective 函数和使用 sp.optimize.minimize Python 的 jacobian 的不同参数

Different arguments for objective function and jacobian using sp.optimize.minimize Python

我想用 sp.optimize.minimize 在 x 上优化函数 f(x,y,z)。雅可比矩阵只依赖于 x 和 y,它就是函数 J(x,y)。 (这只是一个玩具示例)

如果我尝试:

import numpy as np
import scipy as sp

def f(x,y,z):
  return(x**2+x*y**3+z)

def J(x,y):
  return(2*x+y**3)

x0,y,z=0,1,4
sp.optimize.minimize(f,x0,args=(y,z),jac=J)

我收到错误 "J() takes 2 positional arguments but 3 were given",因为优化将 y 和 z 传递给 J。

有什么方法可以定义我想传递给 f 的参数,以及我想传递给 J 的参数吗?

(一种选择是定义 f 和 J,使它们具有相同的参数,只忽略函数不需要的参数,但我希望有更优雅的方法)

根据 manual,雅可比行列式是可调用的,带有签名

J(x, *args)

其中 args 是您示例中明确的固定参数 args=(y,z)。所以一般来说没有。另一方面,没有什么能阻止你写:

def J(x, y, z):
  return 2*x + y**3

我在这里没有看到任何东西 "inelegant"。一般我们写

df(x, y, z)/dx = f'(x, y, z)

无论如何,这适用于 f' 独立于变量之一 - 我们不知道,而且没有人对这种写作不满意。

如果你真的想要,你可以拥有:

def J(x, *args):
    return 2*x + args[0]**3

隐藏多余的变量。不过,我不会称之为更优雅。