3
$\begingroup$

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

$\endgroup$
4
  • $\begingroup$ SortBy[solutions /. Rule -> List, Last][[1, 1]] /. List -> Rule try this. $\endgroup$ Commented Sep 8, 2013 at 10:53
  • $\begingroup$ 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. $\endgroup$
    – Nasser
    Commented Sep 8, 2013 at 10:58
  • $\begingroup$ @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 $\endgroup$
    – user29918
    Commented Sep 8, 2013 at 11:53
  • $\begingroup$ @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 $\endgroup$
    – user29918
    Commented Sep 8, 2013 at 13:26

2 Answers 2

1
$\begingroup$

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]}
$\endgroup$
5
  • $\begingroup$ 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 $\endgroup$
    – user29918
    Commented Sep 8, 2013 at 13:13
  • 2
    $\begingroup$ @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... $\endgroup$
    – Kuba
    Commented Sep 8, 2013 at 13:53
  • $\begingroup$ @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. $\endgroup$
    – Mr.Wizard
    Commented Sep 8, 2013 at 14:06
  • $\begingroup$ @Mr.Wizard - Now I feel really ashamed..that's exactly what I wanted (maybe up to minsol := x->Min[x/.solutions]). Thanks $\endgroup$
    – user29918
    Commented Sep 8, 2013 at 15:10
  • $\begingroup$ @user29918 Don't feel ashamed. I'm glad we have a solution for you, and thanks for the Accept. $\endgroup$
    – Mr.Wizard
    Commented Sep 8, 2013 at 15:13
0
$\begingroup$

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}

enter image description here

F can be any other function.

$\endgroup$
4
  • $\begingroup$ That doesn't return the original solution, only the post-substitution value. $\endgroup$
    – Mr.Wizard
    Commented Sep 8, 2013 at 11:45
  • $\begingroup$ @Mr.Wizard I'm almost finished the addition, when you wrote this comment :) $\endgroup$
    – ybeltukov
    Commented Sep 8, 2013 at 11:56
  • $\begingroup$ 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 $\endgroup$
    – user29918
    Commented Sep 8, 2013 at 13:16
  • $\begingroup$ @user29918 I rewrite my answer. May be now it is more helpful. $\endgroup$
    – ybeltukov
    Commented Sep 8, 2013 at 16:01

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.