On 03/02/2012 02:56 PM, Chris Smith wrote:
Does this work?
def linear_expand(e):
from sympy.utilities.iterables import sift
d = sift(Add.make_args(e), lambda i: i.is_commutative)
t0 = (Add._from_args(d[True]),)
n0 = (S.One,)
e = d[False]
if not e:
return t0, n0
h, t = zip(*[[Mul._from_args(i) for i in t.args_cnc()]
for t in e])
return t0 + h, n0 + t
def projection(h, t, *sym):
assert len(h) == len(t)
rv = []
for i in range(len(h)):
if t[i].has(*sym):
rv.append((h[i], t[i]))
rv = tuple(zip(*rv))
if not rv:
rv = ((), ())
return rv
>>> linear_expand(1+a*A+3*b*B)
((1, a, 3*b), (1, A, B))
>>> c,nc=_
>>> projection(c,nc,A)
((a,), (A,))
>>> scalar = c[0]; scalar
1
>>> linear_expand(3*b*B)
((0, 3*b), (1, B))
>>> c,nc=_
>>> projection(c,nc,A)
((), ())
>>> scalar = c[0]; scalar
0
Something like this could probably go in exprtools. There is already a
class Term in there for """Efficient representation of
``coeff*(numer/denom)``. """ So you might have a class Linear that
implements the expand, projection and scalar methods.
/c
--
You received this message because you are subscribed to the Google
Groups "sympy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sympy?hl=en.
//I will do a complete evaluation of the functions as soon as I have time.
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sympy?hl=en.