sympy:测试子表达式为trig函数

时间:2014-09-10 23:25:15

标签: sympy

我试图测试任何子表达式是否包含sin函数(或任何trig函数)

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函数?

2 个答案:

答案 0 :(得分:1)

如果您想使用Wild,请使用find

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

但是如果你正在寻找像sin这样的单一函数而不是泛型表达式,那么使用atoms就会更简单快捷:

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

如果要检查多个trig函数,atoms需要多个参数,这比多次调用它更有效

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

答案 1 :(得分:0)

在我的第一次尝试中,我尝试使用外卡来测试犯罪

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

在阅读了asmeuer的回答并进行了一些实验后,我发现你可以简单地传递类sin(没有参数)并且它有效:

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

因此,如果您想要进行逻辑测试,请使用 ,如果您想要一组出现在表达式中的函数,请使用 atoms

问题:是否有一个通用的类我可以用来测试是否存在任何trig函数(sin,cos,tan,atan,......)?