Vous pouvez me contacter via Facebook (questions, critiques constructives) : page Facebook relative à mon site
Même sans importer de modules, on peut déjà faire de nombreux traitements mathématiques via Python.
Mais grâce à différents modules tels math mais aussi matplotlib & numpy on peut aller beaucoup plus loin.
Vous allez dire : "on a déjà vu ! " Non, on a seulement survolé. Dans ce chapitre nous allons approfondir en présentant d'autres fonctions de ce module.
>>> import math >>> dir(math) ... 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp'. >>>
Vous retrouvez dans cette liste : sqrt(), pow() & pi. pi n'est à proprement parler, une fonction mais plutôt une constante égale à 3.1416 environ.
>>> math.ceil(3.5) 4 >>> math.floor(3.5) 3 >>> math.fabs(-10) 10.0 >>> math.factorial(5) 120 >>> math.remainder(10,3) 1.0 >>> maliste = [10,15,12,18] >>> math.fsum(maliste) 55.0 >>> monset = {10,15,12,9} >>> math.fsum(monset) 46.0 >>> montuple = (10,12,14) >>> math.fsum(montuple) 36.0 >>> math.gcd(60,90) 30 >>> x = 10 >>> math.hypot(4,3) 5.0 >>> math.modf(17.25) (0.25, 17.0) >>> math.round(3.99) AttributeError: module 'math' has no attribute 'round' >>> round(3.99) 4
Concernant l'objet factorial(), rappelez vous, dans un chapitre précédent nous nous sommes fatigués à produire (de deux façons) une fonction retournant la factorielle d'un nombre. Donc nous avons travaillé pour rien ? Pas vraiment, car nous avons ainsi découvert à cette occasion une notion importante en algorithmique : la récursivité.
Certaines fonctions sont toujours disponibles (sans aucune importation) ; on parle de fonctions natives.
Citons entre autres : abs(), dir(), eval(), input(), int(), list(), len(), max(), min(), pow() print(), range(), round(), set(), type(), etc.
On retrouve donc souvent deux fonctions qui font exactement la même chose : une fonction native (ou standard) et une fonction de module.
Ainsi int() équivaut à math.trunc() , abs() équivaut à math.fabs(), etc.
On dit que l'abondance ne nuit pas mais c'est quand même une difficulté en Python.
Conseil : avant d'intégrer une commande dans un programme testez la dans console Python.
Le module math comprend également toutes les fonctions relatives à la trigonomètrie :
Le radian est une unité de mesure pour mesurer les angles, comme le degré. Un angle d'un radian est un angle qui délimite un arc de cercle
d'une longueur égale au rayon du cercle.
Un cercle complet (360°) représente un angle de 2π radians. Donc un angle plat c'est π radian et un angle droit c'est π/2.
La trigonométrie est une branche des mathématiques qui traite des relations entre distances et angles dans un triangle rectangle. Sinus, cosinus et tangente sont des rapports entre deux côtés du triangle rectangle. Mais à partir du sinus (ou cosinus ou tangente) on peut déterminer l'angle correspondant.
Vérifions tout cela dans l'interpréteur :
>>> import math >>> math.pi 3.141592653589793 >>> math.radians(360) 6.283185307179586 >>> math.degrees(2 * math.pi) 360.0 >>> math.sin(radians(45)) 0.7071067811865476 >>> math.sin(radians(60)) 0.8660254037844386 >>> math.sin(radians(30)) 0.49999999999999994
math.pi retourne 3.1416 environ.
L'équivalent de 360° en radians est 6,28 radians.
L'équivalent de 2 ∏ radians = 360°
La fonction radians(angle en degrés) convertit les degrés en radians.
La fonction degrees(angle en radians) convertit les radians en degrés.
La fonction sin(angle en radians) retourne la valeur du sinus. Donc si vous voulez partir d'un angle en degrés il faut imbriquer
la fonction radians(angle en degrés) dans sin()
Il existe aussi les fonctions : cos(), tan()
Après avoir calculé le sinus ou cosinus ou tangente d'un angle, il fallait rechercher ensuite dans les tables trigonométriques l'angle correspondant.
J'emploie le passé car désormais la recherche d'une valeur d'angle se fait avec une calculette scientifique OU avec Python.
Un triangle rectangle a des côtés de l'angle droit qui mesurent respectivement 3 et 4.
Calculez l’hypoténuse, et les deux angles (autres que l'angle droit) en degrés.
Résolvons ce problème via l'interpréteur Python
>>> from math import * # avec cette syntaxe, il est inutile de préfixer les fonctions du module math >>> a=4 >>> b=3 >>> h =sqrt(pow(a,2) + pow(b,2)) #j'aurais pu utiliser la fonction hypot >>> h 5.0 >>> h =math.hypot(a,b) >>> h 5.0 >>> angle1 = degrees(asin(b/h)) >>> angle 36.86989764584402 >>> angle2 = degrees(asin(a/h)) >>> angle2 53.13010235415599 >>> >>> angle1 + angle2 90.0
Le carré de l’hypoténuse est égal à la somme des carrés des côtés de l'angle droit.
Donc l'hypoténuse est ici égale à 5
Donc le sinus du premier angle = 3/5 soit un angle de 36,87°
Et le sinus du deuxième angle 4/5 soit un angle de 53,13°
Contrôle : la somme des deux angles est égale à 90°
La fonction asin(sinus) donne l'angle en radians à partir de la valeur du sinus ; il faut ensuite le convertir en degrés avec
la fonction degrees()
Il existe aussi les fonctions acos(), atan().
Voyez que souvent on est obligé d'imbriquer dans une commande deux fonctions.
Grâce à cet outil vous allez pouvoir représenter graphiquement des fonctions mathématiques telles y = ax + b ou (fonctions affines) ou des paraboles (y = ax2) voire des hyperboles (y = 1/x) etc.
Matplotlib est donc une bibliothèque pour le traçage de courbes.
Attention cette bibliothèque ne fait pas forcément partie du package de base de Python.
Le plus simple est d'utiliser l'outil "pip".
Cet utilitaire est évoqué dans le chapitre 16.
Il faut alors activer ('importer') matplotlib et plus précisément un sous-module pyplot.
Commandes à saisir :
>>> import matplotlib.pyplot as pyp >>> pyp.plot([-3,0,3], [-6,0,6]) >>> pyp.show()
En raison du nom compliqué du module, il est conseillé d'utiliser un alias.
La fonction plot() demande en arguments deux séries de valeurs : la série des abcisses et la série des ordonnées.
Ces deux arguments peuvent être des variables contenant chacune une liste.
Après la dernière commande (pyp.show()) une fenêtre légendée "figure1" et contenant le graphique s'affiche.
Le graphique :
Il s'agit d'une droite puisque les couples (x,y) correspondent à la fonction y = 2x (une fonction linéaire)
La fonction show() n'a pas d'argument.
Pour le premier tracé nous n'avions que trois couples (x,y) mais c'était suffisant, puisqu'il s'agissait d'une fonction affine linéaire.
Pour tracer, par exemple, une parabole il faut beaucoup plus de points. Nous allons donc avoir besoin de
la fonction linspace() du module numpy
Commandes à saisir dans l'interpréteur:
>>> import matplotlib.pyplot as pyp >>> import numpy >>>pyp.grid() >>> x = numpy.linspace(-10,10,100) >>> y =x * x >>> pyp.plot(x,y) >>> pyp.show()
pyp.grid() : on rajoute une grille dans le repère orthogonal.
x = numpy.linspace(-10,10,100) : les abscisses seront au nombre de 100 réparties dans l'intervalle -10 à +10
y = x*x : les ordonnées sont obtenues en calculant le carré de chaque abscisse.
Le graphique :
Une superbe parabole apparait dans la fenêtre "figure1".
Pour sauvegarder nos commandes nous allons les stocker dans des programmes.
Les histogrammes sont utilisés pour représenter des séries statistiques.
Thème : distribution des notes à un partiel dans un groupe de travaux dirigés.
Le code :
# nom programme : graphique1.py # objet : histogramme sur distribution notes dans une classe import matplotlib.pyplot as pyp pyp.grid() x = [6,8,10,12,14,16] y = [3,5,6,8,7,2] largeur = 0.5 pyp.bar(x, y, largeur) pyp.show()
Le programme demande l'affichage d'une grille dans le repère orthogonal.
x contient la liste des abscisses (notes possibles)
y contient la liste des ordonnées (effectif de chaque note)
Pour produire un histogramme, il faut utiliser la fonction bar(série des x, série des y, largeur de chaque barre)
Le graphique :
Le code :
# nom programme : graphique2.py # objet : nuage de points import matplotlib.pyplot as pyp pyp.grid() x = [1, 2, 3, 4, 5, 6] y = [2, 3.5 ,5.5 ,8.5 ,9.5, 11.5] pyp.scatter(x, y) pyp.show()
Pour produire un nuage de points il faut utiliser la fonction scatter(abscisses, ordonnées)
Le graphique :
On note une corrélation linéaire presque parfaite : les points sont pratiquement alignés sur une droite.
On ne pourrait pas construire la droite de régression exprimant la relation entre les x et les y ???
À vous de "bosser" un peu !
Ètes vous capables de produire la figure ci-dessous (une hyperbole) ?
Si x est proche de 0, son image est très grande mais de même sens que x. De quelle fonction il s'agit ?