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