为什么我的python lmfit leastsq拟合函数被传递了太多参数?

0 投票
1 回答
1102 浏览
提问于 2025-04-18 14:25

我试着找找有没有人和我犯同样的错误,但没找到!这是我第一次发帖,所以如果表达得不好或者方向不对,请见谅。欢迎大家给我建议。

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

我已经成功使用了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 个回答

4

在调用 minimize 的时候,把

args=(stationarray)

改成

args=(stationarray,)

args 需要是一个序列(通常是一个元组),里面的元素就是传给函数的参数。如果你想创建一个长度为1的元组,记得要加上额外的逗号。当你写 args=(stationarray)(没有额外的逗号)时,括号并没有什么作用,这样就等于写 args=stationarray。这样一来,minimize 就会把函数调用成 residualfunct(params, stationarray[0], stationarray[1], ...),这就会导致你遇到的错误。

撰写回答