5

我有以下表達式:SymPy,簡單化/置換使用已知的圖案或子表達式

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) 

目前我手動替換SIM卡中的bjcj plified u0表達獲得:

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

是否有可能使用SymPy實現這一目標,避免了手動替換?

回答

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例程中找到常見的子表達式。

+0

是否可以傳遞給'cse'它應該查找的子表達式? –

+0

'cse'的要點是爲你找到表達式。如果你知道常見的子表達式,爲什麼你需要搜索它們?另一方面,如果您的問題是關於替換表達式,只需使用'subs'或'subs'文檔字符串中提到的任何其他例程。檢查sympy教程http://docs.sympy.org/0.7.3/tutorial/index.html – Krastanov

+0

我必須搜索它們,因爲它們有時不明顯可見,否則我可以在文本編輯器或類似文件中替換。例如見'cj',它的子表達式在'u0'裏面,但是沒有明確地分開...... –