BCPST1 Introduction a=a+1 Windows Windows. Disque dur, arborescence des dossiers répertoires (folders, directories) Représentation interne des nombres, adresse. Octet, Kilo-octet Mega-octet, Giga-octet, Téra-octet. Introduction Python est un langage de programmation très polyvalent. De ce fait, il existe de multiples installations possibles de Python. L’utilisateur débutant peut donc se sentir dérouté par l’absence d’une référence unique pour Python. Depuis 2009, un nouvel environnement de développement scientifique pour Python est disponible. Fortement inspiré par l'environnement de développement de MATLAB, Spyder (Scientific PYthon Development EnviRonment) est l'outil idéal pour faciliter l’apprentissage de Python. Pour plus de détails, veuillez visiter le site officiel de Spyder : http://code.google.com/p/spyderlib/ En pratique nous utiliserons la suite scientifique Anaconda qui rassemble tout le nécessaire pour l’enseignement de Python : Spyder, le langage Python et ses modules scientifiques. Téléchargement d’Anaconda : http://continuum.io/downloads Environnement TM1314 BCPST1 Spyder présente 2 panneaux que nous allons beaucoup utiliser: en bas à droite, un interpréteur interactif Python (la console) , à gauche un éditeur pour écrire ses scripts Python. Editeur de scripts Interpréteur interactif L’invite (prompt) est >>> sous Python Accès à l’aide : log Se placer dans l’Inspecteur d’objets et taper le nom de la fonction exemple : Variables dans Python Une variable est représentée par un identificateur de variable (son nom) formé d'une chaîne alphanumérique commençant par un des 26 caractères de l'alphabet. Exemples a, a1, toto... Création d’une variable >>> v=1.234 On peut placer des commentaires après un # >>> w=4.321 # création de la variable w L’explorateur de variables permet connaitre leurs types, tailles et leurs valeurs Il est possible (en se plaçant dans l’explorateur de variables) de supprimer une variable devenue inutile Les caractères accentués sont tous interdits dans Python Autre écriture interdite >>>x(t)=5 (on écrira x=5) L'affectation se fait par = >>> a=2 ; b=3 #2 instructions sur la même ligne sont séparées par un ; >>> a**b >>> s=a+b >>> s >>> a=a+1 Le signe = ne signifie pas qu'il y a identité entre les deux membres. Il signifie que le résultat du second membre (de droite) est stocké à une adresse référencée par la variable du premier membre. Ainsi, le premier membre (à gauche) est toujours réduit à un identificateur de variable. On dénombre dans Python plusieurs types de variables : les réels, les entiers, les chaînes de caractères et les booléens (codés par False ou True). Les nombres réels sont représentés par des nombres à virgule flottante. TM1314 BCPST1 En notation scientifique >>>1.34e3 représente 1340. Python travaille toujours avec des données en double précision soit 8 octets. >>>1e-323 1e-323 >>>1e-324 0.0 >>>1e309 inf >>>1e308 1e308 Python, une super calculatrice Explorons d'abord les opérateurs + , - , * , / , ** et leur hiérarchie . 10-3*2 2*3**2 (2*3)**2 4/5*2 4/(5*2) Une valeur approchée de est donnée par la constante prédéfinie de Python pi Tester les quelques fonctions suivantes calculer sqrt(81) puis log(2), log(e) et log10(10). Calculer cos(pi/4) sin(pi/6) tan(pi/4) Tester les fonctions trunc, round, floor et ceil pour les valeurs suivantes : Fonctions Trunc int Floor Ceil -1.9 -1.5 -1.1 1.1 1.5 1.9 Conclure sur les quatre fonctions testées >>>round(1.23456,2) #arrondi avec 2 décimales Autres fonctions >>>int(12.3456) >>>a=factorial(5) #partie entière #factorielle Nombres complexes La constante j est prédéfinie : >>>x=1+2j >>>y=3+1j Testez les fonctions conj, real, imag, abs et angle sur x et y. y=real(z) #array Calculer l’argument des complexes suivants : 1, i, 1+i, 1-i,-1-i,-1+i à l’aide de la fonction atan (function of math module) et comparer avec les résultats donnés par la fonction angle Bibliothèque mathématique >>>atan(-1) >>>import math >>>math.atan(-1) Fonctions Scripts Vecteurs Matrices 1) Fonctions et Scripts Sélectionner votre répertoire de travail : (par exemple c:\bcpst1\nom) Fonctions Ecrire les instructions suivantes dans l’éditeur de scripts def ex1(): r=5 area = pi*r*r print(area) TM1314 TD2 BCPST1 Pour exécuter ces instructions il faut appuyer sur la touche F5 et enregistrer le fichier dans votre répertoire de travail en le nommant td1.py par exemple. Ensuite, on repasse dans la console >>>ex1() 78.5398163397 Si nous n’utilisions pas Spyder il faudrait écrire le programme ainsi : def ex1(): import math r=5 area = math.pi*r*r print(area) Exercice 2 2 Soit T le trinôme défini par T(x) = a x + b x + c Recopier et compléter le programme suivant dans td1.py (à la suite de la fonction ex1) 2 Exécuter le programme pour T(x) = 2,5.x + 3,4x –1,5 def ex2(a,b,c): ……. ……. ……. return x1,x2 #calcul de delta # calcul de x1 # calcul de x2 Scripts Exercice 3 Définissons deux variables a et b : >>>a=2, b=3 Ecrire un script permettant d’échanger les valeurs de a et de b Exercice 4 Attention à la division >>>5/3 #division réelle dans la console Mais Lorsque l’on écrira des scripts ou des fonctions 7/3 ≠7./3 Tester le script suivant permettant de mettre en évidence cette particularité syntaxique k=5/3; print 'k = :',k f=5./3;print 'f = :',f 2) Vecteurs (matrice 1D), visualisation de vecteurs Python dispose de plusieurs types de données pour représenter des matrices de données. Nous nous intéresserons aux listes et aux tableaux. Listes : une liste est un ensemble de valeurs modifiables séparées par des virgules >>>a=[4,5,6] >>>a >>>a[0] >>>a[0]=88 ;a >>>a=a+[33] ;a #ajout d’un élément >>>b=range(1,7,2) ;b # range(start,stop,step) le pas est nécessairement entier TM1314 Arrays (module Numpy) manipulations que les listes plus pratique pour les calculs, moins pratique pour les BCPST1 >>> x2=array([[1,2,3]]); y2=array([[1],[2],[3]]) x2 et y2 sont des tableaux x2 est un vecteur ligne, y2 est un vecteur colonne. La function arange permet de créer des tableaux le pas n’est pas nécessairement entier >>> w=arange( 1, 3, 0.5 ) #arange(start,stop,step) >>>w #création d’un tableau de réels >>> t=arange(0,2.5,0.1) ; t[0] ;t[1] ;t[24] ;t[25] Remarque : si u=array([a,b,c]), v=sin(u) est le tableau ([sin(a),sin(b),sin(c)]) >>>t=arange(0,pi,0.02); >>>s=cos(exp(t)) ; >>>plot(t,s) # fonction plot du module matplotlib Pour dnner un nom aux axes et au graphique, on peut utiliser les fonctions xlabel , ylabel et title.ou cliquer sur l’icône « Edit curve line and axes parameters » Enregistrer cette courbe figure_1.pngdans votre dossier. Exportez ce tracé sous Word (Insertion / Image) Tout tracé est formé d'un ensemble de points reliés par des segments de droite. Le premier vecteur (ici t) est porté en abscisses, le second en ordonnées. Testez >>>plot(s,t) Rq : sous Python il y a superposition des graphes dans la fenêtre active. Tracés superposés variante 1 On veut représenter sur une même figure les fonctions sinus et cosinus sur l'intervalle [0; pi]. Comme on l'a déjà remarqué, on ne représente pas des fonctions mais des vecteurs. Il faut d’abord construire le vecteur des abscisses : t (déjà fait) Il faut ensuite construire les deux vecteurs des ordonnées. >>>s=sin(t); c=cos(t); >>>plot(t,s,t,c) affiche les deux courbes dans une même figure. Appuyer sur la touche f pour agrandir la fenêtre graphique Tracés superposés variante 2 Représenter la fonction f(x)= x.sin x sur l'intervalle [-1..1]. On créera tout d'abord 2 vecteurs abscisses x1 et x2 en prenant respectivement 5 points puis 1000 points puis 2 vecteurs ordonnées y1 et y2. Comparer les tracés sur une même figure Remarque : La fonction size renvoie la longueur d'un vecteur >>>size(y1) 3) Matrices TM1314 BCPST1 C'est un tableau rectangulaire (ou carré) par exemple : >>> A=array([[1,2,3],[4,5,6]]) >>> A array([[1, 2, 3], [4, 5, 6]]) A est une matrice 2*3 (2 lignes et 3 colonnes). La fonction size renvoie le nombre d’éléments d’une matrice>>>size(A) La fonction shape renvoie le nombre de lignes et nombre de colonnes d’une matrice. >>>u=shape(A) ;nbl=u[0] ;nbc=u[1] L'élément situé à la première ligne, deuxième colonne est A[0,1] >>> A[0,1] #réponse 2 On peut extraire une ligne >>> u= A[0,:]extrait la première ligne. On peut extraire une colonne >>> A[:,1]extrait la deuxième colonne . La commande 2+A renvoie le vecteur/matrice dont tous les éléments sont ceux de A plus 2. Multplier un vecteur/matrice par un scalaire se fait selon le même principe : la commande 2*A renvoie le vecteur/matrice de même dimension dont tous les éléments ont été multipliés par 2. L’opérateur + additionne terme à terme deux tableaux de même dimension L’opérateur * multiplie terme à terme deux tableaux de même dimension >>> B=array([[1,0,1],[0,1,0]]) >>>A+B >>>A*B Le vrai produit matriciel utilise la fonction dot (du module Numpy) >>> a=array([[1,2],[3,4]]) >>>b=array([[1,0],[0,5]]) >>>a*b >>>dot(a,b) >>>d=array([[1,2,3]]) >>>e=array([[4],[5],[6]]) >>>dot(d,e) >>>c=inv(a) >>>dot(a,c) >>>a*c >>>transpose(a) >>> g=array([[5],[1]]) >>>dot(a,g) >>>dot(e,d) >>>dot(g,a) Flow Control TD3 >>> y=input('donner un réel :') >>> if y>0: ... print 's= ',y+1 ... else: ... print 's= ',y-1 1) Dans la console… peu utilisé 2) Dans des fonctions Ex1 : Ecrire les fonctions suivantes dans l'éditeur Testez les, répondez aux questions et faites les organigrammes correspondants if1. if2. TM1314 def if1(n) : if n > 1 : m = n+1; else : m = n - 1; return m def if2(z) : a. n = 7 b. n = 0 c. n = -10 m=? m=? m=? BCPST1 if z < 5 : w = 2*z; elif z < 10 : w = 9 - z; elif z < 100: w = sqrt(z); else: w = z; return w if3. if4. if5. def if3(T): if T < 30: h = 2*T + 1; elif T < 10: h = T - 2; else: h = 0; return h def if4(x): if 0 < x < 10: y = 4*x; elif 10 < x < 40 : y = 10*x; else: y = 500; return y a. z = 1 b. z = 9 c. z = 60 d. z = 200 w=? w=? w=? w=? a. T = 50 b. T = 15 c. T = 0 h=? h=? h=? a. x = -1 b. x = 5 c. x = 30 d. x = 100 Conclusion ? y=? y=? y=? y=? def if5(x): if x>30: print 'flow control' Comparaisons 2==3 Booléens On appelle expression booléenne une expression qui est soit vraie, soit fausse. Une variable booléenne, est codée par 0 / 1 pour coder Faux / Vrai. (False et True sous Python) Exécuter les instructions suivantes : >>>2==3 >>> u=1>0;print u >>> u=([[ 3<5, 7==8 ]]) ;u # u est une liste constituée de 2 éléments comparateur == , inférieur < , supérieur > , >=,<= , différent != Syntaxe des opérateurs Opérateurs booléens ET and OU or OU exclusif ^ Complément not Ecrire les Tables de vérité des opérateurs et, ou et ou exclusif Testez : >>>6 != 3 >>> test= (2>1)or(5>10);test TM1314 #ne pas oublier les parenthèses ! BCPST1 >>> test= (2>1)and(5>10);test >>>pi==3.14159 #Attention == pas = >>>1==0.99 >>> 1==0.99999999999999999 #conclusion ? >>> a=7 >>>2<a;a<9 >>>(2<a)and(a<9) >>>2<a<3 # écriture à éviter, on préfèrera (2<a)and(a<3) >>>2<a>9 # écriture à éviter, on préfèrera (2<a)and(a>9) >>>True or True >>>d=6 ;d<=6 Exercice a, b et c désignant 3 réels positifs ou nuls, écrire dans l’éditeur, les tests suivants ( ne pas placer d’accents dans les commentaires inclus dans print) Test1 : " a, b et c sont nuls " Test2 : " un au moins des trois nombres a, b et c est nul " Test3 : " les trois réels a, b et c sont non nuls " Test4 : " a, b et c ne sont pas tous égaux " Test5 : " un seul parmi les trois réels a, b et c est non nul " Test6: " 2<a<9 et b>15 et c 2" Comparaison de 2 listes et de 2 matrices >>> b=([[1,2],[3,4]]);c=([[1,2],[3,4]]) ; d=([[1,55],[3,4]]); >>> c==b;b=d True False #listes >>> b=array([[1,2],[3,4]]);d=array([[1,55],[3,4]]); >>> b==d array([[ True, False], [ True, True]], dtype=bool) #matrices Caractères, chaînes de caractères Table partielle des codes ASCII (American Standard Code for Information Interchange) des caractères décimal 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 TM1314 binaire char 100000 espace 100001 ! 100010 " 100011 # 100100 $ 100101 % 100110 & 100111 ' 101000 ( 101001 ) 101010 * 101011 + 101100 , 101101 101110 . décimal 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 Binaire 1000000 1000001 1000010 1000011 1000100 1000101 1000110 1000111 1001000 1001001 1001010 1001011 1001100 1001101 1001110 char @ A B C D E F G H I J K L M N décimal 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 binaire 1100000 1100001 1100010 1100011 1100100 1100101 1100110 1100111 1101000 1101001 1101010 1101011 1101100 1101101 1101110 char ` a b c d e f g h i j k l m n BCPST1 47 48 49 50 51 52 53 54 55 56 101111 110000 110001 110010 110011 110100 110101 110110 110111 111000 / 0 1 2 3 4 5 6 7 8 79 80 81 82 83 84 85 86 87 88 1001111 1010000 1010001 1010010 1010011 1010100 1010101 1010110 1010111 1011000 O P Q R S T U V W X 111 112 113 114 115 116 117 118 119 120 1101111 1110000 1110001 1110010 1110011 1110100 1110101 1110110 1110111 1111000 o p q r s t u v w x code ASCII et Python Pour obtenir le code ASCII d'un caractère Python utilise la fonction ord >>> ord ('B') La fonction chr sert pour savoir quel caractère correspond à un code ASCII donné >>> chr(97) ; chr(85) Variable de type caractère >>> a='u' >>> a=('B','C','P','S','T') #tuple de caractères >>>ord(a[1]) A restructurer Fonctions sous Python(inutile déjà fait en TD2sauf pour n entrées m sorties cf résumé) 1) Première fonction(table7) 0 entrée , 0 sortie def table7(): n=1 while n <11 : print (n * 7), n = n +1 Faire une exécution préalable dans l’éditeur (F5) avant d’utiliser la fonction dans la console >>>table7() 1) Deuxième fonction(f2) def f2(x): TM1314 1 entrée , 1 sortie BCPST1 y=2*x**2+5*x-7 return y >>>f2(5) 2) Troisième fonction(f3) 2 entrées,3 sorties Ecrire dans l’éditeur cette seconde fonction à la suite de la fonction précédente import numpy as np import matplotlib.pyplot as plt def f3(xmin,xmax): pas=(xmax-xmin)/1000. x=np.arange(xmin,xmax,pas) y=(2*np.sin(x)-x)**2; ymax=max(y) ymin=min(y) ymoy=np.mean(y) plt.plot(x,y); plt.show() return ymoy,ymax,ymin Appel de la fonction >>>a,b,c=f3(-10,10);print '<y> = : ',a,'y_max = : ',b,' et y_ min = :',c Réponse <y> = : 32.1035591066 y_max = : 122.944680312 et y_ min = : 4.54383881407e-26 if6. def if6(x): if x>30 or x==0: h=17; else: h=x**2; return h a. x = 50 b. x = 5 c. x = 0 h=? h=? h=? On pourrait écrire en ligne 2 de cette fonction if (x>30) |(x==0):? Ex2 Écrire une fonction aleapm renvoyant de manière équiprobable +1 ou -1. On pourra utiliser la fonction rand(). Ex3 De la même manière, écrire une fonction aleapmp renvoyant +1 avec la probabilité p et -1 avec la probabilité 1- p. (p compris entre 0 et 1) Ex4 Ecrire une fonction ex4 définie sur R telle que f(x) = 2 f(x) = x-4 f(x) = 36-x f(x)=1 TM1314 si x < 6 si 6 x < 20 si 20 x 35 sinon BCPST1 Ex5 Ecrire une fonction Hy : R → R définie par morceaux ainsi : Hy(t) = -1 si t < 0 Hy(t) = 0 si t = 0 Hy(t) = +1 si t > 0 Ex6 Ecrire une fonction ex6 permettant de déterminer si un entier est pair ou impair On pourra utiliser la fonction % (reste de la division entière) Ex7 Ecrire une fonction ex7 permettant de connaître le nombre n de chiffres constituants un entier p <10000 Le programme vérifiera que p est entier compris entre 0 et 9999 On pourra utiliser la division entière // et la fonction round Boucles while et suites avec Python TD4 Ce type de boucle est à utiliser lorsque le nombre d'exécutions d'une séquence d'instructions est inconnu à priori. Donnons des exemples : On lance un dé jusqu'à obtenir un 1. On ne sait pas à priori combien de fois le lancer. On lance un dé jusqu'à ce que la somme des résultats dépasse 100 Syntaxe de la boucle while Tant que (condition vérifiée), Instruction 1; ... Instruction m; fin; while condition: Instruction 1; ... Instruction m; Exemple 1 Dans la console >>> k=3 >>> while(k<40): # ne pas oublier : ... k=k+10 # ne pas oublier l’indentation ... print k Exemple 2 Dans une fonction def ex2(k): n=0 while(k<12): k=k+2 print k n=n+1 # n compteur de boucles print 'nb de boucles =',n Pour exécuter la fonction : >>>ex2(4.56) établir l'organigramme correspondant. (Exemple 2 non réalisable dans la console On ne peut rien exécuter après une boucle while dans la console) TM1314 Exemple 3 def ex3(): s=rand() print s Pour exécuter la fonction : >>>ex3() # pas ex3 BCPST1 n=1 while(s<0.9): s=rand() print s n=n+1 print 'nb d''essais =',n Ex4 On étudie la suite décroissante suivante : Faire l’étude à l’aide d’Excel pour n compris entre 0 et 20 On écrira : un=(2*n+5)/(n+1.) #sans le . derrière le 1 Python effectue une division entière Ex41 : Ecrire un programme permettant de calculer un (n ≥0) tant que un est supérieur à 2,4. Ex42 : On modifiera le programme de façon à tracer u(n) pour des termes > 2,4 Pour cela, on placera les différents un dans une liste nommée u. Rappels et compléments sur les listes u=[] #création d’une liste vide u=u+[4.56] #ajout d’un élément (ici 4.56) à la liste u plot(u) #tracé de u en fonction de n Ex5 Considérons les suites de Feigenbaum : un+1=k.un.(1-un) Faire l’étude sous Excel On choisira u0=0,2 avec k=2,8 puis k=1,5 et enfin k=3,2 Ecrire un programme permettant de calculer les 20 premiers termes de la suite Le programme permettra de tracer u(n) Dans la séance suivante nous verrons une autre façon de réaliser un nombre donné d’itérations TM1314 BCPST1 Ex6 Considérons la suite un=sin(n)/n pour n≥0 Calculer et tracer un jusqu’a ce que | | | | Ex7 Petit jeu def dice(): res=floor(6*rand()+1); return res def jeu(): print '1 euro la partie , tu mises sur un numero de 1 à 6' print 'si tu trouves tu gagnes 5 euros' e=input('si tu veux jouer tape 7 ');gain=0; while(e==7): gain=gain-1; c=input('numero choisi '); s=dice(); print '\n le tirage est ',s if (s==c): gain=gain+5; print '\ngain actuel =',gain; e=input('si tu veux continuer tape 7 sinon 8 '); if (gain >0): print '\n bye bye tu as gagne ',gain,' euros'; else: print 'bye bye tu as perdu',gain,' euros' TM1314 rappel : u0=1 BCPST1 Boucles for avec Python TD5 Introduction Lorsqu'une opération doit être exécutée plusieurs fois, on utilise une boucle (loop en anglais).Python possède deux types de boucles : boucles for et boucles while . On utilise une boucle for chaque fois que le nombre de fois que la séquence d'instructions doit être exécutée est connu à priori. Dans les autres cas, on utilise une boucle while Syntaxe de la boucle for >>> for i in range(11): ... print i**2; #écriture des carrés des entiers de 0 à 10 >>> for i in range(1,11,3): ... print 2**i #écriture de 21, 24 ,27 et 210. Boucle avec pas de 1 Boucle avec pas différent de 1 for i in range (n+1) : # i varie de 0 à (n) BLOC for i in range(init,end,pas): BLOC init ≤ i < end i= 2/5/8/11 for i in range(2,12,3): Exercices Pour chacune des fonctions demandées, on commencera par préciser les paramètres d'entrée et les paramètres de sortie (résultats). i n Ex1 1) Ecrire une fonction ex1 calculant S la somme des n premiers entiers Algorithme S0 pour i allant de 1 à n faire S S+i fin de faire TM1314 S i i 1 BCPST1 2) Compléter la fonction ex1 afin de calculer S2 la somme des n premiers carrés et S3 la somme des n premiers cubes Dans chaque cas, vérifier avec les formules établies en cours. Ex2 Ecrire une fonction ex2 calculant la somme des n premiers entiers impairs. Ex3 Ecrire une fonction ex3 calculant la somme des éléments d'un vecteur x donné. On déterminera le nombre d'éléments du vecteur en utilisant la fonction len. Tester avec x1=[1,3,5,2,1,5,4,6] et x2=rand(1000) rappel : x1[3]=2 Ex4 Ecrire une fonction ex4 calculant la somme des k premiers éléments de x. On fera un test sur k et on demandera à l’utilisateur de donner une nouvelle valeur de k si k>len(x) Séries de Fourier (SF) Tout signal périodique peut se décomposer en une somme infinie de signaux sinusoïdaux Exemple de décomposition : Signal carré : +A t T -A f(t ) 4.A sin 3t sin 5 t sin t ... 3 5 La fréquence f==1/T s’exprime en Hz. La pulsation s’exprime en rd.s-1. On a =2*.f Saisir le programme suivant qui permet la synthèse d’un signal rectangulaire de fréquence 50Hz et d’amplitude A=2 à partir de sa décomposition en SF def SF1(n): f=50;A=2.0 w=2*pi*f t=arange(0,40e-3,20e-6) L=len(t) y=zeros(L) TM1314 BCPST1 for i in range(1,n,2): y=y+4*A/(pi*i)*sin(i*w*t) print y plot(t,y) Tester le pour n=2 comment s’appelle le signal visualisé ? Tester le pour n=4, n=6 puis n=99. Conclusion. Que vaut l=len(t) ? Justifier Modifier le programme de façon à visualiser 3 périodes de y Modifier ce programme de façon à visualiser 3 périodes de y dans une fenêtre graphique et le fondamental et les harmoniques dans une autre fenêtre graphique rappel : figure() permet d’ouvrir une autre fenêtre graphique Deuxième exemple de décomposition : Signal triangulaire : +B t T -B f(t ) 8.B cos 3t cos 5 t cos t ... 2 2 2 3 5 n vous inspirant de SF1, écrire un programme SF2 permettant de faire la reconstruction d’un signal triangulaire à partir de sa décomposition en Séries de Fourier Ex5 Ecrire une fonction ex5 calculant la somme des éléments d'une matrice. On déterminera les dimensions de la matrice en utilisant la fonction shape. Tester avec A=array([[1,2],[3,4],[5,6]]) et B=rand(5,10). Ex6 Ecrire une fonction ex6 calculant la somme des éléments du triangle supérieur d'une matrice carrée. (faire un test préalable pour vérifier que la matrice est carrée) Ex7 Ecrire Dice une fonction générant aléatoirement un entier entre 1 et 6 puis ex7 une fonction effectuant le lancer successif de100 dés et calculant la moyenne des résultats. Ex8 TM1314 Saisir et tester les programmes suivants BCPST1 def aleapmp(p): test=rand() if test<p: s=1 else: s=-1 return s def comptage(): s=0 for i in range(100): d=aleapmp(.7) if d==1: s=s+1 print 'nb de 1 = :',s Retour sur un exercice du TD3 Ex8 Ecrire une fonction ex8 permettant de connaître le nombre n de chiffres constituants un entier p <10000 Le programme vérifiera que p est entier compris entre 0 et 9999 On pourra utiliser la division entière // et la fonction round def ex8(e): if e>10000 or e<0 or e!=round(e): print'entrer un entier entre 0 et 9999';s=0 else: if e//1000!=0: print'4cs';s=4 elif e//100!=0: print'3cs';s=3 elif e//10!=0: print'2cs';s=2 else: print'1cs';s=1 return s Ex9 Ecrire une fonction ex9 permettant de connaître les chiffres a,b,c,d qui constituent un entier p<10000 On pourra s’inspirer des lignes suivantes et utiliser la fonction ex8() p=5432; a=(p-(p%1000))/1000 appel à la fonction : >>> chiffres=ex8(564);print chiffres; 3cs [4 6 5] def ex8(p): TM1314 BCPST1 nb=ex7(p);print'nb =',nb a=arange(nb) for i in range (nb-1,-1,-1): print'i=',i a[i]=(p-(p%10**i))/10**i p=p%10**i return a TM1314 BCPST1 Exercices Python TD6 Saisir et enregistrez les programmes suivants sous TD6.py dans votre répertoire BOUCLE WHILE 1) Euclide : ex1 def ex1(a,b): r=mod(a,b); while r!=0: a=b; b=r; r=mod(a,b); return b Testez le -->ex1(36,24) --> ex1(24,36) -->ex1(261,203) Que calcule ce programme? 2) Les Nénuphars : ex2 Au premier mars, les nénuphars recouvrent 3% de l'étang. Ils croissent de 5% par semaine. Combien de temps sera-t-il nécessaire pour qu'ils recouvrent entièrement l'étang? 3) Placement financier : ex3 Bernard place 1000€ à 8% l'an et Paul place 3000€ à 1%. Quand Bernard sera-t-il plus riche que Paul? Quels seront alors leurs capitaux ? L’appel de la fonction pourra se faire ainsi : >>> annee,Bernard,Paul=ex3() BOUCLE FOR Considérons la suite uk telle que u0 = 1 et uk+1 = 1 / (3+uk) 4) ex4 : L'utilisateur donne n. Le programme affiche un 5) ex5 : L'utilisateur donne n. Le programme affiche les valeurs u0, u1, u2 …un. 6) ex6 : L'utilisateur donne n. Le programme représente un en fonction de n. avec n>=0 k n 7) ex7 : L'utilisateur donne n. Le programme affiche s= uk k 0 8) ex8 : Soit u un vecteur dont les coordonnées sont des entiers positifs on pourra générer u ainsi : >>> u=[3,4,6,3,7,8,2,2,9,3] fonctionnement ex8 avec u=ceil(15*rand(1,10)) qui est un array mais pas avec u=[3,4,6,3,7,8,2,2,9,3] ex8bis fonctionne avec u=[3,4,6,3,7,8,2,2,9,3] On désire écrire une fonction permettant de déterminer le nombre d’éléments distincts du TM1314 BCPST1 vecteur. Algorithme avec une liste: on balaie le vecteur du premier à l’avant dernier élément (de u(0) à u(8)) i varie de 0 à 8 On remplace par 0 tous les éléments de la queue du vecteur [u(i+1)…u(9)] égaux à u(i) On obtient alors un vecteur dont tous les éléments non nuls sont distincts. Il reste ensuite à compter les éléments non nuls. Tester et analyser d’abord le programme suivant avec une liste: def balayage(u): lo=len(u);n=lo; for i in range(0,lo-1): print 'u(',i,')=',u[i],' a comparer avec:' for j in range(i+1,lo): print u[j] 9) ex9 : Soit u un vecteur dont les coordonnées sont des entiers Ecrire une fonction permettant de déterminer la position du premier terme égal à 0 (si il existe) 10) Les Lapins Au XIIème siècle, Fibonacci a créé le 1er modèle biologique. Il a modélisé la croissance d'un élevage à partir des 16 lapins (8 couples) initiaux. Si un représente le nombre de couples de lapins à la fin du nième mois alors : un+1= un+un-1 avec u0 =8 et u1 = 13. Combien de temps faudra-t-il pour que le nombre de lapins dépasse le million? Visualiser l'évolution sur un graphe. TM1314 BCPST1 Tris TD 7 Programme officiel : Recherche du maximum dans une liste de nombres, Algorithmes de tri d’un tableau à une dimension de valeurs numériques : tri à bulles, tri par insertion. Calcul de la médiane d’une liste de nombres. Calcul de la moyenne Introduction Ex1 Ecrire une fonction mymax renvoyant le plus grand de deux nombres a et b. Ex2 Ecrire une fonction maxv de paramètre entrée un vecteur x renvoyant le plus grand élément de x Tester avec a=[2,55,4,66,8,9] Ex3 Ecrire une fonction permut de paramètres entrée un vecteur x ainsi que deux entiers i et j permutant les éléments x(i) et x(j). Le vecteur initial sera ainsi modifié. Tester avec a=[2,55,4,66,8,9] Appel de la fonction >>> permut(a,2,3) ; print a Tri par sélection Soit un vecteur x constitué de n éléments à trier dans l'ordre décroissant : Algorithme : On cherche l'indice du plus grand élément, soit ipg. On permute cet élément avec le premier (x(ipg) et x(0)). On cherche l'indice du plus grand élément parmi x(1), x(2)…x(n-1) soit ipg. On permute cet élément avec le second (x (ipg) et x(1)). etc.… Ex4 Ecrire une fonction indmax de paramètres entrée un vecteur x et un entier k renvoyant ipg l'indice du plus grand élément parmi ceux dont l'indice est supérieur ou égal à k. Tester avec b=[2,5,10,1,8,4] pour différentes valeurs de k Ex5 Tester la fonction triselection à l’aide du vecteur c=[0,1,2,3,-8,-7] à trier dans l'ordre décroissant. Vérifier qu’elle correspond à l’algorithme précédent. def triselection(x): n=len(x) for i in range(n-1): ipg=indmax(x,i) permut(x,i,ipg) Compléter le programme en affichant les vecteurs en cours de tri et le vecteur final On donnera une représentation graphique du vecteur trié à l’aide de plot(x) Performances du tri Il est possible d'obtenir le temps d'exécution du tri. >>>import time as t >>>v=rand(500) ;plot(v);figure() >>> start=t.time();triselection(v);end=t.time();duree=end-start Il est possible d’insérer ces instructions à l’intérieur d’une fonction. def eval1(v): import time as t start=t.time();triselection(v);end=t.time(); duree=end-start;print(duree) TM1314 BCPST1 Evaluer les performances du tri dans les 2 cas suivants w vecteur à valeurs croissantes w=range(500) z vecteur déjà trié z=range(499,-1,-1) Conclusion ? Médiane But : écrire un programme déterminant la médiane d’une série statistique simplement donnée sous forme d’une liste de valeurs (pas forcément ordonnée) notée L Voici une proposition d’algorithme : n = effectif total de L ordonner L p = partie entière de n/2 si n/2=p alors mediane = demi somme de la p-ième et de la (p+1)-ième valeur de L sinon mediane =(p+1)-ième valeur de L exemples : mediane([1,2,5,7,99])=5 mediane([1,2,5,7,99,100])=6 n=5 n=6 p=2 p=3 moyenne=57 moyenne=107 n=5 n=6 p=2 p=3 { moyenne=57} { moyenne=107} Ecrire la fonction mediane correspondant à cet algorithme Pour ordonner L utiliser soit la fonction triselection int(x)=partie entière de x division réelle n/2.0 p-ième terme de L = L[p-1] exemples : mediane([1,2,5,7,99])=5 mediane([1,2,5,7,99,100])=6 Tri à bulles Soit un vecteur x avec n éléments x0, x1…xn-1 que l'on veut trier dans l'ordre décroissant : 1ère étape : On compare x0 et x1, on les permute s'ils sont mal rangés; on compare x1 et x2, on les permute s'ils sont mal rangés;……; on compare xk et xk+1 on les permute s'ils sont mal rangés. A l'issue de la première étape, le dernier élément est bien placé le plus petit élément se trouve en dernière position. 2ème étape : On compare x0 et x1, on les permute s'ils sont mal rangés; on compare x1 et x2, ………… Pour quelle valeur de l'indice la deuxième étape doit-elle s'arrêter ? Combien d'étapes sont-elles nécessaires ? Tester la fonction triabulle à l’aide du vecteur c=[0,1,2,3,-8,-7] à trier dans l'ordre décroissant. Vérifier qu’elle correspond à l’algorithme précédent. def triabulle(x): n=len(x) for i in range(n-1): print "i= ", i for k in range(n-i-1): TM1314 BCPST1 if x[k]<x[k+1]: permut(x,k,k+1) print x Si n est la taille du vecteur, donner le nombre maximal de permutations (en fonction de n) lors d’un tri à bulles. Tester le programme avec les vecteurs suivants w vecteur à valeurs croissantes w=range(6) z vecteur déjà trié z=range(5,-1,-1) >>> v=range(1000) >>> start=t.time();triabulle(v);end=t.time();duree=end-start >>> duree 0.5299999713897705 >>> v=range(1000) >>> start=t.time();triselection(v);end=t.time();duree=end-start >>> duree 0.1700000762939453 >>> v=range(1000,0,-1) >>> start=t.time();triabulle(v);end=t.time();duree=end-start >>> duree 0.1099998950958252 >>> v=range(1000,0,-1) >>> start=t.time();triselection(v);end=t.time();duree=end-start >>> duree 0.11999988555908203 On lance 30 fois deux dés, à chaque fois, on ne conserve que le grand des deux scores obtenus. 1) On veut savoir le nombre de fois où le résultat est 5. Ecrire un programme simulant cette expérience. Votre programme devra : – Choisir un nombre aléatoire entre 1 et 6 puis un deuxième. – Calculer le plus grand des deux. – Répétez cette opération 30 fois et stocker les résultats dans un tableau. – Comptez le nombre de fois où le nombre 5 est dans ce tableau. 2) Adapter le programme précédent pour calculer la fréquence de chaque entier i compris entre 1 et 6. Les fréquences seront stockées dans un tableau F de taille 6 (1 ligne et 6 colonnes). 3) Utiliser la fonction triselection afin de trier le tableau F. 1) function t=des1 TM1314 BCPST1 T=zeros(1,30) ; // pour avoir un vecteur ligne s=0 ; // initialisation indispensable for k=1:30 n=ceil(6*rand()); m=ceil(6*rand()); if n>m T(k)=n ; else T(k)=m ; end if T(k)==5 s=s+1; end end disp(' fois',s,' Le 5 apparaît '); endfunction 2) On transforme le programme précédent pour calculer les fréquences des entiers 1..6: function t=des2 T=zeros(1,30) ; F=zeros(1,6); for k=1:30 n=ceil(6*rand()); m=ceil(6*rand()); if n>m then T(k)=n ; else T(k)=m ; end for i=1:6 if T(k)==i F(i) = F(i)+1/30; end end end disp(T) endfunction Le tri rapide sera évoqué en seconde année. Recherche dans une liste Recherche d’un mot dans une chaîne de caractères. On se limite à l’algorithme « naïf », en estimant sa complexité. TM1314 BCPST1 Python et Isostasie TD8 Buts: - A partir de données extraites de GeoMapApp Tracer le profil de la montagne Lisser ce profil Tracer le profil de la racine Modèle d’Airy h hc Surface de compensation H Equilibre isostatique : H.rm+hc.rc = (H+hc+h).rc D’où H=(rc.h) / (rm-rc) TM1314 BCPST1 Simulations avec Python TD9 Ecrire une fonction nommée De6() renvoyant un entier aléatoire 1..6 Cette fonction fera appel à la fonction rand() renvoyant un nombre pseudo-aléatoire 0, 1[ et à la fonction floor. On simulera ainsi le lancer d'un dé cubique. Rappel à propos de la fonction hist() >>>x=rand(100) >>>hist(x,10) Lancer d'un dé à 6 faces Ecrire une fonction LDS(n) permettant d'effectuer un nombre n de lancers en stockant les résultats dans un vecteur x. Compléter la fonction LDS pour calculer la moyenne des résultats. Est-ce cohérent ? Compléter la fonction LDS pour représenter les résultats à l'aide d'un histogramme Mouvement Brownien en deux dimensions Une particule initialement située en (0,0) effectue aléatoirement un mouvement vers le haut, le bas, la droite ou la gauche de manière équiprobable.. On note d la distance à l'origine après n mouvements. Ecrire une fonction brown2D permettant de : Réaliser un nombre n de mouvements en stockant les déplacements de la particule dans des vecteurs x (abscisses) et y (ordonnées). On pourra écrire une fonction nommée De4() renvoyant un entier aléatoire 1..4 permettant de choisir un des 4 déplacements élémentaires possibles. Visualiser y en fonction de x. Déterminer d. Variante possible en 3D avec une fonction équivalente à celle de Scilab : plot3d(x,y,z) Jeu de dés en Toscane Au XVIème siècle un jeu consistant à lancer 3 dés et à totaliser les points obtenus se pratiquait en Toscane. Ecrire une fonction Toscane permettant d'effectuer un nombre n de lancers de 3 dés en stockant les sommes dans un vecteur. Compléter la fonction Toscane pour calculer la moyenne des résultats. Est-ce cohérent ? Compléter la fonction Toscane pour représenter les résultats à l'aide d'un histogramme (chaque élément de s pouvant prendre une des 16 valeurs entre 3 et 18). Tests >>>Toscane(100) >>>Toscane(1000) >>>Toscane(10000) Urne avec 3 boules numérotées tirage avec remise Une urne contient trois boules numérotées 1, 2 et 3. On en tire n successivement avec remise (n>2) Ecrire une fonction urn1 permettant d'effectuer un nombre n de tirages en stockant les résultats dans un vecteur x. On pourra écrire une fonction nommée De3() renvoyant un entier aléatoire 1..3 permettant de choisir une des 3 boules numérotées possibles ? Ecrire une fonction urn2 qui permet d'effectuer un nombre n de tirages . urn2 renvoie 1 si les 2 boules extrêmes sont de même nombre. Sinon urn2 renvoie 0. TM1314 BCPST1 Ecrire une fonction urn3 qui permet d'effectuer 5 tirages . urn3 renvoie 1 si chaque boule a été tirée au moins une fois. Sinon urn3 renvoie 0. Urne avec 8 boules numérotées tirage sans remise Une urne contient huit boules numérotées de 1 à 8. On en tire 4 sans remise. On fait la somme des numéros tirés. Ecrire une fonction urn4 permettant d'effectuer un tirage de 4 boules. urn4 renvoie la somme s des éléments tirés. Préambule On pourra créer la fonction avec pour paramètre d’entrée n et renvoyant un entier aléatoire 1..n >>>y=[8, 7 ,6, 5, 4 ,3, 2 ,1] >>>y.pop(2) # alors y = [8, 7, 5, 4, 3, 2, 1] Méthode de Monte-Carlo Estimation de la valeur de par la méthode de Monte-Carlo : Ecrire une fonction PiMC qui génère des points au hasard dans un carré de côté égal à 1 qui 1 contient un cercle de diamètre unité (rayon r ) centré en 0. 2 Les points pouvant "tomber" avec la même probabilité n’ importe où dans le carré, le rapport du nombre de points dans le cercle sur le nombre de points total tend vers le rapport des surfaces nb de po int s dans le cercle surface du cercle .r 2 1 puisque r nb total de po int s surface du carré 1 4 2 Pour un nombre donné N de points, le programme déterminera le nombre de points contenus dans le cercle : c'est à dire tels que : points générés. TM1314 x 2 y 2 r . On pourra également tracer le cercle et les BCPST1 50 points générés TM1314 BCPST1 Introduction aux graphiques avec Excel 2007 TD10 Ouvrir le fichier colle_Excel_eleves Sélectionner toute la feuille (Ctrl + A) choisir la police Times New Roman Centrer toutes les cellules sauf la cellule A2 (aligner le texte à gauche) Sélectionner la plage E7:G20 Réaliser les bordures de cette plage (Toutes les bordures) Sélectionner la plage F7:F20 Choisir comme couleur de remplissage celle correspondant à R=0 et V=B=255 TM1314 BCPST1 Td11 Intégration Numérique et Python Il est courant en Sciences expérimentales d’être confronté à une intégrale qu’il est impossible de calculer analytiquement. Soit parce que l'on ne connait pas la primitive de la fonction à intégrer. Soit parce que l'on traite des données expérimentales. b Dans ce cas, nous devrons calculer une valeur approchée de f ( x )dx a 1) La méthode des rectangles est la moins précise. On approche l'intégrale de f par l'aire des rectangles hachurés: Notons S = {x1 = a; x2;… ; xn; xn+1 = b} S est une subdivision régulière de l'intervalle [a; b] de pas h ba n k n I h. f ( x k ) avec x k a ( k 1 ).h k 1 Ecrire une fonction Ire(a,b,n) évaluant l'intégrale d'une fonction f sur l'intervalle [a; b]. On pourra, pour simplifier l'écriture du programme, définir la fonction f1 suivante a def f1(x): y=1./(1+x**2) return y Comparer les valeurs Ire(0,1,10) et Ire(0,1,100) avec la valeur théorique de cette intégrale. b b 1 f1 ( x)dx dx a tan(b) a tan(a) 2 a 1 x 2) Dans la méthode des trapèzes, on remplace, sur l'intervalle [xk;xk+1], la fonction f à intégrer par le segment de droite [f(xk);f(xk+1)] On obtient I k n h . f ( a ) f ( b ) 2. f ( x k 2 k 2 ) avec les même s notations . Ecrire une fonction Itrap(a,b,n) évaluant l'intégrale d'une fonction f2 sur l'intervalle [a; b]. 2 Compléter le tableau sachant que : I 2 th cos(x )dx 1 0 n I2calculées erreurs Conclusion? TM1314 10 100 1000 BCPST1 3) Travail sur des données expérimentales : à partir de la densité de la terre en fonction de R Comment peut-on en déduire sa masse. (cf. fichier Excel joint) -3 densité(g densité (g.cmcm-3) ) 14 12 10 8 densité(g cm-3) Noyau 6 Manteau 4 2 0 0 2000 4000 6000 8000 4) Dans la méthode de Simpson, on remplace, sur l'intervalle [xk; xk+1], la fonction par un morceau de parabole passant par f(xk+1/2) (xk+1/2 milieu de l'intervalle ) ou par un segment de droite si f(xk) f(xk+1/2) et f(xk+1) sont alignés. I k n k n h . f ( a ) f ( b ) 2. f ( x k ) 4. f ( x 1 k 6 k 2 k 1 2 ) avec les même s notations . Ecrire une fonction Isimp(a,b,n) évaluant l'intégrale d'une fonction f3 sur l'intervalle [a; b]. 4 I 3 x 2 dx 4 3 / 3 21.33 Compléter le tableau suivant 0 n I3calculées erreurs 10 100 100000 Conclusion ? TM1314 Faire la même étude pour f4(x) telle que si x>0 f4(x)=x2 sinon f4(x)=-x BCPST1 5) Calcul direct avec Python en utilisant la fonction quad de Scipy Pour revenir à l’exemple initial : integrate('1/(1+x^2)','x',0,1) >>> import scipy.integrate as si >>> I = si.quad(f1, 0,1) # exemple initial >>> I (0.7853981633974484, 8.719671245021581e-15) >>> I = si.quad(cos, 0, pi/2) >>> I (0.9999999999999999, 1.1102230246251564e-14) # la première valeur est l’estimation de l’intégrale # . La deuxième nous indique l’erreur maximale par rapport au vrai résultat. 2 Application : exp(sin(log( x )))dx 1 def f5(x): y=exp(sin(log(x))) return y >>> I = si.quad(f5,1,2) >>> I (1.4711450951602487, 1.633299157211275e-14) TM1314 BCPST1 TD 12 Chaines de caractères ( Création/ Accès à un caractère/ Concaténation) a) Ecrire un programme ex1(c,n) avec c une chaine de caractères et n un entier tel que à l’appel >>> ex1('verre',4) le programme fournit l’affichage suivant : 1 verre 2 verres 3 verres 4 verres b) Ecrire un programme ex2(ch) avec ch une chaine de caractères tel que à l’appel >>> ex2('oiseau') le programme fournit l’un des affichages suivant : o ii sss eeee aaaaa uuuuuu c) Ecrire un programme ex3(c,ch) avec c un caractère et ch une chaine de caractères qui retourne l’indice du premier c présent dans ch (à partir de la gauche) et -1 si c est absent de ch >>> ex3('e','mesange') 1 >>> ex3('i','mesange') -1 d) Ecrire un programme voy(c) avec c un caractère qui retourne -1 si c n’est une voyelle , 0 si c=a, 1 si c=e, 2 si c=i, 3 si c=o et enfin 4 si c=u. e) Ecrire un programme ex5(ch_in) avec ch_in une chaine de caractères qui retourne une chaine ch_out qui correspond à ch_in en inversant le sens de lecture et en modifiant les voyelles en faisant correspondre o à a / i à e /e à i / a à o , u restant inchangée (les consonnes restent également inchangées) >>> ex5('la voiture') iruteav ol >>> ex5('iruteav ol') la voiture TM1314 BCPST1 TD12 Du mal à démarrer ? a) Une chaine de caractère peut être crée ainsi >>> c='pied' ou de cette manière : >>> d="verre" il est possible de concaténer des chaines de caractères ainsi : >>> print(d+' à '+c) verre à pied remarque : >>> d+' à '+c retourne 'verre à pied' b) Il faut utiliser l’instruction rand() du module random de la bibliothèque numpy . La fonction floor de la bibliothèque numpy fournit l’entier inférieur le plus proche d’un réel donné. Cela permet de choisir un entier entre 0 et n-1 . Il suffit ensuite d’ajouter m fois la mième lettre du mot à une chaine initialement vide. Avec oiseau si m=4, on écrit eeee Remarque on pourrait utiliser des indices négatifs. En effet : >>> ch='pied' >>> ch[-1] retourne 'd' et >>> ch[-2] retourne 'e' c) On peut initialiser une variable i à -1. Cette variable prendra la valeur de k dès qu’il existe un entier k tel que c=ch[k] d) On peut créer une chaine ch1="aeiou" que l’on va balayer pour savoir si c en fait partie et une variable k initialement égale à -1 e)On peut utiliser la fonction voy(c) précédente. Pour balayer ch_in il suffit d’écrire for c in ch_in: Pour modifier les voyelles ,il est possible d’introduire une chaine ch2="oieau" et écrire pour un caractère c d’indice k dans ch_in (de longueur L) if voy(c)≠-1 alors ch_out[L-1-k]=ch2[voy(c)] sinon ch_out[L-1-k]=c ainsi si ch_in =’castor’ alors L=5 et pour a, d’indice k=1 on a voy(a)=0 et donc ch_out[L-1-k]=ch_out[3]=ch2[0]=’o’ => ---o- TM1314 BCPST1 TD12 Corrigé de l’exercice a) def ex1(c,n): for i in range(n): if i==0: print (i+1,c) else: print(i+1,c+'s') b) import numpy as np def ex2(ch): n=len(ch) s='' m=int(np.floor(n*np.random.rand())) # choix d’un entier entre 0 et n-1 for i in range(m+1): #i varie entre 0 et m s=s+ch[m] print(s) c) def ex3(c,ch): i=-1;k=0 while i==-1 and k<len(ch): if c==ch[k]: i=k k=k+1 return i d) def voy(c): #identification de voyelle ou non ch1="aeiou";k=-1 for j in range(5): if c==ch1[j]: k=j return k e) def ex5(ch_in): #inversion de lecture et codage des voyelles import string L=len(ch_in) TM1314 BCPST1 ch_out=[] for i in range(L): ch_out=ch_out+['o'] ch2="oieau" k=0; for c in ch_in: v=voy(c) if v!=-1: ch_out[L-1-k]=ch2[v] else: ch_out[L-1-k]=c k=k+1 print(''.join(ch_out)) TM1314 BCPST1 TD13 Méthode d’Euler pour la résolution approchée d’équations différentielles Rappel : la méthode d’Euler consiste à remplacer la dérivée d’une fonction y(t) en un instant ti par le rapport dy y (ti dt ) y (ti ) dy y (ti ) y (ti dt ) dt t i dt dt …ou dt t i On réalise une discrétisation du temps telle que tn n.dt dt = période d’échantillonnage On détermine ainsi y(t) de proche en proche en élaborant la suite des yn. dy y yn dy y yn 1 n 1 n dt t n dt dt …ou dt t n a) Exemple 1 dy 2. y 6 pour t [0,4] avec y(t 0) 0 et dt 0.01s dt Résoudre cette équation avec Python. Visualiser sur le même graphe yth(t) et yeuler(t) b) Cinétique chimique On note a, b et c les concentrations respectives de trois corps A, B et C. k1 k2 A B C da dt k1.a db (a, b, c) solution du système suivant : k1.a k2 .b dt dc dt k2 .b avec a(t 0 ) 1 et b(t 0 ) c(t 0) 0 A l’aide de la méthode d’Euler représenter les trois concentrations sur une même figure. On étudiera, pour t [0;20] avec dt 0.1 , les cas suivants k1=k2=0.7 k1=0.1<k2=2.1 k1=2.1>k2=0.1. Du mal à démarrer ? a) On commencera par établir la relation de récurrence liant yn+1 et yn . yn+1=yn.(1-2.dt)+6.dt On construira le vecteur abscisse t à l’aide de la fonction arange de la bibliothèque numpy On en déduira le vecteur ordonnée y On superposera yth= 3.(1-exp(-2.t)) sur le même graphe que y à l’aide de la ligne suivante TM1314 BCPST1 plt.plot(t,yth,t,y);plt.show() b) On commencera par établir les relations de récurrences liant yn+1 et yn . an+1=an.(1-k1.dt) bn+1=bn.(1-k2.dt)+an.k1.dt cn+1=cn+k2.dt.bn On construira le vecteur abscisse t à l’aide de la fonction arange de la bibliothèque numpy On en déduira les vecteurs ordonnées a,b,c On superposera a(t),b(t) et c(t) sur le même graphe. Corrigé de l’exercice import matplotlib.pyplot as plt import numpy as np a) def ex1(): #y'+2y=6 et yinitial=1 dt=0.01; t=np.arange(0,4,dt);n=len(t); y=[0]; for i in range(n-1): y=y+[y[i]*(1-2*dt)+6*dt] yth=3*(1-np.exp(-2.*t)); plt.plot(t,yth,t,y);plt.show() b)def cinetik(k1,k2): dt=0.1 t=np.arange(0,20,dt);n=len(t) a=[1];b=c=[0] for k in range(n-1): a=a+[a[k]*(1-k1*dt)] b=b+[b[k]*(1-k2*dt)+a[k]*k1*dt] c=c+[c[k]+k2*dt*b[k]] plt.plot(t,a,t,b,t,c);plt.show() TM1314 k1=k2=0.7