cse(expr)
- иногда способ получить более компактное представление, поскольку повторяющиеся подвыражения могут быть заменены одним символом. cse
возвращает список повторяющихся выражений и список выражений (одиночный, если вы передали только одно выражение):
>>> from sympy import solve
>>> var('a:c x');solve(a*x**2+b*x+c, x)
(a, b, c, x)
[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]
>>> r, e = cse(_)
>>> for i in r: pprint(Eq(*i))
...
_____________
╱ 2
x₀ = ╲╱ -4⋅a⋅c + b
1
x₁ = ───
2⋅a
>>> for i in e: pprint(i)
...
x₁⋅(-b + x₀)
-x₁⋅(b + x₀)
Вы по-прежнему будете иметь длинные выражения, но они будут представлены более компактно (и более эффективно для вычислений), если cse
способен идентифицировать повторные подвыражения.
Чтобы использовать это в SymPy, вы можете создать две лямбда-выражения: одну для преобразования переменных в значения замены, а другую для использования этих значения:
>>> v = (a,b,c,x)
>>> Pts = Lambda(v, tuple([i[1] for i in r]+list(v)))
>>> Pts(1,2,3,4)
(2*sqrt(2)*I, 1/2, 1, 2, 3, 4)
>>> Func = Lambda(tuple([i[0] for i in r]+list(v)), tuple(e))
>>> Func(*Pts(1,2,3,4))
(-1 + sqrt(2)*I, -1 - sqrt(2)*I)