Python - scipy fmin,给fmin提供参数

时间:2014-01-16 17:21:43

标签: python numpy scipy

我是Python的新手。 我正在写一小段代码以找到函数的最小值:

import os,sys,matplotlib,pylab
import numpy as np
from scipy.optimize import fmin

par = [2., 0.5, 0.008]
x1 = 0.4
f2_2 = lambda x, param: param[0] * x**2 + param[1] * x + param[2]
xmin = fmin(f2_2,x1,args = (par))

print xmin

它应该非常简单,但是我收到了这个错误:

"Traceback (most recent call last):

  File "prova.fmin.py", line 9, in <module>

 xmin = fmin(f2_2,x1,args = (par))

  File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 257, in fmin

 fsim[0] = func(x0)

  File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 176, in function_wrapper

 return function(x, *args)

TypeError: <lambda>() takes exactly 2 arguments (4 given)"

有人可以帮我理解这个吗?

2 个答案:

答案 0 :(得分:3)

我刚尝试过这个。您似乎需要说(par,)而不仅仅是(par)。请注意,(par,)是一个元组,变量par作为单个元素,而(par)只评估为par:无元组。 args的“fmin”关键字希望找到一个元组,而不是par,在这种情况下是一个列表。

编辑: 嗯,实际上,似乎args也不介意接收列表。但是,在fmin内部,当调用函数f2_2时,argsunpacked,这意味着其内容现在作为参数传递给f2_2。这意味着f2_2最终得到四个参数,即。在这种情况下,x20.50.008,而不是只获取两个参数x[2, 0.5, 0.008]

答案 1 :(得分:0)

您需要定义lambda函数以接受更多参数,如下所示:

f2_2 = lambda x, *param: param[0] * x**2 + param[1] * x + param[2]