4
$\begingroup$

I have a data. The LinearModelFit works well with it. But I'm really interested to fit it to y == a 34^b x^d + e 34^f x. So, my code:

fit2 = NonlinearModelFit[data, {a 34^b x^d + e 34^f x}, {a, b, d, e, f}, {x}]

But it gives me an error:

NonlinearModelFit::nrjnum: The Jacobian is not a matrix of real numbers at {a,b,d,e,f} = {1.,1.,1.,1.,1.}.

Now I'm a bit stuck...

Update

data = {{0, 0}, {0.5`, 0.005899`}, {2.`, 0.011938`}, {5.`, 
0.016026`}, {8.`, 0.019241`}, {11.`, 0.021775`}, {14.`, 
0.023975`}, {17.`, 0.025926`}, {20.`, 0.027588`}, {23.`, 
0.029033`}, {26.`, 0.030481`}, {29.`, 0.03175`}, {32.`, 
0.032963`}, {35.`, 0.034043`}, {38.`, 0.035107`}, {44.`, 
0.036933`}, {50.`, 0.038732`}, {56.`, 0.040337`}, {62.`, 
0.041727`}, {68.`, 0.043243`}, {74.`, 0.044595`}, {80.`, 
0.045782`}, {86.`, 0.046893`}, {92.`, 0.048013`}, {98.`, 
0.04901`}, {104.`, 0.049906`}, {110.`, 0.050887`}, {116.`, 
0.051737`}, {122.`, 0.052511`}, {130.`, 0.053636`}, {142.`, 
0.056062`}, {154.`, 0.057802`}, {166.`, 0.059426`}, {178.`, 
0.060762`}, {190.`, 0.062086`}, {202.`, 0.063304`}, {214.`, 
0.064401`}, {226.`, 0.065449`}, {238.`, 0.066462`}, {250.`, 
0.067398`}, {262.`, 0.068241`}, {274.`, 0.069049`}, {286.`, 
0.069826`}, {298.`, 0.070638`}, {310.`, 0.071341`}, {322.`, 
0.071984`}, {334.`, 0.07258`}, {346.`, 0.073202`}, {358.`, 
0.073809`}, {370.`, 0.074263`}, {382.`, 0.074954`}, {394.`, 
0.075353`}, {406.`, 0.075835`}, {418.`, 0.076402`}, {430.`, 
0.076759`}, {442.`, 0.077285`}, {454.`, 0.077618`}, {466.`, 
0.077963`}, {478.`, 0.078492`}, {490.`, 0.07869`}, {502.`, 
0.079317`}, {514.`, 0.0795`}, {526.`, 0.079799`}, {538.`, 
0.080266`}, {550.`, 0.080393`}, {562.`, 0.080893`}, {574.`, 
0.081167`}, {586.`, 0.081271`}, {598.`, 0.081768`}, {610.`, 
0.082036`}, {622.`, 0.082127`}, {634.`, 0.0824`}, {646.`, 
0.082904`}, {658.`, 0.082974`}, {670.`, 0.083041`}, {682.`, 
0.083286`}, {694.`, 0.083747`}, {706.`, 0.083797`}};
$\endgroup$
4
  • $\begingroup$ How many data points are in data, what's the form of the dataset? And maybe you have some lingering definitions on a, b, .... Btw, you can replace {x} with x. $\endgroup$
    – corey979
    Commented Jan 18, 2018 at 9:48
  • $\begingroup$ @corey979 77 points are in data. The form is typical for primary + secondary creep of material, so it absolutely could be fitten... $\endgroup$
    – crx
    Commented Jan 18, 2018 at 10:06
  • $\begingroup$ Please incldue the data into the question so that we have something to work with. $\endgroup$
    – corey979
    Commented Jan 18, 2018 at 10:07
  • $\begingroup$ @corey979 updated the question with data $\endgroup$
    – crx
    Commented Jan 18, 2018 at 10:11

2 Answers 2

11
$\begingroup$

Because there is a term x^d, I dropped the point {0, 0} from the data (see here).

Next, the terms a 34^b and e 34^f will be just constants - there is no point in taking them as a multiplication of two numbers - there are infinitely many ways to write them. So I changed to just a and e.

Using Manipulate:

Manipulate[
 Show[Plot[a x^d + e x, {x, 0, 700}], ListPlot@data, 
  PlotRange -> All], {a, 0, 1, 0.001}, {d, 0, 1, 0.01}, {e, 0, 1, 0.001}]

by trial-and-error I found starting values for the parameters:

fit2 = NonlinearModelFit[data, {a x^d + e x}, {{a, 0.2}, {d, 0.08}, {e, 0.}}, x]

that eventually gave

Show[Plot[Normal@fit2, {x, 0, 700}, PlotStyle -> Red], ListPlot@data]

enter image description here

being a quite good fit. The formula is

Normal@fit2

$0.00815195 x^{0.418618} - 0.0000613279 x$

$\endgroup$
5
$\begingroup$

a 34^b does not depend on x, so it is a constant with 2 unknowns, which won't work.

So start removing those parameters that can't be fit, i.e. use a x^d + e x

To find a good initial guess for the parameters let's solve a and e given two of the data points near the boundary and look at the result while varying d:

sol = Solve[Table[a x^d + e x,
  {x, Round[data[[{2, -1}, 1]], 1/1000]}] ==
      Round[data[[{2, -1}, 2]], 1/1000], {a, e}];
test[x_, d_] = a x^d + e x /. sol[[1]];

Manipulate[Show[ListPlot[data, PlotRange -> All], Plot[test[x, d],
                {x, Sequence @@ MinMax[data[[All, 1]]]}]], {d, 0, 10}]

Which reveals that d is about 0.42. The other parameters solved for this d-value are

sol /. d -> 0.42
(* {{a -> 0.0080681625, e -> -0.000060686662}} *)

Using these as initial guesses, an appropiate fit is returned:

Normal@NonlinearModelFit[data, a x^d + e x,
 {{a, 0.008068, 0.007068}, {d, 0.42, 0.43}, {e, -0.00006, -0.00007}}, x]

$0.00812816 x^{0.419428}-0.0000617869 x$

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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