David Madore's WebLog: Petite animation (merdique) d'ondes sur un tore plat

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

↓Entry #2532 [older| permalink|newer] / ↓Entrée #2532 [précédente| permalien|suivante] ↓

(mercredi)

Petite animation (merdique) d'ondes sur un tore plat

En lien avec l'entrée précédente (que personne n'a lue mais c'est normal), j'ai produit ce petit gadget JavaScript qui (s'il n'est pas complètement cassé) représente une animation de l'équation des ondes sur un tore plat, en l'occurrence le tore plat E/L quotient du plan euclidien E=ℝ² par un réseau L triangulaire équilatéral (i.e., la fonction est périodique par L), à partir d'une condition initiale gaussienne assez piquée (censée donnée une idée d'approximation d'une distribution δ). Si on préfère, cela revient à faire l'équation des ondes dans le plan à partir d'une condition initiale qui est la somme d'une gaussienne centrée sur chaque point de L. Concrètement, il s'agit juste de calculer (la fonction du temps t et du point xE/L) :

αL* cα exp 2 i π αx cos 2 π α t cα = exp α2 / U2

— soit, en plus moche pour les navigateurs cassés qui ne gèrent pas le MathML —

αL* cα·exp(2iπ(α·x))·cos(2π|αt) cα = exp(−|α|²/U²)

U est un paramètre d'étroitesse de la condition initiale, et, histoire de faire le lien avec les notations de l'entrée précédente, Λ(α)=|α|² et m(α)=1 pour le paramétrage par tous les éléments αL*. Ce que fait mon programme est uniquement de calculer cette somme (pour les α pas trop loin de l'origine dans L* ; pour alléger les calculs, il précalcule les fonctions de α et x et se contente ensuite de les sommer).

Commentaire mathématique : Si la dimension d'espace était impaire, l'évolution de l'équation des ondes à partir d'un δ initial se ferait uniquement sur des fronts sphériques centrés sur les points du réseau (imaginez que vous superposez une sphère centrée en chaque point de L, dont le rayon croit linéairement avec le temps, et dont l'amplitude décroît proportionnellement à la surface de façon que la quantité totale reste constante), et l'évolution à partir d'une gaussienne donne la même chose avec des sphères un peu épaissies ; en dimension paire, ce qui est le cas ici, ce « principe de Huygens » ne vaut pas, la fonction de Green de l'équation des ondes n'est pas concentrée sur une sphère[#], il y a une « queue » (négative par rapport au front d'onde, et qui apparaît en bleu sur mon animation). • Par ailleurs, même si le réseau L* ici est le réseau des poids de SU₃ et même si on a symétrie par le groupe de Weyl, il ne s'agit pas de l'équation des ondes sur SU₃ (pour ça il faudrait corriger Λ(α) et m(α)), c'est en gros ce qu'essaie d'expliquer l'interminable entrée qui précède.

[#] Ceci dit, ça doit être aussi assez joli comme dessin, une superposition de cercles de rayon croissant linéairement avec le temps et centrés sur chacun des points d'un réseau L triangulaire équilatéral.

Bon, tout ça fait des images pas trop moches, je dois l'avouer, et l'aspect « kaléidoscopique » apparaît assez clairement. Je pourrais mettre une animation de ce genre sur YouTube.

Ajout () : Voici les vidéos YouTube : pour un réseau triangulaire équilatéral et pour un réseau carré (j'ai eu la folie, dans les deux cas, de calculer ça en 1920×1080, 25fps, pour une vidéo de 3′=180s ; ça m'a pris deux fois 40 minutes de calcul, mais il faut reconnaître que le résultat n'est pas mal).

Ajout 2 : Je recopie le lien fourni dans le commentaire de Benoit qui a écrit une version bien plus efficace de mon animation en utilisant WebGL.

Mais le calcul en direct est péniblement lent. Je pensais que sur un ordinateur moderne je n'aurais même pas besoin d'optimiser et je pouvais calculer la somme de quelques centaines de cosinus par pixel d'une image de taille raisonnable à une vitesse d'animation qui dépasse la perception de l'œil humain, mais apparemment calculer des centaines de millions de cosinus par seconde ça ne se fait pas sur un simple ordinateur de bureau, en tout cas pas en JavaScript.

Comme je déteste optimiser par-dessus tout, et que JavaScript commence à me sortir par les oreilles, je ne touche plus à ce code. Si quelqu'un veut l'améliorer (rendre le truc interactif en ajoutant un bouton pause ou quelque chose comme ça, permettre de bouger, zoomer, ou ce que vous voudrez, ou encore changer le réseau — il y a juste quelques lignes à commenter/décommenter pour faire un réseau carré), envoyez-moi des patchs, mon code est lisible et commenté, mais je ne veux pas de suggestions non codées. Parce que, là, pour le moment, les incantations propitiatoires du JavaScript servant à conjurer des petites crottes de ragondin, elles me gonflent prodigieusement.

Si vous voulez savoir ce que ça donne comme son, voici la conversion directe en onde sonore de la valeur mesurée au point central (l'origine de E/L, celle où est centrée la gaussienne initiale, i.e., mettre x=0 dans les formules ci-dessus), avec exactement les paramètres de l'animation, juste accélérée d'un facteur 8800 par rapport à l'animation affichée par le JavaScript. Mais ça donne juste un bruit strident atroce (moralité, une jolie image ne correspond pas forcément à un joli son, et si je veux transformer des spectres en sons un peu harmonieux, une dissipation dans le temps, dépendant de la fréquence, est indispensable).

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

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