2012-03-10 17 views
11

tengo una ecuación como:Factor/recoger expresión en sympy

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

definido y me gustaría que dividirlo en factores que incluyen solamente sola variable - en este caso V1 y V2.

Así como resultado que cabe esperar

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

Pero lo mejor que podía conseguir hasta ahora es

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

usando equation.factor(V1,V2). ¿Hay alguna otra opción para factorizar u otro método para separar las variables aún más?

Respuesta

6

Si fue posible excluir algo del algoritmo factor (el denominador en este caso) hubiera sido fácil. No sé de una manera de hacer esto, asi que aquí hay una solución manual de:

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₃ 

También puede ver las opciones de evaluar = False en Agregar y Mul, para construir esas expresiones manualmente. No sé de una buena solución general.

En [3] puede ser una lista de comprensión si tiene muchos términos.

También puede verificar si es posible tratar esto como un polinomio multivariante en v1 y v2. Puede dar una mejor solución.

3

Aquí tengo sympy 0.7.2 instalado y los sympy.collect() obras para este propósito:

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 
Cuestiones relacionadas