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$
  • $\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 Jan 18 '18 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$ – E. Delacroix Jan 18 '18 at 10:06
  • $\begingroup$ Please incldue the data into the question so that we have something to work with. $\endgroup$ – corey979 Jan 18 '18 at 10:07
  • $\begingroup$ @corey979 updated the question with data $\endgroup$ – E. Delacroix Jan 18 '18 at 10:11
10
$\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, privacy policy and cookie policy

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