Python 二元极小化函数

Python 二元极小化函数,python,scipy,minimize,Python,Scipy,Minimize,我试图最小化一个有两个参数的函数: def c_Gamma_gamma_fv(cf, cv): return np.abs((4 * eta_gamma * charges**2 * a_q * cf).sum() + 4.* cf *a_tau/3. + a_w * cv)**2/Gamma_gamma def mu_fv(cf, cv): return np.array([cf**4, cf**2 * cv**2, cf**2 * c_Gamma_gamma_fv(cf,

我试图最小化一个有两个参数的函数:

def c_Gamma_gamma_fv(cf, cv):
    return np.abs((4 * eta_gamma * charges**2 * a_q * cf).sum() + 4.* cf *a_tau/3. + a_w * cv)**2/Gamma_gamma

def mu_fv(cf, cv):
    return np.array([cf**4, cf**2 * cv**2, cf**2 * 
c_Gamma_gamma_fv(cf, cv), cv**2 * c_Gamma_gamma_fv(cf, cv), cf**4, cv**2 * cf**2, cf**2 * cv**2,
                 cv**4, cv**2 * cf**2, cv**4])

def chi_square_fv(cf, cv):
    return ((mu_fv(cf, cv) - mu_data) @ inv_cov @ (mu_fv(cf, cv) - mu_data))

x0 = [1., 1.]
res_fv = minimize(chi_square_fv, x0)
但是,我得到了错误“TypeError:chi_square_fv()缺少1个必需的位置参数:'cv'”。但是,当我执行以下操作时:

print(chi_square_fv(1.,1.))
我得到输出

38.8312698786

我不理解这一点,而且我对这类程序还不熟悉。我该如何进行?OBS:Gamma\u Gamma只是代码中的一个常量。

由于您没有向我们提供代码中的所有变量值,我不得不猜测

我认为问题在于如何传递参数
x0=[1,1.]
x0
指定为一个包含两个值的列表,这是一个实体。但是,在您的
卡方图fv
中,输入是两个独立的值,而不是列表

您可以尝试更改
chi_square\u fv
功能:

def chi_square_fv(clist):
    cf, cv = clist
    return ((mu_fv(cf, cv) - mu_data) @ inv_cov @ (mu_fv(cf, cv) - mu_data))
如果启用最小化,您将找到可选的
args
参数(还可以查看@sacha的注释)

因此,由于您的函数包含两个参数,并且您希望在其中一个参数上最小化它,所以您需要为另一个参数传递值

minimize(chi_square_fv, x0, args=(cv,))

它将把一些
cv
值作为第二个参数传递给函数
chi_square\u fv

您尝试的
minimize(chi_square\u fv,x0,args=(cv,)
?(假设你有cv;如果没有,你可能想准备你的函数,将x解压到你需要的变量中;但是从你不完整的例子中很难读出:第一个参数x总是决策变量的(平面)向量)是的,我试图最小化与2个参数相关的函数。将它们转换为向量解决了问题。非常感谢您的时间和帮助!使用解包可以减少一行,尽管
cf,cv=clist
@Roushan,同意。这很有效!非常感谢您的时间!现在我理解了我的错误!