On se propose d’étudier le problème suivant :
« Quelle est la probabilité qu’un
triangle inscrit dans un cercle soit acutangle ? »
Ce problème m’a été soumis par Alain Busser et voici le récit de son implémentation algorithmique.
Navigation rapide :
Pour fixer la situation, donnons-nous le cercle unité, centré en l’origine d’un repère orthonormé du plan.
Il s’agit de
choisir aléatoirement des triangles inscrits dans ce cercle. Pour cela,
choisissons aléatoirement trois nombres compris entre 0 et 360 : et
puis plaçons les trois points
et
de coordonnées polaires respectives
,
et
.
On
se pose maintenant la question de savoir reconnaitre un triangle acutangle.
Étant donné que nous allons travailler dans un logiciel de géométrie, on peut
facilement mesurer les trois angles et donc reconnaitre un triangle acutangle.
Il
existe cependant une autre caractérisation : un triangle inscrit dans un
cercle est acutangle si et seulement si le centre du cercle circonscrit est à
l’intérieur du triangle.
CarMetal
possède la syntaxe inside qui permet de savoir si un point est à
l’intérieur d’un polygone, c’est-à-dire que l’expression booléenne inside(O ;
triangle) vaut 1 si le point O est à l’intérieur
de triangle, 0 sinon (et 0,5 s’il est sur la frontière).
Passons
alors aux premières expérimentations. Tout au long de cette présentation, on
notera :
·
le nombre total de triangles obtenus lors
d’une simulation ;
·
le nombre de triangles acutangles obtenus lors
d’une simulation ;
·
la fréquence de triangles acutangles inscrits
dans le cercle lors d’une simulation.
CarMetal
possède une implémentation du temps : il suffit de placer un point mobile
sur un cercle et de l’animer. Chaque mouvement de ce point correspondra alors à
une unité de temps. L’expression sum(1) permettra alors de
compter le double de ces mouvements (on multiplie par 2 car il se produit en
fait deux évènements élémentaires par mouvement du point mobile).
À
chaque mouvement de ce point, le logiciel procèdera au choix aléatoire de trois
nombres entre 0 et 360.
On
peut voir un exemple de ce compteur dans l’onglet n°1 du classeur disponible
dans l’archive.
Puisque
l’on sait maintenant compter le nombre de triangles générés (à la division par
2 près), on peut s’attaquer au comptage du nombre de triangles acutangles.
L’expression sum(inside) permet de compter ce
nombre : en effet, comme dit précédemment, l’expression inside
vaut 1 ou 0 selon les cas ce qui permet, lorsque l’on effectue leur somme au
fil du temps, d’obtenir le nombre de triangles acutangles.
Pourtant,
comme le montre l’animation suivante, il y a un problème : lors de deux
simulations successives, il se peut que la valeur de augmente alors qu’elle ne le devrait pas car
dans ces deux simulations, O n’est pas dans le triangle.
Essayons
de comprendre ce qu’il se passe en recréant deux simulations particulières.
Faisons faire à un triangle un aller-retour entre ces deux positions à l’aide
du script suivant :
Le
résultat sera une augmentation de 3 de la valeur de alors qu’aucun des deux triangles ne contient
le point O (on peut tester le script correspondant dans l’onglet n°3 du
classeur fourni). L’explication est assez simple : le déplacement des
trois points n’étant pas instantané et se faisant chacun leur tour, les
triangles formés lors des déplacements successifs peuvent contenir le point O,
ce qui fait alors augmenter la valeur de
.
Conclusion
(partielle) : ce n’est pas cette méthode qu’il faut employer pour générer
et compter les triangles acutangles ! Il va donc falloir placer le nouveau
triangle et ensuite seulement vérifier s’il est acutangle ou non.
Passons
alors au JavaScript avec les deux algorithmes suivants :
Ces
deux algorithmes différent l’un de l’autre par la méthode de comptage des
triangles acutangles. Le premier reprend le principe déjà utilisé, c’est-à-dire
en incrémentant de 1 la valeur de n si l’expression
booléenne inside vaut 1 (ligne 11). Le second relève les
valeurs des trois angles du triangle (lignes 11 à 13) et augmente la valeur de n
s’ils sont tous trois inférieurs ou égaux à 90°.
Arrivé
à ce stade, on pourrait se demander si ces deux algorithmes fournissent les
mêmes résultats… cela ne ferait que renforcer leur valeur. Voici donc un petit
algorithme de comparaison. Il stoppe son exécution lorsque les deux valeurs de n
(1ere méthode et 2e méthode) ne sont pas égales (ligne
19).
Plusieurs
exécutions de cet algorithme nous montrent que les deux méthodes de comptage
divergent dans les cas suivants :
·
l’un des angles mesure 0° : le 2e
script considère le triangle comme acutangle alors que pour le 1er,
il est réduit à un segment donc ne peut contenir le point O (sauf points
diamétralement opposés) ;
·
l’un des angles mesure environ 90°.
Quoi
qu’il en soit, les différences sont minimes. On préfèrera tout de même utiliser
le 1er algorithme puisqu’il ne fait pas appel au calcul des trois
angles du triangle, donc un peu moins compliqué à mettre en œuvre.
Fort
de cet algorithme de comptage, on peut passer à l’estimation de la fréquence de
triangles acutangles. On peut évidemment demander un grand nombre de simulations sur un seul poste ou bien,
puisque l’idée est de faire travailler des élèves en salle informatique, faire
du traitement en parallèle !
L’idée
fondamentale est de faire "peu" de calculs sur un "grand" nombre
de postes (et d’ensuite fusionner les résultats obtenus) plutôt qu’un
"grand" nombre de calculs sur un seul poste.
Sur
chaque poste, l’algorithme se terminera par la création d’un point, dont
l’abscisse est le nombre de triangles acutangles obtenus et l’ordonnée le
nombre total de triangles :
P1 pour le 1er
poste, P2 pour le 2e, etc.
Une
fois cela effectué, il faut maintenant centraliser les données. La dernière
fonctionnalité implémentée de CaRMetal permet de se connecter à une version
serveur et de lui envoyer des données (objets géométriques, ici les points).
Pour
plus de détails, on pourra se référer à cet article http://revue.sesamath.net/spip.php?article511,
mais voici les grandes étapes, en quelques captures, côté client :
Apparition du panneau
permettant l’échange avec le serveur :
En
cliquant sur « Partager », le point P1 est envoyé au serveur et après
que chaque élève a fait de même (avec son point Pi) on obtient alors, sur le poste serveur :
Un
exemple avec 3 points
Le script permettant de
fusionner les données est alors le suivant :
Et dans notre cas, le
résultat est :
Il
semble donc y avoir un quart de
triangles acutangles.
Une
petite droite de régression pour finir ?
Le
script est inclus dans la dernière figure : après avoir reçu les points
des élèves, on obtient donc un nuage de points comme vu précédemment. Il peut
alors être intéressant de trouver un lien entre les deux variables et
.
Une
fois le script lancé, on obtient le point moyen du nuage et la droite de
régression calculée par la méthode des moindres carrés et le coefficient
directeur de cette droite n’est … pas loin de 4 !! Cela semble encore
confirmer la proportion de triangles acutangles.