2014-09-10 105 views
1

我想測試任何子表達式是否包含正弦函數(或任何三角函數)sympy:測試的子表達式的三角函數

from sympy import sin, symbols, Wild 
A, B, x, y = symbols('A, B, x, y') 
W1=Wild('W1') 

我可以這樣做:

>> (A*sin(x)+B*sin(y)).has(sin(x)) 
out: True 

但這是行不通的:

>>: (A*sin(x)+B*sin(y)).has(sin(W1)) 
out: False 

如何測試一個或多個sin函數而不論參數?

回答

1

如果你想使用Wild S,使用find

In [11]: (A*sin(x)+B*sin(y)).find(sin(W1)) 
Out[11]: set([sin(x), sin(y)]) 

但是,如果你正在尋找像罪的單一功能,而不是通用的表達,更容易和更快的方法是使用atoms

In [12]: (A*sin(x)+B*sin(y)).atoms(sin) 
Out[12]: set([sin(x), sin(y)]) 

如果要檢查多個三角函數,atoms需要多個參數,它的效率比調用它多次

In [14]: (A*sin(x)+B*cos(y)).atoms(sin, cos) 
Out[14]: set([sin(x), cos(y)]) 
+0

顯然,「has」方法以類似的方式工作,但返回邏輯True/False。 – GeorgeSalt 2014-09-15 21:36:15

+0

哦,我沒有意識到你可以通過一個班'has'。在這種情況下,使用'expr.has(sin)'。 – asmeurer 2014-09-15 22:44:25

0

在我第一次嘗試,我嘗試使用外卡的參數測試罪

>>: (A*sin(x)+B*sin(y)).has(sin(W1)) 
out: False 

閱讀asmeuer答案,並嘗試了一下後,我發現,你可以簡單地把類罪(無參數)和它的作品:

>>: (A*sin(x)+B*sin(y)).has(sin, cos) 
out: True 

因此,使用如果你想有一個邏輯測試,如果你想一組functi的使用原子出現在表達式中的ons。

問題:是否有一個通用類可用於測試任何三角函數(sin,cos,tan,atan,...)的存在?