我试图测试任何子表达式是否包含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函数?
答案 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,......)?