scipy.optimize.curve#u拟合不';当要拟合的函数只有一个参数时,它不工作

scipy.optimize.curve#u拟合不';当要拟合的函数只有一个参数时,它不工作,scipy,curve-fitting,Scipy,Curve Fitting,我试图用振幅作为参数来拟合正弦+余弦曲线,而曲线拟合似乎不能和只有一个参数的函数一起工作 import numpy as np import scipy.optimize as scio def function(x,a): y = a*np.sin(np.radians(x)) return y x = np.array(range(360)) y = function(x,3) yn = y +0.2 * np.random.normal(size=len(x)) pop

我试图用振幅作为参数来拟合正弦+余弦曲线,而曲线拟合似乎不能和只有一个参数的函数一起工作

import numpy as np
import scipy.optimize as scio

def function(x,a):
    y = a*np.sin(np.radians(x))
    return y

x = np.array(range(360))
y = function(x,3)
yn = y +0.2 * np.random.normal(size=len(x))
popt,pcov = scio.curve_fit(function,x,yn)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/Users/mj/Documents/NACO/VLT/DataReduction/<ipython-input-62-388a2d20a0c8> in <module>()
----> 1 popt,pcov = scio.curve_fit(function,x,yn)

 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/optimize/minpack.pyc in curve_fit(f, xdata, ydata, p0, sigma, **kw)
     416 
     417    if (len(ydata) > len(p0)) and pcov is not None:
 --> 418        s_sq = (func(popt, *args)**2).sum()/(len(ydata)-len(p0))
    419        pcov = pcov * s_sq
    420    else:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/optimize/minpack.pyc in _general_function(params, xdata, ydata, function)
    319 
    320 def _general_function(params, xdata, ydata, function):
--> 321     return function(xdata, *params) - ydata
    322 
    323 def _weighted_general_function(params, xdata, ydata, function, weights):

TypeError: function() argument after * must be a sequence, not numpy.float64
将numpy导入为np
导入scipy.optimize作为scio
def功能(x,a):
y=a*np.sin(np.radians(x))
返回y
x=np.阵列(范围(360))
y=函数(x,3)
yn=y+0.2*np.随机.正常(尺寸=len(x))
popt,pcov=scio.曲线拟合(函数,x,yn)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
/用户/mj/Documents/NACO/VLT/DataReduce/in()
---->1 popt,pcov=scio.曲线拟合(函数,x,yn)
/库/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/optimize/minpack.pyc曲线拟合(f,扩展数据,ydata,p0,sigma,**kw)
416
417如果(len(ydata)>len(p0))和pcov不是无:
-->418 s_sq=(func(popt,*args)**2).sum()/(len(ydata)-len(p0))
419 pcov=pcov*s_sq
420其他:
/函数中的Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/optimize/minpack.pyc(参数、扩展数据、ydata、函数)
319
320定义通用函数(参数、扩展数据、ydata、函数):
-->321返回函数(扩展数据,*参数)-ydata
322
323定义加权通用函数(参数、扩展数据、ydata、函数、权重):
TypeError:*后面的function()参数必须是序列,而不是numpy.float64
为什么曲线拟合会出现这样的问题? 我做错什么了吗

提前谢谢!
MJO

FWIW,您的代码使用
numpy 1.7.1
scipy 0.11.0
为我运行,未经修改。非常感谢!!!!事实证明,我的numpy和scipy版本都非常旧……现在它工作得非常好:)。谢谢!