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