TP4

publicité
Informatique
TP4 Chapitre 3 : FONCTIONS
APPLICATION AU CALCUL APPROCHE D'UNE INTEGRALE SUR UN SEGMENT
Nous avons déjà rencontré des fonctions, par exemple la fonction print(), la fonction abs(), des fonctions du module math
comme sqrt(). Nous pouvons aussi définir et utiliser nos propres fonctions.
I/ LES FONCTIONS EN PYTHON
1/ Définition d'une fonction
Fonction NomDeLaFonction(paramètres formels)
Début
Séquence
Retourne résultat
Fin
se traduit par :
def Fonction(parametres formels):
sequence
return resultat
Entrées
Sorties
Le return est facultatif. En fait, s'il est absent, la fonction retourne le résultat None.
2/ Exemple
• On étudie le mouvement vertical d’une balle lancée en l’air. La position verticale de la balle à l’instant t est donnée par y(t) = v0.t –
2
½.g.t , où v0 est la vitesse initiale et g l’accélération due à la gravité (environ 9,81). Définir dans l'éditeur une fonction position par :
def position(v0, t):
return v0*t - 0.5 * 9.81 * t**2
Faire F5, puis tester la fonction en l'appelant dans la console pour : v0 = 10 m/s et t = 1s
v0 = 20 m/s et t = 2s
Position de la balle ?
…
…
• Tester dans la console :
>>> vit_init = 10
# Comment s'appellent vit_init et instant ?
>>> instant = 1
>>> pos1 = position(vit_init, instant)
# A bien comprendre ; pos1 prend pour valeur
>>> print(pos1)
# le résultat retourné par la fonction
>>> pos2 = position(2*vit_init, 2*instant)
>>> print(pos2)
er
• Rq importante : Il peut y avoir plusieurs return dans une fonction. Le 1 rencontré termine la fonction et rend la main au
programme appelant.
• Si le programme appelant (ici l'instruction position(10, 1) par exemple) n'a pas besoin du résultat produit en sortie de la
fonction, on peut omettre le return et faire simplement un affichage :
def position(v0, t):
print(v0*t - 0.5 * 9.81 * t**2)
3/ Documentation d'une fonction
• Toute fonction doit impérativement être documentée : on doit spécifier ce qu'elle fait, ainsi que la signification et le type des
paramètres formels en entrée.
• Python propose un moyen de rédiger avec les triples guillemets une documentation facilement accessible :
Saisir après la ligne de définition (def) de la fonction et en indentant :
""" Retourne la position à l'instant t d'une balle lancée en l'air à la vitesse
initiale v0.
Paramètres : t : Réel ; v0 : Réel """
Faire F5, puis taper dans la console help(position). On voit que la documentation est ainsi disponible.
Encore plus fort : saisir dans la console position( et examiner l'inspecteur d'objets. Conclusion ?
4/ Un paramètre formel en entrée peut être de type quelconque
Reprenons la recherche du maximum dans une liste non vide de nombres. Elle peut être réalisée par une fonction :
CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville
-1-
Informatique
def maxi(L):
m = L[0]
for i in L:
if m < i: m = i
return m
# Le paramètre formel est une liste L
Saisir cette fonction, puis la tester dans la console avec différentes listes L1 de 20 entiers entre 0 et 99 créées avec :
L1 = sample(range(100), 20)
# Importer le module random avec from random import *
5/ La portée des variables
On distingue les variables "locales à une fonction" des variables "globales".
Les règles sont les suivantes :
— dans le corps d'une fonction f, une variable x est par défaut locale si on l'affecte à une valeur (avec un "=" par ex.) ; on ne peut
alors pas y accéder en dehors de la fonction ;
— cette variable est globale si elle n'est pas affectée à une valeur dans la fonction ; on peut alors y accéder de partout ;
— on peut aussi rendre globale une variable affectée à l'intérieur d'une fonction avec le mot-clé global (à éviter).
Pour comprendre la portée des variables, saisir à la suite de la fonction maxi(L) précédente :
x = 42
Tester dans la console et justifier le résultat par la portée des variables :
>>> m
Résultat :
car …
def f():
return x
>>> x
Résultat :
car …
def g(y):
print(y)
y = 3
print(y)
def h():
global x
x = 17
return x
>>> f()
Résultat :
car …
>>> g(8)
Résultat :
car …
>>> y
Résultat :
car …
>>> h()
Résultat :
car …
>>> x
Résultat :
car …
II/ CALCUL APPROCHE D'UNE INTEGRALE SUR UN SEGMENT :
METHODES D'INTEGRATION NUMERIQUE DES RECTANGLES ET DES TRAPEZES
1/ Présentation des méthodes
• En analyse numérique, il existe une vaste famille d’algorithmes dont le but principal est d’estimer la valeur numérique de
l’intégrale d’une fonction f(x) continue sur un domaine [a; b], soit

b
a
f(x).dx .
Ces techniques procèdent en trois phases distinctes :
1. Décomposition du domaine en intervalles.
2. Intégration approchée de la fonction sur chaque intervalle, par calcul d'une aire sous f(x).
3. Sommation des résultats numériques ainsi obtenus.
• On commence donc par partager [a; b] en n intervalles d’amplitude h =
b-a
. Ce paramètre h est appelé le "pas".
n
ère
• Une 1 méthode consiste à approximer l'aire sous la courbe f(x) par
une série de rectangles comme sur la figure ci-contre :
er
nd
L'aire du 1 rectangle est h . f(a) ; l'aire du 2 est h . f(a+h) ; l'aire du
ème
3 est h . f(a+2.h) ; etc.
La somme des aires permet alors d'écrire :

b
a
n-1
f(x).dx = h . f(a + i.h)
i=0
C'est la méthode des rectangles.
CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville
-2-
h
Informatique
Evidemment, on comprend bien que :
- le résultat obtenu sera un minorant de l'intégrale exacte si f croît, un majorant si f décroît ;
- le calcul sera tout de même d'autant plus exact que h sera petit, donc que n sera grand.
L'algorithme correspondant (à connaître) est le suivant :
Algorithme Intégration_Rectangles
Variables
a, b, n, h : Réel
res : Réel
i : Entier
Début
Ecrire ("Donner les valeurs de l'intervalle d'intégration [a ; b] et le nombre de pas n :")
Lire (a, b, n)
h ← (b – a)/n
La fonction f est bien entendu définie auparavant :
res ← 0
Pour i ← 0 Jusqu'à i = n-1 Faire
res ← res + h . f(a + i.h)
FinPour
Fonction f(x)
Ecrire("Le résultat est :", res)
Fin
# Calcule et renvoie f(x)
# x : Réel
Début
Retourne …
# Expression de la fonction
Fin
er
nd
Rq : - un autre choix est de calculer h . f(a+h) pour le 1 rectangle, h . f(a+2.h) pour le 2 , etc. On obtient alors un majorant pour f
n-1
croissante, qui est
h . f(a + (i + 1).h) .
i=0
- une dernière variante donne de meilleurs résultats en se servant du point milieu de chaque intervalle : l'aire est h . f(a+h/2) pour le
n-1

 1 
er
nd
1 rectangle, h . f(a+3.h/2) pour le 2 , etc. On calcule alors h . f  a +  i + .h  .
 2 
i=0

ème
• Une 2 méthode consiste à tracer des segments entre les points f(a+i.h).
L'intégrale de chaque segment correspond alors à l'aire d'un trapèze :
f(a) + f(a+h)
nd
; l'aire du 2
2
f(a+h) + f(a+2.h)
f(a+2.h) + f(a+3.h)
ème
h.
; l'aire du 3 est h .
; etc.
2
2
L'aire
du
1
er
trapèze
est h .
La somme des aires permet alors d'écrire :

b
a
n-1
f(x).dx = h .
i=0
est
f(a + i.h)+f(a + (i+1).h)
2
C'est la méthode des trapèzes.
L'algorithme correspondant est le suivant, avec les mêmes variables que pour les rectangles :
Algorithme Intégration_Trapèzes
Début
Ecrire ("Donner les valeurs de l'intervalle d'intégration [a ; b] et le nombre de pas n :")
Lire (a, b, n)
h ← (b – a)/n
res ← 0
Pour i ← 0 Jusqu'à i = n-1 Faire
res ← res + h/2 . ( f(a + i.h) + f(a + (i+1).h) )
FinPour
Ecrire("Le résultat est :", res)
Fin
CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville
-3-
Informatique
2/ Application : calcul de la quantité d'électricité produite par une batterie au démarrage d'un moteur
Lors du démarrage d'un moteur à courant continu, le courant qu'il consomme présente une pointe importante car il n'est limité que
par la résistance interne du moteur, qui est faible. Au fur et à mesure de son accélération, le courant consommé chute pour se
stabiliser lorsque la vitesse a atteint un régime permanent.
Dans un système embarqué, ce phénomène doit être quantifié pour pourvoir dimensionner la batterie d'alimentation. Celle-ci
peut en effet fournir un certain courant pendant un certain temps ; c'est sa capacité, exprimée en A.s ou A.h.
Sur un système du laboratoire, on a relevé le courant
de démarrage suivant :
Ce comportement peut se
modéliser par la fonction :
-10.x
f(x) = 200 . x . e
avec x le temps en secondes.
Son tracé est en effet :
Ce modèle conserve sa
validité au-delà de t = 0,5 s, si
l'on considère que le courant
n'est plus seulement dû au
démarrage.
Calibres:
1A/div
0,1s/div
La quantité d'électricité Qdemar fournie par la batterie au démarrage est la surface sous la courbe du courant. Elle correspond en
effet à un produit courant x temps, et s'exprime en A.s. On peut donc la calculer avec Qdemar =

0,9
0
f(t).dt
Commencer par programmer la fonction f(t).
Programmer ensuite la fonction int_rect(f, a, b, n) en suivant l'algorithme de la page précédente pour l'intégration par la méthode
des rectangles (sans Ecrire() et Lire() car a, b et n seront passés en paramètres lors de l'appel).
Programmer la fonction Qdemar(a, b, n) appelant int_rect et affichant la quantité d'électricité consommée en A.s. Tester l'appel.
-10.t
Programmer la fonction primitive(t) = –2 . e
– 20 . t . e
calcul d'intégrale avec primitive(0.9) – primitive(0).
-10.t
permettant de tester votre programme en donnant le résultat exact du
Modifier n. Que constate-t-on ?
Rajouter la fonction int_trap(f, a, b, n) en suivant l'algorithme de la page précédente pour l'intégration par la méthode des trapèzes.
Rajouter l'appel à int_trap dans la fonction Qdemar, afin de pouvoir comparer les résultats des 2 méthodes.
Conclusion : quelle est la méthode la plus précise ?
-3
Que doit valoir n pour que cette méthode donne un résultat approché avec une erreur inférieure à 10 A.s ?
Pour ceux qui ont le temps :
-5
Rajouter une fonction qui trouve n pour garantir une erreur < 10 , dans chacune des 2 méthodes.
Tracer f(t) avec l’instruction plot(T,Y), après avoir constitué la liste T des instants et la liste Y des valeurs de f(t). On peut par exemple
définir la fonction :
def tracef():
T, Y = [], []
Calculer le temps mis par le processeur pour faire le calcul
for i in range(100):
pour chaque méthode, avec :
T.append(i/100)
from time import *
Y.append(f(i/100))
plot(T, Y)
t1 = clock()
res = int_rect(f, a, b, n)
t2 = clock()
print(t2-t1)
Rajouter la méthode des rectangles par point milieu.
CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville
-4-
# Par ex.
Téléchargement