收集表达的理性因素

时间:2019-02-27 18:51:15

标签: sympy

假设我有以下内容:

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 :(得分:0)

我认为您应该为此使用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)'

这是预期的结果吗?