使用scipy python中的curve_fit函数

时间:2015-12-04 01:01:43

标签: python matplotlib scipy

我很担心这个功能应该如何工作。我试图拟合最适合xdata和ydata数据集的一行。这段代码会产生错误,但我不明白curve_fit函数应该如何工作,或者我是否使用了正确的术语来表达我想做的事情。在图表上绘制的xdata和ydata会产生弯曲的图案,然后上升,然后下降。任何帮助非常感谢。

#define xdata dnd ydata 
xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-
1.42001]) 



# get the curve fit funtion 
from scipy.optimize import curve_fit
def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)


popt, pcov = curve_fit(func, xdata, ydata)


#plot code for data points 
plot.plot(xdata,ydata,"bo",label="Xdata and Ydata")
plot.plot(popt,pcov,"r--",label="Curve of Best Fit")
plot.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plot.show()

这当前产生的直线不是最适合数据的曲线。我试图尽可能地镜像数据模式,目前我无处接近。

2 个答案:

答案 0 :(得分:2)

你错过了什么:

  1. 正如我在评论中所说,您需要np.cosnp.sin。这是因为xdataydata(10,)形状的numpy数组。因此Python无法识别,它需要(10,1)
  2. 您需要为数据定义linspace,在下面的示例中称为xfine
  3. 这是一个有效的例子:

    import numpy as np
    import matplotlib.pyplot as qt
    from scipy.optimize import curve_fit
    
    #define xdata dnd ydata 
    xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
    ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-
    1.42001]) 
    
    def func(xdata, p1, p2):
        return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)
    
    xfine = np.linspace(xdata.min(), xdata.max(), 100)
    
    popt, pcov = curve_fit(func, xdata, ydata)
    
    plt.plot(xdata, ydata, '.');
    plt.plot(xfine, func(xfine, popt[0], popt[1]),'r-')
    

    enter image description here

答案 1 :(得分:1)

您需要使用numpy.cos代替math.cos来处理向量:

def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)

你需要生成这样的拟合曲线:

xfit = np.linspace(xdata[0], xdata[-1], 100)
yfit = func(xfit, *popt)
plt.plot(xdata, ydata)
plt.plot(xfit, yfit)
plt.show()