SymPy,使用已知模式或子表达式进行简化/替换

时间:2013-08-02 07:27:07

标签: python substitution sympy symbolic-math symbolic-computation

我有以下表达式:

from sympy import pi, sin, cos, var, simplify
var('j,u,v,w,vt,wt,a2,t,phi')

u0 = v*a2*sin(pi*j/2 + pi*j*t*phi**(-1)/2) + pi*vt*a2*cos(pi*j/2 + pi*j*t*phi**(-1)/2)*j*phi**(-1)/2 + pi*w*a2*cos(pi*j/2 + pi*j*t*phi**(-1)/2)*j*phi**(-1)

可以简化:

print simplify(u0)
#a2*(pi*j*vt*cos(pi*j*(phi + t)/(2*phi)) + 2*pi*j*w*cos(pi*j*(phi + t)/(2*phi)) + 2*phi*v*sin(pi*j*(phi + t)/(2*phi)))/(2*phi)

给出子表达式:

bj = pi*j*(phi + t)/(2*phi)
cj = j*pi/(2*phi)

目前,我在简化的bj表达式中手动替换cju0来获取:

u0 = a2*(v*sin(bj) + cj*vt*cos(bj) + 2*cj*w*cos(bj))

是否可以使用SymPy实现这一目标,避免手动替换?

2 个答案:

答案 0 :(得分:8)

我想你缺少的是subs将取代任意表达式,而不仅仅是符号

>>> print simplify(u0).subs({pi*j*(phi + t)/(2*phi): bj, j*pi/(2*phi): cj})
a2*(pi*j*vt*cos(bj) + 2*pi*j*w*cos(bj) + 2*phi*v*sin(bj))/(2*phi)

(我使用了simplify,因为这导致pi*j*(phi + t)/(2*phi)而不是pi*j/2 + pi*j*t/(2*phi)的结果,但不是必需的)

阅读http://docs.sympy.org/0.7.3/tutorial/basic_operations.html#substitution,了解有关替换和替换的更多信息。如果您想进行更高级的替换,请查看replace方法。

答案 1 :(得分:1)

您可以使用cse例程找到常见的子表达式。