# expression has trig component or not?

Is there any way in Sage to find out whether an expression has any trigonometric component (e.g. sin, cos,... ) or not?

expression has trig component or not?

add a comment

3

There's probably an Expression walker lurking somewhere which could do what the first function does automatically but I don't know where it lives. So instead (with the usual untested warning):

```
def walk_for_operators(someexpr):
tor = someexpr.operator()
if tor: yield tor
for oper in someexpr.operands():
for subtor in walk_for_operators(oper):
yield subtor
trig_ops = set([sin, cos, tan, sec, csc, cot,
sinh, cosh, tanh, sech, csch, coth,
asin, acos, atan, asec, acsc, acot,
asinh, acosh, atanh, asech, acsch, acoth,
atan2])
def has_trig_fn(someexpr):
return any(op in trig_ops for op in walk_for_operators(someexpr))
```

```
sage: x,y = var("x, y")
sage: list(walk_for_operators(x^2))
[<built-in function pow>]
sage: list(walk_for_operators(x^2+4))
[<built-in function add>, <built-in function pow>]
sage: list(walk_for_operators(x^2+4+sin(x)^2))
[<built-in function add>, <built-in function pow>, <built-in function pow>, sin]
sage: list(walk_for_operators((x^2+4+exp(x)^2)/(1-sin(y))))
[<built-in function mul>, <built-in function pow>, <built-in function add>,
sin, <built-in function add>,<built-in function pow>, exp, <built-in function mul>]
sage: # hmm. that's strange, no sub and div?
sage: list(walk_for_operators(x/y))
[<built-in function mul>, <built-in function pow>]
sage: (x/y).operands()
[x, 1/y]
sage: (x/y).operator()
<built-in function mul>
sage: (x/y).operands()[1]
1/y
sage: ((x/y).operands()[1]).operator()
<built-in function pow>
sage: # so it seems the division is processed to a pow (and sub to add with negative arg). okay.
sage:
sage: has_trig_fn(x^2+4)
False
sage: has_trig_fn(x^2+4+sin(x)^2)
True
sage: has_trig_fn((x^2+4+exp(x)^2)/(1-pow(atan2(x,y), 5)))
True
```

Asked: **
2011-02-10 07:49:09 -0500
**

Seen: **139 times**

Last updated: **Feb 10 '11**

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.