14
$\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$
16
$\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$
  • 1
    $\begingroup$ Perfect! Thanks! $\endgroup$ – LBogaardt Nov 12 '13 at 16:49
  • $\begingroup$ Unique can also be helpful. $\endgroup$ – ybeltukov Nov 12 '13 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$ – Albert Retey Nov 13 '13 at 13:36
18
$\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$
  • $\begingroup$ So close :P Thanks! $\endgroup$ – LBogaardt Nov 12 '13 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$ – Albert Retey Nov 13 '13 at 13:39
0
$\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, privacy policy and cookie policy

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