00a-TDBCPST1-TM-13-14

publicité
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
S0
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 3t 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 3t 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 
ba
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
Téléchargement