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,同意。这很有效!非常感谢您的时间!现在我理解了我的错误!