16

I use a list of variables {x1, x2, x3} to Solve a particular set of equations.

I am now trying to generalise this depending on the number of equations.

I need something along the lines of Table[{"x" i}, {i,1,Length[equations]}] which prints {x1, x2, x3, x4,...} etc.

However, "x" i obviously does not work. Nor does x[[i]] as {x[[1]], x[[2]], x[[3]]} won't work in Solve.

Any quick thoughts?

Thank you.

LBogaardt
  • 1,595
  • 1
  • 11
  • 21

3 Answers3

19

Use Symbol to convert a string into a symbol...

Table[Symbol["$x" <> ToString@i], {i, 5}]

{$x1, $x2, $x3, $x4, $x5}

One word of caution. I tend to keep programmatically generated variables prepended with a $ to avoid any collisions with any other variables I might've defined. Just from experience.

kale
  • 10,922
  • 1
  • 32
  • 69
  • 1
    Perfect! Thanks! – LBogaardt Nov 12 '13 at 16:49
  • 1
    Unique can also be helpful. – ybeltukov Nov 12 '13 at 16:52
  • I admit I also use leading $ for variable names but I think it is important to reminde people that this has the danger to conflict with Module local variable names, especially when they end -- as in this case -- with digits... – Albert Retey Nov 13 '13 at 13:36
  • Is it possible to use this within a Control environment, in a Manipulate? I tried it, but it doesn't seem to work. Somehow Control[{{a1, 0, ""}, {1, 0}}] is not the same as Control[{{Symbol["$a" <> ToString@1], 0, ""}, {1, 0}}]. Any idea how to fix this? – sam wolfe Mar 02 '20 at 15:14
19

You almost have found a simple solution: try x[i] instead of x[[i]]

Solve[{x[1] + x[2] == 2, x[1] - x[2] == 1}, {x[1], x[2]}]

{{x[1] -> 3/2, x[2] -> 1/2}}

List of this variables:

Array[x,2]

{x[1], x[2]}

ybeltukov
  • 43,673
  • 5
  • 108
  • 212
  • So close :P Thanks! – LBogaardt Nov 12 '13 at 16:49
  • 2
    I actually think that this is in a lot of cases the better solution: it is much easier to access these variables in a programmatic way and many functions as Solve, NDSolve,... do accept "nonatomic" variable names, so at least for them it isn't necessary to create those symbols programmatically... – Albert Retey Nov 13 '13 at 13:39
1

Or you could make a function to add a range of numbers to a predefined string("x")

f2 := Function[{i}, ToExpression["x" <> ToString[#]] & /@ Range[i]]

f2[5]

{x1,x2,x3,x4,x5}

Or a function to add a range of numbers to any string

f3 := Function[{i, s}, ToExpression[s <> ToString[#]] & /@ Range[i]]

f3[5, "y"]

{y1,y2,y3,y4,y5}

ps1
  • 71
  • 6