собирать рациональные факторы в выражении - PullRequest
0 голосов
/ 27 февраля 2019

Предположим, у меня есть следующее:

a, b, c = symbols('a b c')
test = a / 2 + b / 2 + c
pprint(collect(test, Rational(1, 2)))

a   b    
─ + ─ + c
2   2   

Есть ли способ заставить SymPy возвращать что-то более похожее на 1 / 2 * (a + b) + c или (a + b) / 2 + c?

Редактировать:collect_const(), кажется, работает на моем примере с игрушкой, но, похоже, не соответствует действительности.Вот лучший пример.

a, b, c, d, e, f = symbols('a b c d e f')    
test = c / a + d / a + e / (a * b) + f / (a * b)
print(test)

Я бы хотел получить что-то вроде 1 / a * (c + d + 1 / b * (e + f)).collect(test, (1 / b, 1 / a)) дает мне (e/a + f/a)/b + (c + d)/a, что близко, но я бы хотел рекурсивно собрать 1 / a в первом числителе.Кроме того, из-за вложенности выражений было бы здорово представить знаменатели как ведущий фактор, например, 1 / a, то есть 1 / a * (b + c), а не (b + c) / a.

1 Ответ

0 голосов
/ 28 февраля 2019

Я думаю, что вы должны использовать str() для этого.В вашем случае

str(collect(test, Rational(1, 2)))

дает вывод

'a/2 + b/2 + c'

Для упомянутого вами выражения я бы использовал

str(Add(Mul(Integer(-1), Add(Mul(Rational(1, 2), Symbol('f_2')), Mul(Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_5'), Add(Mul(Integer(-1), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_6'), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_7'), Add(Mul(Integer(-1), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_8'), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1)))))))), Add(Mul(Rational(1, 2), Symbol('p_2')), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_6'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_8'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('a_2'), Integer(-1)), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_2'), Add(Mul(Symbol('a_1'), Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('a_2'), Integer(-1)), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_4'), Add(Mul(Symbol('a_1'), Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))))), Mul(Pow(Symbol('wBar'), Integer(-1)), Symbol('x_5'), Symbol('x_6'), Symbol('z_1'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2'))), Mul(Pow(Symbol('wBar'), Integer(-1)), Pow(Symbol('x_6'), Integer(2)), Symbol('z_1'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2'))), Mul(Pow(Symbol('wBar'), Integer(-1)), Symbol('x_6'), Symbol('x_8'), Symbol('z_1'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')))))

Это дает мне вывод как

'-(f_2/2 + (a_2*(-f_2 + 1) + f_2)*(x_5*(-t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*wBar) + x_6*(-o*t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*wBar) + x_7*(-t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*wBar) + x_8*(-o*t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*wBar)))*(p_2/2 + x_6*(a_2*(-f_2 + 1) + f_2)*(-o*t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*wBar) + x_8*(a_2*(-f_2 + 1) + f_2)*(-o*t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*wBar) + x_2*(a_1*a_2*(-f_2 + 1) + f_2)*(-o*t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*a_2*wBar) + x_4*(a_1*a_2*(-f_2 + 1) + f_2)*(-o*t_2*z_2*(s - 1) + z_1*(-t_2 + 1))/(2*a_2*wBar)) + x_5*x_6*z_1*(a_2*(-f_2 + 1) + f_2)/wBar + x_6**2*z_1*(a_2*(-f_2 + 1) + f_2)/wBar + x_6*x_8*z_1*(a_2*(-f_2 + 1) + f_2)/wBar'

Чтобы получить упрощенный результат, я использовал simplify() as well.

str(simplify(Add(Mul(Integer(-1), Add(Mul(Rational(1, 2), Symbol('f_2')), Mul(Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_5'), Add(Mul(Integer(-1), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_6'), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_7'), Add(Mul(Integer(-1), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_8'), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1)))))))), Add(Mul(Rational(1, 2), Symbol('p_2')), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_6'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_8'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('a_2'), Integer(-1)), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_2'), Add(Mul(Symbol('a_1'), Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))), Mul(Rational(1, 2), Pow(Symbol('a_2'), Integer(-1)), Pow(Symbol('wBar'), Integer(-1)), Symbol('x_4'), Add(Mul(Symbol('a_1'), Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2')), Add(Mul(Integer(-1), Symbol('o'), Symbol('t_2'), Symbol('z_2'), Add(Symbol('s'), Integer(-1))), Mul(Symbol('z_1'), Add(Mul(Integer(-1), Symbol('t_2')), Integer(1))))))), Mul(Pow(Symbol('wBar'), Integer(-1)), Symbol('x_5'), Symbol('x_6'), Symbol('z_1'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2'))), Mul(Pow(Symbol('wBar'), Integer(-1)), Pow(Symbol('x_6'), Integer(2)), Symbol('z_1'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2'))), Mul(Pow(Symbol('wBar'), Integer(-1)), Symbol('x_6'), Symbol('x_8'), Symbol('z_1'), Add(Mul(Symbol('a_2'), Add(Mul(Integer(-1), Symbol('f_2')), Integer(1))), Symbol('f_2'))))))

, который дал мне

'-(a_2*wBar*x_6*z_1*(a_2*(f_2 - 1) - f_2)*(x_5 + x_6 + x_8) + (f_2*wBar + (a_2*(f_2 - 1) - f_2)*(x_5*(t_2*z_2*(s - 1) + z_1*(t_2 - 1)) + x_6*(o*t_2*z_2*(s - 1) + z_1*(t_2 - 1)) + x_7*(t_2*z_2*(s - 1) + z_1*(t_2 - 1)) + x_8*(o*t_2*z_2*(s - 1) + z_1*(t_2 - 1))))*(a_2*p_2*wBar + a_2*(x_6 + x_8)*(a_2*(f_2 - 1) - f_2)*(o*t_2*z_2*(s - 1) + z_1*(t_2 - 1)) + (x_2 + x_4)*(a_1*a_2*(f_2 - 1) - f_2)*(o*t_2*z_2*(s - 1) + z_1*(t_2 - 1)))/4)/(a_2*wBar**2)'

Это ожидаемый результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...