Depuis plusieurs heures maintenant, j'essaie d'adapter un modèle à un ensemble de données (généré) en tant que casus pour un problème avec lequel j'ai lutté. J'ai généré des points de données pour la fonction f (x) = A * cos^n (x) + b, et j'ai ajouté du bruit. Lorsque je tente d'adapter l'ensemble de données avec cette fonction et curve_fit, je reçois l'erreurScipy.optimize.curve_fit ne correspondra pas à la loi de puissance du cosinus
./tester.py:10: RuntimeWarning: invalid value encountered in power
return Amp*(np.cos(x))**n + b
/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py:690: OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning)
Le code que je utilise pour générer les points de données et adapter le modèle est le suivant:
#!/usr/bin/env python
from __future__ import print_function
import numpy as np
from scipy.optimize import curve_fit
from matplotlib.pyplot import figure, show, rc, plot
def f(x, Amp, n, b):
return np.real(Amp*(np.cos(x))**n + b)
x = np.arange(0, 6.28, 0.01)
randomPart = np.random.rand(len(x))-0.5
fig = figure()
sample = f(x, 5, 2, 5)+randomPart
frame = fig.add_subplot(1,1,1)
frame.plot(x, sample, label="Sample measurements")
popt, pcov = curve_fit(f, x, sample, p0=(1,1,1))
modeldata = f(x, popt[0], popt[1], popt[2])
print(modeldata)
frame.plot(x, modeldata, label="Best fit")
frame.legend()
frame.set_xlabel("x")
frame.set_ylabel("y")
show()
Le Les données bruyantes sont affichées - voir l'image ci-dessous.
Est-ce que quelqu'un d'entre vous la moindre idée de ce qui se passe? Je soupçonne qu'il a quelque chose à voir avec la loi de puissance entrant dans le domaine complexe, comme la partie réelle de la fonction est nowhere divergent. J'ai essayé de retourner seulement la partie réelle de la fonction, en définissant des limites réalistes dans curve_fit et en utilisant déjà un tableau numpy au lieu d'une liste python pour p0. Je cours la dernière version de scipy disponible, scipy 0.17.0-1.