)

Accueil

Traduction

Tutoriel Python - sommaire

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Mathématiques avec Python

Dans ce chapitre je vais traiter des module statistic & fractions, revenir sur le module math et évoquer les bibliothèques matplotlib & numpy .
Mais auparavant je vais rappeler quelques fonctions natives orientées mathématiques.

Fonctions natives à vocation mathématiques

Commandes à saisir dans la console.

>>> notes = [7,10,13,11,9]
>>> sum(notes)
50
>>> len(notes)
5
>>> sum(notes)/len(notes)
10.0
>>> max(notes)
13
>>> min(notes)
7
>>> sorted(notes)
>>> notes
[7, 9, 10, 11, 13]
>>> pi = 3.14116
>>> round(pi,2)
3.14

J'ai pu calculer la moyenne simple de la série : 50/5 = 10 en combinant les fonctions sum() & len().
Je peux dire grâce à la liste triée, que la médiane est 10 (médiane : élément du milieu dans la série ordonnée).
J'ai aussi utilisé la fonction native round(nombre, décimales) qui arrondi à l'affichage.

Module statistics

Créer une commande qui calcule la moyenne simple d'une série de notes, c'est facile. Par contre la programmation de la variance, de l'écart type c'est beaucoup plus compliqué. Donc ce module tombe à pic car il propose des fonctions de haut niveau ad hoc.

Liste des fonctions du module

Test de certaines fonctions de ce module

>>> import statistics as stat
>>> notes1 = [15, 12,12, 8,14]
>>> stat.mean(notes1)
12.2
>>> stat.median(notes1)
12
>>> stat.mode(notes1)
12
>>> stat.stdev(notes1)
2.6832815729997477
>>> notes2 = [12,13,11,14,10]
>>> stat.mean(notes2)
12
>>> stat.stdev(notes2)
1.5811388300841898

Pour importer le module statistics j'utilise la syntaxe : import nomModule as alias Donc pour produire une commande j'utilise la syntaxe : alias.fonction().
L'emploi d'un alias a ici du sens car le nom du module est ici long.

Syntaxes

mean(série) : fonction qui calcule la moyenne simple d'une série de notes.

La médiane est une valeur qui permet de partager une série numérique ordonnée en deux parties de même nombre ; syntaxe : median(série)

le mode désigne la valeur la plus représentée dans une série ; syntaxe : mode(série)

L’écart type est un indicateur de dispersion dans une série ; syntaxe : stdev(série)

Les fonctions peuvent s'appliquer à une liste, un tuple, un set ; du moment que les éléments sont numériques.

Vous constatez ici, que pour les deux séries la moyenne est pratiquement la même (12,2 et 12,0).
Mais le premier élève est beaucoup plus irrégulier dans ses résultats que le second. Donc l'écart type est plus grand pour le premier que pour le second.
Je rappelle que l'écart type est la racine carrée de la variance ; il existe bien sûr la fonction variance() dans le module statistics.

Pour les mordus de statistiques, le module propose aussi des fonctions pour calculer les moyennes géométrique & harmonique ...

Le module fractions

Vous pouvez manipuler des fractions sous Python grâce au module fractions.
Un seul exemple, il est plus logique d'utiliser la fraction "1/3" que le flottant correspondant qui n'est qu'une valeur a pprochée de ce nombre irrationnel.

Quelques commandes à tester

>>> from fractions import *
>>> unTiers = Fraction(1,3)
>>> unDemi = Fraction("1/2")
>>> unQuart = Fraction("1/4")
>>> unTiers + unTiers
Fraction(2, 3)
>>> unTiers + unDemi
Fraction(5, 6)
>>> float(unTiers+unQuart)
0.5833333333333334
>>> unDemi - unTiers
Fraction(1, 6)
>>> unQuart * unTiers
Fraction(1, 12)
>>> unTiers/unQuart
Fraction(4, 3)
>>> Fraction(6/12)
Fraction(1, 2)
>>>

Le module fractions comprend surtout la fonction Fraction (avec un F majuscule).

Utiliser une fraction plutôt qu'un flottant

Il y avait dans le passé un taux de TVA dit majoré qui était égal à 1/3 du hors taxes. Il s'appliquait entre autres au matériel HIFI et aux voitures neuves.
Voyons comment il fallait alors calculer la TVA par rapport au prix hors taxes de l'article.

>>> taux_tva = Fraction(1/3)
>>> hors_taxe = 1000
>>> TVA = round(float(hors_taxe * taux_tva),2)
>>> TVA
333.33

La TVA sur l'article qui vaut 1000 HT est calculé en appliquant le taux sous forme d'une fraction.
Dans la même commande le résultat est arrondi à deux décimales. J'ai donc imbriqué les fonctions round & float.

Module math

Dans un chapitre précédent ce module a simplement été évoqué. Je vais y revenir pour approfondir.

Une liste impressionnante de fonctions

Tests

Les fonctions devront être préfixées par "math." compte tenu de la syntaxe utilisée pour l'importation du module.
Mais nous avons bien fait car si nous avions écrit from math import * nous aurions écrasé la fonction native pow() ...

>>> 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
>>> math.hypot(4,3)
5.0
>>> math.modf(17.25)
(0.25, 17.0)
>>> round(3.99)
4
>>> math.pi
3.141592653589793
>>> pow(10,5)
100000
>>> math.pow(10,5)
100000.0
>>> math.fmod(10,3)
1.0

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é.

Trigonométrie

Le module math comprend également toutes les fonctions relatives à la trigonomètrie :

Rappels : unité d'angle radian

Le radian est une unité de mesure pour mesurer les angles. Un angle d'un radian est un angle qui délimite un arc de cercle d'une longueur égale au rayon du cercle.
Ci-dessous un gif animé qui explique bien la notion de radian :
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 radian.

Rappels de trigonométrie

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.

Quelques fonctions trigonométriques proposées par le module math

Vérifions tout cela dans la console :

>>> 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()

Rappels sur le calcul du sinus, cosinus et tangente d'un angle

 module math de python

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.

Exercice de trigo

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 dans la console :

Le carré de l’hypothénuse est égal à la somme des carrés des côtés de l'angle droit.
Donc l'hypothé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 bien é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() qui donnent respectivement l'angle en radians à partir du cosinus ou tangente.

La bibliothèque matplotlib

Grâce à cet outil vous allez pouvoir représenter graphiquement des fonctions mathématiques telles f(x) = ax + b (fonction affine) ou des paraboles (f(x) = a x2) voire des hyperboles (f(x) = 1/x), etc.

Matplotlib est une bibliothèque pour tracer des courbes. J'ai bien écrit "bibliothèque" et non pas module. Donc pour disposer des modules de ce pack il faut éventuellement installer cette extension de Python avec l'utilitaire PIP (voir chapitre 9).
Dès que l'extension est installée il suffit d'importer le module pyplot de cette extension.

Tracer des courbes

Premier tracé

Commandes à tester dans l'interpréteur :

>>> from matplotlib import pyplot
>>> pyplot.plot([-3,0,3], [-6,0,6])
>>> pyplot.show()

Nous devons importer le module pyplot de la librairie matplotlib.
La fonction plot() permet de définir les couples de points et demande en arguments deux séries de valeurs : la série des abscisses et la série des ordonnées. Ces deux arguments peuvent être des variables qui contiennent des séries de type "range" ou "list".
La fonction show() permet d'afficher le graphique.
Après la dernière commande pyp.show() une fenêtre légendée "figure1" et contenant le graphique s'affiche.

Le graphique : module matplolib de python

Il s'agit d'une droite puisque les couples (x,y) correspondent à la fonction y = 2x (une fonction linéaire)
La fonction show() est utilisée sans arguments et est bloquante ; tant que la fenêtre n'a pas été fermée, la suite du code ne s'éxécute pas.

Deuxième tracé

Pour le premier tracé nous n'avions que trois couples (x,y) mais c'était suffisant, puisqu'il s'agissait d'une fonction linéaire.
Pour tracer, par exemple, une parabole il faut beaucoup plus de points ; nous allons donc utiliser toute la puissance de la fonction range(start,stop,step) pour produire un grand nombre de couples.

Commandes à saisir dans l'interpréteur:

J'ai utilisé une autre syntaxe pour importer le module pyplot de matplolib et lui donner un alias : import matplotlib.pyplot as plt.
plt.grid() : on rajoute une grille dans le repère orthogonal.
Les couples x,y sont créées grâce à la fonction range(start,stop,step).

Une superbe parabole apparait dans la fenêtre "figure1". module matplolib de python

Il est possible d'enregistrer le graphique au format PNG en cliquant sur la commande "enregistrer" de la fenêtre graphique.

Programmes construisant des graphiques

Pour sauvegarder nos commandes nous allons les stocker dans des programmes.

Réalisation d'un histogramme

Les histogrammes sont utilisés pour représenter des séries statistiques.
Thème : distribution des notes à un partiel dans un groupe d'étudiants.

Le script :

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 : module matplolib de python

Réalisation d'un "camembert"

Il faut utiliser la fonction pie(série de valeurs, légendes, couleurs)

Le script :

Le graphique : module matplolib de python

Construction d'un nuage de points

Le code :

Pour produire un nuage de points il faut utiliser la fonction scatter(abscisses, ordonnées)

Le graphique : module matplolib de python

On note une corrélation linéaire presque parfaite : les points sont pratiquement alignés sur une droite.
Ne pourrait-on pas construire la droite de régression exprimant la relation entre les x et les y ???

La bibliothèque numpy

NumPy est une bibliothèque Python, destinée à créer et manipuler des tableaux composés uniquement de nombres et pouvant faire l'objet de calculs matriciels. On crée donc des matrices !
Les "numpy.array" sont des séries ordonnées itérables, indexables mais immuables (ne peuvent être modifiées après leur création).

Matrice à une dimension

En supposant que la bibliothèque "numpy" est installée sur votre PC.

>>> import numpy as np
>>> tableau = np.array(range(10))
>>> tableau
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> len(tableau)
10
>>> np.append(tableau, 8)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8])
>>> tableau
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.delete(tableau, 1)
array([0, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.insert(tableau, 2, 3)
array([0, 1, 3, 2, 3, 4, 5, 6, 7, 8, 9])
>>> tableau
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> type(tableau)
class 'numpy.ndarray'
>>> tableau[-1]
9
>>> tableau[2:6]
array([2, 3, 4, 5])
>>> for i, ele in enumerate(tableau):
...     print(i,ele)
...
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
>>>

les fonctions append(), delete(), insert() ne modifient pas l'array nommé "tableau". C'est logique puisque les "numpy.array" ne son pas mutables.

Calcul matriciel

>>> deux_dim = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> deux_dim
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> deux_dim[2,2]
9
>>> deux_dim[0,0]
1
>>> deux_dim2 =  np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> deux_dim *3
array([[ 3,  6,  9],
       [12, 15, 18],
       [21, 24, 27]])
>>> deux_dim * deux_dim2
array([[ 1,  4,  9],
       [16, 25, 36],
       [49, 64, 81]])
>>> un_dim = np.array([2,4,6])
>>> deux_dim * un_dim
array([[ 2,  8, 18],
       [ 8, 20, 36],
       [14, 32, 54]])	   
>>>

J'ai créé une matrice à deux dimensions (3 par 3) nommée "deux_dim". Notez la syntaxe pour construire cette matrice : une liste de trois listes ; chaque sous-liste comprenant trois éléments.

Si on veut accéder à un élément en particulier, il faut écrire la commande nomArray[ligne, colonne].
Attention, la première ligne a l'indice 0 ; la première colonne aussi.

Puis j'ai créé une deuxième matrice 3 par 3 nommée "deux_dim2" et une matrice 1 par 3 nommée "un_dim".