Série de Fourier

Soit $f$ une fonction périodique de période $2L$.

Soit $S_n(x)$ la somme des $n$ premiers termes de sa série de Fourier:

$$\boxed{S_n(x)=\frac{a_0}{2}+\sum_{k=1}^{n} a_k \cos \left(k\frac{\pi x}{L}\right) + b_k \sin \left(k\frac{\pi x}{L}\right)}$$

avec

$$ \frac{a_0}{2}=<f>$$$$ a_k=\frac{1}{L}\int_{x_0}^{x_0+2L} f(x) \cos \left(k\frac{\pi x}{L}\right) {\rm d} x $$$$ b_k=\frac{1}{L}\int_{x_0}^{x_0+2L} f(x) \sin \left(k\frac{\pi x}{L}\right) {\rm d} x $$

$S_n$ s'obtient à l'aide de la commande:

f.fourier_series_partial_sum(n,L)

Pour calculer les coefficients $a_k$ et $b_k$:

f.fourier_series_cosine_coefficient(k,L)

f.fourier_series_sine_coefficient(k,L)

Il faut auparavant avoir défini la fonction $f$ sur une période à l'aide de la fonction piecewise qui sert à définir les fonctions par morceaux.

Fonction définie par morceaux

Synthaxe: on donne d'abord les expressions $f_i(x)$ successives de la fonction $f$ sur chaque intervalle $[x_{i-1},x_i]$ , l'intervalle $[x_0,x_n]$ correspondant à une période, puis on utilise la fonction piecewise.

f1(x)=expression de la fonction sur l'intervalle $[x_0,x_1]$

f2(x)=expression de la fonction sur l'intervalle $[x_1,x_2]$

....

fn(x)=expression de la fonction sur l'intervalle $[x_{n-1},x_{n}]$

piecewise$([[(x_0,x_1),f_1],[(x_1,x_2),f_2],.........[(x_{n-1},x_n),f_n]])$

Exemple:

On choisit une fonction de période 2, de valeur moyenne non nulle, ni paire, ni impaire et continue:

$$ \left\lbrace \begin{array}{ll} -1<x<0 & f(x)=0\\ 0<x<1/2 & f(x)=2x\\ 1/2<x<1 & f(x)=-2x+2 \end{array} \right. $$
In [1]:
%display latex
In [2]:
f1(x)=0;f2(x)=2*x;f3(x)=-2*x+2
f=piecewise([ [(-1,0),f1], [(0,1/2),f2], [(1/2,1),f3] ]) 
In [3]:
gf=plot(f,-1,1,color='red',thickness=2) #tracé de la fonction sur sa période de définition
show(gf)

Série de Fourier

Comme indiqué précédemment, $S_n$ s'obtient à l'aide de la commande:

f.fourier_series_partial_sum(n,L)

In [4]:
S5=f.fourier_series_partial_sum(5,1);S5
Out[4]:
In [5]:
gS5=plot(S5,-1,1,thickness='2')

On superpose la fonction et sa série de Fourier (n=4).

In [6]:
show(gf+gS5) 

Si on souhaite comparer les courbes sur plus d'une période il est nécessaire d'élargir la définition de $f$ à $\mathbb{R}$.

En effet, la fonction définie à partir de piecewise ne permet de faire un tracé que sur l'intervalle $[-1,1]$. On peut le vérifier en tentant de tracer la courbe de $f$ sur l'intervalle $[-3,3]$:

In [7]:
plot(f,-3,3)
verbose 0 (3749: plot.py, generate_plot_points) WARNING: When plotting, failed to evaluate function at 134 points.
verbose 0 (3749: plot.py, generate_plot_points) Last error message: 'point 2.97045226131 is not in the domain'
Out[7]:

On obtient un message abscons et la courbe n'est tracée que sur l'intervalle $[-1,1]$!

On doit alors programmer une fonction qui prolonge $f$ à $\mathbb{R}$.

Une méthode consiste à définir (en langage Python) une fonction $f_p$ de manière récursive (dans sa définition la fonction fait appel à elle-même).

In [8]:
def fp(x):
    if x<-1:
        return fp(x+2)
    elif x>1:
        return fp(x-2)
    else:
        return f(x)
In [9]:
gfp=plot(fp,-3,3,thickness=2)
show(gfp)

On n'est donc plus limité dans le choix de l'intervalle sur lequel on souhaite tracer la fonction $f$.

On peut alors superposer la courbe de $f$ et sa série de Fourier $S_n(x)$ sur un intervalle de largeur arbitraire.

In [10]:
gS5p=plot(S5,-3,3,thickness='2',color='red')
show(gS5p+gfp)

La fonction $f$ choisie étant continue la convergence est uniforme et on n'observe pas de phénomène de Gibbs.

In [11]:
S10=f.fourier_series_partial_sum(10,1);S10
Out[11]:
In [12]:
gS10=plot(S10,-3,3,thickness='3',color='red')
show(gS10+gfp)
In [ ]: