« Mathématiques avec Python et Ruby/Une tortue qui accélère la résolution de problèmes » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Ligne 7 :
Avant d'utiliser la tortue de ''Python'', on doit l'importer, en faisant
 
<sourcesyntaxhighlight lang="python">
from turtle import *
</syntaxhighlight>
</source>
 
Ensuite, une connaissance du vocabulaire de situation et de déplacement en anglais peut aider; en voici un échantillon:
Ligne 38 :
Pour représenter l'addition de 21 et 34, on peut tout simplement entrer
 
<sourcesyntaxhighlight lang="python">
from turtle import *
 
Ligne 45 :
 
print(position())
</syntaxhighlight>
</source>
 
Ce qui oblige à ignorer une information superflue (l'ordonnée de la tortue). La variante suivante permet d'éviter cela:
 
<sourcesyntaxhighlight lang="python">
reset()
forward(21)
Ligne 55 :
 
print(distance(0,0))
</syntaxhighlight>
</source>
 
 
Ligne 62 :
Pour soustraire 21 à 34, il suffit de faire reculer la tortue au lieu de la faire avancer:
 
<sourcesyntaxhighlight lang="python">
reset()
forward(34)
Ligne 68 :
 
print(position())
</syntaxhighlight>
</source>
 
Si on intervertit l'amplitude des mouvements, on découvre que ''Python'' choisit d'afficher négativement une position à gauche de l'origine:
 
<sourcesyntaxhighlight lang="python">
reset()
forward(21)
Ligne 78 :
 
print(position())
</syntaxhighlight>
</source>
 
Assez naturellement, on est amené à poser 21-34=-13: Découverte expérimentale des nombres négatifs...
Ligne 91 :
Pour additionner deux nombres négatifs, on peut faire
 
<sourcesyntaxhighlight lang="python">
reset()
backward(34)
Ligne 97 :
 
position()
</syntaxhighlight>
</source>
 
Tout ceci permet assez rapidement d'explorer les différents autres cas de figure (deux cas différents pour la somme de deux nombres de signes différents). Puis la découverte spontanée du fait que les deux instructions suivantes ont le même effet:
 
<sourcesyntaxhighlight lang="python">
forward(-34)
backward(34)
</syntaxhighlight>
</source>
 
Ce qui facilite grandement l'exploration de la soustraction de deux nombres relatifs:
Ligne 112 :
Pour calculer 34-(-21), on peut faire
 
<sourcesyntaxhighlight lang="python">
reset()
forward(34)
Ligne 118 :
 
position()
</syntaxhighlight>
</source>
 
Pour l'apprentissage des opérations sur les nombres négatifs, ''turtle'' constitue un [[w:Micromonde|outil expérimental]] intéressant à explorer.
Ligne 126 :
De même, les deux instructions suivantes ont le même effet (rotation de 60° vers la gauche):
 
<sourcesyntaxhighlight lang="python">
left(60)
right(-60)
</syntaxhighlight>
</source>
 
mais ce n'est nullement évident pour des lycéens qui n'ont jamais fait ce genre de manipulation, surtout depuis que la notion de [[w:rotation plane|rotation]] a totalement disparu de l'enseignement des mathématiques. Pourtant le module ''turtle'' permet de visualiser l'addition des angles et d'introduire des notions comme celle d'angles [[w:angles complémentaires|complémentaires]] ou [[w:angles supplémentaires|supplémentaires]] avec
 
<sourcesyntaxhighlight lang="python">
left(30)
left(60)
</syntaxhighlight>
</source>
 
 
Ligne 149 :
La [[w:planche de Galton|planche de Galton]] réalise une [[w:marche aléatoire|marche aléatoire]] de dimension 1 (le mouvement vertical de la bille n'ayant aucune influence sur le numéro de la case où elle aboutit). On peut donc simuler le mouvement d'une bille avec ce script:
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from random import *
Ligne 160 :
 
print(position())
</syntaxhighlight>
</source>
 
On peut améliorer ce script en utilisant ''randrange'' qui va de -1 à 1 (donc 2 exclu) par pas de 2, ce qui économise un test:
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from random import *
Ligne 172 :
 
print(position())
</syntaxhighlight>
</source>
 
==Statistiques sur 100 billes==
Ligne 178 :
Pour effectuer des statistiques sur 100 billes, on a intérêt à accélérer la tortue, avec
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from random import *
Ligne 185 :
hideturtle()
penup()
</syntaxhighlight>
</source>
 
Ensuite on crée un tableau d'effectifs pour simuler le bas de la planche de Galton:
 
<sourcesyntaxhighlight lang="python">
effectifs=[0 for x in range(-24,25)]
</syntaxhighlight>
</source>
 
Après ça il n'y a plus qu'à remplir le tableau en recommençant 100 fois l'expérience précédente (lancer d'une bille):
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from random import *
Ligne 207 :
forward(randrange(-1,2,2))
effectifs[int(xcor()]+=1
</syntaxhighlight>
</source>
 
Ce script, bien qu'assez court, met du temps à s'exécuter (de l'ordre d'une minute). Pour l'accélérer, on peut ajouter un degré d'abstraction en n'utilisant pas la tortue. En effet, chaque pas est égal à -1 ou 1 au hasard, donc d'après ce qu'on a vu au début de ce chapitre (opérations sur les nombres relatifs), on ne fait qu'additionner 24 nombres égaux à 1 ou -1, ce qui donne ce script:
 
<sourcesyntaxhighlight lang="python">
from random import *
effectifs=[0 for x in range(-24,25)]
for n in range(100):
effectifs[sum(randrange(-1,2,2) for h in range(24))]+=1
</sourcesyntaxhighlight>
 
Cette fois-ci, l'effet est presque instantané.
Ligne 224 :
Une fois le tableau d'effectifs rempli, le module ''turtle'' peut le représenter graphiquement sous forme d'un polygone des effectifs. Comme la méthode précédente est très rapide et que les effectifs des nombres impairs sont nuls, on va plutôt utiliser la variante suivante, avec 256 cases et 1000 essais:
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from random import *
Ligne 234 :
for x in range(256):
goto(x,effectifs[x])
</sourcesyntaxhighlight>
 
On obtient alors un histogramme de ce genre (la tortue est encore visible à droite):
Ligne 250 :
Comme le script qui va dessiner le triangle fractal sera assez long, on va utiliser des abréviations: ''fd'' au lieu de ''forward'', ''lt'' au lieu de ''left'' et ''rt'' au lieu de ''right''. Alors pour dessiner un triangle on peut faire ceci:
 
<sourcesyntaxhighlight lang="python">
from turtle import *
 
fd(100); rt(120); fd(100); rt(120); fd(100); rt(120)
</syntaxhighlight>
</source>
 
Ou mieux, en stockant ce programme en Python dans une variable ''programme'':
 
<sourcesyntaxhighlight lang="python">
from turtle import *
 
programme='fd(100); rt(120); fd(100); rt(120); fd(100); rt(120)'
exec(programme)
</syntaxhighlight>
</source>
 
Dans un premier temps, on va abréger encore plus, en notant chaque instruction de ce programme par une seule lettre:
Ligne 277 :
Alors le programme pour créer un programme qui dessine un triangle devient:
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from re import *
Ligne 285 :
programme=sub('m','rt(120); ',programme)
exec(programme)
</syntaxhighlight>
</source>
 
Le remplacement des lettres mnémotechniques par des instructions en Python est à l'image de ce que fait un [[w:compilateur|compilateur]] comme celui de Python. Avec ça, au moins, la recette pour dessiner un triangle est facile à retenir: ''avancer; tourner; avancer; tourner; avancer; tourner'', étant entendu que chaque fois qu'on avance, c'est de 100 pixels, et chaque fois qu'on tourne, c'est de 120° vers la droite.
Ligne 293 :
Pour transformer le triangle en flocon, on doit remplacer chaque instruction ''avancer'' par la séquence ''avancer; gauche; avancer; droite; avancer; gauche; avancer''. Du moment que chaque fois qu'on avance, c'est du même nombre de pixels (par exemple 81) et chaque fois qu'on tourne à gauche, c'est de 60° et chaque fois qu'on tourne à droite, c'est de 120°. Pour obtenir cet effet, il suffit de remplacer chaque ''A'' par ''ApAmApA'':
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from re import *
Ligne 305 :
programme=sub('p','lt(60); ',programme)
exec(programme)
</syntaxhighlight>
</source>
 
Ce script dessine bien une étoile:
Ligne 315 :
Pour finir le dessin du flocon fractal, il suffit d'itérer le remplacement de chaque ''A'' par ''ApAmApA'':
 
<sourcesyntaxhighlight lang="python">
from turtle import *
from re import *
Ligne 328 :
programme=sub('p','lt(60); ',programme)
exec(programme)
</syntaxhighlight>
</source>
 
Ce script dessine ceci en 9 lignes de Python (la tortue donne une idée de l'échelle):