Python - séance 3 - corrigé

publicité
Python - séance 3 - corrigé
PT
2015-16
Exercice 7
Cet exercice devra être fait avec le langage Python. À chaque question, les instructions ou les fonctions écrites
devront être testées.
Soit n un entier vérifiant n≤ 26. On souhaite écrire un programme qui code un mot en décalant chaque lettre
de l’alphabet de n lettres.
Par exemple, pour n = 3, le décalage sera le suivant :
avant le décalage
après le décalage
a
d
b
e
c
f
...
...
...
...
x
a
y
b
z
c
Le mot oralensam devient ainsi rudohqvdp.
1. Définir une chaı̂ne de caractères contenant toutes les lettres dans l’ordre alphabétique (caractères en minuscule).
2. Écrire une fonction decalage, d’argument un entier n, renvoyant une chaı̂ne de caractères contenant toutes
les lettres dans l’ordre alphabétique, décalées de n, comme indiqué ci-dessus.
3. Écrire une fonction indices, d’arguments un caractère x et une chaı̂ne de caractères phrase, renvoyant une
liste contenant les indices de x dans phrase si x est une lettre de phrase et une liste vide sinon.
4. Écire une fonction codage d’arguments un entier n et une chaı̂ne de caractères phrase, renvoyant phrase
codé avec un décalage de n lettres.
5. Comment peut-on décoder un mot codé ?
1. et 2. La manipulation des chaı̂nes de caractères peut être une difficulté ici. Il est plus simple de travailler avec des
listes de caratères car on peut les modifier facilement mais il faut ensuite renvoyer une chaı̂ne de caractères.
Il faut donc savoir passer de l’une à l’autre.
""" question 1 """
alphabet = ’ a b c d e f g h i j k l m n o p q r s t u v w x y z ’
""" question 2 """
print ( ’ premier essai ’)
# Premier essai : on transforme notre chaine en liste
# car les chaines de caracteres ne sont pas modifiables .
def decal ( n ):
’’’ decale les lettres de n places dans l ’ alphabet ’’’
dec = list ( alphabet ) # transformation en liste
i = 0 # indice de la lettre a decaler
while i + n <=25: # on decale de n en restant avant z
dec [ i ] = alphabet [ i + n ]
i = i +1
while i <=25: # on traite les derniers qui decales , depassent z
dec [ i ] = alphabet [ i +n -26]
i = i +1
return " " . join ( dec ) # permet de transformer la liste dec en une chaine de caractere .
# test
print ( decal (3))
print ( ’ deuxieme essai ’)
# deuxieme essai largement plus compact : on deplace la fin de l ’ alphabet au debut et on decale .
# on ne travaille qu ’ avec des chaines de caracteres
def decalage ( n ):
Magali Hillairet
1
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
’’’ decale les lettres de n places dans l ’ alphabet ’’’
dec1 = alphabet [ n :26]
dec2 = alphabet [: n ]
return dec1 + dec2
# tests : tester pour 0 , 25 , 26 , et meme pour des valeurs negatives
print ( ’ pour 3\ n ’ , decalage (3))
print ( ’ pour 0\ n ’ , decalage (0))
3. Je propose deux solutions : l’une d’elle utilise .count et .index mais elle est plutôt plus compliquée !
""" question 3 """
# on peut coder une nouvelle fonction : tres simple avec enumerate
def indices (x , phrase ):
L = []
for i , val in enumerate ( phrase ):
if val == x :
L . append ( i )
return L
# ou utiliser . index
def indic (x , phrase ):
L = []
n = len ( phrase )
i = 0
nb = phrase . count ( x ) # nombre d ’ occurences de x dans phrase
if nb != 0: # si x apparait dans phrase
while i <= n and len ( L ) < nb :
k = phrase . index (x ,i , n ) # prendre le plus petit indice ou x se trouve apres i
i = i + k +1 # passer a l ’ indice suivant
L . append ( k ) # ajouter k a la liste des positions prises par x
return L
# test
l = ’ oralensam ’
print ( ’ avec indices ’)
print ( indices ( ’a ’ ,l ))
4. et 5. Questions 4 et 5
""" ’ question 4 """
# on veut pouvoir transformer une liste de caracteres en chaine de caractere
# version sans . join
def chaine ( N ):
C = N [0]
for i in range (1 , len ( N )):
C = C + N[i]
return C
# Plus elegant sans indexation
def chaine ( N ):
C = ’ ’# on definit une chaine vide
for val in N :
C = C + val # on concatene chaque element de N
return C
# Direct si on connait . join
Magali Hillairet
2
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
def chain ( N ):
return ’ ’. join ( N )
# test
L =[ ’a ’ , ’b ’ , ’c ’]
cL = chaine ( L )
print ( cL )
# fonction codage
def codage (n , phrase ):
nouv = list ( phrase )
dec = decalage ( n )
for i in range (26):
x = alphabet [ i ]
y = dec [ i ]
L = indices (x , phrase )
for j in L :
nouv [ j ] = y
return chaine ( nouv )
# test
print ( ’ le mot abcyz devient ’ , codage (3 , ’ abcyz ’ ))
print ( ’ le mot oralensam devient ’ , codage (3 , ’ oralensam ’ ))
""" question 5 """
# en utilisant ce qui precede avec -n
motcode = codage (3 , ’ oralensem ’)
print ( motcode , ’ redevient ’ , codage ( -3 , motcode ))
bilan
â Manipulation de chaı̂ne de caractère : savoir transformer une chaı̂ne en liste, savoir modifier le type (passage
de string à entier par int). Connaı̂tre aussi les méthodes .split et .join .
â Récupération d’une partie d’une liste list[deb:fin:pas] en particulier.
â Utilisation de enumerate pour parcourir une liste en ayant l’indice et la valeur.
â Utilisation de .count, .index sur des listes.
â Réfléchir à un algorithme efficace avant de se lancer dans la programmation.
Magali Hillairet
3
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
Exercice 5
Cet exercice devra être fait avec le langage Python (et ses bibliothèques numpy, scipy, matplotlib). À chaque
question, les instructions ou les fonctions écrites devront être testées.
On considère la fonction g définie sur [0, 2] par
x
g(x) =
1
pour 0 ≤ x < 1
pour 1 ≤ x < 2
1. Définir la fonction g. Tracer sa courbe représentative sur [0, 2[, c’est-à-dire la ligne brisée reliant les points
(x, g(x)) pour x variant de 0 à 1.99 avec un pas de 0.01.
2. Définir une fonction f donnée de manière récursive sur [0, +∞[ par
g(x)
pour 0 ≤ x < 2
√
f (x) =
xf (x − 2) pour x ≥ 2
3. Tracer la courbe représentative de f sur [0, 6].
4. Écrire les instructions permettant de calculer, à 10−2 près, la plus petite valeur α > 0 telle que f (α) > 4.
Corrigé
1. Pour le tracé on a besoin de définir un vecteur X contenant les abscisses des points à placer. La question
oriente vers l’utilisation de arange.
On veut ensuite la liste des ordonnées, pour cela on applique la fonction g au vecteur X. Dans le corrigé, on
crée une fonction appliquer pour le faire mais on peut aussi utiliser la fonction vectorize de numpy. Pensez
aussi à tester avec des valeurs simples.
2. Pas de difficulté pour définir f .
3. Pour le tracé, on donne une première courbe qui ne prend pas en compte les discontinuités puis, on essaie de
faire mieux ! On pourrait rajouter des pointillés aux discontinuités.
4. Utilisez le graphe précédent, puis pensez au principe de dichotomie pour trouver une valeur approchée de
f (α) = 0.
import matplotlib . pyplot as plt
import numpy as np
# Question 1
# on definit g
def g ( x ):
assert 0 <= x and x <2 # renvoie un message d ’ erreur si x n ’ est pas dans l ’ intervalle [0 ,2[
if x <1:
return x
else :
return 1.
# on ’’ vectorialise ’’ une fonction
def appliquer (h , t ):
’’’ Cette fonction applique la fonction h a un vecteur t ’’’
return [ h ( x ) for x in t ]
Magali Hillairet
4
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
# courbe
x = np . arange (0 ,2 ,0.01) # de 0 a 2 exclu avec un ecart de 0.01
gy = appliquer (g , x )
plt . plot (x , gy , linewidth =3) # la courbe de g
plt . xlabel ( ’ axe des x ’)
plt . ylabel ( ’ axe des y ’)
plt . axis ([0 ,2 ,0 ,2]) # choix d ’ une fenetre graphique
plt . savefig ( ’ ex5_fig1 . pdf ’)
plt . show ()
# Autres methodes de vectorialisation d ’ une fonction
# avec vectorize
gvec = np . vectorize ( g )
xv = np . arange (0 ,2 ,0.01) # de 0 a 2 exclu avec un ecart de 0.01
gyv = gvec ( x )
plt . plot ( xv , gyv , linewidth =3) # la courbe de g
plt . show ()
# question 2
def f ( x ):
assert x >=0
if x <2: # expression de f pour x dans [0 ,2[
return g ( x )
else : # expression de f sinon , on se ramene a x -2
return np . sqrt ( x )* f (x -2)
# test
# print ([ f (0) , f (1) , f (2) , f (3) , f (4) , f (5)])
# question 3
# courbe de f sur [0 ,6]
x = np . arange (0 ,6 ,0.01) # de 0 a 6 exclu avec un ecart de 0.01
fy = appliquer (f , x )
plt . plot (x , fy ) # la courbe de f
plt . xlabel ( ’ axe des x ’)
plt . ylabel ( ’ axe des y ’)
plt . axis ([0 ,6 ,0 ,10]) # choix d ’ une fenetre graphique
plt . savefig ( ’ ex5_fig2 . pdf ’)
plt . show ()
# Essayons d ’ obtenir une courbe plus jolie , respectant les discontinuites .
x1 = np . arange (0 ,2 ,0.01) # de 0 a 2 exclu avec un ecart de 0.01
fy1 = appliquer (f , x1 )
plt . plot ( x1 , fy1 ) # la courbe de f sur [0 ,2]
x2 = x1 + 2 # de 2 a 4 exclu avec un ecart de 0.01
fy2 = appliquer (f , x2 )
x3 = x2 + 2 # de 4 a 6 exclu avec un ecart de 0.01
fy3 = appliquer (f , x3 )
plt . plot ( x1 , fy1 , ’b ’) # la courbe de f sur [0 ,2]
plt . plot ( x2 , fy2 , ’b ’) # la courbe de f sur [2 ,4]
plt . plot ( x3 , fy3 , ’b ’) # la courbe de f sur [4 ,6]
t = np . arange (0 ,6 ,0.01)
# plt . plot (t , np . sqrt ( t ) , ’r - - ’)
# plt . plot (t , np . sqrt ( t )*( t -2) , ’g - - ’)
Magali Hillairet
5
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
plt . xlabel ( ’ axe des x ’)
plt . ylabel ( ’ axe des y ’)
plt . axis ([0 ,6 ,0 ,6]) # choix d ’ une fenetre graphique
plt . savefig ( ’ ex5_fig3 . pdf ’)
plt . show ()
# on peut automatiser cette construction avec une boucle for
def trace_sur02N ( n ):
for k in range ( n ): # trace sur le segment [0 ,2 k ]
x_trace = x1 +2* k
y_trace = appliquer (f , x_trace )
plt . plot ( x_trace , y_trace , ’b ’)
plt . show ()
trace_sur02N (6)
# question 4
# on met en place une methode de dichotomie
def sup ( eps ):
’’’ determine une valeur approchee par exces , a eps pres d ’ une valeur alpha telle que
f ( alpha )=4 ’’’
a = 4. # intialisation la valeur cherchee est entre 4 et 6
b = 6.
while b - a >= eps :
m = ( a + b )/2 # le milieu
#
print (m , f ( m ))
if f ( m ) > 4: # si f ( m ) depasse 4 , on prend b = m et on garde a
b = m
else : # sinon on garde b et on prend a = m
a = m
return b # on renvoie la valeur superieure
# on a pour chaque boucle : f ( a ) <4 < f ( b ) , et on sort si b -a < eps .
print ( sup (0.01))
print ( sup (0.0001))
2.0
axe des y
1.5
1.0
0.5
0.0
0.0
Magali Hillairet
0.5
1.0
axe des x
1.5
2.0
6
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
10
6
8
5
4
6
axe des y
axe des y
2015-16
4
2
2
0
3
0
1
1
2
3
axe des x
4
5
6
0
0
1
2
3
axe des x
4
5
6
Bilan
â Tracés : pas de difficulté particulière à part le fait de ”vectorialiser” une fonction.
â Méthode de dichotomie.
Magali Hillairet
7
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
Exercice 9
Cet exercice devra être fait avec le langage Python (et ses bibliothèques numpy, scipy, matplotlib). À chaque
question, les instructions ou les fonctions écrites devront être testées.
Dans cet exercice, on pourra utiliser la fonction array de la bibliothèque numpy, ainsi que la fonction eig de
la sous-bibliothèque numpy.linalg.
1. Créer deux matrices R =
1
4
2
5
3
6

1
et S =  4
7
2
5
8

3
6  et les faire afficher.
9
2. Créer une fonction test, d’argument M , renvoyant la valeur n si M est une matrice carrée d’ordre n (entier
naturel non nul), et zéro dans tous les autres cas.
Vérifier la fonction test sur R et sur S.
3. Le fichier ex.009.txt, situé dans le sous-répertoire data du répertoire de travail, contient un tableau de
valeurs flottantes. Lire ce tableau dans le fichier et vérifier qu’il correspond bien à une matrice carrée d’ordre
5 que l’on désignera par M1.
4. Déterminer les valeurs propres de la matrice M1.
5. Créer une fonction dansIntervalle, d’arguments une liste L et deux réels a et b, renvoyant la valeur True
si tous les éléments de la liste L sont dans l’intervalle [a, b] et False sinon.
Vérifier que toutes les valeurs propres de la matrice M1 sont dans l’intervalle [−4, 0].
Corrigé
import numpy as np
import numpy . linalg as nplin
# # Question 1
R = np . array ([[1 ,2 ,3] ,[4 ,5 ,6]] , float )
print ( " voici la matrice R " ,R )
S = np . array ([[1 ,2 ,3] ,[4 ,5 ,6] ,[7 ,8 ,9]] , float )
print ( " voici la matrice S " ,S )
# Question 2
def test ( M ):
v = 0
n = len ( M ) # renvoie le nombre de lignes
p = len ( M [0]) # renvoie la longueur de la ligne 0
if n == p : # on change la valeur de v si n = p
v = n
return v
print ( test ( R ))
print ( test ( S ))
# Question 3
with open ( " data / ex009 . txt " ," r " ) as source :
M0 =[]
for ligne in source :
#
print ( ligne )
ligne = ligne . rstrip ( ’\ n \ r ’)
ligne_data = ligne . split ( " ," )
L = [ float ( val ) for val in ligne_data ] # on cree une liste pour la ligne
Magali Hillairet
8
Lycée Franklin, Orléans
Python - séance 3 - corrigé
PT
2015-16
M0 . append ( L ) # on ajoute la liste a M0
#
print ( ’ M0 ’, M0 )
#
print ( M0 [1])
# M0 est une liste des lignes de la matrice
# on transforme en un array de numpy
M1 = np . array ([ M0 [ i ] for i in range ( len ( M0 ))] , float )
print ( M0 )
print ( M1 )
# Question 4
w , P = nplin . eig ( M1 )
print ( ’ les valeurs propres de la matrice \ n ’ ,M1 , ’ sont \ n ’ ,w )
vp = nplin . eigvals ( M1 )
print ( ’ les valeurs propres seulement ’ , vp )
# Question 5
# version maladroite
def dansIntervalle (L ,a , b ):
v = True
i = 0
while v == True and i < len ( L ): # on passe en revue les valeurs propres
# on s ’ arrete des que l ’ une n ’ est pas dans l ’ intervalle
if L [ i ] < a or L [ i ] > b :
v = False
else :
i = i +1
return v
# version plus elegante
def dansInterval (L ,a , b ):
for val in L :
if val < a or val > b :
return False
return True
# test de dans Intervalle
L = [ -1 ,1 ,2 ,3]
print ( dansIntervalle (L , -2 ,4))
print ( dansIntervalle (L ,0 ,4))
print ( dansIntervalle (L , -1 ,2.5))
print ( dansIntervalle (w , -4 ,0))
Bilan
â Définir une matrice avec np.array.
â Ouverture et lecture de fichiers : utilisation de .rstrip, de .split. Transformation du type des données.
â Valeurs propres : .eig (renvoie les valeurs propres et les vecteurs propres) ou .eigvals (seulement les valeurs
propres).
Magali Hillairet
9
Lycée Franklin, Orléans
Téléchargement