Graphes Python
Graphes Python
Graphes Python
article1045
Cet article peut être librement diffusé et son contenu réutilisé suivant la licence CC-by-sa (https://creativecommons.org/licenses/by-sa/3.0
/fr/legalcode)
Pour écraser une mouche, le marteau-pilon n’est pas l’outil le plus ergonomique. Pour tracer un graphe de fonction, on ne pense pas forcé‐
ment à Python. Mais la circulaire (http://www.education.gouv.fr/pid285/bulletin_officiel.html?cid_bo=115984) aménageant le programme de mathé‐
matiques de seconde pour la rentrée 2017, qui préconise l’utilisation d’un « langage de programmation textuel », précise que « même si les
logiciels traceurs de courbes permettent d’obtenir rapidement la représentation graphique d’une fonction définie par une formule algé‐
brique, il est intéressant, notamment pour les fonctions définies par morceaux, de faire écrire aux élèves un algorithme de tracé de
courbe. » L’idée n’a toutefois pas été reprise dans le document ressource (http://cache.media.eduscol.education.fr/file/Mathematiques
/73/3/Algorithmique_et_programmation_787733.pdf) publié en juin dernier. Nous proposons ici d’explorer différentes façons d’utiliser le langage
Python pour écrire un tel algorithme, approchant la courbe par des segments de droites.
Voir aussi :
La façon la plus naturelle, pour un utilisateur expérimenté de Python, de tracer un graphe de fonction, c’est d’utiliser la « bibliothèque »
ad hoc, matplotlib - en fait son module pyplot suffira largement. Commençons donc par présenter cette méthode.
matplotlib ne fait pas partie de Python standard. Selon l’environnement utilisé (ÉduPython (http://edupython.tuxfamily.org/) , Pyzo
(http://www.pyzo.org/index.html) , Thonny (http://thonny.org/) , etc) vous serez donc peut-être amené à le télécharger.
Dans la suite de cette partie, nous supposerons que cela a été fait. Il est alors facile d’obtenir un graphe :
Télécharger
• comme tout module Python, matplotlib.pyplot doit être importé pour être utilisé dans un programme ; c’est ce que fait la
première ligne, en adoptant plt comme « alias » (synonyme abrégé).
• on crée ensuite la fonction (au sens de Python) correspondant à la fonction (mathématique) que l’on veut représenter.
• la ligne 9 crée la liste des abscisses des N+1 points, régulièrement répartis entre a et b. L’instruction range(N+1) crée la liste des
entiers de 0 à N.
• la ligne 10 crée la liste des images par f des points précédents.
• la ligne 11 crée le dessin, en reliant les points dont les abscisses sont dans la liste lx et les ordonnées dans la liste ly.
• plt.show() lance l’affichage.
Enfin, l’unique ligne du programme principal lance l’exécution de la fonction graphe, avec en premier paramètre la fonction
[Math Processing Error] que l’on veut représenter.
Notre éventuel lecteur novice en Python s’étonnera sans doute de voir différentes façons d’importer des modules : nous venons d’uti‐
liser import matplotlib.pyplot as plt alors que plus loin ce sera from dessin2d import *. En fait, une troisième ver‐
sion serait aussi possible : import matplotlib.pyplot mais avec celle-ci, dans le programme précédent, au lieu de
plt.plot(lx,ly) nous aurions dû écrire matplotlib.pyplot.plot(lx,ly), et matplotlib.pyplot.show() au lieu de
plt.show(). On s’en lasse vite, c’est pourquoi on introduit l’« alias » plt.
Mais, entre les deux premières versions, quelles différences ? La première est dans l’usage qu’on en fera : avec from matplot-
lib.pyplot import * , on pourrait utiliser chaque fonction du module avec son nom seul, par exemple plot(lx,ly). Alors
qu’avec import matplotlib.pyplot as plt on est obligé de les « préfixer » avec plt. : donc plt.plot(lx,ly) dans notre
exemple. Cela peut paraître fastidieux, mais c’est le seul moyen d’éviter les problèmes d’homonymie : des fonctions portant le même
nom dans des modules distincts. Par exemple, les modules math et numpy proposent tous deux une fonction log. Si on a importé ces
deux modules avec la syntaxe from ... import * et qu’on tape x = log(u), laquelle des deux fonctions log sera-t-elle utili‐
sée ? Tant que les deux coïncident, ce n’est pas gênant. Mais ce n’est pas toujours le cas. Pour un module qu’on ne connaît pas bien,
utiliser la syntaxe import ... as ... ou import ... est plus prudent.
Une autre différence est moins visible, sauf dans un environnement comme Thonny, qui permet à l’utilisateur de voir toutes les fonc‐
tions importées : la syntaxe from ... import * a l’inconvénient d’importer toutes les fonctions du module, ce qui, avec un
« gros » module, peut finir par être encombrant. Le module math ne contient [1] que 53 fonctions, mais le sous-module pyplot de
matplotlib, à lui seul, en contient 977 !
Avec des élèves de lycée, il est certainement prématuré d’évoquer les explications qui précèdent. Pour justifier l’utilisation de cette
syntaxe import matplotlib.pyplot as plt pour l’importation du module pyplot de la bibliothèque matplotlib, , on peut
leur dire plus simplement : faisons comme tout le monde. Car cette syntaxe est très fréquemment utilisée, dans la vaste documenta‐
tion Python, pour les raisons expliquées ci-dessus.
Pour être complet sur cette question, signalons une dernière façon d’importer, non pas un module cette fois, mais une seule fonction
d’un module : si par exemple on veut utiliser la fonction (racine carrée) du module math et seulement celle-là, il suffit de taper
d’un module : si par exemple on veut utiliser la fonction sqrt (racine carrée) du module math et seulement celle-là, il suffit de taper
from math import sqrt, et on peut alors l’utiliser, sous la forme simple sqrt().
On obtient le graphe cherché, auquel matplotlib a ajouté des axes gradués mais non centrés :
Si on les préfère centrés à l’origine, on peut les ajouter, en couleur noire, avec les commandes plt.axhline(color = 'k') ;
plt.axvline(color='k'). De même pour diverses décorations : des étiquettes sur les axes latéraux avec [2]plt.xla-
bel('$x$') ; plt.ylabel('$f(x)$'), et un titre avec plt.title("Tracé approché d'un graphe"). Le résultat est bien
propre :
Programme grapheur
Graphe avec le module python Matplotlib.py
Mais c’est assez loin de l’algorithmique telle qu’on peut l’imaginer en seconde : on n’a utilisé aucune des structures élémentaires
(boucle, condition, etc). Et on a besoin des listes, dont l’introduction en seconde peut sembler prématurée.
Nous allons voir une première façon d’y remédier, sans changer le résultat - et sans que l’élève ait besoin de manipuler des listes. L’idée
Nous allons voir une première façon d’y remédier, sans changer le résultat - et sans que l’élève ait besoin de manipuler des listes. L’idée
est de le faire travailler, non pas avec matplotlib directement, mais avec un module (au sens de Python toujours : un ensemble de
fonctions prédéfinies) que nous appellerons dessin2d : créé par le professeur et mis à disposition de l’élève. Attention, comme il ne
s’agit pas d’un module de Python standard, il faudra que le fichier contenant dessin2d soit dans le dossier de travail de l’élève (celui
où il enregistre ses propres programmes), pour que Python le trouve sans difficulté. L’élève pourra alors l’utiliser avec la syntaxe stan‐
dard : from dessin2d import *.
Voici ce que nous proposons comme contenu pour ce fichier - mais bien sûr chacun pourra l’adapter à son usage :
Télécharger
Les seuls outils ainsi mis à disposition de l’élève sont le tracé d’un point et d’un segment. On lui cache le fait que Python adapte automa‐
tiquement le repère aux objets géométriques qu’il doit représenter. Pour que l’élève s’approprie ce petit outil, on pourra lui fournir le
programme suivant :
Télécharger
et lui demander d’ajouter une porte à la maison, par exemple. On devrait alors pouvoir l’amener à représenter, avec ce même outil, un
graphe de fonction en l’approchant par des segments. Chaque professeur saura mieux que nous l’adapter à ses élèves. Nous nous conten‐
terons de montrer ce qui pourrait être la production d’un élève :
Télécharger
Si l’on veut permettre à l’élève d’obtenir un graphe plus conforme aux usages (axes centrés, légende, etc), il suffit d’enrichir dessin2d
avec des traductions des commandes Python décrites au début de ce texte. Mais ce ne serait plus vraiment une question d’algorithmique.
N.B. N’ayant pas d’élèves de lycée sous la main, je n’ai pas pu tester les idées exposées ici. J’accueillerai avec intérêt les commentaires, en
particulier après essai de mise en œuvre même partielle : fgoichot@univ-valenciennes.fr
Je remercie Gérard Kuntz, Alain Busser, Aymeric Picaud et les autres membres du comité de rédaction, pour leur lecture attentive et leurs
suggestions, qui ont permis d’améliorer cet article.
F. G.
Notes :
[1] comment le savoir ? il suffit de taper, dans la console Python, après avoir importé le module, len(dir(math)) : la commande dir(math) donne la liste de toutes les fonctions du
module math, et len() donne la longueur de cette liste.
[2] les « dollars » sont hérités de la syntaxe du traitement de texte mathématique LATEX ; ils ne sont pas indispensables mais donnent un affichage d’aspect plus mathématique.