Chris,

Thanks! I took your suggestion of using "as_independent" and made a 
function that now behaves the way I described in the first post:

import sympy
from sympy import S,N,sqrt,Poly
x,y = S('x'),S('y')

def GetCoefficientsOfFreeVariables(eq):
    if eq.__class__==sympy.Mul:
        coeffs,vars = zip(eq.as_independent(*eq.free_symbols,as_Add=False))
    elif eq.__class__==sympy.Add:
        coeffs,vars = zip(*(i.as_independent(*i.free_symbols,as_Add=False) 
for i in eq.args))
    return coeffs,vars

p = 4*sqrt(97)*x/97 - 2*sqrt(85)*y/85
p2 = 4*sqrt(97)*x/97
p3 = 4*sqrt(97)*x/97 - 2*sqrt(85)*y/85 + 4*sqrt(2)*x*y

GetCoefficientsOfFreeVariables(p)
 -> ((4*sqrt(97)/97, -2*sqrt(85)/85), (x, y))

GetCoefficientsOfFreeVariables(p2)
 -> ((4*sqrt(97)/97,), (x,))

GetCoefficientsOfFreeVariables(p3)
 -> ((4*sqrt(97)/97, -2*sqrt(85)/85, 4*sqrt(2)), (x, y, x*y))


I have not tested this for speed, but I see no reason it would be any 
slower than as_coefficient_dict. Is there anything else I could do to 
improve / generalize this function?

Thanks,
-David


On Friday, February 22, 2013 11:57:06 AM UTC-6, smichr wrote:
>
> On Fri, Feb 22, 2013 at 10:31 PM, David Mashburn 
> <[email protected] <javascript:>> wrote: 
> > Hello everyone, 
> > 
> > I have been using the method "as_coeff_dictionary" to get fast access to 
> the 
> > coefficients of simple multi-variable linear polynomials (a*x+b*y+... 
> where 
> > x,y are symbols and a,b are numerical). 
> > 
> > For the most part it works great, but I ran into a couple of quirks with 
> > this approach. First of all, "as_coeff_dictionary" only treats floating 
> > point or integer values as coefficients, and any irrational or more 
>
> The definition of coefficient in sympy is generally a Number (not 
> number). For one, 'is_Number' is true and the other, 'is_number' is 
> True. 
>
> > complicated pure numerical expressions become part of the "variable" 
> > instead. I can live with this by applying N first, but ideally a method 
> that 
> > could split off any numerical factors from the true variables would be 
> > preferable to me. 
>
> Perhaps this will suffice? 
>
> >>> eq 
> 2*sqrt(3)*x**2 
> >>> eq.as_independent(*eq.free_symbols, as_Add=False) 
> (2*sqrt(3), x**2) 
>
> The as_Add argument being False forces the expression to be treated as a 
> Mul. 
>
> > 
> > More insidious than this (at least to my way of looking at it) is that 
> > passing a Mul object instead of an Add results in things like 
> {<number>*x : 
> > 1} instead of {x:<number>}. 
>
> The method treates everything like a product so the keys are always 
> the factors -- if a Add is sent, it treats that as the single factor. 
> This way you always know that the expression can be rebuilt by 
> multiplying the the keys raised to their exponents. 
>
> The above method I showed is pretty straight forward. Whether 
> something else is better or not depends on what you want to do with 
> the pieces. 
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to