2017-07-27 4 views
1

Je reçois un résultat étrange lorsque j'utilise scipy curve_fit pour ajuster mes données à cette fonction.scipy curve_fit ne produit pas de graphique lisse lors de l'ajustement de la fonction fourier

def func(t, freq, offset, a0, b0, a1, b1, a2, b2, a3, b3): 
    return (
     + a0*np.sin(2.*0*np.pi*freq*t) 
     + b0*np.cos(2.*0*np.pi*freq*t)  
     + a1*np.sin(2.*1*np.pi*freq*t) 
     + b1*np.cos(2.*1*np.pi*freq*t)  
     + a2*np.sin(2.*2*np.pi*freq*t) 
     + b2*np.cos(2.*2*np.pi*freq*t)  
     + a3*np.sin(2.*3*np.pi*freq*t) 
     + b3*np.cos(2.*3*np.pi*freq*t) 
     + offset) 

Ceci est le résultat de l'ajustement tracé Bumpy curve fit line

L'ajustement lui-même est bien, le seul problème étant que la ligne est cahoteuse. Puisque je ne fais qu'adéquation entre les sinus et les cosinus, comment cela pourrait-il se produire? Est-ce que cela se passe dans matplotlib ou dans la fonction curve_fitting? Une autre chose est que, selon que j'ajoute plus ou moins de termes à la fonction, la fonction se lissera elle-même ou deviendra de nouveau cahoteuse.

Répondre

4

Vous pouvez laisser le terme a0, car il s'agit d'un zéro constant. Vous pouvez également laisser b0 car c'est la même chose que l'offset. Ce n'est pas la cause des bosses, mais supprime deux paramètres d'ajustement redondants.

def func(t, freq, offset, a1, b1, a2, b2, a3, b3): 
    return ( 
     + a1*np.sin(2.*1*np.pi*freq*t) 
     + b1*np.cos(2.*1*np.pi*freq*t)  
     + a2*np.sin(2.*2*np.pi*freq*t) 
     + b2*np.cos(2.*2*np.pi*freq*t)  
     + a3*np.sin(2.*3*np.pi*freq*t) 
     + b3*np.cos(2.*3*np.pi*freq*t) 
     + offset) 

En outre, le résultat est attendu. Plus vous autorisez de fréquences, plus vous avez de fréquences dans votre intrigue. Les bosses sont les fonctions sin ou cos avec une faible amplitude et une haute fréquence. L'utilisation de plus de points de données sur l'axe des x lors du tracé de la courbe d'ajustement vous permettra d'observer que les bosses sont aussi lisses que les fonctions sin.

+0

Super merci! En fait, supprimer les termes redondants semblait avoir lissé le graphique. – Giovanni