我试图通过替换常见的较小表达式来简化大表达式。 这是完整的表达:
例如,我想这样做:
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 :(得分: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)**2
与L_r_tilde*sin(alpha)
。
我还会指出cse()
函数,它会自动拉出常见的子表达式。