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
隐藏多余的变量。不过,我不会称之为更优雅。
我想用 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
隐藏多余的变量。不过,我不会称之为更优雅。