【问题标题】:Minimizing function with 2 arguments使用 2 个参数最小化函数
【发布时间】:2018-04-23 23:18:44
【问题描述】:

我正在尝试使用 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 只是代码的一个常数。

【问题讨论】:

  • 你试过minimize(chi_square_fv, x0, args=(cv,)? (假设您有 cv;如果没有,您可能想准备函数以将 x 解压缩到所需的变量中;但这很难从您不完整的示例中读出:第一个参数 x 始终是决策变量的(平面)向量)
  • 是的,我试图最小化与 2 个参数相关的函数。将它们转换为向量解决了这个问题。非常感谢您的宝贵时间和帮助!

标签: python scipy minimize


【解决方案1】:

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

我认为问题在于您如何传递参数。 x0 = [1.,1.]x0 指定为具有 2 个值的列表,即 ONE 实体。但是,在您的 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))

【讨论】:

  • 虽然cf,cv = clist使用解包可以减少一行
  • @Roushan,同意。
  • 这成功了!非常感谢您的宝贵时间!现在我明白我的错误了!
【解决方案2】:

如果您 read docs 最小化,您会发现可选的 args 参数(另请参阅 @sacha 的评论)

因此,由于您的函数包含两个参数,并且您希望将其中一个参数最小化,因此您需要为其他参数传递值

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

这会将一些cv 值作为第二个参数传递给函数chi_square_fv

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 2016-07-22
    • 2019-03-21
    • 2019-06-12
    • 2020-05-16
    • 1970-01-01
    • 2018-01-30
    • 2015-02-18
    • 2020-10-06
    相关资源
    最近更新 更多