Учитывая рациональное выражение E
, подобное приведенному ниже, я хочу использовать Sympy, чтобы упростить его до чего-то похожего на F
(определено во втором блоке кода Python ниже):
import sympy as sp
a, b, c, d, n, t, A, B, C = sp.symbols('a, b, c, d, n, t, A, B, C', real = True)
E = n/(c-b) * ( B - (c-b)/(c-a)*A - (b-a)/(c-a)*B ) * (c-t)/(c-b) + n/(c-b) * ( (d-c)/(d-b)*B + (c-b)/(d-b)*C - B ) * (t-b)/(c-b)
print(sp.pretty( E ))
print(sp.pretty( E.simplify() ))
Это печатает
⎛ B⋅(-c + d) C⋅(-b + c)⎞ ⎛ A⋅(-b + c) B⋅(-a + b) ⎞
n⋅(-b + t)⋅⎜-B + ────────── + ──────────⎟ n⋅(c - t)⋅⎜- ────────── - ────────── + B⎟
⎝ -b + d -b + d ⎠ ⎝ -a + c -a + c ⎠
───────────────────────────────────────── + ─────────────────────────────────────────
2 2
(-b + c) (-b + c)
-n⋅((a - c)⋅(b - t)⋅(-B⋅(b - d) + B⋅(c - d) + C⋅(b - c)) + (b - d)⋅(c - t)⋅(A⋅(b - c) + B⋅(a - b) - B⋅(a - c)))
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
(a - c)⋅(b - c) ⋅(b - d)
Тем не менее, выражение можно - вручную - дополнительно упростить, результат чего я обозначил как F
:
F = n/(c-a) * (B - A) * (c-t)/(c-b) + n/(d-b) * (C - B) * (t-b)/(c-b)
print(sp.pretty( F ))
print((F-E).simplify())
Это выводит
n⋅(-A + B)⋅(c - t) n⋅(-B + C)⋅(-b + t)
────────────────── + ───────────────────
(-a + c)⋅(-b + c) (-b + c)⋅(-b + d)
0
Я рассмотрел различные варианты, включая factor()
, collect()
и apart()
, но ни один из них, похоже, не дает выражений, имеющих ту же структуру, что и F
. Есть указания о том, как действовать?
Кроме того, мне было интересно, можно ли как-нибудь настроить симпатичную функцию печати Sympy, чтобы
- Сохраните исходный порядок переменных как в числителе, так и в знаменателе (например,
B - A
вместо-A + B
). В настоящее время порядок в большинстве случаев перевернут, что выглядит довольно некрасиво с ведущими знаками минус. - Показывайте составные дроби как произведения простых дробей (например,
a/b c/d
вместоac/bd
), хотя в некоторых случаях, конечно, может быть неоднозначно, где и как разделить такие составные дроби.