我试图寻找与我犯同样错误的人,但却没有快乐!这也是我的第一篇文章,所以如果它被严重解释或指导我会道歉。建议欢迎。
我要解决的问题是:通过测量到许多已知参考点的距离来找到某种接收器的位置。这是基本的三边形,我使用最小二乘法来做到这一点。
我已经成功地使用了scipy.optimize lesatsq函数来做到这一点,所以我很确定我的拟合函数是有效的。但是,我希望能够使用lmfit Python软件包提供的一些额外功能,而我正在努力将其翻译过来。完整的尝试代码在这里:http://pastebin.com/4xbfkaCm
lmfit最小化函数设置对我的拟合函数的调用(称为residualfunct),如下所示,其中stationarray是一个包含站点位置和范围的numpy数组,params是要在拟合函数中使用的参数字典< / p>
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个)。
因为这个调用是由最小化函数完成的,所以我看不出对此有什么控制。我只能想象这是因为我传递一个np.array作为参数,但这似乎是不可避免的。谁能看到我做错了什么?
由于
答案 0 :(得分:4)
在致电minimize
时,请更改
args=(stationarray)
到
args=(stationarray,)
args
必须是一个序列(通常是一个元组),其元素是传递给函数的参数。要创建长度为1的元组,您需要额外的逗号。当您编写args=(stationarray)
(没有额外的逗号)时,括号不起作用,它与编写args=stationarray
相同。 minimize
然后将该函数调用为residualfunct(params, stationarray[0], stationarray[1], ...)
,这会导致您报告的错误。