How to define a sequence of piecewise functions and then plot them altogether?

The following is the piecewise functions I want to define

fk(x)={j−12kj−12k≤f(x)≤j2kkf(x)≥k{f_k(x)} = \left\{ {\begin{array}{*{20}{c}}
{\frac{{j – 1}}{{{2^k}}}}&{\frac{{j – 1}}{{{2^k}}} \le f(x) \le \frac{j}{{{2^k}}}}\\
k&{f(x) \ge k}
\end{array}} \right.

where j=1,2,3,…,k2kj=1,2,3,…,k2^k. We can let f(x)=exf(x)=e^x and let kk to be from 1 to 6.

They are basically simple functions. The problem is that the number of pieces are increasing with kk, and it would be too tedious to define them manually. For example, f4f_4 has 64+1 intervals.

I believe there is some syntax that allows me to define them all at once and draw them altogether, but I don’t know how to do it. Hope someone can help. Thank you!




fkf_k is kind of inverse function. For example, f1={0x=2x>=2, k=3k=3, fk(x)=3f_k(x)=3 when x>=3x>=3 etc. When x=k}}];
pw[x_] := Piecewise[list]



Thank you! I still has a problem to ask. When I try list = Join[ Table[{(j – 1)/2^4, (j – 1)/2^4 <= E^x <= j/2^4}, {j, 1, 64}], {{4, E^x >= 4}}]; it gives the desired function for k=4k=4. But when I try to make it a function of kk by list[k_] = Join[Table[{(j – 1)/2^k, (j – 1)/2^k <= E^x <= j/2^k}, {j, 1, k*2^k}], {{k, E^x >= k}}]; it gives an error message.
– Tony
Jul 23 ’15 at 17:29



@Tony. Use := instead of =.
– march
Jul 23 ’15 at 18:08



@march Thank you for your reply, It still gives an error, which says “Tag List in \ {{0,0<=E^x<=1/16},{1/16,1/16<=E^x<=1/8},{1/8,1/8<=E^x<=3/16}‌​,{3/16,3/\ 16<=E^x<=1/4},{1/4,1/4<=E^x<=5/16},{5/16,5/16<=E^x<=3/8},{3/‌​8,3/8<=E^\ x<=7/16},{7/16,7/16<=E^x<=1/2},{1/2,1/2<=E^x<=9/16},{9/16,9/‌​16<=E^x<=\ 5/8},{5/8,5/8<=E^x<=11/16},{11/16,11/16<=E^x<=3/4},{3/4,3/4<‌​=E^x<=13/\ 16},{13/16,13/16<=E^x<=7/8},{7/8,7/8<=E^x<=15/16},{15/16,15/‌​16<=E^x<=\ 1},... is Protected." – Tony Jul 23 '15 at 18:58      Do Clear[list] and try again 😉 – Marius Ladegård Meyer Jul 23 '15 at 19:37 You can define a function that evaluates to the needed piecewise function while evaluating it. f[x_] := E^x fp[foo_, x_, k_Integer?Positive, j_Integer?Positive] /; j <= k 2^k := Piecewise[{ {(j - 1)/(2^k), (j - 1)/(2^k) <= foo[x] <= j/(2^k)}, {k, foo[x] >= k}

fp creates the Piecewise function series item for a k and j. It checks that j and k are integers with the addition of checking that j is in the correct range. When fp is called it both builds the function and evaluates it.

fp[f, 0.5, 2, #] & /@ Range[2 2^2]
(* {0, 0, 0, 0, 0, 0, 3/2, 0} *)

With Table we can generate the set of Piecewise functions for a particular k.

With[{k = 1}, Table[fp[f, x, k, j], {j, k 2^k}]]
{Piecewise[{{0, 0 <= E^x <= 1/2}, {1, E^x >= 1}}, 0],
Piecewise[{{1/2, 1/2 <= E^x <= 1}, {1, E^x >= 1}}, 0]}

This can be used in Plot to show the set of functions.

plotIt[foo_, k_Integer?Positive] :=
Plot[Evaluate@Table[fp[foo, x, k, j], {j, 2^k k}], {x, -2, 2},
PlotStyle -> (ColorData[“SolarColors”][#] & /@ Rescale@Range[2^k k])]

The Evaluate is needed because of Plots HoldAll attribute.

plotIt[f, 3]

Of course you know you need to take some care with parameter k in plotIt as the sequence of gets very long for small k. You can help mitigate this with the PlotPoints option.

Hope this helps.


Plotting performance for larger k can be greatly increased by plotting each piecewise function individually and spreading the plots over the available kernels in parallel. parallelPlotIt does this and significantly reduces the plot time.

parallelPlotIt[foo_, k_Integer?Positive] :=
Module[{fpList, colors, mapList, plots},
fpList = Table[fp[foo, x, k, j], {j, 2^k k}];
colors = ColorData[“SolarColors”][#] & /@ Rescale@Range[2^k k];
mapList = Transpose@{fpList, colors};
plots =
Plot[#[[1]], {x, -2, 2}, PlotStyle -> #[[2]],
PlotRange -> {Full, {0, Automatic}}] &, mapList, 1];

The plots and their plot style are paired up in mapList before ParallelMap is used to spread the plotting over the kernels. The plot range of each has been tweaked a bit as it was going negative on the y-axis for some reason.