0

我试图寻找和我犯同样错误的人,但没有快乐!这也是我的第一篇文章,所以如果解释或指导不当,我深表歉意。欢迎咨询。

我正在解决的问题是:通过测量到多个已知参考点的距离来找到某种接收器的位置。这是基本的三边测量,我正在使用最小二乘法来做到这一点。

我已经成功地使用了 scipy.optimize lesatsq 函数来做到这一点,所以我很确定我的拟合函数有效。但是,我希望能够使用 lmfit Python 包提供的一些额外功能,并且我正在努力将其翻译过来。完整的尝试代码在这里: http: //pastebin.com/4xbfkaCm

lmfit 最小化函数设置对我的拟合函数(称为残差函数)的调用如下,其中 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 个)。

由于这个调用是由最小化函数进行的,我看不出我对此有什么控制权。我只能想象这是因为我将 np.array 作为参数传递而引发的,但这似乎是不可避免的。谁能看到我做错了什么?

谢谢

4

1 回答 1

4

在调用中minimize,更改

args=(stationarray)

args=(stationarray,)

args必须是一个序列(通常是一个元组),其元素是传递给函数的参数。要创建长度为 1 的元组,您需要额外的逗号。写的时候args=(stationarray)(不用多余的逗号),括号没有作用,和写一样args=stationarrayminimize然后调用函数 as residualfunct(params, stationarray[0], stationarray[1], ...),这会导致您报告的错误。

于 2014-07-23T12:46:53.103 回答