Assign output of solve to variables

12

4

I have this input:

Solve[x^2 + 3 x + 2 == 0, x]

which gives this output:

{{x -> -2}, {x -> -1}}

I want the first x to be named x1 and the second x to be named x2 without having to copy the value and doing x1=-2 manually and x2=-1

Onizuka

Posted 2014-09-19T17:20:54.527

Reputation: 349

Question was closed 2014-09-20T00:08:11.363

Answers

13

{x1, x2} = x /. Solve[x^2 + 3 x + 2 == 0, x]
{-2, -1}

Karsten 7.

Posted 2014-09-19T17:20:54.527

Reputation: 26 728

loved it! Thanks! – Onizuka – 2014-09-19T17:43:05.493

4

{x1, x2} = Last @@@ Solve[x^2 + 3 x + 2 == 0, x]
(* {-2, -1} *)

or

{x1, x2} = Solve[x^2 + 3 x + 2 == 0, x][[All,1,-1]]
(* {-2, -1} *)

or

sol = Solve[x^2 + 3 x + 2 == 0, x];
sol[[All, 0]] = Last;
{x1, x2} = sol 
(* {-2, -1} *)

Note: Since this question has a much simpler structure than the question linked by Artes, these tricks work for the current case (with a single-variable expression to be solved), but not for the more general case in the linked Q/A.

kglr

Posted 2014-09-19T17:20:54.527

Reputation: 302 076

Can't you see it's a duplicate? – Artes – 2014-09-19T20:18:21.470

@Artes, -- now that i saw your comment -- yes. – kglr – 2014-09-19T20:35:14.783

2

A certain generalization using an indexed variable:

r = FindInstance[Sin[x] == Cos[x] && -10 < x < 10, x, Reals, 15] // Values // Flatten // N

{-5.49779, 7.06858, 0.785398, -8.63938, 3.92699, -2.35619}

Map[(x[#] = r[[#]]) &, Range @ Length @ r];

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

{-5.49779, 7.06858, 0.785398, -8.63938, 3.92699, -2.35619}

eldo

Posted 2014-09-19T17:20:54.527

Reputation: 34 072