使用fmin_l_bfgs_b时遇到一些问题

时间:2015-11-18 07:35:24

标签: python numpy optimization scipy

这是我第一次使用“scipy.optimization”。 我定义了一个简单的函数,并希望将其最小化。

def func(x,*args):
    t = 0
    x[0] += args[0]
    x[1] += args[1]
    t += (x[0]-x[1])**2
    return t

def fprime(x,*args):
    a = numpy.zeros(2)
    a[0] = 2*(x[0]-x[1]-1)
    a[1] = 2*(x[1]-x[0]+1)
    return a

if __name__=='__main__':
    constant = numpy.array([1,2])
    initial_value = 1.2, 1.3
    bounds = [(-2.0,2.0), (-2.0,2.0) ]
    best, val, d =    optimize.fmin_l_bfgs_b(func,x0=initial_value,fprime=fprime,args=constant,bounds=bounds)
    print 'Position of the minimum',best, 'and its value',val

但是当我运行它时,它会返回一些错误:

File "D:/Code/Python/LFC/dataset.py", line 8, in func
x[0] += args[0]
IndexError: tuple index out of range

我尝试调试它,然后我发现:    当它第一次遇到'func'时,'args'有值,    但是当它第二次遇到'func'时,'args'没有值, 所以它返回一个IndexError。

我不知道为什么会这样?如果有人能帮助我,我将非常感激。

----------------------------------------------- --------------线----------------------------------- ----------------------------- 我发现args应该是元组,所以我将'constant'改为'(constant,)'并且它不会返回错误。 但是这段代码的输出是:

Position of the minimum [ 5.2         6.71477239] and its value 2.29453538085

为什么'界限'不起作用? 我认为函数'(x0-x1-1)^ 2'的最小值是0,但为什么输出是2.29453538085?

1 个答案:

答案 0 :(得分:0)

不要修改输入数组:

    x = [x[0] + args[0], x[1] + args[1]]

应该是

{{1}}