为什么我的python lmfit leastsq拟合函数被传递了太多参数?
我试着找找有没有人和我犯同样的错误,但没找到!这是我第一次发帖,所以如果表达得不好或者方向不对,请见谅。欢迎大家给我建议。
我现在要解决的问题是:通过测量到一些已知参考点的距离,来找到某个接收器的位置。这是基本的三边测量法,我正在使用最小二乘法来实现这个目标。
我已经成功使用了scipy.optimize库里的leastsq函数来完成这个,所以我对我的拟合函数是有信心的。不过,我想利用lmfit这个Python包提供的一些额外功能,但我在转换过程中遇到了困难。完整的尝试代码在这里:http://pastebin.com/4xbfkaCm
lmfit的minimize函数会调用我的拟合函数(叫做residualfunct),具体的调用方式是这样的,其中stationarray是一个包含站点位置和范围的numpy数组,params是一个字典,用来存放拟合函数中要用到的参数。
position = minimize(residualfunct, params, args=(stationarray))
而我的拟合函数定义如下:
def residualfunct(params, stationarray):
X = params['solutionX'].value
Y = params['solutionY'].value
Z = params['solutionZ'].value
result = numpy.array([s[3] - linalg.norm(array((X,Y,Z))-array((s[0],s[1],s[2]))) for s in stationarray])
print result
return result
当我运行这段代码时,出现了TypeError错误:
residualfunct()需要2个参数,但我给了5个。
这个调用是由minimize函数发起的,我不知道我能控制什么。我只能猜测这个错误是因为我传递了一个np.array作为参数,但这似乎是不可避免的。有人能看出我哪里出错了吗?
谢谢!
1 个回答
在调用 minimize
的时候,把
args=(stationarray)
改成
args=(stationarray,)
args
需要是一个序列(通常是一个元组),里面的元素就是传给函数的参数。如果你想创建一个长度为1的元组,记得要加上额外的逗号。当你写 args=(stationarray)
(没有额外的逗号)时,括号并没有什么作用,这样就等于写 args=stationarray
。这样一来,minimize
就会把函数调用成 residualfunct(params, stationarray[0], stationarray[1], ...)
,这就会导致你遇到的错误。