Фактор/собирать выражение в 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)
. Есть ли еще одна опция для фактора или другого метода для дальнейшего разделения переменных?
Ответы
Ответ 1
Если бы можно было исключить что-то из фактор-алгоритма (знаменатель в этом случае), это было бы легко. Я не знаю, как это сделать, так что это ручное решение:
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. Это может дать лучшее решение.
Ответ 2
Здесь у меня установлен 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