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.

I often need to solve equations for numerical coefficients while preserving numerous variables (e.g. to preserve scaling relations). Thus I end up with a set of solutions like

$$ \left\{-\frac{(0.156113\, +0.0384783 i) d^{6/13} f^{6/13} m^{16/13} r^{9/13}}{g^{9/13} L^{6/13}}, -\frac{(0.156113\, -0.0384783 i) d^{6/13} f^{6/13} m^{16/13} r^{9/13}}{g^{9/13} L^{6/13}}, [...] , \frac{0.160785 d^{6/13} f^{6/13} m^{16/13} r^{9/13}}{g^{9/13} L^{6/13}}\right\} $$

where [...] is possible lots more, ugly solutions --- while I just want the last one (for example).

How can I select only the solution with the type of numerical coefficient I want (e.g. Real, or real & positive, etc)?

Solve[eq,var,dom] doesn't seem to work with 'inexact coefficients', and trying things like 'Select[...]' seem to have the same problem.

I've found I can brute force proper selection if I just replace every variable with unity (i.e. {Sols} /.f->1 /.d->1 /.m->1 $...$ But that realls sucks...

Any help would be appreciated, thanks!

share|improve this question
2  
how do you obtain these solutions in the first place? Have you tried NSolve (which you can ask for real solutions)? –  acl May 22 '12 at 17:44
    
The exact same problem results from NSolve... it can't handle those criteria for variables. –  zhermes May 22 '12 at 21:32
1  
I don't understand the need for the numerical part in your solution. Can't you just solve your equations with everything symbolic while adding an extra constraint with respect to the part that you currently have as a number? –  Sjoerd C. de Vries May 23 '12 at 8:13
add comment

2 Answers 2

up vote 6 down vote accepted

You can use Trace to pick out the coefficients. There may be a more elegant way but this seems to work.

sol={(1.233-0.23I)a^(1/2) b^(3/2),(1.233-0.343I)a^(1/2) b^(3/2),   
        (234.234)a^(1/2) b^(3/2)};
coeff=Map[TraceScan[Identity,#][[1]]&,sol];
rule=Select[coeff,( Im[#]<0)&];      (* Select only negative Im coefficients *) 
Extract[sol,Position[coeff,#]&/@rule]

{{(1.233 -0.23 I) Sqrt[a] b^(3/2)},{(1.233 -0.343 I) Sqrt[a] b^(3/2)}}
share|improve this answer
    
It looks like the question asks for the solutions that contain a specific type of number. So it should return the solution, not the number. –  Sjoerd C. de Vries May 22 '12 at 21:11
    
I updated the code to return the solution. –  azdahak May 22 '12 at 21:23
    
Thanks, this works... I'm a little disappointed if its the cleanest solution Mathematica can muster –  zhermes May 22 '12 at 21:34
add comment

I am sure there will be some input that will break the following method, but here is a way to use Pick or Select:

Let

sols = {-(((0.25` + 0.5` I) x^2 y^3)/z), ((3 + I) x^3 y)/w^2, 3 - 4 I, (5.` x^5 Sqrt[y])/z^3, 2, -2.5`, 4 x^2};

First, note that you can get the rules to replace variables with 1s using

thrd = Thread[Variables[sols] -> 1]
(* ==>  {w -> 1, x -> 1, y -> 1, z -> 1} *)

and use this in to get the "coefficients" in a single step:

sols /. thrd
(* ==> {-0.25 - 0.5 I, 3 + I, 3 - 4 I, 5., 2, -2.5, 4}  *) 

Now, you can use Select as follows:

Select[sols, myConditions[#] &@(# /. thrd) &]

where myConditions is any pure function specifying your criteria.

Examples:

Select[sols, (Element[#, Integers]) &@(# /. thrd) &]
(*==> {2, 4 x^2} *)
Select[sols, (Element[#, Complexes] && Re[#] > 2) &@(# /. thrd) &]
(* ==> {((3 + I) x^3 y)/w^2, 3 - 4 I, (5. x^5 Sqrt[y])/z^3, 4 x^2} *)
Select[sols, (Element[#, Complexes] && Im[#] < 0) &@(# /. thrd) &]
(* ==> {-(((0.25 + 0.5 I) x^2 y^3)/z), 3 - 4 I} *)

Alternatively, you get the same results using Pick as follows:

Pick[sols, Element[#, Integers] & /@ (sols/.thrd)]
Pick[sols, (Element[#, Complexes] && Re[#] > 2) & /@ (sols/.thrd)]
Pick[sols, (Element[#, Complexes] && Im[#] < 0) & /@ (sols/.thrd)]
share|improve this answer
    
It looks like the question asks for the solutions that contain a specific type of number. So it should return the solution, not the number. –  Sjoerd C. de Vries May 22 '12 at 21:11
    
@Sjoerd, hope this one is not too far off the mark:) –  kguler May 22 '12 at 21:40
add comment

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.