diff --git a/slides/cours_22.md b/slides/cours_22.md index fd865fb8e8c163ed84dadd8479bd073f0ee4f5da..dd92cf0145578af78e486ac2e3af4d63e7a39160 100644 --- a/slides/cours_22.md +++ b/slides/cours_22.md @@ -766,6 +766,177 @@ m&=m_2+m_3,\\ * Il faut stocker les coordonnées des quadrants. * Un nœud a un comportement différent s'il est interne ou externe. +# Algorithme d'insertion + +## Structure de données + +```C +struct node + etoile e // externe: pour stocker + etoile sup_etoile // interne: pour stocker m, x + quadrant q // coordonnées du quadrant + node enfants[4] +``` + +## Remarque: + +* On fait une simplification "moche": `sup_etoile` pourrait juste avoir une masse et une position. + +# Algorithme d'insertion + +\footnotesize + +## Algorithme d'insertion, pseudo-code (15min, matrix) + +. . . + +```C +rien insertion_etoile(arbre, e) + si (!est_vide(arbre) && dans_le_quadrant(arbre.q, e.x)) { + si (est_feuille(arbre)) + si (!contient_etoile(arbre)) + arbre.e = e + sinon + // on crée enfants et arbre.sup_etoile est initialisée + subdivision_arbre(arbre, e) + pour enfant dans arbre.enfants + insertion_etoile(enfant, arbre.e) + pour enfant dans arbre.enfants + insertion_etoile(enfant, e) + destruction(arbre.e) + sinon + maj_masse_cdm(arbre.sup_etoile, e) + pour enfant dans arbre.enfants + insertion_etoile(enfant, e) +``` + +# Utilisation de l'arbre + +* L'arbre est rempli: comment on calcule la force sur le corps 1? +* Parcours de l'arbre: + * si la distance entre 1 et le centre de masse est suffisante, on utilise la masse totale et centre de masse pour calculer la force. + * sinon, on continue le parcours + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Le cadrant ID ne contient que `1`, rien à faire. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Le cadrant SG ne contient `5` corps. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* La distance entre `1` et le centre de masse de SG est `d`. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* La distance entre `1` et le centre de masse de SG est `d`. +* Est-ce que `d` est assez grand? +* On va comparer avec la distance `d` avec la taille du quadrant `s`. + +# Critère $\theta$ + +* On compare $d=||\vec x_1-\vec x_{cm}||$ avec $s$ la taille du quadrant. +* Le domain est assez éloigné si + + $$ + \frac{s}{d}<\theta, + $$ +* $\theta$ est la valeur de seuil. +* Une valeur typique est $\theta=0.5$, donc la condition devient + + $$ + d>2s. + $$ + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Ici $d<2s$, domaine rejeté. +* ON descend dans l'arbre. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* `s` est plus petit, mais.... +* Cela ne suffit pas $d<2s$, domaine rejeté. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Les nœuds sont des feuilles, on calcule la force. +* On ajoute la force qu'ils exercent sur `1`. + +# Algorithme pour le calcul de la force + +Pour calculer la force sur un corps `c`, on parcourt l'arbre en commençant par la racine: + +* Si le nœud `n` est une feuille et n'est pas `c`, on ajoute la force dûe à `n` sur `c`; +* Sinon si $s/d<\theta$, on traite `n` comme une feuille et on ajoute la force dûe à `n` sur `c`; +* Sinon on continue sur les enfants récursivement. + + +## Continuons notre exemple précédent! + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Il y a deux corps dans le quadrant vert. +* Quel est le critère pour remplacer les étoiles par leur centre de masse? + +. . . + +* Et oui! $d>2s$ on peut remplacer les étoiles par leur centre de masse! + +# Algorithme du calcul de force + +## Écrire le pseudo-code-code du calcul de la force + +\footnotesize + +```C +rien maj_force_sur_etoile(arbre, e, theta) + si est_vide(arbre) + retourne + + si est_feuille(arbre) && contient_etoile(arbre) && dans_le_quadrant(arbre.q, e.x) + maj_force(e, arbre.e) + sinon si noeud_assez_loin(arbre, e, theta) + maj_force(e, arbre.sup_etoile) + sinon + pour enfant dans enfants + maj_force_sur_etoile(enfant, e, theta) +``` + # Les B-arbres \Huge