2015-05-19 49 views
-2

我想使用model找到参数A,B,C到数据x,y使用model y= Ax^2 sin(x)/cos(x)^C + B 我想从scipy.optimize使用leastsq,但出现错误。 这里是我的尝试:使用Levenberg-Marquardt算法查找模型的参数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]) 

初始化哪里是我的 “第一次的猜测” 参数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) 
+0

你会得到什么错误?在哪一行? – matiasg

+0

@matiasq巨大的一个,其中之一:Traceback(最近调用最后一个): 文件“D:/programs/levenberg.pyw”,第30行,在 param = scipy.optimize.leastsq(err,init,args =(x,y)) – wiedzminYo

+0

或文件“D:/programs/levenberg.pyw”,第22行,在 model = lambda tpl,x:(tpl [0] * x^2 * n.sin(x) )/((n.cos(x)^ tpl [2])* tpl [1]) TypeError:输入类型不支持ufunc'bitwise_xor',并且输入不能被安全强制转换为任何受支持的类型铸造规则''安全'' – wiedzminYo

回答

1

它看起来像你对我正在使用^而不是**取幂。请尝试:

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

请注意,^是python中的按位异或操作。要提高权力,请使用**

+0

是的,我的坏。感谢提示。但是我仍然有错误“RuntimeWarning:在电源遇到无效值” – wiedzminYo

+0

而类似的东西“RuntimeWarning:函数调用次数已达到maxfev = 800. (array([nan,nan,nan]),5) “ – wiedzminYo

+0

可能你的函数在某处是单数的:例如对于某些x,cos(x)= 0。 – xnx