2016-01-06 69 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()函數,它會自動提取常見的子表達式。