# How to pick a solution from a list of solutions using a test?

I have a list of solutions that depends on a parameter b3 and I'd like to get the solution for which the x value is minimal when the parameter value is substituted. for example:

b3 =.;
f[x_] := x^2 - b3
solutions = Solve[f[x] == 0, x]

{{x -> -Sqrt[b3]}, {x -> Sqrt[b3]}}


I'm trying to get the element for which x/.element is minimal (which should be b3-depended). I started with:

f[x_] := x^2 - b3
solutions = Solve[f[x] == 0, x]
minsol := Pick[solutions, x /. solutions, Min[x /.solutions]]
pickminimum = minsol /. {b3 -> 2}


but when trying the above I got:

Pick::incomp: "Expressions {{x->-\[Sqrt]b3},{x->\[Sqrt]b3}} and {-\[Sqrt]b3,\[Sqrt]b3} have incompatible shapes."
Pick::incomp: "Expressions {{x->-\[Sqrt]2},{x->\[Sqrt]2}} and {-\[Sqrt]2,\[Sqrt]2} have incompatible shapes"


Then I tried to remove the extra {}:

f[x_] := x^2 - b3
solutions = Solve[f[x] == 0, x]
minsol := Pick[((#[[1]]) & /@ solutions), x /. solutions, Min[x /. solutions]]
pickminimum = minsol /. {b3 -> 2};


for which I got:

Rule::argr: Rule called with 1 argument; 2 arguments are expected
Rule::argrx: Rule called with 0 arguments; 2 arguments are expected.


Trying just to see if it works for some list, also got me nowhere:

f[x_] := x^2 - b3
solutions = Solve[f[x] == 0, x];
minsol := Pick[{1, 2}, x /. solutions, Min[x /. solutions]]
minsol /. {b3 -> 2}

{}


I think I understand why I get the first error - but I have no idea why the second/third won't work.

clarification I'd like to have an expression for any value of b3. this is because later I'm interested at various quantities which are related to this point for many values of b3 (for example draw the first derivative of this 'minimal point' as a function of b3). so I'm less interested in a solution for a particular value of b3

-
SortBy[solutions /. Rule -> List, Last][[1, 1]] /. List -> Rule try this. –  Rorschach Sep 8 '13 at 10:53
solutions=x /.Solve[f[x] == 0, x]; Pick[solutions/. b3 -> 2,Min[solutions]/.b3 -> 2] gives {1}. You need to do the replacement before Pick uses them. –  Nasser Sep 8 '13 at 10:58
@Nasser: thanks, but I'd like it to work for non-particular value of b3: so later I can use it for any b3. I updated the post to clarify –  user29918 Sep 8 '13 at 11:53
@Blackbird: this is not working if the value of b3 is not set in advance: SortBy[solutions /. Rule /.{b3->2} -> List, Last][[1, 1]] /. List -> Rule –  user29918 Sep 8 '13 at 13:26

Your updated request makes no sense me unless you mean something much simpler that you appeared to be attempting. Perhaps all you want is this:

min = Min[x /. solutions]

Min[-Sqrt[b3], Sqrt[b3]]

min /. b3 -> 2

-Sqrt[2]


I hope this helps. If not I'm at a loss.

There are a couple of problems here. First, as Nasser comments your replacement is done out of order. If you correct that to:

Pick[solutions, #, Min@#] &[x /. solutions /. b3 -> 2]


Pick::incomp: Expressions {{x->-Sqrt[b3]},{x->Sqrt[b3]}} and {-Sqrt[2],Sqrt[2]} have incompatible shapes. >>

Pick[{{x -> -Sqrt[b3]}, {x -> Sqrt[b3]}}, {-Sqrt[2], Sqrt[2]}, -Sqrt[2]]


You still get an error because Pick wants matching structures for the first two arguments. It is IMHO the wrong tool for this particular task.

Instead I would use Position:

solutions ~Extract~ Position[#, Min@#] &[x /. solutions /. b3 -> 2]

{{x -> -Sqrt[b3]}}


Or a bit more advanced, Ordering:

solutions ~Extract~ Ordering[x /. solutions /. b3 -> 2, 1]

{x -> -Sqrt[b3]}

-
But unless I'm missing something - this forces me to set the value for b3 in advance: whereas I want to be able to set it later to any other desired value –  user29918 Sep 8 '13 at 13:13
@user29918 Maybe I'm missing something but your request does not make any sense to me. How you can choose the minimal value solution without any assumptions about b3? for example: take {x->b3, x->-b3} and try b3=1 or -1... –  Kuba Sep 8 '13 at 13:53
@user29918 I updated my answer with the only thing I can think that you might mean. If not please try again to explain what you want. –  Mr.Wizard Sep 8 '13 at 14:06
@Mr.Wizard - Now I feel really ashamed..that's exactly what I wanted (maybe up to minsol := x->Min[x/.solutions]). Thanks –  user29918 Sep 8 '13 at 15:10
@user29918 Don't feel ashamed. I'm glad we have a solution for you, and thanks for the Accept. –  Mr.Wizard Sep 8 '13 at 15:13

For example, derivative of minimal solution with respect to b3 in different points

f[x_] := x^2 - b3;
solutions = x /. Solve[f[x] == 0, x];
F[x_] := D[x, b3];
F[solutions[[Ordering[solutions /. b3 -> #, 1][[1]]]]] /. b3 -> # & /@ {1, 2, 3}


F can be any other function.

-
That doesn't return the original solution, only the post-substitution value. –  Mr.Wizard Sep 8 '13 at 11:45
@Mr.Wizard I'm almost finished the addition, when you wrote this comment :) –  ybeltukov Sep 8 '13 at 11:56
it works when I know the value of b3 in advance. but like the solution of Mr.Wizard, I'm not able to use it for any value of b3. I tried: solutions[[#]] &@Position[#, Min[#]][[All, 1]] &[solutions[[All, 1, 2]]] But I just get empty list –  user29918 Sep 8 '13 at 13:16
@user29918 I rewrite my answer. May be now it is more helpful. –  ybeltukov Sep 8 '13 at 16:01