16
$\begingroup$

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.

$\endgroup$
1
  • $\begingroup$ Closely related, perhaps duplicate?: (6623), (20160) $\endgroup$
    – Mr.Wizard
    Feb 15, 2017 at 15:13

3 Answers 3

19
$\begingroup$

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.

$\endgroup$
4
  • 1
    $\begingroup$ Perfect! Thanks! $\endgroup$
    – LBogaardt
    Nov 12, 2013 at 16:49
  • 1
    $\begingroup$ Unique can also be helpful. $\endgroup$
    – ybeltukov
    Nov 12, 2013 at 16:52
  • $\begingroup$ 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... $\endgroup$ Nov 13, 2013 at 13:36
  • $\begingroup$ 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? $\endgroup$
    – sam wolfe
    Mar 2, 2020 at 15:14
19
$\begingroup$

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]}

$\endgroup$
2
  • $\begingroup$ So close :P Thanks! $\endgroup$
    – LBogaardt
    Nov 12, 2013 at 16:49
  • 2
    $\begingroup$ 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... $\endgroup$ Nov 13, 2013 at 13:39
1
$\begingroup$

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}

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.