使用Levenberg-Marquardt算法leastsq查找模型的参数

时间:2015-05-19 17:59:12

标签: python scipy least-squares levenberg-marquardt

我正在尝试使用模型y= Ax^2 sin(x)/cos(x)^C + B找到数据x,y的参数A,B,C 我想从scipy.optimize使用leastsq,但我有错误。 这是我的尝试:

x=n.array(x)
y=n.array(y)

model=lambda tpl,x :(tpl[0]*x**2 * n.sin(x))/((n.cos(x)**tpl[2]) *tpl[1])
func=model
err=lambda tpl,x,y: func(tpl,x)-y
init=(3.0,8.0,4.0)
param=scipy.optimize.leastsq(err,init[:],args=(x,y))
print(param[o])

其中init是我对参数A,B,C的“第一次猜测”

错误:

Warning (from warnings module):
File "D:/programs/levenberg.pyw", line 21
model=lambda tpl,x :(tpl[0]*(x**2) * n.sin(x))/((n.cos(x)**tpl[2]) *tpl[1])
RuntimeWarning: invalid value encountered in power

Warning (from warnings module):
File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 419
warnings.warn(errors[info][0], RuntimeWarning)
RuntimeWarning: Number of calls to function has reached maxfev = 800.
(array([ nan,  nan,  nan]), 5)

1 个答案:

答案 0 :(得分:1)

我认为您使用^代替**进行取幂。尝试:

model=lambda tpl,x :(tpl[0]*x**2 * n.sin(x))/((n.cos(x)**tpl[2]) *tpl[1])

注意^是python中的按位xor操作。要提升能力,请使用**