Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Solve returns a list of replacement rules

In: Solve[x + y == 3 && x - y == 6, {x, y}]
Out: {{x -> 9/2, y -> -(3/2)}}

I am only interested in the right hand side of these rules. To extract the right hand side I use substitution:

({x, y} /. sol)[[1]]

It gives

{9/2, -(3/2)}

This works, but it is not very elegant. You have to adapt the list of the variables, each time you solve for different variables. Is there a more general way to extract the right hand sides form a list of replacements?

Edit The number of variables and the number of solutions may both differ.

share|improve this question
5  
I think everyone uses practically the same. Personally I use the equivalent form x /. First@Solve[...] (if there's only one solution---there might be two). –  Szabolcs Mar 19 '12 at 9:17
3  
I think using ReplaceAll is in fact the elegant solution. If you get used to working with rules this method offers a lot of flexibility (e.g. when dealing with the already mentioned multiple solutions). –  Yves Klett Mar 19 '12 at 9:30
    
Thanks for the Accept. –  Mr.Wizard Mar 21 '12 at 16:12

6 Answers 6

up vote 7 down vote accepted

I also think that what you are already using is the best way, but here is another one to toss into the mix:

Solve[x + y == 3 && x - y == 6, {x, y}][[1]] /. Rule -> (#2 &)
{9/2, -(3/2)}
share|improve this answer
    
This doesn't return the complete set of solutions, when there are more than only one. A simple improvement would be deleting [[1]] or setting [[All]]. My approach seems to be a bit unnecessarily sophisticated. –  Artes Mar 19 '12 at 19:55
    
@Artes that is a valuable note. I was attempting to duplicate the result that the OP wanted and he used [[1]] too. –  Mr.Wizard Mar 19 '12 at 21:11
    
This works very well when deleting [[1]]. When solving for many variables (10), I don't want to specify these variables twice. I think this is much more elegant then substitution. –  sjdh Mar 21 '12 at 14:13

What about

res=Solve[x + y == 3 && x - y == 6, {x, y}];
res[[1, All, 2]]

that gives

{9/2, -(3/2)}

as you wanted. This should work while using Solve for any finite number of linear simultaneous equations.

Actually Rules in Mathematica has similar structure as list of Length two. You can see that if you replace Rule in a expression with List.

a1 = {a -> 2, b -> 3};
a1 /. Rule -> List

resulting to

{{a, 2}, {b, 3}}

This is an example that shows List is an intrinsic structure in Mathematica language and part specification simply works on rules. As expected

a2 = {{a, 2}, {b, 3}};
{a1[[1, 2]], a2[[1, 2]]}

{2, 2}

gives the same result for the List as well as the list of Rule.

share|improve this answer

You can also use

  Solve[x + y == 3 && x - y == 6, {x, y}] /. (_ -> b_) -> b 

or

 Solve[x + y == 3 && x - y == 6, {x, y}] /. Rule[_, b_] -> b 

or

Solve[x + y == 3 && x - y == 6, {x, y}] // #[[All, All, 2]] &
share|improve this answer
    
Yet another variation: Cases[Solve[x + y == 3 && x - y == 6, {x, y}], r_Rule :> Last[r], Infinity] –  J. M. Mar 19 '12 at 13:31

It would be better to use the following :

{#[[1, 2]], #[[2, 2]]} & /@ Solve[x^2 + y == 4 && x - y == 2, {x, y}]
{{-3, -5}, {2, 0}}

Since in general given a system of equations may have more than only one solution.

Another more general approach is to use Table, because of different number of variables. For example when we have 3 variables in a system :

x^2 + y == 4 && x - y == 2 && x^3 + y - z^3 == 5

We could write :

Table[ #[[a, 2]], {a, 3}] & /@ 
       Solve[ x^2 + y == 4 && x - y == 2 && x^3 + y - z^3 == 5, {x, y, z}]

Edit

Instead of specifying how many variables there are we can just use this :

Column@Apply[List, #, {2}] & @ Solve[
             x^2 + y == 4 && x - y == 2 && x^3 + y - z^3 == 5, {x, y, z}]

enter image description here

or

Column@
   Apply[Composition[Part[#, 2] &, List], 
         Solve[x^2 + y == 4 && x - y == 2 && x^3 + y - z^3 == 5, {x, y, z}], {2}]

enter image description here

share|improve this answer

As others have already echoed, using ReplaceAll is in fact, the most commonly used way (and not considered inelegant). You can accommodate for varying variables by keeping a list of them separately. For example, you could do

vars = {x, y};
sol = Solve[x + y == 3 && x - y == 6, vars];
var /. sol // First

Out[1]= {9/2, -(3/2)}

However, if you feel using ReplaceAll like that is kludgy, then you can also use OptionValue which does exactly what you want:

OptionValue[sol, vars]

Out[2]= {9/2, -(3/2)}
share|improve this answer

You can always just use indexing to get the rhs, though I find it makes your code less readable. For your example:

sol[[All,All,2]] 

will give {9/2, -(3/2)}. Which should work in general as the second "column" of a rule list is the rhs.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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