2012-03-10 5 views
11

У меня есть уравнение вида:фактор/собирают выражение в SymPy

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

определены и Я хотел бы разделить его на факторы, которые включают в себя только одну переменную - в этом случае V1 и V2.

Так что в итоге я бы ожидать

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

Но лучшее, что я мог бы получить до сих пор

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

с помощью equation.factor(V1,V2). Есть ли еще одна опция для фактора или другого метода для дальнейшего разделения переменных?

ответ

6

Если бы можно было исключить что-то из фактор-алгоритма (знаменателя в этом случае), это было бы легко. Я не знаю, как сделать это, так вот руководство решение:

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₃ 

Вы также можете посмотреть на оценивающих = False опций Add и Mul, чтобы построить эти выражения вручную. Я не знаю хорошего общего решения.

В [3] может быть понимание списка, если у вас много терминов.

Вы также можете проверить, можно ли рассматривать это как многомерный полином в v1 и v2. Это может дать лучшее решение.

3

Здесь я sympy 0.7.2 установлен и sympy.collect() работы для этой цели:

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