Python 用Levenberg-Marquardt算法求模型参数

Python 用Levenberg-Marquardt算法求模型参数,python,scipy,least-squares,levenberg-marquardt,Python,Scipy,Least Squares,Levenberg Marquardt,我正试图使用modely=Ax^2 sin(x)/cos(x)^C+B 我想使用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) par

我正试图使用model
y=Ax^2 sin(x)/cos(x)^C+B
我想使用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)

在我看来,您正在使用
^
而不是
**
进行幂运算。尝试:

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

请注意,
^
是python中的按位异或操作。使用
**

将事情提升到一个高度,会出现什么错误?在哪一行?@matiasq巨大的一行,其中一行:回溯(最近一次调用):文件“D:/programs/levenberg.pyw”,第30行,在param=scipy.optimize.leastsq(err,init,args=(x,y))或文件“D:/programs/levenberg.pyw”,第22行,在model=lambda tpl,x:(tpl[0]*x^2*n.sin(x))/(n.cos(x)^tpl[2])[1])TypeError:输入类型不支持ufunc“按位异或”,并且根据强制转换规则“安全”@wiedzminYo,无法将输入安全强制为任何受支持的类型,请使用帖子下方的
编辑
链接改进您的问题。当问为什么会发生错误时,一定要在你的问题中包含完整的回溯。是的,我的错。谢谢你的提示。但我仍然有错误“RuntimeWarning:在power中遇到无效值”和类似“RuntimeWarning:调用函数的次数已达到maxfev=800。(数组([nan,nan,nan]),5)”可能您的函数在某个地方是单数的:例如,cos(x)=0表示某些x。不,我检查了两次,没有单数,否-不一定在cos(x)中,但是如果cos(x)对于某些x是负数,那么将其提高到非整数次幂会给您带来问题。