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]
]
b
beingNull
). Can you check it? $\endgroup$FindMinimum
where the function you're minimizing is the distance from the curve to the data point when the curve is above the data point and some large value (say, 500) when the curve is below the observed data point (i.e., a penalty for the curve being below the data). But without any mention of how the data is generated in a probabilistic manner, this is just a manipulation of the data without the ability to make statistical inferences. $\endgroup$