Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Let's consider the following data:

data = Table[{q, 2*q^2}, {q, 0, 2}];

and then, do a very simple fitting to this data:

FindFit[data, a*q^b, {a, b}, q]

I get the answer:

Infinity::indet: Indeterminate expression 0. (-\[Infinity]) encountered. >>
FindFit::nrjnum: The Jacobian is not a matrix of real numbers at {a,b} = {1.,1.}. >>
Out[68]= {a -> 1., b -> 1.}

if we remove the {0,0} point:

FindFit[Rest@data, a*q^b, {a, b}, q]

we correctly get:

{a -> 2., b -> 2.}

I've read this, which is very similar, but even if I hint it to start with the correct values, I get the same error message:

FindFit[data, a*q^b, {{a, 2}, {b, 2}}, q]

This would seem a too basic limitation of Mathematica 8 fitting algorithms, and so, before accusing it, what am I doing wrong?

share|improve this question
add comment

2 Answers 2

up vote 15 down vote accepted

Well, FindFit works by calculating a Jacobian of your expression, which is a matrix of derivatives with respect to all variables. Analytically, because $b$ is a real variable (and not an integer), you have $q^b = \exp(b \log q)$, so you see how that might become difficult when $q$ becomes zero.

However, the documentation for FindFit describes exactly your problem, and a possible solution. (I found it by looking for "FindFit Jacobian" in the documentation, so it's possible to find from your original error message.)

Specify the model gradient to avoid problems with a removable singularity:
[…] Gradient -> "FiniteDifference"

This works for you too:

In:=  FindFit[data, a*q^b, {a, b}, q, Gradient -> "FiniteDifference"]
Out=  {a -> 2., b -> 2.}
share|improve this answer
    
Nothing to do with your answer but, I feel like the automatic choice of the best algorithm for the user case (typical characteristic of MMA capabilities) is completely failing in this one... But thank you for the quick answer! –  P. Fonseca Apr 7 '12 at 10:02
    
As a general rule, I would say that if one is able of doing a decent fit with Manipulate, there's no reason for Mathematica to fail on a completely automated answer... wouldn't you agree? –  P. Fonseca Apr 7 '12 at 10:08
2  
The same manual workaround, with the Gradient option setting, seems to drastically improve the results from some uses of NonlinearModelFit. –  murray Apr 7 '12 at 21:59
add comment

I think the problem has already been diagnosed correctly by F'x, but I wanted to mention two other work-arounds.

(a)

FindFit[data, a*q^b, {a, b}, q, Method -> "PrincipalAxis"]

(b)

FindFit[data, a*q^b, {{a, 1,10}, {b,1,10}}, q]

Maybe the last one is the best because it doesn't require you to remember a Method specification. All it does is to provide two initial guesses instead of one for the variables. This doesn't seem to be documented (I just went by what I knew from the closely related FindMinimum and it turned out to work for FindFit, too).

As you can see in (b), the initial bracketing values for a and b don't have to be very good guesses at all, which should make this approach useful in practice.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.