使用sympy中的给定术语进行智能替换

时间:2015-10-31 12:40:30

标签: python sympy

我正在使用sympy在Python3中进行符号计算。我的问题是强制替换已知的术语a,定义为x,y和z的乘积。看到这个最小的例子:

import sympy as sp
from sympy.abc import a,x,y,z
expr=(x*y)/z**3 *(x**2*y**2-5*x*y*z+12*z**2)
print (expr) #as typed in line 3
print (expr.subs(x*y/z,a)) #only substitues the first factor to a**1/z**2
print (sp.simplify(expr)) #not any better

我希望看到的是表格

a**3-5*a**2+12*a

a = x * y / z第4行也不是第5行或第6行。谁能帮我? 谢谢!

2 个答案:

答案 0 :(得分:1)

嗯,对于这个特殊的例子,以下想法导致了一个解决方案,但更一般地说,我不知道如何实现目标。

因此,不要将x*y/z替换为a,而是将x*y替换为a*z,然后进行简化。

expr2 = expr.subs(x*y, a*z)
print(expr2)
print(sp.simplify(expr2))

答案 1 :(得分:1)

先使用展开:

In [13]: expr.expand()
Out[13]: 
 3  3      2  2         
x ⋅y    5⋅x ⋅y    12⋅x⋅y
───── - ─────── + ──────
   3        2       z   
  z        z            

In [14]: expr.expand().subs({x * y / z: a})
Out[14]: 
 3      2       
a  - 5⋅a  + 12⋅a