2016-01-06 67 views
1

我想通过替换常见的较小表达式来简化大型表达式。 以下是完整的表达: full_expression_imageSympy替代数学表达式

举例来说,我想这样做:

exp.subs(L_r*cos(alpha)-L_p*sin(alpha),L_r_tilde)) 

表达式可以两次在1找到。 我也尝试用相同的方法替换较小的表达式,但SymPy在第一步中需要因式分解来执行替换。

这一个工程:

small_exp = L_p*sin(alpha)**2-L_r*sin(alpha)*cos(alpha) 
small_exp_factorized = small_exp.factor() 
small_exp_factorized.subs(L_p*sin(alpha)-L_r*cos(alpha),L_r_tilde) 

导致L_r_tilde*sin(alpha)但没有事先分解SymPy无法替代的。

是否有可能将所有常见表达式替换为没有因式分解或对上面大表达式的进一步操作?

回答

0

SymPy的subs只会代替完全出现在表达式中的东西。它有几个小启发式(像(x**4).subs(x**2, y)处理的,但是没有一个意志因素或以其他方式重写表达式为您服务。

一个窍门是重新排列替换,以便您仅代替一个词,像

small_exp.subs(L_p*sin(alpha), L_r*cos(alpha) + L_r_tilde) 

简化后,一切都应该抵消。

为了您的具体体现,它看起来像你的子表达式的每一个实例是由sin(alpha)相乘,所以你可以只在您的L_r_tilde定义这个词,或者你ç替换L_r*cos(alpha)*sin(alpha) -L_p*sin(alpha)**2L_r_tilde*sin(alpha)

我还会指出cse()函数,它会自动提取常见的子表达式。