使用2个参数最小化函数

时间:2018-04-23 15:07:20

标签: python scipy minimize

我正在尝试使用2个参数最小化函数:

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_gamma只是代码的常量。

2 个答案:

答案 0 :(得分:1)

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

我认为问题在于如何传递参数。 x0 = [1.,1.]x0指定为包含2个值的列表,即一个实体。但是,在chi_square_fv中,输入是两个单独的值而不是列表。

您可以尝试更改chi_square_fv功能:

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

答案 1 :(得分:0)

如果您read docs最小化,您会找到可选的minimize(chi_square_fv, x0, args=(cv,)) 参数(并且还会看到@ sacha的评论)

因此,由于您的两个参数的功能并且您希望在其中一个参数中最小化它,您需要为其他参数传递值

cv

将一些chi_square_fv值作为第二个参数传递给函数{{1}}