【问题标题】:Scipy fmin argument passingScipy fmin 参数传递
【发布时间】:2015-07-04 23:05:06
【问题描述】:

所以我对 scipy.optimize.fmin 如何接受参数有点困惑

假设我有两个功能:

def func_1(x, y):
   return (x*x) + (y*y)

def func_2(x, y, a):
   return ((x-a)*(x-a)) + ((y-a) *(y-a))

在 func_1 中,我只想要 x 和 y 的最小值,而在 func_2 中,我理想地希望传递 a 的值,然后找到 x 和 y 的最小值。我已经阅读了有关此的其他一些问题,但仍然有些困惑。

尝试调用:fmin(fund_1, [1,1]) 导致:fmin() takes at least 2 arguments (1 given)

非常感谢!

【问题讨论】:

    标签: python scipy mathematical-optimization


    【解决方案1】:

    首先,将func_1func_2 的签名更改为:

    def func_1(t):
       x,y=t
       return (x*x) + (y*y)
    
    def func_2(t, a):
       x,y=t
       return ((x-a)*(x-a)) + ((y-a) *(y-a))
    

    在第一种情况下,使用

    from scipy.optimize import fmin
    from numpy import array
    fmin(func_1,array([1,1]))
    

    在第二种情况下,您必须将参数args=(a,) 传递给fmin。它会完全按照您的描述进行,

    fmin(func_2,array([1,1]),args=(3,))
    

    【讨论】:

    • 第一个呢?我一直试图通过: fmin(func_1, [1,1]) 和接收 fmin() 至少需要 2 个参数(1 个给定)。这让我很困惑
    • 啊,好吧,所以 fmin 优化了向量?即我试图解决的任何参数都必须包含在数组中?
    • 有点,是的。 func_1/func_2 的第一个参数,上面是t,是一个向量。 func_2 签名中出现的所有其余部分,在本例中为 a,是必须作为元组传递给 fminargs=(a,) 的附加参数。
    • 非常感谢。最后一个问题,我保证。所以,我让 func_1 运行,但是 x 和 y 都应该为 0,但是我得到了返回:[ -2.10235293e-05 2.54845649e-05],当我继续对这些值调用 func_1 时,我没有收到正如预期的那样,0 作为fund_1 的最小值。这是我的错误,还是 scipy 的错误?
    • 这是一个数值解,然后受数值误差的影响。所以这不是任何人的错。如果您可以通过更改xtolftol 的值来询问fmin 以获得更好的数值精度。请参阅docs
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2018-06-23
    • 2013-01-01
    • 2015-10-02
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多