David Madore's WebLog: Une envoûtante animation d'ondes sur la sphère

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

Entry #2316 [older|newer] / Entrée #2316 [précédente|suivante]:

(lundi)

Une envoûtante animation d'ondes sur la sphère

Comme je me suis décidé relativement récemment (j'y ai fait allusion au passage) à apprendre des choses que j'aurais sans doute dû savoir depuis longtemps sur l'analyse harmonique élémentaire sous les groupes compacts, j'ai voulu faire joujou avec les harmoniques sphériques.

Comme il faut bien que je dise au moins approximativement de quoi il est question, voici une petite digression à ce sujet.

Beaucoup de gens, même non-mathématiciens, ont probablement entendu parler des séries de Fourier, qui sont une façon d'analyser un signal périodique en le décomposant en fréquences harmoniques : grossièrement parlant, il s'agit d'écrire une fonction de fréquence f comme comme de sinusoïdes de fréquences n·f (la « n-ième harmonique ») dont l'amplitude et la phase dépendent de n. Par ailleurs, un signal périodique, c'est la même chose qu'une fonction sur le cercle (un temps circulaire, c'est la même chose qu'un temps qui se répète périodiquement : voyez l'article Wikipédia que je viens de lier, il y a plein d'animations très cool dessus) : les séries de Fourier sont donc, si on préfère, une façon d'analyser les fonctions sur le cercle.

Mais il existe aussi une façon très analogue de décomposer un signal sur la sphère (il existe des choses analogues en toute dimension, et même sur des espaces nettement plus généraux, mais limitons-nous à la sphère de dimension 2) : au lieu de développer en sinusoïdes de fréquences multiples de la fondamentale comme on le fait pour les séries de Fourier (séries trigonométriques), on développe en termes de ce qu'on appelle des harmoniques sphériques, et le développement correspondant s'appelle l'expansion multipolaire (note : ces deux articles Wikipédia parlent en gros de la même chose, et il faudrait sans doute les fusionner, ou au moins les harmoniser — mais c'est un bon exemple de la manière dont des gens peuvent faire la même chose sans vraiment se parler). Ce développement a beaucoup de propriétés communes avec le développement de Fourier. Une différence notable est qu'au lieu d'avoir juste le multiple n de la fréquence fondamentale (si on veut, le nombre de bosses sur le cercle), les harmoniques sphériques Y[,m] dépendent de deux entiers, étant en quelque sorte le niveau de fréquence totale et m la fréquence en longitude. (Elles dépendent, du coup, du choix d'un pôle nord : si on effectue une rotation quelconque de la sphère, la fonction Y[,m] se transforme en une combinaison linéaire des Y[,m′] pour ce même et l'ensemble de tous les m′. Une recherche sur Google images donnera au moins une idée de ce à quoi ces fonctions ressemblent, sous différentes représentations graphiques — et on voit vaguement en quoi ce sont des analogues sur la sphère des sinusoïdes sur le cercle.) Du coup, au lieu d'avoir une série simple de coefficients de Fourier, on a une série à deux indices ,m de coefficients harmoniques.

Cette décomposition a des applications dans beaucoup de domaines : elle est très souvent pertinente pour étudier une fonction sur la sphère. Par exemple, une quantité définie sur la Terre tout entière, ça aurait un sens, et souvent un intérêt, d'essayer de la décomposer en harmoniques sphériques (je ne sais pas, moi, la forme du géoïde, la température de surface à un instant donné, la densité de population humaine, ce genre de choses ; les physiciens font ça aussi, entre autres, pour analyser le rayonnement cosmologique fossile et confronter son spectre aux théories).

Mais un intérêt particulier de la décomposition en séries de Fourier (ou de la transformée de Fourier), c'est aussi de résoudre des équations aux dérivées partielles linéaires ; d'ailleurs, Fourier cherchait, historiquement, à résoudre l'équation de la chaleur sur un cercle. C'est aussi le cas pour la décomposition en harmoniques sphériques, essentiellement à cause du fait que les harmoniques sphériques Y[,m] sont des vecteurs propres du laplacien shérique (ΔY[,m] = −(+1)·Y[,m]), ce qui les rend très confortables dans des équations faisant intervenir cet opérateur, comme l'équation de la chaleur ou l'équation des ondes. C'est pour cette raison que les harmoniques sphériques apparaissent dans la résolution de l'équation de Schrödinger pour le calcul des orbitales des électrons dans un atome.

Bref, j'ai fait une petite page en JavaScript qui représente l'évolution — linéaire — d'une onde sur une sphère (ou peut-être plutôt trois ondes, une par composante de couleur). En fait, j'ai fait deux versions de cette page :

ici en WebGL et ici sans

(la version WebGL est généralement beaucoup plus rapide que celle sans — cette dernière pourrait mettre plusieurs secondes, voire dizaines de secondes, à se charger, et affichera certainement moins d'images par seconde — mais la version WebGL a aussi plus de chances de ne pas marcher, ou de marcher bizarrement, ou dans de rares cas de crasher le navigateur ; à part ça, elles sont censées afficher exactement la même chose, aux choix aléatoires initiaux près).

Je trouve ça extrêmement joli et vraiment fascinant à regarder. J'ai passé un temps fou à regarder cette sphère opalescer jusqu'à me laisser hypnotiser par elle. (Mais pourquoi on ne m'a jamais dit ça, quand on m'a parlé de l'équation des ondes, que ça pouvait être aussi joli ?)

Après, je suis un peu déçu par les navigateurs. La version sans WebGL est lente, ce qui est peut-être normal parce qu'elle doit effectuer en gros 81 multiplications+additions par pixel et par rafraîchissement, mais je pensais quand même que les ordinateurs arriveraient à faire un ordre de grandeur plus vite que ça, surtout qu'on m'a tellement vanté que JavaScript était maintenant un langage ultra-rapide. La version avec WebGL est d'une rapidité acceptable, mais j'ai horriblement souffert pour l'écrire, à me cogner contre une limitation après une autre de ce truc (par exemple, j'avais voulu faire ça avec des textures flottantes, mais déjà c'est une extension pas garantie et ensuite de toute façon, on ne peut pas demander 81 textures flottantes, quelle que soit leur taille, c'est trop). Dans tous les cas, je n'ai pas vraiment pu aller au-delà de 9 niveaux d'harmoniques sphériques (c'est-à-dire <9 ; c'est pour ça que la sphère est aussi lisse) : c'est dommage, parce que je pense que ça peut être intéressant avec beaucoup plus, mais je ne vois pas vraiment comment améliorer l'efficacité.

(Les téméraires peuvent reprendre le fichier et modifier la ligne var degree_cut = 9 pour remplacer 9 par le nombre qu'ils voudront, mais déjà pour 12, la version sans WebGL est inacceptablement lente chez moi — bon, il est vrai qu'on peut baisser la résolution pour compenser, en changeant les attributs width="300" height="300" de l'élément canvas — et la version WebGL ne marche tout simplement plus puisque le « fragment shader » devient trop long et bute contre une autre limitation du machin.)

J'essaierai sans doute de calculer une animation en haute résolution et avec beaucoup d'harmoniques (j'aimerais bien arriver à mettre quelque chose comme 30 niveaux), et la mettre sur YouTube. Qui, bien sûr, massacrera impitoyablement la qualité de ce que j'aurai calculé (surtout que les formats vidéo sont très mauvais avec les couleurs qui bougent), mais bon, je ne sais pas bien quoi faire de mieux.

Mise à jour : Voici un lien vers la version sur YouTube, où j'ai calculé 31 niveaux d'harmoniques ce qui donne plus de détails sur la sphère (détails malheureusement en partie obscurcis par la compression vidéo).

↑Entry #2316 [older|newer] / ↑Entrée #2316 [précédente|suivante]

Recent entries / Entrées récentesIndex of all entries / Index de toutes les entrées