Académique Documents
Professionnel Documents
Culture Documents
ÉLÉMENTS D’ALGORITHMIQUE
3.1 Définitions
Un algorithme est une série d’instructions qui doit être exécutée par un programme in-
formatique. A partir des données d’entrée un algorithme doit donner un résultat. Le mot
"algorithme" vient du nom du mathématicien Al Khwarizmi, qui, au 9 ème siècle écrivit le
premier ouvrage systématique sur la solution des équations linéaires et quadratiques.
algorithme parallèle : les opérations s’exécutent sur plusieurs processeurs en parallèle.
algorithme distribué : les tâches s’exécutent sur un réseau de processeurs.
algorithme distribué : il contient un appel à lui-même.
Un algorithme glouton est un algorithme qui suit le principe de faire, étape par étape, un
choix optimum local, dans l’espoir d’obtenir un résultat optimum global.
Un programme informatique est la traduction d’un algorithme dans un langage de pro-
grammation
La preuve : prouver que l’algorithme résout la classe de problèmes pour laquelle il a été
écrit.
L’arrêt : prouver que quelles que soient les données fournies en entrée l’algorithme s’arrête
toujours.
Le choix des structures des données : la façon d’organiser les données manipulées
influence l’écriture et la performance de l’algorithme.
Son efficacité. Il est très important d’avoir une idée du comportement d’un algorithme
lorsque la taille des données qui lui sont transmises en entrée augmente.
L’algorithmique intervient dans des domaines divers et variés :
Numériques.
Tri, recherche de mots, plus généralement recherche d’information (gé- nomes, internet, . .
. ).
Algorithmes géométriques, images de synthèse.
Reconnaissance de formes.
Compression des données.
Cryptographie.
...
def f(a,b):
q=0
w=b
r=a
while w<= r:
w=2*w
while w!=b:
q=2*q
w=w/2
if w<=r:
r=r-w
q=q+1
return (q,r)
La méthode d’Euler consiste à déterminer approximativement les valeurs prises par u à différents
instants : t0 , t1 , . . . , tN −1 . Il s’agit de construire ui+1 à partir de ii quelque soit i ∈ [0, N − 1] tel
que :
ui+1 − ui
= f (ui , ti )
ti+1 − ti
Il en résulte que ui+1 est définit par :
T ableau(N)
u[0] ←− u0
pour i allant de 0 à N − 2
u[i + 1] ←− u[i] + (t[i + 1] − t[i]) × f (u[i], t[i])
f in pour
les éléments jusqu’à insérer le ième élément à sa bonne place et ainsi de suite.
Pour l’exécuter il faut appliquer la fonction tri-insertion à la liste puis afficher la liste.
n(n − 1)
1 + 2 +...+ n− 1 =
2
Il évolue rapidement. Il existent deux versions incompatibles entre elles : python 2.x
et python 3.y. Le développement actuel de Python se fait uniquement sur la branche
3.y, qui constitue une remise à plat non-rétrocompatible du langage, et la branche 2.x
ne sera à priori plus supportée au delà de 2020. C’est pour cette raison ce cours porte
sur la version 3.y.
qu’est qu’on peut faire avec python ?
calcul scientifique et l’imagerie,
Les scripts d’administration système ou d’analyse de fichiers textuels, traitements de
fichiers par lot,
Tous les développement liés à l’internet et en particulier au Web : scripts CGI, navi-
gateurs Web, moteurs de recherche, agents intelligents, objets distribués etc.
La réalisation d’interfaces graphiques utilisateurs.
Comment peut-on installer python ?
Python est déjà installé dans Linux. Pour utiliser des librairies orientées vers le calcul
scientifique, on choisit, entre autres, la distribution Anaconda.
On commence par télécharger le bit installer (64bit ou 32 bit) de Anaconda 4.1.x à
partir de la page web :
https://www.continuum.io/downloads#linux
on ouvre un terminal et on se place dans le répertoire de téléchargement ou se trouve
le fichier téléchargé par exemple
Anaconda3-4.1.1-Linux-x86_64.sh
puis et on tape la commande :
>>> bash Anaconda3-4.1.1-Linux-x86_64.sh
Toute tentative d’utiliser l’un de ces mots réservés comme identificateur se traduit par une
erreur de syntaxe comme le montre la figure suivante.
>>>lambda=3
File "<stdin>", line 1
lambda=3
SyntaxeError : invalid sntax
>>> def=5
File "<stdin>", line 1
def=5
SyntaxeError : invalid sntax
Les principales opérations possibles avec les nombre entiers, réels et complexes sont les suivantes :
a+b : addition
a-b : soustraction
a ∗ b : multiplication
a/b : division
a//b : division entière valable pour les réels et les entiers
a%b : reste de la division entière
a ∗ ∗b : élévation à la puissance ab
>>> 1+2j+(5-4j)
6-2j
>>> (1+3j)**3
-26-18j
>>> 12/7
1.7142857142857142
>>> 12//7
1
>>> 12%7
Les éléments d’une chaîne de caractère sont indexés de 0 à len()-1. On peut accéder à
chaque caractère par l’opérateur crochet :
>>> '''aujourd'hui'''[4]
'u'
On peut adresser les éléments d’une chaîne à partir de la fin, avec des indices négatifs, le
dernier élément porte le numéro -1
>>> "aujourd'hui"[-5]
'd'
Python est sensible à la casse ce qui signifie que les caractères majuscules et minuscules
sont distingués.
On affecte une variable par une valeur en utilisant le signe = (qui n’a rien à voir avec
l’égalité en math !). Dans une affectation, le membre de gauche reçoit le membre de droite
ce qui nécessite d’évaluer la valeur correspondant au membre de droite avant de l’affecter
au membre de gauche.
Les affectations relient les identificateurs aux données : si une donnée en mémoire n’est plus
reliée, le ramasse-miettes (garbage collector) de Python la supprime automatiquement (car
son nombre de références tombe à zéro)
Différentes manières d’affecter une variable :
>>> a="aujourd'hui";b="255"
>>> a
"aujourd'hui"
>>> b
'255'
>>> a,b="aujourd'hui","255"
>>> a+b
"aujourd'hui255"
>>> a-b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'
>>> b
3
<class 'list'>
>>> L1[2]
'écrire'
Les principales opérations que l’on peut effectuer sur les listes sont données ci-dessous :
Ajout d’éléments :
>>> L3
[3, 6, 11, 18, 27, 38, 51, 66, 83, 102]
>>> L3.append("écrire")
>>> L3
[3, 6, 11, 18, 27, 38, 51, 66, 83, 102, 'écrire']
[3, 6, 11, 18, 27, "aujourd'hui", 38, 51, 66, 83, 102, 'écrire']
Inversion
>>> L3
[3, 6, 11, 18, 27, 38, 51, 66, 83, 102]
>>> L3.reverse()
>>> L3
[102, 83, 66, 51, 38, 27, 18, 11, 6, 3]
>>> L3.append("écrire")
>>> L3
[102, 83, 66, 51, 38, 27, 18, 11, 6, 3, 'écrire']
>>> L3.reverse()
>>> L3
['écrire', 3, 6, 11, 18, 27, 38, 51, 66, 83, 102]
Extension :
>>> L3
['écrire', 3, 6, 11, 18, 27, 38, 51, 66, 83, 102]
>>> L3.extend([10,12,[1,2,3]])
>>> L3
['écrire', 3, 6, 11, 18, 27, 38, 51, 66, 83, 102, 10, 12, [1, 2, 3]]
4.3.3 Ensemble
C’est une collection non ordonnée (ce n’est donc pas une séquence comme les listes, les
tuples,. . . , on ne peut donc pas accéder à "l’élément d’indice i" comme pour les séquences) d’objets
deux à deux distincts (pas de doublons) "hashable". Un même objet ne peut apparaître qu’une
seule fois. Pour créer un ensemble, on utilise soit :
la commande set :
>>> Ens=set("écrire")
>>> Ens
{'r', 'i', 'c', 'é', 'e'}
soit on écrit une suite d’objets (éventuellement hétérogènes) séparés par des virgules et
entre accolades :
>>> Ens2={15, "écrire", 1+2j, 155, 12}
>>> type(Ens2)
<class 'set'>
>>> A={1,1,2,3}
>>> A
{1, 2, 3}
Les opérations que l’on peut effectuer sur les ensembles se résument comme suit :
On peut itérer l’ensemble via l’instruction for :
>>> Ens2
{'écrire', 155, 12, 15, (1+2j)}
>>> for x in Ens2:
... print(x)
...
écrire
155
12
15
(1+2j)
réunion :
>>> A={1,2,3,4,5,6,7,8,9,"aa", "éé"}
>>> B={5,6,7,10,"hh", "écrire"}
>>> A|B
{'hh', 'aa', 2, 3, 4, 5, 6, 7, 8, 9, 1, 10, 'écrire', 'éé'}
Intersection :
>>> A={1,2,3,4,5,6,7,8,9,"aa", "éé"}
>>> B={5,6,7,"hh", "écrire"}
>>> A&B
{5, 6, 7}
Différence :
>>> A={1,2,3,4,5,6,7,8,9,"aa", "éé"}
>>> B={5,6,7,"hh", "écrire"}
>>> A-B
{'aa', 2, 3, 4, 1, 8, 9, 'éé'}
>>> B-A
{'hh', 'écrire', 10}
Différence symétrique (A − B) ∪ (B − A) :
>>> A={1,2,3,4,5,6,7,8,9,"aa", "éé"}
>>> B={5,6,7,"hh", "écrire"}
>>> C=(A-B)|(B-A)
>>> C
{'hh', 'aa', 2, 3, 4, 1, 8, 9, 10, 'écrire', 'éé'}
Copie :
>>> A
{'aa', 2, 3, 4, 5, 6, 7, 8, 9, 1, 19}
>>> C=A.copy()
>>> C
{'aa', 2, 3, 4, 5, 6, 7, 8, 9, 1, 19}
>>> A.remove(19)
>>> A
{'aa', 2, 3, 4, 5, 6, 7, 8, 9, 1}
>>> C
{'aa', 2, 3, 4, 5, 6, 7, 8, 9, 1, 19}
4.3.4 Dictionnaire
C’est une collection de couples (clé : valeur), non ordonnée entourée d’accolades. Les dic-
tionnaires sont modifiables mais non-ordonnés(non indicés). Une clé pourra être alphabétique,
numérique . . . en fait tout type hachable (donc liste et dictionnaire exclus). Les valeurs pourront
être de tout type sans exclusion.On accède à une valeur par sa clé. Différentes manières de créer
un dictionnaire :
En utilisant une formule mathématique :
>>> D1={x:x*2 for x in range(10)}
>>> D1
Ci-dessous quelques opérations que l’on peut effectuer sur les dictionnaires :
Effacer une paire clé : valeur
>>> D2
{'Fatima': 14, 'Ilyass': 13, 'Hassan': 16, 'Younes': 17, 'Chouaib': 11, '
abc': 22}
>>> del D2['abc']
>>> D2
{'Fatima': 14, 'Ilyass': 13, 'Hassan': 16, 'Younes': 17, 'Chouaib': 11}
{'Fatima': 14, 'Ilyass': 13, 'Hassan': 16, 'Younes': 17, 'Chouaib': 11}
>>> D3=D2.copy()
>>> D3
{'Younes': 17, 'Fatima': 14, 'Ilyass': 13, 'Hassan': 16, 'Chouaib': 11}
>>> type(L2)
<class 'list'>
>>> type(C2)
<class 'str'>
C’est l’indentation (le décalage par rapport à la marge gauche) qui délimite le bloc d’ins-
tructions.
elif n’est déclenchée que si la condition qui la précède n’est pas vérifiée. Elle est située au
même niveau que if et else.
else est facultative et concerne tous les autres cas.
On peut envisager de faire intervenir plusieurs clauses elif :
if condition1:
instructions
elif condition2:
instructions
elif condition3:
instructions
else:
instructions
Nous prenons comme exemple les appréciations que l’on formule dans un conseil de classe
Nous donnons comme exemple la somme des entiers paires inférieurs à une certaine valeur n.
n=float(input("entrer le nombre n"))
compteur=1
somme=0
while compteur<=n:
if compteur%2==0:
somme=somme+compteur
compteur=compteur+1
print(somme)
Dans des situations particulières On reprend l’exemple du calcul de la somme des nombres pairs
à l’aide de la boucle for :
>>> cube(1+2j)
(-11-2j)
>>> f(1+2j)
(-11-2j)
g=lambda x,y:x**2+y**2
Pour rendre la fonction utilisable pour n’importe quel utilisateur, il faut ajouter un commentaire
précisant la nature de cette fonction. Python propose une fonction help qui retourne pour chaque
fonction un commentaire ou mode d’emploi qui indique comment se servir de cette fonction.
>>> def volume_sphere(R):
... """fonction qui calcule le volume d'une sphère de rayon R"""
... 4/3*3.14*R**3
...
>>> help(volume_sphere)
volume_sphere(R)
fonction qui calcule le volume d'une sphère de rayon R
4.6 Modules
Un module est un fichier.py sous forme de regroupement de procédures et de fonctions, dont le
but est de les mettre à disposition de plusieurs programmes appelant ces procédures et fonctions.
Exemple le module math. Quand on cherche le help en ligne de commande on obtient ce qui
suit :
Help on module math:
NAME
math
MODULE REFERENCE
http://docs.python.org/3.5/library/math
DESCRIPTION
This module is always available. It provides access to the
mathematical functions defined by the C standard.
FUNCTIONS
acos(...)
acos(x)
asin(...)
asin(x)
asinh(...)
asinh(x)
atan(...)
atan(x)
atan2(...)
atan2(y, x)
Return the arc tangent (measured in radians) of y/x.
Unlike atan(y/x), the signs of both x and y are considered.
atanh(...)
atanh(x)
ceil(...)
ceil(x)
copysign(...)
copysign(x, y)
Return a float with the magnitude (absolute value) of x but the sign
of y. On platforms that support signed zeros, copysign(1.0, -0.0)
returns -1.0.
cos(...)
.....
4.7.1 Écriture
L’écriture s’effectue selon les étapes suivantes :
création ou ouverture du fichier
écriture
fermeture.
>>> f=open('fichier1','w')
>>> f.write("blabla blabla de la première ligne \n")
36
>>> f.write("blabla de la deuxième ligne \n")
29
>>> f.write("blabla de la troisièe ligne")
27
>>> f.close()
4.7.3 Lecture
#fermeture du fichier
f.close()
PYTHON SCIENTIFIQUE
Le calcul scientifique fait intervenir les modules numpy, scipy et matplotlib. Nous exposons
ci-dessous leurs syntaxe et leurs utilisation dans la résolution de problèmes en sciences physiques.
5.1 numpy
numpy est une librairie d’algorirhme et de fonctions. Il permet de créer des tableaux multi-
dimensionnels similaires aux listes tels que les éléments du tableau sont de même type(soit des
entiers, soit des flottants,. . . ). On parle aussi de vecteurs et de matrices. numpy est un outil
performant pour la manipulation de tableaux à N dimension. Il dispose de fonctions basiques en
algèbre linéaire et de fonctions basiques pour les transformées de Fourier.
>>> A.size
4
>>> A=np.array([1,0,12,3],dtype=float)
>>> A
array([ 1., 0., 12., 3.])
>>> A=[1,2,5,11,12,25,88,32]
>>> #valeur indicée
... A[3]
11
>>> #début jusqu'à l troisième
... A[:3]
[1, 2, 5]
>>> #du deuxième indice jusqu'à la fin
... A[2:]
>>> A=np.array([1,3,5,7,9,11,13,15])
>>> B=np.array([2,4,6,8,10,12,14,16])
>>> #moyenne
... np.mean(A)
8.0
>>> #mediane
... np.median(A)
8.0
>>> #variance
... np.var(A)
21.0
>>> #pourcent
... np.percentile(A,50)
8.0
>>> #somme
... np.sum(A)
64
>>> #somme cumulée
... np.cumsum(A)
array([ 1, 4, 9, 16, 25, 36, 49, 64])
>>> #somme de deux vecteurs
... A+B
array([ 3, 7, 11, 15, 19, 23, 27, 31])
>>> #multiplication de deux vecteurs
... A*B
array([ 2, 12, 30, 56, 90, 132, 182, 240])
>>> #produit scalaire de deux vecteurs
... np.vdot(A,B)
744
>>> #norme d'un vecteur
... np.linalg.norm(A)
26.076809620810597
>>> #intersection
... np.intersect1d(A,B)
array([], dtype=int64)
>>> #union
... np.union1d(A,B)
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
12 20 5 2
55 0.01 12 20
>>> B
array([ 2, 4, 6, 8, 10, 12, 14, 16])
>>> B.shape
(8,)
>>> C=B.reshape(4,2)
>>> C
array([[ 2, 4],
[ 6, 8],
[10, 12],
[14, 16]])
>>> C.shape
(4, 2)
#matrice à 4 lignes et 2 colonnes
créer une matrice à une colonne et une matrice à une ligne à partir d’un vecteur :
>>> A=np.array([1,2,5,11])
>>> A
array([ 1, 2, 5, 11])
>>> np.shape(A)
(4,)
>>> B=A[:,np.newaxis]
>>> B
array([[ 1],
[ 2],
[ 5],
[11]])
>>> np.shape(B)
(4, 1)
>>> C=A[np.newaxis,:]
>>> C
array([[ 1, 2, 5, 11]])
>>> np.shape(C)
(1, 4)
>>> a=np.array([[1,2],[3,4],[5,6]])
>>> b=n.array([[7,8]])
>>> a
array([[1, 2],
[3, 4],
[5, 6]])
>>> b
array([[7, 8]])
>>> c=np.append(a,b,axis=0)
>>> c
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
>>> d=np.array([[7],[8],[9]])
>>> np.append(a,d,axis=1)
array([[1, 2, 7],
[3, 4, 8],
[5, 6, 9]])
insertion d’un vecteur dans une matrice en tant que nouvelle ligne
>>> a
array([[1, 2],
[3, 4],
[5, 6]])
>>> b
array([[7, 8]])
>>> np.insert(a,1,b,axis=0)
array([[1, 2],
[7, 8],
[3, 4],
[5, 6]])
>>> a
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.shape(a)
(3, 2)
>>> b=np.resize(a,new_shape=(2,3))
>>> b
array([[1, 2, 3],
[4, 5, 6]])
matrices spéciales :
>>> A=np.ones((3,5))
>>> A
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
>>> A=np.ones((3,5),np.int)
>>> A
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
>>> B=np.zeros((2,3))
>>> B
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> C=np.eye(3)
>>> C
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> D=np.diag([1,2,3])
>>> D
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
... A[:,:]
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
>>> #de la première ligne à la dernière
... A[1:,:]
array([[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
>>> #dernière ligne et toutes les colonnes
... A[-1,:]
array([ 9, 10])
>>> A
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
>>> B
array([[5, 3],
[9, 7]])
>>> #transposition
... np.transpose(A)
array([[ 1, 3, 5, 7, 9],
[ 2, 4, 6, 8, 10]])
>>> np.transpose(B)
array([[5, 9],
[3, 7]])
>>> #multiplication
... np.dot(A,B)
array([[ 23, 17],
[ 51, 37],
[ 79, 57],
[107, 77],
[135, 97]])
>>>#déterminant
... np.linalg.det(B)
8.0000000000000018
>>> #inversion
... np.linalg.inv(B)
array([[ 0.875, -0.375],
[-1.125, 0.625]])
5.2 matplotlib
Ce module permet la réalisation des graphes 2 et 3 dimensions avec un support interactif et
sorties de haute qualité. On peut sauvegarder les figures sous différents formats : pdf, ps, png. . .
Pour obtenir des graphes on dispose de deux manières :
Soit on utilise le mode interactif en utilisant pylab. Dans ce cas on n’a pas à importer
matplotlib, pylab se charge de tout
Soit on importe matplotlib.pyplot. Cette manière est préférable pour exécuter les scripts
python
Nous donnons ci-dessous quelques exemples de graphes.
Courbe du sinus cardinal :
import numpy as np
import matplotlib.pyplot as pl
x=np.linspace(-5*np.pi,5*np.pi,200)#tableau contenant 200 points répartis de
manière uniforme entre -5pi et 5pi
y=np.sin(x)/x
pl.plot(x,y,color='blue',linewidth=1.5,linestyle="-",label='fonction sinus
cardinal')
pl.xlim(x.min()*1.1,x.max()*1.1)#domaine de x
pl.xticks(np.linspace(-13,13,5,endpoint=True))#gamme de x et nombre de
graduations
pl.xticks([-5*np.pi, -3*np.pi, 0, 3*np.pi, 5*np.pi],[r'$-5\pi$', r'$-3\pi$',
r'$0$', r'$3\pi$', r'$5\pi$'])
pl.ylim(y.min()*1.1,y.max()*1.1)#domaine de y
pl.yticks([-0.5,0,0.5,1])#nombre de graduations
ax = pl.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
#ax.set_xticklabels([])
#ax.set_yticklabels([])
pl.legend(loc='upper left')
pl.show()
0.5
0.0
−5π −3π 0 3π 5π
−0.5
1.01
0.85
0.90
0.70
0.75
0.54
0.38 0.60
0.23 0.45
0.07
0.30
-0.09
0.15
-0.24
-0.40 0.00
20 −0.15
15
10
5
−20 0
−15
−10 −5
−5
0 −10
5
10 −15
15
20 −20
subplot(212)
semilogx(W,phase1,color='red')
semilogx(W,phase2,color='blue')
semilogx(W,phase3,color='magenta')
grid(True)
show()
50
−50
−100
−150
−200 -2 -1 0 1 2
10 10 10 10 10
0
−20
−40
−60
−80
−100
−120
−140
−160
−180
10 -2
10
-1
10
0
10
1
10
2
line, = plot([],[])
xlim(xmin, xmax)
ylim(-1,1)
# fonction à définir quand blit=True
# crée l'arrière de l'animation qui sera présent sur chaque image
def init():
line.set_data([],[])
return line,
def animate(i):
t = i * dt
y = cos(k*x - w*t)
line.set_data(x, y)
return line,
ani = animation.FuncAnimation(fig, animate, init_func=init, frames=100, blit=
True, interval=20, repeat=True)
show()
5.3 scipy
Scipy est une librairie d’algorithmes et de fonctions mathématiques basées sur les tableaux
ndarray, complétant ou améliorant les fonctionnalités de numpy. Il contient les modules suivants :
Fonctions spéciales : scipy.special((fonctions de Bessel, erf, gamma, etc.))
intégration numérique : scipy.integrate (intégration numérique ou d’équations différen-
tielles)
Méthodes d’optimisation : scipy.optimize (minimisation, moindres-carrés, zéros d’une
fonction, etc.)
Interpolation : scipy.interpolate (interpolation, splines)
Transformées de Fourier : scipy.fftpack
Traitement du signal : scipy.signal (convolution, corrélation, filtrage, ondelettes, etc.)
Algèbre linéaire : scipy.linalg
Statistiques : scipy.stats (fonctions et distributions statistiques)
Traitement d’images multi-dimensionnelles : scipy.ndimage
Entrées/sorties : scipy.io
f (x0 )
y = f (x0 ) + (x1 − x0 )f ′ (x0 ) = 0 ⇒ x1 = x0 −
f ′ (x0 )
f (x1 )
x2 = x1 −
f ′ (x1 )
on itère :
f (xn )
xn+1 = xn −
f ′ (xn )
l’arrêt des itérations est atteint lorsque :
♦ l’écart entre deux termes successifs est suffisamment petit,
♦ ou bien lorsqu’on estime que le nombre d’itérations est suffisant.
Le code python traduisant les lignes de l’algorithme est comme suit :
def newton(f,x_0,epsilon,N):
k = 0
x = x_0
fx = f(x)
h = epsilon
dfx = (f(x+h)-fx)/h
while ( (abs(fx)>epsilon) and (k<N) ):
x = x - fx/dfx
fx = f(x)
dfx = (f(x+h)-fx)/h
k+= 1
if k==N:
print("Pas de convergence")
else:
return x
méthode de newton
import scipy.optimize
scipy.optimize.newton(f,x_0)
f(x)
a b x
La méthode des rectangles nécessite de faire n évaluations de la fonction, ainsi que n sommes
(qui peuvent être considérées comme négligeables). C’est donc un algorithme linéaire par rapport
au nombre d’intervalles utilisés pour le découpage. Sa convergence est hélas très lente, ce qui en
fait un algorithme peu utilisé en pratique. En négligeant le facteur constant M(b − a)2 /2 où M
est un majorant de f’ il faudra un ordre de grandeur de 1010 intervalles pour obtenir une valeur
approchée correcte à dix décimales près.
z=z+f(a+i*h)
return h*z
f(x)
a b x
i=0 6
def Simpson(f,a,b,n) :
h=(b-a)/float(n)
z=(f(a)+f(b))/6
for i in range(1,n) :
z=z+f(a+i*h)/3
for i in range(n) :
z=z+f(a+(2*i+1)*h/2)*2/3
return h*z
intégrale simple :
quad(f,a,b)#calcule une valeur approchée de l'intégrale de f entre a et b
sans spécifier la méthode
romberg(f,a,b)#calcule une valeur approchée de l'intégrale à l'aide de la mé
thode de Romberg
3x + y = 9
(
x + 2y = 8
import numpy as np
a = np.array([[3,1], [1,2]])
b = np.array([9,8])
np.linalg.solve(a, b)
x + 2y = 3
on définit la fonction à valeurs vectorielle f puis on utilise root en spécifiant un point de départ :
>>> import scipy.optimize as opt
>>> def f(v):
... return v[0]**2-v[1]**2-1,v[0]+2*v[1]-3
...
>>> sol=opt.root(f,[0,0])
>>> print(sol)
fjac: array([[ 0.93076594, 0.3656156 ],
[-0.3656156 , 0.93076594]])
ẍ = f (x, ẋ, t)
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=np.sin(2*np.pi*f*t[k])+1
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-0.5,2.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,1.5])
plt.show()
2.5
2.0
1.5
1.0
0.5
0.0
−0.5
0.000 0.001 0.002 0.003 0.004 0.005
1.2
1.0
0.8
0.6
0.4
0.2
0.0
0 1000 2000 3000 4000 5000 6000
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=signal.square(2*np.pi*f*t[k],0.5)
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-1.5,1.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,0.8])
plt.show()
1.5
1.0
0.5
0.0
−0.5
−1.0
−1.5
0.000 0.001 0.002 0.003 0.004 0.005
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
0 10000 20000 30000 40000 50000
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from scipy.fftpack import *
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=signal.square(2*np.pi*f*t[k],0.2)
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-1.5,1.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,0.8])
plt.show()
1.5
1.0
0.5
0.0
−0.5
−1.0
−1.5
0.000 0.001 0.002 0.003 0.004 0.005
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
0 10000 20000 30000 40000 50000
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from scipy.fftpack import *
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=signal.sawtooth(2*np.pi*f*t[k],0.5)
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-1.5,1.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,0.8])
plt.show()
1.5
1.0
0.5
0.0
−0.5
−1.0
−1.5
0.000 0.001 0.002 0.003 0.004 0.005
0.5
0.4
0.3
0.2
0.1
0.0
0 2000 4000 6000 8000 10000 12000 14000
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from scipy.fftpack import *
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=signal.sawtooth(2*np.pi*f*t[k],0.2)
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-1.5,1.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,0.8])
plt.show()
1.5
1.0
0.5
0.0
−0.5
−1.0
−1.5
0.000 0.001 0.002 0.003 0.004 0.005
0.5
0.4
0.3
0.2
0.1
0.0
0 2000 4000 6000 8000 10000 12000 14000 16000
import numpy as np
from scipy import signal
from numpy import random
import matplotlib.pyplot as plt
from scipy.fftpack import *
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=np.sin(2*np.pi*f*t[k])+0.5*random.random()*np.sin(2*np.pi*5000*t[k])
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-1.5,1.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,0.8])
plt.show()
1.5
1.0
0.5
0.0
−0.5
−1.0
−1.5
0.000 0.001 0.002 0.003 0.004 0.005
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
0 10000 20000 30000 40000 50000
import numpy as np
from scipy import signal
from numpy import random
import matplotlib.pyplot as plt
from scipy.fftpack import *
f=1000
T=1/f
dac=0
fac=5*T
Fe=100*f
Te=1/Fe
Tac=(fac-dac)
N=int(Tac*Fe)
t=np.arange(0,N)*Te
X=np.zeros(N)
for k in range(N):
X[k]=np.sin(2*np.pi*f*t[k])+np.sin(2*np.pi*random.random()*1000*t[k])
tfd1=abs(fft(X))
freq=np.arange(0,N)*1.0/Tac
freqmax=N/2*1.0/Tac
plt.subplot(211)
plt.plot(t,X,color='b')
plt.axis([0,fac,-1.5,1.5])
plt.subplot(212)
plt.plot(freq,tfd1/N,color='r')
plt.axis([0,freqmax,0,0.8])
plt.show()
−1
−2
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
0 10000 20000 30000 40000 50000
10
ue
u
5
u (V)
−5
−10
0.000 0.001 0.002 0.003 0.004 0.005
t (s)
f=1000
def ue(t):
if (t<=0):
return 0
elif (t<=1e-2):
return 1000*t
else:
return 10
def F(u,t):
return (ue(t)-u)/(R*C)
t=np.linspace(0,0.02,100)
plt.plot(t,[ue(ti) for ti in t],'b-')
plt.plot(t,odeint(F,0,t),'r-')
plt.legend(["ue","u"],loc="lower right")
plt.xlabel("t (s)")
plt.ylabel("u (V)")
plt.axis([-0.002,0.022,-0.2,10.5])
plt.show()
10
6
u (V)
2
ue
u
0
0.000 0.005 0.010 0.015 0.020
t (s)
m=3.6e-3
g=9.81
k1=1.8e-3
k2=9.2e-5
tau=m/k1
def F(v,t):
return g-k1/m*v
def G(v,t):
return g-k2/m*v**2
t=np.linspace(0,15,100)
v1=odeint(F,0,t)
v2=odeint(G,0,t)
vlim=v1[-1]
plt.plot(t,v1,'b-')
plt.plot(t,v2,'r-')
plt.axhline(y=vlim*0.95,color='k')
plt.xlabel("t (s)")
plt.ylabel("v (m/s)")
plt.legend([u"Linéaire","Quadratique"],loc="lower right")
plt.show()
20
15
v (m/s)
10
Linéaire
Quadratique
0
0 2 4 6 8 10 12 14 16
t (s)
C’est une réaction d’ordre 2. La concentration des ions Fe2+ , notée C est modélisée par la loi :
1
C=
at + b
Les mesures expérimentales sont regroupées dans le tableau suivant :
t(s) 20 40 60 80 100 120
C(10−4 mol.L−1 ) 2.78 1.92 1.47 1.19 1 0.86
0.0006
Modèle (rho=0.999996)
Mesures
0.0005
0.0004
C (mol/L)
0.0003
0.0002
0.0001
0.0000
0 20 40 60 80 100 120 140
t (s)
θ̈ + ω02 θ = 0
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
0.4
0.3
0.2
0.1
0.0
θ
−0.1
−0.2
−0.3
−0.4
0 5 10 15 20 25
t
1.0
0.5
0.0
θ̇
−0.5
−1.0
−0.4 −0.3 −0.2 −0.1 0.0 0.1 0.2 0.3 0.4
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
omega0=np.sqrt(g/L)
Q1=0.1
Q2=0.5
Q3=10
#Q=float(input('donner le facteur de qualité du pendule simple : '))
# Définition du système différentiel linéaire
def Pendule1(Theta,t):
theta = Theta[0]
theta_point = Theta[1]
return [theta_point,-omega0**2*np.sin(theta)-omega0/Q1*theta_point]
def Pendule2(Theta,t):
theta = Theta[0]
theta_point = Theta[1]
return [theta_point,-omega0**2*np.sin(theta)-omega0/Q2*theta_point]
def Pendule3(Theta,t):
theta = Theta[0]
theta_point = Theta[1]
return [theta_point,-omega0**2*np.sin(theta)-omega0/Q3*theta_point]
t0=0
T=2*np.pi/omega0
tfin=10*T
t=np.linspace(t0,tfin,1000)
theta0=float(input('donner la valeur de theta0 en radian inférieure à pi sur 9 : ')
)
thetapoint0=float(input('donner la valeur de thetapoint0 en radian par seconde : ')
)
X1=odeint(Pendule1,[theta0,thetapoint0],t)
X2=odeint(Pendule2,[theta0,thetapoint0],t)
X3=odeint(Pendule3,[theta0,thetapoint0],t)
plt.subplot(211)
plt.plot(t,X1[:,0],color='b')
plt.plot(t,X2[:,0],color='r')
plt.plot(t,X3[:,0],color='m')
#title("Diagramme de phase - pendule simple")
plt.xlabel('t', fontsize = 20)
plt.ylabel('$\\theta$', fontsize = 20)
plt.subplot(212)
plt.plot(X1[:,0],X1[:,1],color='b')
plt.plot(X2[:,0],X2[:,1],color='r')
plt.plot(X3[:,0],X3[:,1],color='m')
0.4
0.3
0.2
0.1
θ
0.0
−0.1
−0.2
−0.3
0 5 10 15 20 25
t
0.8
0.6
0.4
0.2
0.0
θ̇
−0.2
−0.4
−0.6
−0.8
−1.0
−0.3 −0.2 −0.1 0.0 0.1 0.2 0.3 0.4
import numpy as np
from scipy import signal
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def ue(t):
return signal.square(2*np.pi*f*t,0.5)
3
2
1
uc
0
−1
−2
−3
0.000 0.005 0.010 0.015 0.020 0.025
t
80000
60000
40000
20000
0
uc˙
−20000
−40000
−60000
−80000
−3 −2 −1 0 1 2 3
uc
3
2
1
uc
0
−1
−2
−3
0.000 0.005 0.010 0.015 0.020 0.025
t
30000
20000
10000
0
uc˙
−10000
−20000
−30000
−1.5 −1.0 −0.5 0.0 0.5 1.0 1.5
uc
3
2
1
uc
0
−1
−2
−3
0.000 0.005 0.010 0.015 0.020 0.025
t
20000
15000
10000
5000
0
uc˙
−5000
−10000
−15000
−20000
−1.0 −0.5 0.0 0.5 1.0
uc
1.0
0.5
0.0
uc
−0.5
−1.0
5000
0
uc˙
−5000
−10000
−0.10 −0.05 0.00 0.05 0.10 0.15 0.20
uc
ẍ − (ε − x2 )ẋ + x(t) = 0
Selon les conditions initiales et la valeur du paramètre ε différents comportements sont obtenus :
import numpy as np
from scipy import signal
from scipy.integrate import odeint
import matplotlib.pyplot as plt
plt.subplot(121)
plt.plot(t,Y[:,0],color='b',label="$\\varepsilon=0.2, x_0=0.3, v_0=0$")
#title("epsilon=0.2-x0=0.3-v0=0")
plt.xlabel('t', fontsize = 20)
plt.ylabel('x', fontsize = 20)
plt.axis([0,70,-1,1.2])
plt.legend(loc="upper left")
plt.subplot(122)
plt.plot(Y[:,0],Y[:,1],label="ep=0.2, x0=0.3, v0=0")
#title("epsilon=0.2-x0=0.3-v0=0")
plt.xlabel('uc', fontsize = 20)
plt.ylabel('$\dot{uc}$', fontsize = 20)
ax=plt.gca()
#ax.spines['right'].set_color('none')
#ax.spines['top'].set_color('none')
#ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
#ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.tight_layout()
plt.show()
1.0
ε = 0. 2, x0 = 0. 3, v0 = 0
1.0
0.5
0.5
x
0.0
ẋ
−0.5
−0.5
−1.0 −1.0
0 10 20 30 40 50 60 70
2.0
ε = 0. 2, x0 = 3. 5, v0 = 2
3
1.5
1.0
2
0.5
x
ẋ
1
0.0
−2 −1 0 1 2 3 4
x
−0.5
0
−1.0
−1
−1.5
0 10 20 30 40 50 60 70
2.5 3
ε = 1, x0 = 0. 3, v0 = 0
2.0
1.5
1.0 1
0.5
x
0
ẋ
−3 −2 −1 0 1 2 3
0.0
x
−0.5 −1
−1.0
−2
−1.5
−2.0 −3
0 10 20 30 40 50 60 70
ε = 1, x0 = 3. 5, v0 = 2
3
2
1
1
x
ẋ
−3 −2 −1 0 1 2 3 4
x
0
−1
−1 −2
−2 −3
0 10 20 30 40 50 60 70
5 15
ε = 4, x0 = 0. 3, v0 = 0
4
10
2 5
1
x
0
ẋ
−4 −2 0 2 4
0
x
−1 −5
−2
−10
−3
−4 −15
0 10 20 30 40 50 60 70
5 15
ε = 4, x0 = 3. 5, v0 = 2
4
10
2 5
1
x
ẋ
−4 −2 0 2 4
0
x
−1 −5
−2
−10
−3
−4 −15
0 10 20 30 40 50 60 70