wolfram-mathematicawolfram-language

List generation via Array in Wolfram Language


I have a code where we first need to generate n + 1 numbers in a range with a given step. However, I don't understand how and why it works:

a = 2;
b = 7;
h = (b-a)/n;

x[0] = a;
Array[x, n+1, 0];

For[i = 0, i < n + 1, i++, x[i] = a + h*i]

My questions are:

  1. Are elements of x automatically generated when accessed? There's no mention of x before the line x[0] = a
  2. Shouldn't index access be like x[[i]]?
  3. What exactly does Array do here? It isn't assigned to anything which confuses me

Solution

  • From the docs, Array[f, n, r] generates a list using the index origin r.

    On its own Array[x, n + 1, 0] just produces a list of x functions, e.g.

    n = 4;
    Array[x, n + 1, 0]
    

    {x[0], x[1], x[2], x[3], x[4]}

    If x is defined it is applied, e.g.

    x[arg_] := arg^2
    
    Array[x, 4 + 1, 0]
    

    {0, 1, 4, 9, 16}

    Alternatively, to use x as a function variable the Array can be set like so

    Clear[x]
    
    With[{z = Array[x, n + 1, 0]}, z = {m, n, o, p, q}]
    
    {x[0], x[1], x[2], x[3], x[4]}
    

    {m, n, o, p, q}

    The OP's code sets function variables of x in the For loop, e.g.

    Still with n = 4

    a = 2;
    b = 7;
    h = (b - a)/n;
    
    For[i = 0, i < n + 1, i++, x[i] = a + h*i]
    

    which can be displayed by Array[x, n + 1, 0]

    {2, 13/4, 9/2, 23/4, 7}

    also x[0] == 2

    True

    The same could be accomplished thusly

    Clear[x]
    
    With[{z = Array[x, n + 1, 0]}, z = Table[a + h*i, {i, 0, 4}]]
    

    {2, 13/4, 9/2, 23/4, 7}

    Note also DownValues[x] shows the function definitions

    {HoldPattern[x[0]] :> 2, HoldPattern[x[1]] :> 13/4, HoldPattern[x[2]] :> 9/2, HoldPattern[x[3]] :> 23/4, HoldPattern[x[4]] :> 7}