假设我有以下内容:
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
。
答案 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)'
这是预期的结果吗?