5

Can anyone tell me, how to create a list of functions? I've tried the following code, but it doesn't work.

For[i = 0, i < 5, i++,
{
  functionList[[i]][t_]:=(t*i*i)
}]

functionList[[3]][10]

Of course, this construction is just an example.

pavelartlover
  • 53
  • 1
  • 1
  • 4

4 Answers4

11

Perhaps this is what you want?

functionList = Table[With[{i = i}, #*i*i &], {i, 0, 4}]

functionList[[3]][10]
{#1 0 0 &, #1 1 1 &, #1 2 2 &, #1 3 3 &, #1 4 4 &}

40

The With is used to get the values inside Function, which has the HoldAll attribute, as described in: Function in Table


The method above is more general and likely easier to read but for completeness here is another method, in this specific case notably more concise:

Array[# /. i_ :> (#*i*i &) &, 4]
{#1 1 1 &, #1 2 2 &, #1 3 3 &, #1 4 4 &}

Note that there are two different Functions in this code. The replacement rule is used in an inverted way that I have been calling the "injector pattern," and although destructuring is not used here this is similar in form to what I proposed early in my answer to Mathematica Destructuring.

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
6

Here's an even simpler way to create a "list" of functions, just define the function to have two arguments. To follow your example:

f[i_, t_] := t i^2

So now if you want the 5th function, it's

 f[5,t]

which gives 25 t. Or you can evaluate it at any point:

f[5,7]

to get 175. If you wanted f to behave more like a proper list so as to accept only integer-valued $i$, then you can force this by restricting the domain of $f$. For example:

f[i_?IntegerQ, t_] := t i^2

This $f$ will remain unevaluated for noninteger $i$.

bill s
  • 68,936
  • 4
  • 101
  • 191
3

Something like this?

functionList1 = Table[Evaluate[#*i*i] &, {i, 0, 4}]
functionList2 = Function[x, x^2 # &] /@ Range[0, 4]

functionList1[[3]]@10
functionList2[[3]]@10

(*
{0 &, #1 &, 4 #1 &, 9 #1 &, 16 #1 &}
{0^2 #1 &, 1^2 #1 &, 2^2 #1 &, 3^2 #1 &, 4^2 #1 &}
40
40
*)
chyanog
  • 15,542
  • 3
  • 40
  • 78
1

Not sure exactly what you're looking for, but perhaps one of these steps will help.

(1) Create a list of functions you wish to apply:

fcnlist = {Sin, Cos, Tan}

(2) Now define myfunc using a pure function which applies the selected function from fcnlist to an argument x of your choice:

myfunc[f_, x_] := fcnlist[[#1]] /@ {#2} &[f, x]

(3) To generate a list of results with Table:

Table[myfunc[i, π/6], {i, 1, 3}]
(* {{1/2}, {Sqrt[3]/2}, {1/Sqrt[3]}} *)

If you specifically want the function to be t i^2, then you simply generate a list of functions as long as you like:

fcnlist = Table[# i^2 &, {i, 1, 5}]
(* {#1 i^2 &, #1 i^2 &, #1 i^2 &, #1 i^2 &, #1 i^2 &} *)

When you apply this fcnlist as above with myfunc, you can generate a list of results as long as you wish (in this case 3 results again):

Table[myfunc[i, t], {i, 1, 3}]
(* {{t}, {4 t}, {9 t}} *)

Table[myfunc[i, 5], {i, 1, 3}]
(* {{5}, {20}, {45}} *)
TransferOrbit
  • 3,547
  • 13
  • 26