python - Why does scipy.optimize.curve_fit not fit correctly to the data? -
i've been trying fit function data while using scipy.optimize.curve_fit
have real difficulty. can't see reason why wouldn't work.
# encoding: utf-8 __future__ import (print_function, division, unicode_literals, absolute_import, with_statement) import numpy np scipy.optimize import curve_fit import matplotlib.pyplot mpl x, y, e_y = np.loadtxt('data.txt', unpack=true) def f(x, a, k): return (1/(np.sqrt(1 + a*((k-x)**2)))) popt, pcov = curve_fit(f, x, y, maxfev = 100000000) mpl.plot(x, f(x, *popt), 'r-', label='fit') mpl.plot(x, y, 'rx', label='original') mpl.legend(loc='best') mpl.savefig('curve.pdf') print(popt) # correct values should calculated # a=0.003097 # k=35.4
here plot-image produced upper code:
data.txt: #x y e_y 4.4 0.79 0.13 19.7 4.9 0.8 23.5 7.3 1.2 29.7 17 2.79 30.7 21.5 3.52 34 81 13.28 34.6 145 23.77 35.4 610 100 36.3 115 18.85 38.1 38 6.23 43.7 14 2.3 56.2 6.2 1.02 64.7 4.6 0.75 79.9 3.2 0.52 210 0.98 0.16
firstly try not increase maxfev
large, sign else going wrong! playing around can fit following addition:
def f(x, b, a, k): return (b/(np.sqrt(1 + a*((k-x)**2)))) popt, pcov = curve_fit(f, x, y, p0=[20, 600.0, 35.0])
firstly give fitting function have given has maximum of 1, since peak in data 600, never fit. added overall factor b
. secondly , try poor old curve_fit out. if eye can see peaks @ x~35
tell through p0
. requires intuition how function works important if going use curve fitting function.
Comments
Post a Comment