我想用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()接受2个位置参数,但给出了3个位置参数,因为优化将y和z传递给J。
有什么方法可以定义我想传递给f的参数,以及我想传递给J的参数?
((一个选择是将f和J定义为具有相同的参数,而忽略该函数不需要的参数,但我希望有一种更优雅的方法)]
根据manual,雅可比行列式是带有签名的可调用项
J(x, *args)
其中args
在您的示例中明确是固定参数args=(y,z)
。所以no通常。另一方面,没有什么可以阻止您写作:
def J(x, y, z):
return 2*x + y**3
而且我在这里看不到任何“模糊”。如果您真的想要,可以拥有:
def J(x, *args):
return 2*x + args[0]**3
隐藏其他变量。不过,我不会说这更优雅。