Cours d'Ingénierie Numérique en Python
Cours d'Ingénierie Numérique en Python
v1.0
Lycée Jean Zay 21 rue Jean Zay 63300 Thiers Académie de Clermont-Ferrand
Compétences visées :
A3-07 Analyser un algorithme.
Choisir une démarche de résolution d'un problème d'ingénierie numérique ou d'intelligence
C1-03 articielle.
C3-02 Résoudre numériquement une équation ou un système d'équations.
C3-03 Résoudre un problème en utilisant une solution d'intelligence articielle.
D3-03 Eectuer des traitements à partir de données.
1 Introduction
1.1 Objectif
Ce cours a pour objectif de lister les diérentes méthodes d'analyse numérique évoquées dans le pro-
gramme de Sciences de l'Ingénieur en PTSI-PT. Elles formeront un premier étage dans la construction
des connaissances en ce domaine, connaissances importantes pour la plupart des ingénieurs qui tra-
vaillent dans le secteur de la simulation numérique notamment. L'ensemble des algorithmes présentés
seront écrit en Python, conformément aux recommandations du programme.
Ce cours n'a en revanche pas vocation à mener une étude approfondie des concepts mathématiques
sous-jacents et des limites de chacune des méthodes abordées. Il pourra donc être utile de se référer à
la littérature spécialisée pour les étudier plus nement.
Attention
Pour faire le lien avec le cours d'Informatique du Tronc Commun, la plupart des fonctions Python
proposées dans ce cours seront codées en Python pur. Seuls quelques exemples feront appels à des
bibliothèques particulières telles que numpy (notamment au 3).
Cependant, en règle générale, il est bien plus simple et plus ecace d'utiliser les bibliothèques spé-
cialisées (numpy, scipy, etc).
À partir de ces dénitions, il sera possible de résoudre des équations diérentielles linéaires selon
diérentes méthodes sachant que les opérations numériques élémentaires sont la dérivation et l'inté-
gration.
Remarque f (x)
9
Dans la suite de ce cours, nous utiliserons dans
les exemples la fonction polynômiale suivante
7
(voir Figure 1 ci-contre) :
1 3 5
f (x) = x3 − x2 + 4x + 4
8 2
3
Dans les diérents exemples de code Python, on
considèrera comme prédénie la fonction f dénie 1
comme suit : x
0 1 2 3 4 5 6 7 8 9
1 def f(x):
2 return 1/8*x**3 - 3/2*x**2 + 4*x + 4 Figure 1 Fonction polynômiale exemple
L'approche numérique pour l'intégration est nécessaire pour le traitement de données expérimen-
tales ou de résultats de simulation complexes, ou encore pour intégrer des fonctions n'ayant pas de
primitive connue analytiquement. Elle ne permet néanmoins pas d'obtenir des résultats corrects pour
n'importe quelle fonction : en particulier, la fonction ne doit pas présenter de branche innie dans
l'intervalle d'intégration.
La répartition des points en abscisse est généralement uniforme (pas d'échantillonnage constant h),
mais il existe des méthodes à pas variable, ou encore à pas adaptatif.
La précision de l'intégration numérique peut s'améliorer en augmentant le nombre de points n (en
diminuant le pas d'échantillonnage h) ou en augmentant le degré de l'interpolation polynomiale (sous
réserve de bonnes propriétés de continuité de la courbe).
• • • •
• •
yi • • yi • •
• •
• • • •
x x
a xi b a xi b
h h
(a) Méthode des rectangles à gauche (b) Méthode des rectangles à droite
Cette méthode est très utilisée pour les intégrations en temps réel. L'intégrale calculée à l'instant t
est en réalité légèrement retardée de h2 (en moyenne), ce qui n'est pas gênant lorsque h est très faible.
La programmation classique de l'intégration numérique d'une courbe dénie par deux tableaux
d'abscisses x et d'ordonnées y s'écrit alors (pour un échantillonnage constant ou non) :
1 # Création des listes, avec a et b les bornes d'intégration et n le nombre de points calculés
2 # On peut aussi obtenir x et y en lisant un fichier de mesures
3 x = np.linspace(a,b,n) # Création d'un vecteur abcisses
4 y = f(x) # Calcul de l'image de x par la fonction f
1 def integration_rectangles_gauche(x,y): 1 def integration_rectangles_droite(x,y):
2 """ 2 """
3 Paramètres : 3 Paramètres :
4 - x : liste des abscisses 4 - x : liste des abscisses
5 - y : liste des ordonnées 5 - y : liste des ordonnées
6 """ 6 """
7 I = 0 7 I = 0
8 for i in range(len(x)-1): 8 for i in range(1,len(x)):
9 I += y[i]*(x[i+1]-x[i]) 9 I += y[i]*(x[i]-x[i-1])
10 return I 10 return I
La programmation classique de la méthode du point milieu pour une courbe dénie par deux
tableaux d'abscisses x et d'ordonnées y s'écrit alors (pour un échantillonnage constant ou non, avec un
nombre impair de points) :
1 def integration_point_milieu(x,y):
2 """
3 Paramètres :
4 - x : liste des abscisses
5 - y : liste des ordonnées
6 """
7 I = 0
8 for i in range(1,len(x)-1,2):
9 I += y[i]*(x[i+1]-x[i-1])
10 return I
ε%
R. à gauche
16 R. à droite
14 Point milieu
Trapèzes
12
10
8
6
4
2
n
0 5 20 40 60 80 100
• si le pas est trop petit, on risque d'augmenter les erreurs numériques liées à la représentation des
ottants en Python.
Le choix du pas de calcul se fera donc à l'aune de ces deux remarques et sera le plus souvent
guidé par l'expérience, tant qu'il n'est pas contraint par la nature des données recueillies lors d'une
acquisition par exemple (ou le choix sera limité par le nombre de points mesurés).
f (x) f (x)
yi+1 yi+1
∆
∆+
yi−1 ∆− yi−1
yi yi
x x
xi−1 xi xi+1 xi−1 xi xi+1
La programmation classique des deux méthodes de dérivation à 1 pas d'une courbe dénie par deux
tableaux d'abscisses x et d'ordonnées y s'écrit alors (pour un échantillonnage constant ou non) :
1 def derivation_1_pas_arriere(x,y): 1 def derivation_1_pas_avant(x,y):
2 """ 2 """
3 Paramètres : 3 Paramètres :
4 - x : liste des abscisses 4 - x : liste des abscisses
5 - y : liste des ordonnées 5 - y : liste des ordonnées
6 """ 6 """
7 deriv = [] 7 deriv = []
8 for i in range(1,len(x)): 8 for i in range(len(x)-1):
9 deriv.append((y[i]-y[i-1])/(x[i 9 deriv.append((y[i+1]-y[i])/(x[i
]-x[i-1])) +1]-x[i]))
10 return deriv 10 return deriv
La Figure 7 montre les erreurs constatées entre la valeur exacte de la dérivée et les valeurs obtenues
par les 3 méthodes en chaque point de l'intervalle [1, 9], en fonction du nombre de points de calcul.
f ′ (x) analytique f (x) f ′ (x) 1 pas avant f ′ (x) 1 pas arrière f ′ (x) 2 pas
f ′ (x) f ′ (x)
x x
θ(t) θL (t)
t t
θ̇(t) θ̇L (t)
t t
t t
Figure 8 Mesure d'un angle θ(t) au cours du temps par un capteur potentiomé-
trique (un lissage donne θL (t)). Calcul numérique de la dérivée (θ̇(t) et θ̇L (t)).
En eet, si les points de mesure restent en moyenne au voisinage de la valeur mesurée, il existe
des uctuations rapides, à la fréquence d'échantillonnage, entre les points successifs.
Le calcul de la dérivée conduit à déterminer la pente entre deux points successifs, ce qui per-
turbe fortement le signal dérivé et cache les évolutions lentes du signal (lentes devant la période
d'échantillonnage).
Deux solutions sont possibles :
• calculer la dérivée sur un temps plus long que le temps d'échantillonnage, par exemple avec une
méthode à 2 pas. Solution adoptée sur la Figure 8a ;
• ltrer (ou lisser) le signal d'origine pour supprimer l'essentiel du bruit (voir 6.3), puis dériver
(et ltrer/lisser une nouvelle fois le résultat), comme montré sur la Figure 8b.
Dans les deux cas, le signal dérivé sera entaché d'un retard sur le signal d'origine. Pour les traite-
ments diérés, le retard ne pose pas de problème mais, pour les systèmes de commande en temps réel,
il est nécessaire de trouver un compromis entre la qualité du signal dérivé et le retard.
Remarque
Dans ce chapitre, les courbes et tableaux de données correspondent à un problème de mécanique
classique : la chute libre d'une bille dans l'huile. En appliquant le PFD à la bille, soumise à la pesanteur
et à du frottement visqueux, on aboutit à l'équation diérentielle suivante, qui régit l'évolution de la
vitesse de la bille :
dv(t)
m = −f v(t) + mg
dt
Sous forme adimensionnée, cette équation peut s'écrire :
dy(t)
= −y(t)
dt
Cette équation présente une solution analytique y(t) = y0 e−t où y0 est la condition initiale y(0) = y0 .
La plupart des systèmes d'équations diérentielles de tout ordre peuvent se mettre sous cette
forme de système d'équations diérentielles du premier ordre (un exemple sera traité plus loin). Or, le
théorème de Cauchy-Lipschitz montre que pour les équations classiquement abordées en SI, le problème
de Cauchy admet une solution unique dénie sur [0, T ].
1.5 1
exacte
2.1
1
0.8 2.0
1.5
0.5 1.0
0.6
0.5
0 0.1
0.4
-0.5
-1 0.2
-1.5 0
2 4 6 8 t 1 2 t
Les courbes montrent que le résultat est d'autant plus précis que le pas de temps est petit et que
le schéma diverge au-delà d'un pas de 2 s.
L'équation de la chute libre dans l'huile est bien connue en physique et en sciences de l'ingénieur : elle
présente une constante de temps de 1 s. Il est donc raisonnable de penser qu'une intégration numérique
ne peut traduire correctement le comportement de l'équation diérentielle que pour des pas de temps
petits devant cette constante de temps, donc pour δt ≪ 1 s.
Si 1 s < δt < 2 s, le schéma converge mais conduit à des oscillations qui n'ont pas lieu d'être. Pour
δt ≫ 2 s, le schéma ne converge pas.
Cette observation se généralise pour les équations diérentielles quelconques : le schéma d'Euler
explicite présente des conditions de convergence liées aux constantes de temps du modèle.
L'erreur évolue linéairement en fonction du pas de temps : le schéma est dit d'ordre 1 . Il faut
descendre à un pas de temps très faible avant d'obtenir un niveau d'erreur satisfaisant.
Le temps de calcul évolue lui aussi linéairement en fonction du pas de temps (complexité en O(N ),
car une seule boucle).
Pour améliorer la précision d'un facteur 10000, il faut diminuer d'un facteur 10000 le pas de temps
et donc augmenter d'un facteur 10000 le temps de calcul.
1. Pour une équation simple, il est parfois possible d'exprimer Yi+1 en fonction des données. Le
calcul est alors aussi simple que pour le schéma d'Euler explicite.
2. Pour un système d'équations linéaires de grande dimension de type F (ti+1 , Y i + 1) = AYi+1 + B ,
où A et B sont une matrice et un vecteur de grande dimension, le calcul de Yi+1 est explicite
mais nécessite de résoudre un système à chaque pas de temps.
3. Pour une équation quelconque, non linéaire, il est nécessaire de faire appel à un algorithme de
recherche de zéro à chaque pas de temps (voir 4). Le programme Python proposé ci-après couvre
ce cas.
Dans la plupart des cas, une méthode implicite est plus coûteuse en temps de calcul qu'une méthode
explicite, à pas de temps égal. Cependant, lorsque les conditions de convergence du schéma explicite
obligent à un pas très petit, il peut être avantageux d'employer une méthode implicite avec un pas de
temps raisonnable.
La programmation du schéma d'Euler dans le troisième cas (le plus général) conduit à dé-
nir la fonction equation(t,y) renvoyant la valeur de l'équation Yi+1 − Yi − ∆tF (ti+1 , Yi+1 ) à ré-
soudre, la fonction resoudre(equation,y0,eps) renvoyant la solution de l'équation, et la fonction
euler_implicite(F,y0,t) renvoyant le tableau des y(t) pour chaque valeur du tableau de temps t,
avec pour condition initiale y0.
1 import numpy as np
2
3 # Définition de la fonction F
4 def F(t,y):
5 return -y
6
7 # Equation implicite à résoudre pour déterminer Yi +1
8 def equation(F,t,y,dt,yi):
9 return y-yi-dt*F(t,y)
10
11 # Fonction de recherche de zéro par la méthode de la sécante
12 def resoudre(F,t,dt,yi,eps):
13 y = [yi] # La recherche débute à yi
14 y.append(yi+10*eps) # Second point proche de yi
15 i=0
16 while (abs(y[i+1]-y[i])>eps):
17 f1 = equation(F,t,y[i],dt,yi)
18 f2 = equation(F,t,y[i+1],dt,yi)
19 a = (f2-f1)/(y[i+1]-y[i])
20 b = f1-a*y[i]
21 y.append(-b/a)
22 i=i+1
23 return y[-1]
24
25 # Schéma d'Euler implicite
26 def euler_implicite(F,y0,t):
27 y = np.zeros([t.shape[0],y0.shape[0]])
28 y[0,:]= y0
29 for i in range(t.shape[0]-1):
30 y[i+1,:] = resoudre(F,t[i+1],(t[i+1]-t[i]),y[i,:],1e -4)
31 return y
32
33 # Résolution
34 t = np.linspace(0,6,100) # Temps
35 y0 = np.array([1]) # Conditions initiales
36 y = euler_implicite(F,y0,t)
Attention
Contrairement à l'intégration par le schéma d'Euler explicite, cet algorithme n'est pas utilisable pour
un système d'équations diérentielles, car la recherche de zéro dans ce cas n'est valable que pour une
équation scalaire.
1 exacte
2.1
2.0
0.8 1.5
1.0
0.5
0.6
0.1
0.4
0.2
0
2 4 6 8 t
Les courbes montrent que le résultat est d'autant plus précis que le pas de temps est petit et que
le schéma converge pour tous les pas de temps.
Cette observation se généralise pour les équations diérentielles quelconques : le schéma d'Euler
implicite ne présente pas de condition de convergence.
L'erreur évolue linéairement en fonction du pas de temps : le schéma est dit d'ordre 1 . Il faut
descendre à un pas de temps très faible avant d'obtenir un niveau d'erreur satisfaisant.
Le temps de calcul évolue lui aussi linéairement en fonction du pas de temps (complexité en O(N ),
car une seule boucle) et s'avère plus long que dans le cas explicite du fait de la résolution de l'équation
implicite.
Pour améliorer la précision d'un facteur 10000, il faut diminuer d'un facteur 10000 le pas de temps
et donc augmenter d'un facteur 10000 le temps de calcul.
En posant un vecteur Y (appelé vecteur d'état) contenant y1 = y et toutes les dérivées contenues
2 n−1
dans f : y2 = dydt1 , y3 = ddt2y et ainsi de suite jusqu'à yn = ddtn−1y , l'équation diérentielle s'exprime sous
la forme d'un système diérentiel :
dy1
dt = y2
dy2
= y3 dY
..
dt
soit = F (t, Y )
.
dt
dyn
= f (t, y1 , y2 , . . . , yn )
dt
Avec :
y1 y2
y2 y3
. ..
.. et F (t, Y ) =
Y =
.
yn−1 yn
yn f (t, y1 , y2 , . . . , yn )
Autre solution Une autre solution classique permettant de résoudre cette équation diérentielle
avec la méthode d'Euler explicite est d'appliquer deux fois la dénition.
Yi+1 − Yi
On note Y p la dérivée première. On a Y pi =
h
Y pi+1 − Y pi Yi+2 − 2Yi+1 + Yi
On note Y pp la dérivée seconde. On a Y ppi = = .
h h2
On obtient alors une relation de récurrence directe qui peut être programmée. Ce schéma est un
schéma d'intégration à deux pas qui pourrait s'inscrire dans un cadre plus général des méthodes à
plusieurs pas.
pour trouver des solutions approchées de ces équations. Ce chapitre est dédié à la présentation de
deux méthodes classiques pour résoudre des équations (linéaires ou non) à une inconnue, c'est à dire
déterminer x solution d'une équation f (x) = 0, où f est une fonction quelconque.
Remarque
Pour ce chapitre 4, nous utiliserons dans les exemples la fonction polynômiale du début de ce cours,
et on cherchera à résoudre l'équation suivante :
1 3 3 2 1 3 3 2
f (x) = 3 ⇔ x − x + 4x + 4 = 3 ⇔ x − x + 4x + 1 = 0
8 2 8 2
On cherchera une solution sur l'intervalle [2, 6].
g(x) + +
5 [ • ] Intervalle 1
+
4 • [ • ] Intervalle 2
+
3 [ ] Intervalle 3
2
1 •
0 x
1 2 3 4 5 6 7
-1 •
-2 •
Le principe de la méthode est simple (voir Figure 16 : l'image par f du milieu c de l'intervalle
est calculée, puis le signe est comparé aux signes de f (a) et f (b) pour déterminer si le zéro est sur
l'intervalle [a, c] ou [c, b]. Seul l'intervalle contenant la racine est conservé et le processus est répété
jusqu'à obtenir une précision susante sur la valeur approchée de la solution.
1 def dichotomie(f,a,b,epsilon):
2 """
3 Paramètres :
4 - f : fonction
5 - a,b : bornes de l'intervalle
6 - epsilon : précision recherchée
7 """
8 while (abs(b-a)) > epsilon:
9 c = (a+b)/2
10 if f(a)*f(c) <= 0:
11 b = c # [a,c] sera le prochain intervalle
12 else :
13 a = c # [c,b] sera le prochain intervalle
14 return (a+b)/2
4
•
3
1 •
x3 x1
0 1 • 7x
x0 x2
-1
•
-2
L'expression de la tangente en x0 s'écrit : y = f ′ (x)(x − xi ) + f (xi ). Cette droite coupe l'axe des
abscisses en xi+1 = xi − ff′(x
(xi ) , ce qui donne une nouvelle estimation de la solution.
i)
1 def newton(f,df,x0,epsilon):
2 """
3 Paramètres :
4 - f : fonction
5 - df : dérivée de f
6 - x0 : solution initiale
7 - epsilon : précision recherchée
8 """
9 xi = x0
10 xi_plus_1 = x0-f(x0)/df(x0)
11 while abs(xi_plus_1-xi) > epsilon:
12 xi = xi_plus_1
13 xi_plus_1 = xi-f(xi)/df(xi) # Calcul de la nouvelle estimation de la solution
14 return xi_plus_1
Cette méthode converge plus rapidement que la méthode de la dichotomie, mais elle nécessite
l'expression de la dérivée de f , qui n'est pas toujours disponible. Dans ce cas, on pourra utiliser la
méthode de la sécante, qui est très similaire à la méthode de Newton, mais qui calcule la pente de la
tangente par un calcul numérique.
Une façon simple d'obtenir une matrice de même structure pour l'étape j + 1 consiste à eectuer
les opérations élémentaires :
aij
Li ←− Li − Lj , j+1≪i≪n
ajj
de façon à faire apparaître naturellement des zéros sur la colonne j pour les indices i ∈ {j + 1, . . . , n}.
Cette méthode n'est pas toujours satisfaisante, car le pivot (le coecient ajj qui apparaît au
dénominateur de l'équation précédente) peut être très petit (ce qui rend alors les calculs très sensibles
aux erreurs d'arrondis), voire même nul (auquel cas la division ne peut bien sûr pas être eectuée). Dans
la méthode de Gauss avec pivot partiel, on cherche donc dans un premier temps l'indice k ∈ {j, . . . , n}
pour lequel |akj | est maximal, puis (si k ̸= j ) les lignes j et k sont permutées avant d'eectuer les
opérations élémentaires énoncées plus haut. La stabilité numérique de l'algorithme est ainsi assurée.
L'inversibilité de la matrice A garantit l'inégalité maxk∈{j,...,n} |akj | > 0.
Résolution du système transformé Une fois le système linéaire initial transformé en un système
linéaire triangulaire (A étant alors une matrice triangulaire supérieure), la résolution devient immédiate
puisque xn est obtenu directement par :
bn
xn =
ann
et les valeurs de xn−1 , xn−2 , . . ., x1 successivement au moyen de la récurrence (descendante) :
n
!
1 X
x1 = bi − aik xk
aii
k=i+1
Résolution du système linéaire initial La combinaison des deux étapes ci-dessus permet donc
de résoudre un système linéaire par la méthode de Gauss avec pivot partiel :
1 def gauss_pivot_partiel(A,b):
2 """
3 Paramètres :
4 - A : matrice carrée (array numpy)
5 - b : vecteur (array numpy)
6 """
7 AA,bb = transforme_gauss(A,b)
8 x = solution_triangulaire(AA ,bb)
9 return x
L'objectif de ce chapitre est donc double : reprendre les méthodes permettant de lire les données
dans un chier, et présenter quelques méthodes de ltrage numérique.
Le code ci-dessous permet alors d'extraire de ce chier les données sous forme de trois listes de
même dimensions : une pour le temps, et une pour psipoint (ωe ) et thetapoint (ωs ).
1 mon_fichier=open("capsuleuse.csv","r") # Ouverture du fichier
2 for i in range(4): # On élimine les 4 lignes d'en-tête
3 poubelle=mon_fichier.readline()
4 temps=[] # initialisation des listes
5 psiPoint=[]
6 thetaPoint=[]
7 # Pour chaque ligne du fichier
8 for ligne in mon_fichier:
9 # On élimine le retour chariot et les séparateurs de colonne (point virgule)
10 # On remplace aussi les virgules par des points (séparateur décimal en Python)
11 data = ligne.replace(",",".").rstrip("\n\r").split(";")
12 # On récupère la valeur des colonnes temps, omega_e (thetaPoint) et omega_s (psiPoint)
13 temps.append(float(data[0]))
14 psiPoint.append(float(data[1]))
15 thetaPoint.append(float(data[2]))
16 mon_fichier.close() # Fermeture du fichier
6.3 Filtrage
Les capteurs renvoient un signal qui peut être bruité, du fait de leur mode de fonctionnement, de la
quantication, ou d'éléments perturbateurs pendant la transmission du signal. Que ce soit dans un dans
le cadre d'un asservissement numérique (en temps réel) ou dans l'analyse de mesures pré-enregistrées
(post-traitement), le bruit dans le signal fourni par le capteur est toujours néfaste, car il peut dégrader
les performances d'un système ou amener à des erreurs parfois spectaculaires de résolution numérique.
Très souvent, le signal brut issu du capteur est d'abord ltré de manière analogique, avec une
fréquence de coupure liée à la fréquence d'échantillonnage du convertisseur analogique-numérique (on
parle alors de ltre anti-repliement) puis par un ltre numérique sur le signal échantillonné dans le
microcontrôleur.
En python, on peut coder cette fonction de la manière suivante (si on doit utiliser ce ltre pour
un traitement de données en temps réel, la moyenne sera calculée sur les n valeurs précédant la valeur
acquise en dernier) :
1 def moyenne_glissante(x,y,n):
2 """
3 Paramètres :
4 - x : abscisses
5 - y : ordonnees
6 - n : nombre de points
7 """
8 if n%2 == 0: # On souhaite un n impair
9 n -= 1
10 a = int((n-1)/2)
11 y_filtres = []
12 for i in range(a,len(y)-a):
13 y_filtres.append(sum(y[i-a:i+a+1])/n) # Calcul de la moyenne
14 return x[a:-a],y_filtres
t t
ω(t) n=4
ω(t) n = 32
t t
L−1
Yf (p)(1 + τ p) = Y (p) −−→ τ ẏf (t) + yf (t) = y(t)
L'équation diérentielle est discrétisée en évaluant les diérents termes pour ti = iTe et la dérivée
yf −yf
est approchée par ẏf (ti ) = ẏfi = i Te i−1 (voir 2.2). On obtient alors :
yfi − yfi−1 Te τ
τ + y fi = y i ⇒ y fi = yi + yf
Te τ + Te τ + Te i−1
L'implémentation de ce type de ltre est alors très simple, et peut s'écrire comme suit en Python :
1 def passe_bas_1er_ordre(x,y,tau):
2 """
3 Paramètres :
4 - x : abscisses
5 - y : ordonnees
6 - tau : constante de temps (idéalement, Te/2)
7 """
8 y_filtres = [y[0]]
9 for i in range(1,len(y)):
10 Te = x[i]-x[i-1]
11 y_filtres.append(Te/(tau+Te)*y[i]+tau/(tau+Te)*y_filtres[i-1])
12 return x[1:],y_filtres[1:]
La courbe suivante montre l'inuence du choix de la constante de temps du ltre sur la réponse
ltrée obtenue : plus la constante de temps est grande plus la courbe ltrée s'écarte de la courbe
d'origine non ltrée essentiellement en régime transitoire.
t t
t t
On approche au temps iTe , la dérivée première de la même façon que pour le premier ordre (ẏf (ti ) =
yf −yf ẏf −ẏf yf −2yfi−1 +yfi−2
ẏfi = i Te i−1 ) et la dérivée seconde par ÿf (ti ) = ÿfi = i Te i−1 = i Te 2
(voir 2.2).
L'équation discrétisée est alors :
1 yfi − 2yfi−1 + yfi−2 2ξ yfi − yfi−1
2 + + y fi = y i
ω0 2 Te ω 0 Te
avec :
ω0 2 Te 2 1 + ξω0 Te 1
a0 = b0 = 2 b1 = −
1 + 2ξω0 Te + ω0 2 Te 2 1 + 2ξω0 Te + ω0 2 Te 2 1 + 2ξω0 Te + ω0 2 Te 2
Il faut alors choisir la période Te telle que T1e ≥ 2ω0 (théorème de Shannon) : on choisit généralement
un facteur d'amortissement ξ = 1 pour assurer un aaiblissement optimal de −6 dB pour la pulsation
ω0 .
En prenant ω0 = 1
2Te (valeur limite), on obtient :
yfi = 0, 444yi + 0, 667yfi−1 − 0, 111yfi−2
t t
ω(t) ω0 = 1 ω(t) ω0 = 1
2Te 8Te
t t
Références
[1] A. Caignot, V. Crespel et D. Violeau : Sciences Industrielles de l'Ingénieur - Tout en un -
MP/MP*, PSI/PSI*, PT/PT*. Vuibert, 2022.
[2] A. Caignot, M. Dérumaux, J. Labasque et L. Moisan : Informatique pour Tous - CPGE
scientiques - 1ere et 2eme année. Vuibert, 2015.
[3] E. Billette : Cours d'informatique de tronc commun, 2021. PTSI - Lycée Jean Zay - Thiers.
[4] A. Caignot et M. Dérumeaux : Cours d'ingénierie numérique, 2014. UPSTI.
[5] D. Defauchy : Cours d'ingénierie numérique, 2022. UPSTI.