list manipulation - How to fit a function to data so that the fit is always greater than or equal to the data?
b = nst[n_] :=
Length[NestWhileList[If[EvenQ[#], #/2, 3 # + 1] &,
n, # > 1 &]];
nn = 500;
With[{stps = Array[nst, nn]},
Table[Max[Take[stps, n]], {n, nn}]
]
I'm working with the following list and I am trying to find a fit so that it's always greater than the data rather then the normal fitting method used in the FindFit
function:
FindFit[b, x + y*Log[z], {x, y}, z]
I like the ability to change the fitting model in the FindFit
function but I can't figure out how to set it for what I want. Help would be appreciated.
Answer
Create the list b
as you have shown.
nst[n_] := Length[NestWhileList[If[EvenQ[#], #/2, 3 # + 1] &, n, # > 1 &]]
b = With[{stps = Array[nst, nn]}, Table[Max[Take[stps, n]], {n, nn}]];
It looks like
ListPlot[b, PlotStyle -> Blue]
It is apparent that we want to locate the first point in each group of horizontal points and use that in the constraint.
Those points can be located as follows:
data = Transpose@Join[{Range[500], b}];
(* {{{1, 1}, {2, 2}, {3, 8}, ..., {500, 144}} *)
data
is a list of {index, b}
pairs.
Next locate the positions where there is a jump.
pos = Position[Differences[b], x_ /; x > 0] + 1
Build a list of constraints forcing the desired function to exceed the y
value at those positions.
constraints =
Map[x + y*Log[#[[1]]] >= #[[2]] &, Extract[data, pos]]
(* {x + y Log[2] >= 2, x + y Log[3] >= 8, x + y Log[6] >= 9,
x + y Log[7] >= 17, x + y Log[9] >= 20, x + y Log[18] >= 21,
x + y Log[25] >= 24, x + y Log[27] >= 112, x + y Log[54] >= 113,
x + y Log[73] >= 116, x + y Log[97] >= 119, x + y Log[129] >= 122,
x + y Log[171] >= 125, x + y Log[231] >= 128, x + y Log[313] >= 131,
x + y Log[327] >= 144} *)
Use the constraints in FindFit
.
solution =
FindFit[b, {x + y*Log[z], Sequence @@ constraints}, {x, y}, z]
(* {x -> 69.7139, y -> 12.8302} *)
Plot it to validate the solution
Show[
ListPlot[list, PlotStyle -> Blue],
Plot[Evaluate[x + y*Log[z] /. solution], {z, 1, 500},
PlotStyle -> Black]
]
Comments
Post a Comment