2016-07-05 13 views
-4

Ich habe Daten, die ich gerne visualisieren würde. Hier ist mein Code:Fit Daten in Python (Sinus?)

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

Ich bin unzufrieden mit dem Ergebnis. Wie kann ich besser passen? Muss die von mir definierte Funktion komplexer sein? Brauche ich einen ganz anderen Ansatz, eine andere Methode?

Ich habe auch versucht, diesen Ansatz:

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

Das Ergebnis sieht viel schöner. Ich suche nach einer passenden Methode, die beim Plotten ein ähnliches Ergebnis liefert. Es tut mir leid, dass ich es nicht deutlicher ausdrücken konnte. Das ist wahrscheinlich schon Teil des Problems :(

+0

Worüber sind Sie unglücklich? Wie erwarten Sie, dass wir raten? – Julien

+0

Die Return-Anweisung Ihres 'func' sollte eingerückt werden. – Ian

Antwort

0

Schließlich gab np.polyfit() das gewünschte Ergebnis:

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) 

Ich denke, der größte Teil meines Problems war die falsche Annahme, dass meine Daten wie eine Sinuswelle ist. ..