Sympy 替代数学表达式

Sympy substitute mathematical expression

我试图通过替换常见的小表达式来简化大表达式。 这是完整的表达:

例如,我想做:

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 无法替代。

是否可以在不分解或进一步操作上面的大表达式的情况下替换所有常用表达式?

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() 函数,它会自动提取公共子表达式。