适合Python的数据(正弦波?)

时间:2016-07-05 10:43:44

标签: python numpy matplotlib data-fitting

我有想要可视化的数据。这是我的代码:

import numpy as np 
from scipy.optimize 
import curve_fit

xdata = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])   
ydata = np.array([26.2, 27.2, 27.9, 27.9, 27.2, 26.2, 25.3, 24.5, 24.2, 24.4, 24.7, 25.4])

def func(x, p1,p2,p3):
    return p1 + p3*np.sin(p2*x)

popt, pcov = curve_fit(func, xdata, ydata,p0=(25.931, 0.5629,1.8978))  

import matplotlib.pylab as plt   
plt.plot(xdata, ydata,'o')   
plt.plot(xdata, func(xdata, popt[0], popt[1], popt[2]),linewidth=2, color = 'red')   
plt.show()

我对结果不满意。我怎样才能更好地适应?我定义的函数是否需要更复杂?我需要一种完全不同的方法,另一种方法吗?

我也试过这种方法:

from scipy.interpolate import interp1d  
f = interp1d(xdata, ydata, kind='cubic')  
xnew = np.linspace(0, 11, num=100, endpoint=True)  
plt.plot(xdata, ydata, 'o', xnew, f(xnew), '-', color = 'blue')

结果看起来更好。 我正在寻找一种拟合方法,在绘制时给出类似的结果。我很抱歉无法表达清楚。这可能已成为问题的一部分:(

1 个答案:

答案 0 :(得分:0)

最后,np.polyfit()给出了所需的结果:

z = np.polyfit(xdata, ydata, 6)
f = np.poly1d(z)

x_new = np.linspace(xdata[0], xdata[-1], 150)
y_new = f(x_new)

plt.plot(xdata,ydata,'o', x_new, y_new)

我想,我问题的最大部分是错误的假设,即我的数据就像一个正弦波......