11
1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal. Pour la programmation en Python, nous utiliserons l’environnement Spyder : 1. MANIPULER DES NOMBRES En première approche, le langage Python peut être vu comme un ensemble de commandes simples à utiliser. En ce sens, il peut jouer le rôle d’une calculatrice scientifique classique. Pour s’en convaincre il suffit de lancer la séquence triviale suivante : In [ 1 ]: a = 1 In [ 2 ]: b = 2 In [ 3 ]: c = a + b Pour avoir le résultat de l’opération, on prolongera simplement par : In [ 4 ]: print (c) 3 ou encore plus simplement par : In [ 5 ]: c Out [ 5 ]: 3 1.1. Types numériques En mathématiques, les nombres appartiennent à des ensembles tels que N, Z, Q, R ou C. En Py- thon (comme dans beaucoup de langages informatiques) les nombres seront du type : int (integer) correspond à un entier (de N ou Z) stocké sur une partie limitée de la mémoire de l’ordinateur. Il ne peut donc pas être aussi petit (négatif) ou aussi grand que l’on veut. Pour une machine (dépend du microprocesseur et du système d’exploitation) de 32 bits (4 octets), un entier sera compris entre -2 31 et 2 31 - 1 (soit entre -2 147 483 648 et 2 147 483 647). Pour une machine de 64 bits, un entier sera compris entre -2 63 et 2 63 - 1 -1-

1TSI 2016-2017 Chapitre B - TD 2 - Les nombres et Python ...tsi-chaptal-stbrieuc.fr/wp-content/uploads/2016/08/TDB2-nombres_et... · machine (dépend du microprocesseur et du système

  • Upload
    buikien

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

Pour la programmation en Python, nous utiliserons l’environnement Spyder :

1. MANIPULER DES NOMBRES

En première approche, le langage Python peut être vu comme un ensemble de commandes simples àutiliser. En ce sens, il peut jouer le rôle d’une calculatrice scientifique classique. Pour s’en convaincre ilsuffit de lancer la séquence triviale suivante :

In [1]: a=1In [2]: b=2In [3]: c=a+b

Pour avoir le résultat de l’opération, on prolongera simplement par :

In [4]: print(c)3

ou encore plus simplement par :

In [5]: cOut[5]: 3

1.1. Types numériques

En mathématiques, les nombres appartiennent à des ensembles tels que N, Z, Q, R ou C. En Py-thon (comme dans beaucoup de langages informatiques) les nombres seront du type :

int (integer) correspond à un entier (de N ou Z) stocké sur une partie limitée de la mémoire del’ordinateur. Il ne peut donc pas être aussi petit (négatif) ou aussi grand que l’on veut. Pour unemachine (dépend du microprocesseur et du système d’exploitation) de 32 bits (4 octets), unentier sera compris entre −231 et 231 −1 (soit entre −2 147 483 648 et 2 147 483 647). Pour unemachine de 64 bits, un entier sera compris entre −263 et 263 −1

- 1 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

long (long integer) le type entier long est équivalent au type entier sauf qu’il n’est pas limité ànombre d’octets (ou de bits prédéterminé). Á l’extrême, un nombre peut prendre la quasi tota-lité de la mémoire de l’ordinateur. Il est clair alors que ce nombre peut être considérable.

float le type flottant permet de représenter des nombres à virgule. Il est codé en mémoire sur 32bits (simple précision) ou sur 64 bits (double précision). Il est représenté sous la forme

nombre = (−1)S1mantisse×2exposant

Sur 64 bits la mantisse est écrite avec 52 chiffres binaires (51 plus le 1 implicite), et l’exposantavec 11 chiffres ; il y a 1 bit de signe. La précision maximale est donc de 2−52, soit environ 2×10−16. Des valeurs spéciales permettent de représenter −∞, +∞ et Nan, not a number, souventissu d’une forme indéterminée.

complex le type complexe correspond à une structure naturellement composée de deux flottants(partie réelle et imaginaire) sur 2 x 8 = 16 octets.

bool le type booléen correspond à l’algèbre booléenne et ne prend que deux valeurs : True/False. Ilest codé sur un bit.

En pratique, pour des applications basiques, le typage est la plupart du temps transparent pourl’utilisateur car Python interprète dynamiquement le type des variables. Par exemple si on attribuela valeur 3 à la variable a, on ne précise pas si a est une variable entière ou réelle ; Python interprètele type de variable en fonction des opérations demandées :

In [1]: a=3In [2]: a+2Out[2]:5In [3]: a/2Out[3]: 1.5

Même si les entiers sont codés sur 64 bits, on peut créer un nombre entier énorme qui sera de typelong (remarque : ** est l’opérateur de mise à la puissance) :

In [1]: c=2** 10000In [2]: c

La réponse donnée peut aussi être de type booléen :

In [1]: a=3In [2]: b=2In [3]: a<bOut[3]: FalseIn [4]: a>bOut[4]: TrueIn [5]: a==bOut[5]: FalseIn [6]: a!=bOut[6]: True

Pour les booléens (| et & indiquent respectivement "ou" et "et"), on peut lancer la séquence :

In [1]: a= TrueIn [2]: b= FalseIn [3]: a|bOut[3]: TrueIn [4]: a&bOut[4]: False

Pour les nombres complexes, on peut tester :

- 2 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

In [1]: a=1.5+3jIn [2]: b=1.5In [3]: a-bOut[3]: 3jIn [4]: a*bOut[4]: (2.25+4.5j)In [5]: c=1+1jIn [6]: a*cOut[6]: (-1.5+4.5j)In [7]: (1+4j)** (1/(2+3j))Out[7]: (1.6758516946016602-0.20706889169199882j)In [8]: a=complex(2,3)In [9]: aOut[9]: (2+3j)In [10]: a.realOut[10]: 2.0In [11]: a.imagOut[11]: 3.0In [12]: a.conjugate ()Out[12]: (2-3j)In [13]: complex.conjugate(-1-2j)Out[13]: (-1+2j)

Enfin, il est possible de modifier explicitement le type des variables en utilisant les fonctions deconversion :

int(a) Conversion de a en type entierlong(a) Conversion a en type entier longfloat(a) Conversion a en type flottantcomplex(a) Conversion a en type complexe a+0j

complexe(a,b) Conversion de a et de b en type complexe a+bj

Sous Python, il existe la fonction type() qui donne le type d’une variable. Par exemple :

In [1]: a=1In [2]: type(a)Out[2]: intIn [3]: a=1.In [4]: type(a)Out[4]: floatIn [5]: a=1In [6]: float(a)Out[6]: 1.0In [7]: a=3+4jIn [8]: type(a)Out[8]: complex

1.2. Opérations sur les nombres

Opérateurs arithmétiques : Python ne possède que très peu d’opérations arithmétiques pour ma-nipuler les nombres. A ce stade, Python principalement se résume à une calculatrice élémentaire :

+ Addition− Soustraction∗ Multiplication/ Division∗∗ Puissance% Reste de la division euclidienne

- 3 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

Considérons l’équation x2 +1,4x +0,49 = 0 ; calculons le discriminant du trinôme :

a=1b=1.4c=0.49D=b** 2-4*a*cD

Quelle remarque peut-on faire ?

Voici une suite d’opérations pour comprendre le rôle de % :

In [1]: 7%5In [2]: 7%2In [3]: 2%7In [4]: 27%5In [5]: 30%26In [6]: import numpyIn [7]: 55*numpy.pi%(2*numpy.pi)

Raccourcis pour les opérateurs arithmétiques : Dans une séquence de code, on peut affecter unevaleur à une variable, effectuer une opération arithmétique sur cette variable et finalement affecterla nouvelle valeur obtenue à la variable. Par exemple :

a=1b=1print(a)2

En Python, il est possible d’écrire l’opération arithmétique de façon plus compacte :

a=1b=1a+=bprint(a)2

Ceci est également vrai pour les autres opérateurs arithmétiques :

a+=b a=a+ba-=b a=a-ba*=b a=a*ba/=b a=a/ba**=b a=a**ba%=b a=a%b

Quelques fonctions supplémentaires : De base, Python fournit quelques fonctions numériquesautres que les opérations arithmétiques :

abs(a) Valeur absolue de amax(...) Plus grande valeur d’une suite de nombresmin(...) Plus petite valeur d’une suite de nombresround(a,n) Arrondi de la variable a au niveau de la nedécimale

- 4 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

Par exemple :

a=-1abs(a)1a=1b=3.4c=10max(a,b,c)10min(a,b,c)1a=3.141592654round(a,4)3.1416round(a,2)3.14round(a,0)3.0

Opérateurs de comparaison : Python peut aussi vérifier si une comparaison entre deux nombresest vraie ou fausse ce qui renvoie une valeur booléenne. Les opérateurs standards de comparaisonsont :

< Plus petit que> Plus grand que<= Plus petit que ou égal à>= Plus grand que ou égal à== Égal à!= Pas égal à

Par exemple :

a=5b=4.9999a<bFalsea>bTruea==bFalsea!=bTrue

2. LISTES ET TUPLES

Listes. Il est souvent utile de collecter plusieurs données sous un même nom, et d’y accéder à traversun indice numérique (par exemple les températures pour les 31 jours d’un mois donné). Sous Python ondispose d’une telle structure appelée liste (dans d’autre langages on dira tableau).

Ainsi[1,a,′Bob′

]est une liste contenant trois valeurs : celle de rang 0 ! est 1, celle de rang 1 est la

valeur de la variable a et celle de rang 2 est la chaîne de caractère (ou mot) Bob.

La liste vide s’écrit[ ]

.

On peut affecter une liste à une variable L = [22,35,56,29

]et ainsi récupérer une valeur seule par son

indice. Par exemple :

- 5 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

L=[22 ,35 ,56 ,29]L[1]35L[3]29L[0]22L[-1]29L[-3]35L[4]IndexError : list index out of range

Opérations sur les listes :

len(L) donne la longueur de La in L vérifie si l’élément a se trouve dans LL+M concatène (juxtapose) les listes L et ML.append(a) ajoute a à la fin de la listeL.insert(i,a) ajoute l’élément a à la ie positionL.pop(i) supprime et retourne le ie élémentL.reverse() remplace la liste par celle d’ordre inverseL.index(a) retourne la première occurrence de a dans la listelist.sort(L) retourne la liste triée

Par exemple :

L=[22 ,35 ,56 ,29]len(L)4L.append(44)L[22 ,35 ,56 ,29,44]L.insert(3,64)L[22 ,35 ,56 ,64,29,44]L.pop(3)64L[22 ,35 ,56 ,29,44]

L.reverse ()L[44 ,29 ,56 ,35,22]list.sort(L)L[22 ,29 ,34 ,44,56]

a=[1,2,3]b=[2,2,1]c=a+bc[1,2,3,2,2,1]c.index(2)13 in bFalse3 in cTrue

- 6 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

Si la liste L contient des caractères ASCII, il est possible de retourner la valeur décimale de chaque carac-tère par la commande ord(L) :

L=[’a’,’&’,’%’,’0’]ord(L[0])97ord(L[1])38ord(L[2])37ord(L[3])48

Tuple. Un tuple est une liste immuable ; on écrit un tuple avec des parenthèses, par exemple a= (1,2,3)est un tuple.

Quand il y a un seul élément, il est suivi d’une virgule : a= (1, ) est un tuple, mais a= (1) est un entier.

Un tuple ne peut pas être modifié, mais on peut concaténer car cela revient à créer un nouveau tuple.

Par exemple :

a=(1,2,3)b=(2,2,1)a+b(1,2,3,2,2,1)

3. LA BIBLIOTHÈQUE NUMPY

Il est impossible de donner une liste exhaustive de toutes les bibliothèques relatives à Python. Toutefois,pour les applications scientifiques, la bibliothèque Numpy apparaît incontournable.

3.1. Importation d’une bibliothèque

L’importation d’une bibliothèque se fait grâce à la commande import. Pour accéder à une fonctionparticulière de la bibliothèque, on peut taper

nom_de_la_bibliothèque.nom_de_la_fonction().

Par exemple pour la fonction sin() :

import numpynumpy.sin(3.141592654)-4.1020685703470686e-10

Pour éviter de retaper le nom complet de la bibliothèque (qui dans certain peut être assez long), onpeut modifier le nom de la bibliothèque en utilisant le terme as. Par exemple, ici on renomme numpypar np :

import numpy as npnp.sqrt(1024)32.0

On peut se passer complètement du rappel du nom de la bibliothèque, en spécifiant directement lesfonctions qu’on désire importer avec le terme from :

from numpy import loglog(1)0.0log(0)-inf

- 7 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

On peut même importer directement toutes les fonctions d’une bibliothèque avec le symbole * :

from numpy import *cos(pi)-1.0

A priori, la dernière solution semble la plus simple car elle évite des écritures répétitives.

La listes des fonctions numériques définies dans numpy est extrêmement importante. On peut icidonner une liste non exhaustive des fonctions les plus classiques.

3.2. Trigonométrie

sin(x) sinuscos(x) cosinustan(x) tangentearcsin(x) arcsinusarccos(x) arccosinusarctan(x) arctangentedegrees(x) conversion de radians vers degrésradians(x) conversion de degrés vers radiansdeg2rad(x) Conversion de degrés vers radiansrad2deg(x) Conversion de radians vers degrés

3.3. Exponentielles et logarithmes

exp(x) exponentiellelog(x) logarithme népérienlog10(x) Logarithme de base 10log2(x) Logarithme de base 2

3.4. Nombres complexes

angle(z) argumentz.real partie réellez.imag partie imaginaireconj(z) conjugué

3.5. Fonction dont on connaît l’expression

On considère la fonction f définie par f (x) = 1

1+x2 ; on souhaite affecter cette fonction à la variable

f. Voici une solution :

f=lambda x:1/(1+x **2)f(0)1.0f(1)0.5f(2)0.2

3.6. Tracé de courbes.

Il existe plusieurs bibliothèques qui permettent de tracer des courbes. Par exemple matplotlib pré-sente un bon compromis entre facilité d’utilisation et qualité graphique, ou pylab qui présente unefonctionnalité proche d’autres langages comme Matlab ou Scilab. Exemple :

- 8 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

1 from pylab import *2 x=linspace(-4,4,100)3 f=lambda x:1/(1+x**2)4 ylim(-0.5,1.5)5 y=f(x)6 plot(x,y,’r’,label=’f(x)=1/(1+x2)′)7 legend()8 title(’Fonction de Runge’)9 xlabel(’abscisses’)

10 ylabel(’ordonnees’)

4. LES MATRICES.

Une matrice n ×p est un tableau de nombres constitué de n lignes et de p colonnes. Par exemple

A =(

1 2 3 4−4 −3 −2 −1

); B =

1 2 32 4 63 6 9

; C =( 1

11

)

A est une matrice 2×4 ; B est une matrice 3×3 et C est matrice 3×1 (peut représenter un vecteur).

On peut additionner deux matrices de mêmes dimensions et multiplier deux matrices A et B à conditionque le nombre de colonnes de A soit égal au nombre de lignes de B . Dans l’exemple, seul le produit B ×Cest possible.

En Python, à l’aide de la bibliothèque numpy on peut manipuler ces tableau avec le type array.

4.1 Création d’une matrice.

Au préalable, il ne faut pas oublier d’importer le module numpy.

np sera l’alias utilisé pour accéder aux instructions de la librairie numpy.

import numpy as npA=np.array([[1,2,3],[4,5,6]])print(A)print(type(A)) #type de structureprint(A.dtype) #type de donnéesprint(A.shape) #nombre de lignes et

colonnes

[[1 2 3][4 5 6]]

<class ’numpy.ndarray ’>int32(2, 3)

On remarque que le type de données est implicite ; le nombre 1 est considéré comme un entier ; pourun flottant, il faudrait entrer 1. ; il est préférable de rendre le typage explicite :

import numpy as npA=np.array([[1,2,3],[4,5,6]],dtype=float)print(A)print(A.dtype)

[[ 1. 2. 3.][ 4. 5. 6.]]

float64

Matrices particulières :

zeros((n,p)) matrice nulleones((n,p)) matrice ne comportant que des 1eye(n) matrice identité

- 9 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

import numpy as npO=np.zeros((2,3))print(O)U=np.ones((2,2))print(U)I=np.eye(3)print(I)

[[ 0. 0. 0.][ 0. 0. 0.]]

[[1. 1.][1. 1.]]

[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]

Il est possible de créer une matrice à partir d’une liste de valeurs ; voici quelques exemples :

A=np.arange(0,10).reshape(2,5)print(A)

[[0 1 2 3 4][5 6 7 8 9]]

B=np.array([1,2,3,4,5,6])C=B.reshape(3,2)print(C)

[[1 2][3 4][5 6]]

L=[1.2,1.3,1.4,1.5]D=np.asarray(L).reshape(2,2)print(D)

[[ 1.2 1.3][ 1.4 1.5]]

Redimensionnement d’une matrice :

A=np.array([[1,2,3],[4,5,6]])print(np.resize(A,new_shape=(3,2)))

[[1 2][3 4][5 6]]

4.2 Opérations sur les matrices.

On peut additionner deux matrices de mêmes dimensions et multiplier une matrice par un scalaire :

A=np.arange(1,7).reshape(2,3)B=np.array([[6,5,4],[3,2,1]])print(A+B)print(2*A)

[[7 7 7][7 7 7]][[ 2 4 6][ 8 10 12]]

Le produit matriciel (entre deux matrices) n’est possible que si le nombre de colonnes de la premièreet égal au nombre de lignes de la seconde :

A=np.arange(1,7).reshape(2,3)B=np.array([[1,3],[2,2],[3,1]])

print(A)print(B)

print(np.dot(A,B))print(np.dot(B,A))

A=[[1 2 3] B=[[1 3][4 5 6]] [2 2]

[3 1]]A*B=[[14 10]

[32 28]]B*A=[[13 ,17 ,21]

[10 ,14 ,18][7,11 ,15]]

On peut accoler un vecteur B en tant que nouvelle ligne (axis= 0) ou en tant que nouvelle colonne(axis= 1) :

A=np.array([[1,3],[-2,2]],dtype=float)B=np.array([[4,5]],dtype=float)print(np.append(A,B,axis=0))

[[ 1. 3.][-2. 2.][ 4. 5.]]

A=np.array([[1,3],[-2,2]],dtype=float)B=np.array([[4],[5]],dtype=float)print np.append(A,B,axis=1)

[[ 1. 3. 4.][-2. 2. 5.]]

- 10 -

1TSI 2016-2017. Chapitre B - TD 2 - Les nombres et Python. Lycée Chaptal.

Insertion de B en tant que nouvelle ligne (axis= 0) à la position n°1 :

A=np.array([[1,3],[-2,2]],dtype=float)B=np.array([[4,5]],dtype=float)print(np.insert(A,1,B,axis=0))

[[ 1. 3.][4. 5.][ -2. 2.]]

Suppression de la ligne (axis= 0) via son indice (n°1) :

A=np.array([[1,3],[-2,2]],dtype=float)print(np.delete(A,1,axis=0)) [[ 1. 3.]]

4.3 Extractions des valeurs d’une matrice.

A=np.array([[1,2,3],[4,5,6],[7,8,9]])print(A)

[[1 2 3][4 5 6][7 8 9]]

Extraction d’une valeur de la matrice via son indice :print(A[0,0])print(A[2,1])print(A[len(A)-1,len(A)-1])

189

Extraction d’une partie de la matrice, de la ligne 0 à la ligne 2 (non incluse) et de la colonne 0 à lacolonne 2 (non incluse) :

print(A[0:2,0:2])[[1 2][4 5]]

Extraction des valeurs d’une ligne ou d’une colonne et retournées sous la forme d’une matrice ligne :

print(A[2,0:len(A)]) #dernière ligne#ou plus simplement :print(A[0]) #première ligneprint(A[0:len(A),2]) #dernière colonne

[7 8 9]

[1 2 3][3 6 9]

- 11 -