Фактор / собрать выражение в Sympy - PullRequest
11 голосов
/ 10 марта 2012

У меня есть уравнение типа:

     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).Есть ли какая-то другая опция для разложения или другого метода для разделения переменных еще дальше?

Ответы [ 2 ]

6 голосов
/ 11 марта 2012

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

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₃

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

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

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

3 голосов
/ 26 апреля 2013

Здесь у меня установлено 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
...