Page personnelle de Maxime BOUCHEREAU

Divers

Sur cette page se trouvent divers documents et petits projets personnels qui ne sont pas en lien avec l'enseignement ou la recherche. Vous y trouverez beaucoup de simulations numériques.

Méthode des éléments finis en deux dimensions (2020)

Ce projet présente la méthode des éléments finis de Lagrange en deux dimension d'espace en introduisant le principe de cette méthode, puis l'équation de Poisson est étudiée. Des résultats de convergence sont ensuite illustrés via des simulations numériques.

Voici les documents associés au projet:

Equation différentielle stochastique avec potentiel (2024)

On s'intéresse à l'équation différentielle stochastique dVt = - ∇ V(Vt) dt + σ dBt (amélioration de l'équation de Langevin), où Vt est la vitesse d'une particule et (Bt)t désigne le mouvement brownien. La vitesse d'une particule étant donnée par une variable aléatoire, on peut, en réalisant ds simulations avec un grand nombre de particules, observer la distribution finale (en temps long) des vitesses avec une densité donnée par Ce-2V(x)/σ2.

Dimension 1

On se place ici dans le cas de la dimension 1. Ce code Python permet de calculer la distribution finale (en temps long) des vitesses pour un grand nombre de particules (1000 particules).

Figure 1: équation de Langevin: potentiel quadratique (distribution finale gaussienne). Figure 2: potentiel V(x) = -log(P(x)), P(x) polynomial de degré 4 (distribution finale proportionelle à 1/P(x))

Dimension 3: boîte fermée

On se place dans le cas de la dimension 3, en supposant que les particules évoluent dans une boîte fermée, sans interaction avec l'extérieur. On observe la distribution finale (en temps long) des trois composantes de la vitesse en espace, ainsi que l'énergie cinétique (proportionelle à la vitesse quadratique moyenne) du système avec 1000 particules

(code Python ici).
Potentiel quadratique V(x) = λ x2. Figure 1: λ = 0.01. Figure 2: λ = 0.1.
Potentiel quadratique V(x) = λ x2, λ = 1.

Dimension 3: boîte ouverte

On se place toujours dans le cas de la dimension 3, en supposant cette fois-ci que les particules peuvent s'échapper de la boîte par le dessus. On observe la distribution finale (en temps long) des trois composantes de la vitesse en espace, ainsi que l'énergie cinétique (proportionelle à la vitesse quadratique moyenne) du système et la distribution en hauteur des particules (code Python ici) pour 1000 particules.
Potentiel quadratique V(x) = λ x2, λ = 0.1.

Système proie-prédateur (2024)

On s'intéresse via ce code Python à un système proie-prédateur avec trois espèces en compétition, sur le modère "poule-renard-vipère" (chacune des espèces est la proie d'une autre et en chasse une autre).

Puissance d'un entier modulo un autre entier (2024)

On s'intéresse ici au nombre de puissances d'un entier naturel n modulo un second entier p, c'est-à-dire quel est le nombre d'éléments de nk dans ℤ/pℤ pour tout k ∈ ℕ. Ce code Python permet d'effectuer rapidement les calculs. On observe ainsi de grandes valeurs pour certains nombres, s'avérant correspondre aux nombres premiers, augmentant avec la valeur des nombres premiers.

PINN's (2024)

Afin de résoudre une équation aux dérivées partielles, il est possible d'utiliser les PINN's (de l'anglais Physics Informed Neural Network), ce qui permet de résoudre l'équation en une ou plusieurs dimensions, tout en ayant un domaine possédant une géométrie complexe.

Equation de la chaleur 1D

On résout via ce code Python l'équation de la chaleur en une dimension d'espace ∂tu = ∂x2u sur le segment [-1,1] avec conditions de Dirichlet au bord.

Equation de Poisson 2D

On résout via ce code Python l'équation de Poisson en deux dimensions d'espace -Δxu = 4 sur le disque unité avec conditions de Dirichlet au bord.

Equation de la chaleur 2D

On résout via ce code Python l'équation de la chaleur en deux dimensions d'espace ∂tu = Δxu sur le disque unité avec conditions de Neumann au bord.

Equation de la Schrödinger 1D

On résout via ce code Python l'équation de Schrödinger en une dimension d'espace ∂tu = i(∂x2u+x2u)/2 sur le segment [-1,1] avec conditions de Dirichlet au bord.

Machine Learning: Problème de classification (2024)

En Machine Learning, une application des réseaux de neurones conserne le problème de classification, qui consiste à séparer des données étiquetées en différents groupes via un apprentissage sur un jeu de données (on parle de problème de classification en apprentissage supervisé), puis à généraliser avec des données étiquetées mais inconnues. Le code Python suivant permet une première résolution de ce problème (les données sont matérialisées par des carré pour celles servant à l'entraînement ou des points pour celles servant au test, avec différentes couleurs pour chaque étiquette).

Problème à N corps (2024)

Le problème à N corps généralise l'étude du problème à deux corps, qui permet de décrire le mouvement de deux astres entre eux. Tandis que le problème à deux corps peut-être facilement étudié et donne des trajectoires d'astres plutôt prévisibles (par exemple une planète tournant autour de son étoile), le problème à trois (et N) corps donne des trajectoires cahotiques. Ce code Python permet d'approcher des trajectoires de N astres (de même masse) liés entre eux par ce problème.

Equation de transport (2024)

Pour résoudre numériquement l'équation de transport ∂tu = c ∂xu, une méthode très connue consiste à utiliser la méthode des différences finies, qui utilise la discrétisation en temps puis en espace de l'EDP. Une fois l'opérateur ∂x discrétisé en espace, la résolution numérique de l'EDP s'apparente ainsi à la résolution numérique d'une EDO. Un premier schéma, inspiré de la méthode d'Euler Implicite, garantit la stbalilité, mais n'est que d'ordre 1 et temps et en espace, ce qui ne garantit pas une bonne erreur numérique (problème de diffusion numérique). Un second schéma, appelé schéma de Lax-Wendroff, corrige ce défaut car est d'ordre 2 en espace et en temps, mais nécéssite un peu plus de calculs.

Ainsi, nous proposons ici une méthode alternative au schéma de Lax-Wendroff, qui consiste à rechercher, pour une discrétisation en espace et en temps données, une matrice donnant le passage de la solution d'un temps t à un temps t+ht, à partir de solution exactes. Cette méthode s'inspire du Machine Learning (création de données, minimisation d'une fonction d'erreur) et permet d'éviter les calculs supplémentaires tout en réduisant le phénomène de diffusion numérique, et permet d'améliorer le schéma d'Euler Implicite (voire de concurrencer Lax-Wendroff pour des discrétisations grossières en espace). Le code Python suivant a permis de réaliser les simulations numériques.

Opérations dans une base autre que 10 (2023)

Dans la vie courante, nous utilisons la base 10 afin d'y effectuer nos calculs. Cependant, cela n'a pas toujours été le cas. Les babyloniens utilisaient par exemple la base 60, tandis que les civilisations Mayas et Aztèques ont utilisé la base 20 et la base 12 a été largement utilisée avant la révolution (et continue plus ou moins de l'être au travers des calculs de durées). Enfin, les ordinateurs utilisent le système binaire, autrement dit, ils comptent en base 2. Ce code Python permet de donner les tables d'addition et de multiplication dans une base inférieure à 36 (limitée par les lettres de l'alphabet et les chiffres). Ci-dessous, les tables d'addition et de multiplication en base 12.

Simulation de fractales (2023)

Diverses fractales ont été simulées par ordinateur.

Flocon de Koch

Le flocon de Koch est une fractale construite à partir d'un triangle équilatéral auquel est ajouté au milieu de chaque côté un triangle équilatéral trois fois plus petit. On répète ce processus à chaque itération en diminuant de trois la taille des triangles ajoutés. Cette figure présente aussi la particularité d'avoir une longueur infinie tout en restant de surface finie. En effet, bien que bornée dans le plan, la longueur est multipliée par 4/3 à chaque itération, d'où une longueur infinie. Les itérations successives sont calculables via ce code Python.

Eponge de Menger

L'éponge de Menger est une structure fractale construite via des itérations successives en suivant ce procédé: A l'étape 0, on considère un cube, que l'on subdivise en 27 petits cubes identiques. On supprime les 7 cubes ne rencontrant pas une arrête du cube initial, ne donnant que 20 cubes. A l'itération 1, on répète ce procédé sur les 20 cubes, donnant 400 petits cubes à la seconde itération, et on peut répéter le procédé jusqu'au nombre d'itérations souhaité.

Au fil des itérations, on peut voir que le cube initial se creuse. En effet, son volume est multiplié par 20/27 à chaque itération, pour au final donner une éponge de Menger ayant une mesure de Lebesgue nulle. Les itérations successives sont calculables via ce code Python. Du fait de la multiplication par 20 du nombre de cubes à traiter à chaque itération, la temps de calcul augmente considérablement à partir de seulement trois-quatre étapes de construction.

Courbe de Hilbert 3D

La courbe de Hilbert 3D est une version en trois dimensions de la courbe de Hilbert, c'est-à-dire qu'il s'agit d'une fonction f : [0,1] → [0,1] × [0,1] × [0,1] surjective, autrement dit, sa courbe représentative remplit tout le cube. Cette fonction peut s'approcher via une suite de fonctions comme on peut le voir par la suite.

Tout comme dans le cas 2D, au bout d'un nombre suffisant d'itérations, on peut voir que la courbe occupe de plus en plus de place et semble remplir le cube, ce qui au premier abord peut sembler surprenant, car une courbe n'a pas de volume, tandis qu'un cube en a un. Les itérations successives sont calculables via ce code Python.

Courbe de Hilbert

La courbe de Hilbert est un exemple de courbe remplissante, c'est-à-dire qu'il s'agit d'une fonction f : [0,1] → [0,1] × [0,1] surjective, autrement dit, sa courbe représentative remplit tout le carré. Cette fonction peut s'approcher via une suite de fonctions comme on peut le voir par la suite.

Au bout d'un nombre suffisant d'itérations, on peut voir que la courbe occupe de plus en plus de place et semble recouvrir le carré, ce qui au premier abord peut sembler surprenant, car une courbe n'a pas de surface, tandis qu'un carré en a une. Les itérations successives sont calculables via ce code Python.

Méthode et fractales de Newton (2023)

La méthode de Newton, mise au point il y a plusieurs siècles, est incontournable lorsque l'on veut approcher le zéro d'une fonction. L'idée est d'utiliser une suite récurrente qui va approcher ce zéro, tant que son premier terme reste assez proche de ce dernier. Toutefois, lorsqu'une fonction possède plusieurs zéros, le choix du premier terme de la suite est important, car une légère perturbation peut faire converger la suite vers deux zéros différents. On dit alors que ces deux premiers termes appartiennent à deux bassins d'attration différents. Il est tout-à-fait possible de visualiser les bassins d'attraction d'une fonction réelle, mais également complexe, donnant ainsi des fractales, que l'on appelle fractale de Newton. Ce premier code Python permet de tester la méthode de Newton et de mettre en évidence les bassins d'attraction sur une fonction polynomiale rélle, tandis que ce second code Python permet d'étendre la méthode et la mise en évidence des bassin d'attraction à des fonctions polynomiales complexes (holomorphes). Ce travail a fait l'objet d'une présentation lors des 5 Minutes Lebesgue (Centre Henri Lebesgue, Université de Rennes) le 16 Mai 2023, dont le support de présentation se trouve ici.

Création et résolution d'un Labyrithne (2023)

Ce code Python permet dans un premier temps la création d'un Labyrinthe. La méthode utilisée est l'algorithme de Kruskal, qui consiste à casser aléatoirement des murs jusqu'à ce que toutes les cases soient accessibles les unes aux autres. Des murs supplémentaires sont ensuite abattus afin de créer un Labyrinthe complexe (plusieurs chemins joignent l'entrée à la sortie). Dans un second temps, le code va résoudre le Labyrinthe, en le parcourant depuis la sortie et en notant la distance de chaque case à la sortie. Une fois l'entrée atteinte, il ne reste plus qu'à aller vers les cases de distance de plus en plus petite pour rejoindre la sortie.

Automate cellulaire élémentaire (2023)

Un automate cellulaire est une grille régulière de cellules qui peut prendre un nombre fini d'états ai cours du temps (on est en temps discret). Le changement d'état d'une cellule au temps suivant se fait en fonction de son état et de celui de cellules voisines. Un automate cellulaire élémentaire regarde l'état de cellules en une dimension d'espace, valant 0 ou 1, avec une dépendance de l'état suivant chaque cellule en fonction de son propre état et de celui de ses deux celulles voisines. Il en existe 256 différents. L'un d'entre eux, permet par exemple de modéliser la surface d'un cône (animal marin). Un autre permet de reconstituer le triangle de Sierpinski, une fractale très célèbre via ce code Python.

Interpolation par série de Fourier (2022)

On modélise ici l'interpolation d'une courbe fermée du plan pouvant représenter une figure quelconque via une série de Fourier. Le nombre de paramètres peut se trouver réduit, ce qui allège le stockage. Ce code Python permet de modéliser une telle interpolation.

Schémas numériques pour les équations différentielles stochastiques (2022)

Ce programme permet de simuler des équations différentielles stochastiques. Un premier schéma utilisable est la méthode d'Euler Explicite, cependant, contrairement aux équations différentielles où ce schéma est d'ordre 1, l'ordre de convergence de cette méthode est ici d'ordre 1/2, ce qui impose l'ajout d'un terme correctif dans le schéma numérique, donnant le schéma de Milstein, d'ordre 1 cette fois. Le modèle simulé est le modèle de Black-Scholes, qui modélise de manière simple l'évolution du cours de la bourse.

Les illustrations représentent 100 simulations de l'EDS pour la première, et des courbes de convergence avec les deux schémas numériques proposés pour la seconde.

Fougère de Barnsley (2022)

Les systèmes dynamiques à temps discret permettent, sous certaines conditions, de produire des suites de points modélisant différentes figures, voire certains éléments que l'on trouve dans la nature. C'est par exemple le cas de certains système dynamiques utilisant une itération aléatoire d'applications affines du plan, modélisant des fougères, appelées fougères de Barnsley (nommées en l'honneur du mathématicien britannique M.Barnsley qui les a développé). Ce programme Python permet le tracé de deux fougères. Il est possible de créér d'autres systèmes dynamiques de la même forme (tant que les applications affines mise en jeu restent contractantes).

Modele de Vicsek (2022)

Voici un code Python reproduisant le modèle de Vicsek, qui simule les nuées d'oiseaux et leur tandance à se regrouper et voler dans la même direction lorsqu'ils sont proches.

Modélisation pour la géologie (2021-2022)

Ce projet a été mené en coopération avec une étudiante de géologie dans le cadre de séances de soutien afin de modéliser divers phénomènes géologiques.

Processus de diffusion en géologie

On modélise ici plusieurs phéomènes géologiques sur une grande durée à l'aide d'équations aux dérivées partielles. Ces phénomènes ont tous la particularité de faire intervenir l'opérateur de diffusion que l'on rencontre dans l'équation de la chaleur. La résolution des ces EDP's se fait à l'aide de schémas numériques aux différences finies (1D ou 2D), implicites en temps. Voici les problèmes posés et les codes Python de résolution:

Tomographie

On s'intéresse ici à la tomographie sismique, qui permet de reconstituer la nature du sous-sol par envoi d'ondes mécaniques. On applique ici ce principe à la reconstitution d'images en noir et blanc (problème inverse) via l'envoie de rayons autour d'un rectangle de pixels en nuances de gris. Voici les documents associés:

Expérience FPUT (2021)

Cette simulation numérique présente l'expérience FPUT (Fermi-Pasta-Ulam-Tsingou), qui est la première simulation numérique, réalisée en 1953. Cette simulation représente l'évolution d'un systèle différentiel modélisant 64 ressorts reliés entre eux. Dans ce code, la méthode de Runge-Kutta 4 a été choisie afin d'intégrer le système différentiel.

Evolution d'une épidémie d'un point de vue statistique (2021)

Cette simulation numérique présente le modèle SIR (Sain-Infecté-Rétabli), permettant par exemple de modéliser une épidemie de grippe au sein d'une population, mais, au lieu d'utiliser des équations différentielles, cette simulation étudie le stade de chaque individu, et comment il peut transmettre la maladie à ses voisins directs.

Projet MEF (2020)

Ce projet présente la méthode des éléments finis de Lagrange en une dimension d'espace en introduisant le principe de cette méthode, puis l'équation de Poisson est étudiée. Des résultats de convergence sont ensuite démontrés et illustrés via des simulations numériques. Enfin, la méthode à pas adaptatif, qui permet de raffiner le maillage à un endroit précis, est abordée.

Voici les documents associés au projet:

Simulations numériques autour de l'équation de la chaleur (2020)

Ces deux simulations numériques sont centrées autour du thème de l'équation de la chaleur.