2016-07-05 224 views
-4

我有想要可視化的數據。這裏是我的代碼:用Python(正弦波?)擬合數據

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') 

結果看起來更漂亮。 我正在尋找繪製時給出類似結果的擬合方法。我很抱歉無法更清楚地表達它。這可能已經是問題:(

+0

你有什麼不滿意的?你如何期待我們猜測? – Julien

+0

你的'func'的return語句應該縮進。 – Ian

回答

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) 

我想,我的問題的最重要的部分是錯誤的假設,我的數據是像一個正弦波。 ..