Vous pouvez définir des limites raisonnables pour les paramètres, par exemple, faire
def fsigmoid(x, a, b):
return 1.0 / (1.0 + np.exp(-a*(x-b)))
popt, pcov = curve_fit(fsigmoid, xdata, ydata, method='dogbox', bounds=([0., 600.],[0.01, 1200.]))
J'ai une sortie
[7.27380294e-03 1.07431197e+03]
et la courbe ressemble à
Le premier point à (400,0) a été supprimé car inutile. Vous pouvez l'ajouter, même si le résultat ne changera pas grand-chose...
MISE À JOUR
Notez que les limites sont définies comme ([low_a,low_b],[high_a,high_b]), j'ai donc demandé que l'échelle soit entre [0...0.01] et que l'emplacement soit entre [600...1200]
Vous avez peut-être remarqué que l'ajustement résultant est complètement incorrect. Essayez de passer quelques paramètres initiaux décents à curve_fit
, avec le p0
argument :
popt, pcov = curve_fit(sigmoid, xdata, ydata, p0=[1000, 0.001])
devrait donner un bien meilleur ajustement, et probablement pas d'avertissement non plus.
(Les paramètres de départ par défaut sont [1, 1] ; c'est trop éloigné des paramètres réels pour obtenir un bon ajustement.)