« Mathématiques avec Python et Ruby/Une tortue qui accélère la résolution de problèmes » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 198 : | Ligne 198 : | ||
from turtle import * |
from turtle import * |
||
from random import * |
from random import * |
||
speed= |
speed=0 |
||
hideturtle() |
hideturtle() |
||
penup() |
penup() |
||
Ligne 236 : | Ligne 236 : | ||
</source> |
</source> |
||
On obtient alors un histogramme de ce genre (la tortue est encore visible à droite): |
|||
[[Fichier:galtonpy1.svg|476px|center]] |
|||
Version du 1 janvier 2012 à 17:23
Depuis la version 2.6, Python possède un module appelé turtle et qui lui permet de faire du graphisme à la LOGO. Outre l'intérêt que peut présenter la consultation de son code source (on y trouve pratiquement tout ce qui est décrit dans les chapitres précédents sur la géométrie), ce module turtle permet de simplifier la résolution de certains problèmes et même d'introduire graphiquement certaines notions mathématiques. Le fil conducteur de ce chapitre est que la tortue LOGO peut mémoriser certaines données de position et se comporte comme une mémoire à la fois plus puissante et moins abstraite que les habituelles variables numériques.
Avant d'utiliser la tortue de Python, on doit l'importer, en faisant
from turtle import *
Ensuite, une connaissance du vocabulaire de situation et de déplacement en anglais peut aider; en voici un échantillon:
- forward ou fd: Pour avancer (l'unité de distance est le pixel)
- backward ou bk: Pour reculer
- left ou lt: Pour tourner à gauche (l'unité d'angle est le degré)
- right ou rt: Pour tourner à droite
- goto pour téléporter la tortue (donner l'abscisse puis l'ordonnée)
- penup() ou pu() pour que les déplacements de la tortue cessent de laisser des traces à l'écran
- pendown() ou pd() pour que les déplacements de la tortue recommencent à laisser des traces
- position() renvoie les coordonnées de la tortue
- home() renvoie la tortue au centre de l'écran (sa position initiale)
- reset() fait pareil mais en effaçant l'écran
- circle dessine un cercle (le rayon est en pixels)
- stamp() donne un coup de tampon sur l'écran, en laissant une empreinte de la tortue
L'écran n'apparaît que lors de l'exécution de la première instruction graphique (un forward par exemple). Sous Windows, il est déconseillé de laisser traîner la souris sur cet écran graphique. Dans les exemples qui suivent, l'export vectoriel au format eps du module TkInter (dont le module turtle hérite) a été utilisé pour produire des figures de meilleure qualité que celles qu'on voit sur l'écran de turtle.
Nombres relatifs
Les nombres (réels) peuvent être représentés par des graduations sur une droite, et donc par les emplacements de la tortue à l'écran.
Nombres positifs
Addition
Pour représenter l'addition de 21 et 34, on peut tout simplement entrer
from turtle import *
forward(21)
forward(34)
print(position())
Ce qui oblige à ignorer une information superflue (l'ordonnée de la tortue). La variante suivante permet d'éviter cela:
reset()
forward(21)
forward(34)
print(distance(0,0))
Soustraction
Pour soustraire 21 à 34, il suffit de faire reculer la tortue au lieu de la faire avancer:
reset()
forward(34)
backward(21)
print(position())
Si on intervertit l'amplitude des mouvements, on découvre que Python choisit d'afficher négativement une position à gauche de l'origine:
reset()
forward(21)
backward(34)
print(position())
Assez naturellement, on est amené à poser 21-34=-13: Découverte expérimentale des nombres négatifs...
Nombres négatifs
Une fois qu'on a vu des nombres négatifs, on peut chercher comment réaliser des opérations dessus:
Addition
Pour additionner deux nombres négatifs, on peut faire
reset()
backward(34)
backward(21)
position()
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:
forward(-34)
backward(34)
Ce qui facilite grandement l'exploration de la soustraction de deux nombres relatifs:
Soustraction
Pour calculer 34-(-21), on peut faire
reset()
forward(34)
backward(-21)
position()
Pour l'apprentissage des opérations sur les nombres négatifs, turtle constitue un outil expérimental intéressant à explorer.
Angles orientés
De même, les deux instructions suivantes ont le même effet (rotation de 60° vers la gauche):
left(60)
right(-60)
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 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 complémentaires ou supplémentaires avec
left(30)
left(60)
Fonctions
On a vu dans un chapitre précédent comment la module turtle permet de représenter graphiquement une fonction.
Statistique
Chute d'une bille sur la planche de Galton
La planche de Galton réalise une 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:
from turtle import *
from random import *
for n in range(24):
if random()<0.5:
forward(1)
else:
backward(1)
print(position())
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:
from turtle import *
from random import *
for h in range(24):
forward(randrange(-1,2,2))
print(position())
Statistiques sur 100 billes
Pour effectuer des statistiques sur 100 billes, on a intérêt à accélérer la tortue, avec
from turtle import *
from random import *
speed=0
hideturtle()
penup()
Ensuite on crée un tableau d'effectifs pour simuler le bas de la planche de Galton:
effectifs=[0 for x in range(-24,25)]
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):
from turtle import *
from random import *
speed=0
hideturtle()
penup()
for n in range(100):
home()
for h in range(24):
forward(randrange(-1,2,2))
effectifs[int(xcor()]+=1
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:
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
Cette fois-ci, l'effet est presque instantané.
Dessin de l'histogramme
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:
from turtle import *
from random import *
effectifs=[0 for x in range(256)]
for n in range(1000):
effectifs[sum(randrange(2) for h in range(256))]+=1
reset()
for x in range(256):
goto(x,effectifs[x])
On obtient alors un histogramme de ce genre (la tortue est encore visible à droite):
Fractales
Voir aussi
Sur ce site, il y a un wikibook sur LOGO dont beaucoup d'idées sont transposables ici.