3

J'essaie d'adapter mes données à (cos(x))^n. La valeur de n en théorie est 2, mais mes données devraient me donner environ 1,7. Quand je définis ma fonction d'ajustement et j'essaie curve_fit, je reçois une erreurAjustement de courbe avec erreur python

def f(x,a,b,c): 
    return a+b*np.power(np.cos(x),c) 

param, extras = curve_fit(f, x, y) 

Voici mes données

x y    error 
90 3.3888756187 1.8408898986 
60 2.7662844365 1.6632150903 
45 2.137309503  1.4619540017 
30 1.5256883339 1.2351875703 
0 1.4665463518 1.2110104672 

L'erreur ressemble à ceci:

/usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py: 4: RuntimeWarning: valeur non valide rencontrée dans l'alimentation après la suppression de le fichier cwd de sys.path.

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:690: OptimizeWarning: Covariance des paramètres ne peut pas être estimée
catégorie = OptimizeWarning)

+0

Y at-il encore quelque chose qui manque/ne fonctionne pas? Si oui, laissez-moi savoir que je peux modifier ma réponse, sinon, s'il vous plaît envisager d'upvote et accepter la réponse si elle a résolu votre problème :) – Cleb

+1

Tout d'abord, merci beaucoup, c'était vraiment utile. Le problème était que les données x étaient en degrés et il devrait être en radians. A part cela, j'ai appris à utiliser * popt pour appeler tous les éléments du tableau, donc c'était génial! –

Répondre

4

Le problème est que cos(x) peut devenir négatif et cos(x)^n peut être indéfini. Illustration:

np.cos(90) 
-0.44807361612917013 

et par ex.

np.cos(90) ** 1.7 
nan 

Cela provoque les deux messages d'erreur que vous recevez.

Cela fonctionne très bien, si vous modifiez votre modèle, par ex. à a + b * np.cos(c * x + d). Puis l'intrigue se présente comme suit:

enter image description here

Le code se trouve ci-dessous avec quelques commentaires en ligne:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 


def f(x, a, b, c, d): 

    return a + b * np.cos(c * x + d) 

# your data 
xdata = [90, 60, 45, 30, 0] 
ydata = [3.3888756187, 2.7662844365, 2.137309503, 1.5256883339, 1.4665463518] 

# plot data 
plt.plot(xdata, ydata, 'bo', label='data') 

# fit the data 
popt, pcov = curve_fit(f, xdata, ydata, p0=[3., .5, 0.1, 10.]) 

# plot the result 
xdata_new = np.linspace(0, 100, 200) 
plt.plot(xdata_new, f(xdata_new, *popt), 'r-', label='fit') 
plt.legend(loc='best') 
plt.show()