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.
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]])$
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. $$%display latex
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] ])
gf=plot(f,-1,1,color='red',thickness=2) #tracé de la fonction sur sa période de définition
show(gf)
Comme indiqué précédemment, $S_n$ s'obtient à l'aide de la commande:
f.fourier_series_partial_sum(n,L)
S5=f.fourier_series_partial_sum(5,1);S5
gS5=plot(S5,-1,1,thickness='2')
On superpose la fonction et sa série de Fourier (n=4).
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]$:
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'
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).
def fp(x):
if x<-1:
return fp(x+2)
elif x>1:
return fp(x-2)
else:
return f(x)
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.
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.
S10=f.fourier_series_partial_sum(10,1);S10
gS10=plot(S10,-3,3,thickness='3',color='red')
show(gS10+gfp)