Re: How to find the best fit for a list {x,y} of data
- To: mathgroup at smc.vnet.net
- Subject: [mg91923] Re: How to find the best fit for a list {x,y} of data
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 13 Sep 2008 05:53:21 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <gadcid$rh2$1@smc.vnet.net>
dinodeblasio at gmail.com wrote: > I have the list and the y=f(x) equation > > data = {{1, 1}, {28, 0.719188377}, {54, 0.35746493}, {81, > 0.182114228}, {117, 0.166082164}, {260, 0.132765531}}; > express = (1 - k*x)*(1 - k*x/q)*(1 - p*k*x/q) > > (1 - k x) (1 - (k x)/q) (1 - (k p x)/q) > > > "k,q and p are parameters; then I do the fitting": > > f1 = FindFit[data, (1 - k*x)*(1 - k*x/q)*(1 - p*k*x/q), {{k, 0.01}, > {p, 1.5}, {q,1}}, x, MaxIterations -> 200] > > "and I obtain": > > {k -> 0.00586032, p -> 2.86841, q -> 2.86841} > > "My question is: how I can find the best fit to my data for values of > (k,q,p) >0" ?? Some tweaking and experimentation gives you a variety of options to get excellent approximations. In[1]:= data = {{1, 1}, {28, 0.719188377}, {54, 0.35746493}, {81, 0.182114228}, {117, 0.166082164}, {260, 0.132765531}}; expr = (1 - k*x)*(1 - k*x/q)*(1 - p*k*x/q); (* You could add the constrains k > 0 && p > 0 && q > 0 and set the option Method to NMinimize *) f1 = FindFit[data, {expr, k > 0 && p > 0 && q > 0}, {k, p, q}, x, Method -> NMinimize] Plot[expr /. f1, {x, 1, 260}, Epilog -> Point /@ data] (* Or set the precision of the data to, say, 20 and test several methods but "Gradient" *) f1 = FindFit[SetPrecision[data, 20], expr, {k, p, q}, x, Method -> #] & /@ {"ConjugateGradient", "LevenbergMarquardt", "Newton", "QuasiNewton"} Plot[expr /. #, {x, 1, 260}, Epilog -> Point /@ data] & /@ f1 Out[3]= {k -> 0.00586017, p -> 0.348616, q -> 0.999951} Out[5]= {{k -> 0.0058603184189148254461, p -> 0.34862536795753106130, q -> 1.0000000000759083932}, {k -> 0.0058603184186521820593, p -> 0.34862536786743369247, q -> 0.99999999999757125104}, {k -> 0.0020430556645278991563, p -> 0.99999999999994081062, q -> 0.34862536786785086450}, {k -> 0.0058603184186556336479, p -> 0.34862536786744803858, q -> 0.99999999999859996068}}59996068}} Regards, -- Jean-Marc