# [sage-devel] Issues with Fourier series

```Hi,

It seems that the only way to compute with Sage the Fourier series of a
periodic real function is through the methods fourier_series_* of
piecewise-defined
functions
<http://doc.sagemath.org/html/en/reference/functions/sage/functions/piecewise.html>.

Let us take a trivial example: the Fourier series of the cosine function:```
```
sage: f = piecewise([((0,2*pi), cos(x))])

To get the cosine coefficient of order n of the Fourier series, one has to
call the method fourier_series_cosine_coefficient with n and the
half-period as argument:

sage: f.fourier_series_cosine_coefficient(1, pi)
1

So far so good. Now

sage: f.fourier_series_partial_sum(1, pi)
0

This is quite surprising at first glance and is actually the offset issue
already discussed in #8603 <https://trac.sagemath.org/ticket/8603>. The
expect result is obtained via

sage: f.fourier_series_partial_sum(2, pi)
cos(x)

To understand why one has to provide 2 as the first argument, let us have a
look at the documentation:

sage: f.fourier_series_partial_sum?
Signature:      f.fourier_series_partial_sum(*args, **kwds)
Docstring:
Returns the partial sum

f(x) sim frac{a_0}{2} + sum_{n=1}^N [a_ncos(frac{npi
x}{L}) + b_nsin(frac{npi x}{L})],

as a string.

At the very least, this is very incomplete: there is no explicit relation
between N and *args, nor between L and *args. One has to infer them from
the provided examples. Moreover the specified output type is wrong: it is
not a string but a symbolic expression:

sage: type(f.fourier_series_partial_sum(2, pi))
<type 'sage.symbolic.expression.Expression'>

The documentation of fourier_series_cosine_coefficient is better because it
has an INPUT section:

sage: f.fourier_series_cosine_coefficient?
Signature:      f.fourier_series_cosine_coefficient(*args, **kwds)
Docstring:
Returns the n-th Fourier series coefficient of cos(npi x/L), a_n.

INPUT:

* "self" - the function f(x), defined over -L x L

* "n" - an integer n=0

* "L" - (the period)/2

OUTPUT: a_n = frac{1}{L}int_{-L}^L f(x)cos(npi x/L)dx

However , it  needs some correction: n=0 looks like a typo here.

Besides the documentation, another issue is the relation between the period
and the piecewise function domain. Since one has to provide the half-period
L as an argument to the fourier_series_* methods, this suggests that L is
independent from the domain provided to piecewise. Let us then define

sage: f = piecewise([((0,4*pi), cos(x))])

This is the same cosine function as before but defined on a larger domain.
Let us ask for the Fourier coefficient of order 1  by providing pi as the
half-period, as above:

sage: f.fourier_series_cosine_coefficient(1, pi)
2

Boom!
Having a look at the code of fourier_series_cosine_coefficient, one sees
clearly why there is such an error:

sage: f.fourier_series_cosine_coefficient??
from sage.all import cos, pi
x = SR.var('x')
result = 0
for domain, f in parameters:
for interval in domain:
a = interval.lower()
b = interval.upper()
result += (f*cos(pi*x*n/L)/L).integrate(x, a, b)
return SR(result).simplify_trig()

The integral is taken over all the domain, while it should be taken over a
single period only.
A solution would be to deduce the half-period L from the domain (instead of
getting it as an argument)  by writing something like

L = (self.domain().sup() - self.domain().inf())/2

I volunteer to write a ticket to improve the documentation and possibly the
code. Any comment/suggestion prior to do so is welcome.

Eric.

--
You received this message because you are subscribed to the Google Groups
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email