Séries de Fourier avec Maple
Introduction
Au cours de ce bref article, nous allons approximer deux fonctions classiques, respectivement un signal triangulaire et un créneau, sous forme de somme de cosinus. On n'explicitera pas la théorie de Fourier qui appuie les résultats : l'intéret ici est de considérer plusieurs approches pour afficher les approximations successives, d'abord sous forme de graphe statique, puis sous forme animée.
restart: with(plots):
Définition des coefficients
On commence par définir dans un tableau les coefficients des séries de cosinus : a pour la fonction triangulaire et b pour le créneau.
a := array(0..50): b := array(0..50): for i from 0 to 50 do a[i] := 4 / (((2*i+1)^2)*(Pi^2)); b[i] := (-1)^i * 4 / ((2*i+1)*Pi); od:
Approximation avec une procédure
La fonction que l'on cherche à obtenir pour le triangle est la suivante :
Une première idée pour la représenter est d'écrire une procédure qui calcule la valeur en t, puis apple la fonction plot directement, comme suit :
triangle := proc(n,couleur,afficher)
local i, s;
global a, b, f;
s := 1/2;
for i from 0 to n do
s := s + a[i] * cos(t * (2*i+1));
od:
f[n] := s;
if (evalb(afficher)) then
plot(s,t=-2*Pi..2*Pi, color=couleur);
fi;
end:
L'affichage du résultat pour la somme des 42 premiers coefficients se résume alors à :
triangle(42,red,true);
Animation de la construction
Cependant, l'expression sous forme de somme peut tout aussi bien s'écrire avec l'instruction sum de Maple. On peut donc définir une fonction fa(t,n) qui calcule la somme des n premiers termes :
f_a := (t,n) -> 1/2 + sum(a[k] * cos(t * (2*k+1)), k=0..n):
L'avantage de cette écriture est qu'elle permet l'utilisation de la procédure animate du logiciel. Cette dernière s'utilise comme plot, si ce n'est que l'on précise les intervalles des deux variables (ainsi qu'une éventuelle fréquence d'affichage) :
animate(f_a(t,n), t=(-2*Pi)..(+2*Pi), n=1..50, frames=100, color=blue);
On peut alors procéder de même pour le signal créneau :
f_b := (t,n) -> 1/2 + sum(b[k] * cos(t * (2*k+1)), k=0..n): animate(f_b(t,n), t=(-2*Pi)..(+2*Pi), n=1..50, frames=50, color=red);
Conclusion
Bien que la première approche soit souvent plus instinctive pour un programmeur, la dernière expression est beaucoup plus concise, tout aussi efficiente, et permet l'utilisation de nouvelles instructions Maple sympathiques tels que les graphes animés.
Annexes
- Feuillet Maple associé à l'article.
- Code source Pascal rédigé avec une bibliothèque obscure.