Re: NonlinearFit
- To: mathgroup@smc.vnet.net
- Subject: [mg10719] Re: NonlinearFit
- From: seanross@worldnet.att.net
- Date: Mon, 2 Feb 1998 00:44:15 -0500
- References: <199801300924.EAA15324@smc.vnet.net.>
Phil Howe wrote: > > I'm having a problem working with NonLinearFit, and would like some > advice. To demonstrate the problem, I'll use a very simple expression, > y==a*x^c +b, where I have assigned a=3, b=7, and c=2. > > Clear[data] > This generates a simple data set: > data=Table[{x, 3*x^2+7 +5*Random[]},{x,0,4,.2}]; > > Now I try to use NonLinearFit. If I specify the value of the exponent, > "c", the routine seems to work. If I ask it to find a value of c, it > chokes, even if I tell it the right answer: > > Remove[a,b,c,x]; > > NonlinearFit[data,a*x^c+b,x, {{c,2},{b,7},{a,3}}]; > > NonlinearFit::"badderiv": "The matrix of model derivatives (dimensions > \!\({3, 21}\)) includes DirectedInfinity in at least one element. Try > fitting without data points having indices in the list \!\({1}\)." > 1) If the nonlinearfit routine ever tries any negative values for x and c is any real number, then the function becomes wildly oscillatory between positive and negative numbers depending on how you want to define a negative number to a fractional power. Trying to evaluate derivatives in this region gives similarly difficult results. Trying to evaluate derivatives at x=0 is similarly problematic because the right anad left hand derivatives are different. That is what gives the directed infinity error message. 2) Using a random number from 0 to 5 to simulate experimental noise may not be a good idea. Your function ranges from 7 to 55 over the range while the noise stays fixed in size at 5 Random[] which makes a signal to noise ratio that ranges from 1.4 near zero to 8 at the end of the range. A better approximation to noise is (1+noise Random[x])(3*x^2+7). To fix the problem, just generate data that doesn't have zero as one of the data points due to the problem of evaluating derivatives there. For example: data=Table[{x,(1+0.15 Random[])( 3*x^2+7)} ,{x,.1,4.1,.2}]; NonlinearFit[data,a*x^c+b,x, {{c,2},{b,7},{a,3}}] returns: 6.756291662079482 + 3.939994195809126*x^1.858652816625926 -- Remove the _nospam_ in the return address to respond.