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 :

Recherche et implémentation

Exploitation des résultats

 

Recherche et implémentation

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.

 

Exploitation des résultats

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.