我是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)"
有人可以帮我理解这个吗?
答案 0 :(得分:3)
我刚尝试过这个。您似乎需要说(par,)
而不仅仅是(par)
。请注意,(par,)
是一个元组,变量par
作为单个元素,而(par)
只评估为par
:无元组。 args
的“fmin
”关键字希望找到一个元组,而不是par
,在这种情况下是一个列表。
编辑:
嗯,实际上,似乎args
也不介意接收列表。但是,在fmin
内部,当调用函数f2_2
时,args
为unpacked,这意味着其内容现在作为参数传递给f2_2
。这意味着f2_2
最终得到四个参数,即。在这种情况下,x
,2
,0.5
和0.008
,而不是只获取两个参数x
和[2, 0.5, 0.008]
。
答案 1 :(得分:0)
您需要定义lambda函数以接受更多参数,如下所示:
f2_2 = lambda x, *param: param[0] * x**2 + param[1] * x + param[2]