Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Factor/collect expression in Sympy

I have an equation like:

     R₂⋅V₁ + R₃⋅V₁ - R₃⋅V₂
i₁ = ─────────────────────
     R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃

defined and I'd like to split it into factors that include only single variable - in this case V1 and V2.

So as a result I'd expect

        -R₃                        (R₂ + R₃)
i₁ = V₂⋅───────────────────── + V₁⋅─────────────────────
        R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃      R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃

But the best I could get so far is

     -R₃⋅V₂ + V₁⋅(R₂ + R₃)
i₁ = ─────────────────────
     R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃

using equation.factor(V1,V2). Is there some other option to factor or another method to separate the variables even further?

like image 623
viraptor Avatar asked Mar 10 '12 18:03

viraptor


2 Answers

If it was possible to exclude something from the factor algorithm (the denominator in this case) it would have been easy. I don't know a way to do this, so here is a manual solution:

In [1]: a
Out[1]: 

r₁⋅v₁ + r₂⋅v₂ + r₃⋅v₂
─────────────────────
r₁⋅r₂ + r₁⋅r₃ + r₂⋅r₃

In [2]: b,c = factor(a,v2).as_numer_denom()

In [3]: b.args[0]/c + b.args[1]/c
Out[3]: 

        r₁⋅v₁                v₂⋅(r₂ + r₃)    
───────────────────── + ─────────────────────
r₁⋅r₂ + r₁⋅r₃ + r₂⋅r₃   r₁⋅r₂ + r₁⋅r₃ + r₂⋅r₃

You may also look at the evaluate=False options in Add and Mul, to build those expressions manually. I don't know of a nice general solution.

In[3] can be a list comprehension if you have many terms.

You may also check if it is possible to treat this as multivariate polynomial in v1 and v2. It may give a better solution.

like image 183
Krastanov Avatar answered Sep 19 '22 16:09

Krastanov


Here I have sympy 0.7.2 installed and the sympy.collect() works for this purpose:

import sympy
i1 = (r2*v1 + r3*v1 - r3*v2)/(r1*r2 + r1*r3 + r2*r3)

sympy.pretty_print(sympy.collect(i1, (v1, v2)))

# -r3*v2 + v1*(r2 + r3)
# ---------------------
# r1*r2 + r1*r3 + r2*r3
like image 31
Saullo G. P. Castro Avatar answered Sep 17 '22 16:09

Saullo G. P. Castro