Re: FindFit power law problem
- To: mathgroup at smc.vnet.net
- Subject: [mg117057] Re: FindFit power law problem
- From: Peter Pein <petsie at dordos.net>
- Date: Wed, 9 Mar 2011 06:55:31 -0500 (EST)
- References: <il2d8k$65a$1@smc.vnet.net>
Am 07.03.2011 11:49, schrieb Greg Childers: > Hi, > > I'm having a problem with FindFit and a power law problem. Here's the data: > > data = {{1004, 0.003977}, {9970, 0.006494}, {100000, 0.012921}, > {1001000, .059795}} > > I'm wanting to fit it to a function of the form y = a x^b, and determine > the best value of b. When entered into Excel, it returns the exponent b > = 0.383. However, Mathematica gives > > FindFit[data, a x^b, {a, b}, x] > {a->0.0000145749, b->0.601807} > > A graph of these values overlaid on the original data simply didn't look > right. Another way to find the exponent b is to take the log of both > sides and do a linear fit: > > Fit[Log[10, data], {1, x}, x] > -3.64936 + 0.383174 x > > And sure enough the exponent is 0.383 in agreement with Excel. Why does > FindFit give a different value? > > Greg > Hi Greg, if you really insist on b being 0.383, then find the weights: In[1]:= data={{1004,0.003977},{9970,0.006494},{100000,0.012921},{1001000,.059795}}; In[2]:= bw[w_List/;(And@@NumericQ/@w)]:=Cases[Normal[NonlinearModelFit[data,a x^b,{a,b},x,Weights->w]],Power[x,b_]:>b,1,1][[1]] In[3]:= weights=w/@Range[4]; In[4]:= soln=NMinimize[{(bw[weights]-0.383)^2,And@@Flatten[{Thread[weights>=0],Norm[weights]==1,weights[[1]]<=weights[[2]],weights[[3]]>=weights[[4]] (* put focus on the 'middle'*)}]},weights] Out[4]= {2.83106*10^-14,{w[1]->0.264427,w[2]->0.964382,w[3]->0.00681409,w[4]->0.000760789}} In[5]:= NonlinearModelFit[data,a x^b,{a,b},x,Weights->((w/@Range[4])/.soln[[2]])]//Normal Out[5]= 0.000196237 x^0.383 Peter