Travaux Pratiques 5 : Fonctions

publicité
Travaux Pratiques 5 : Fonctions
Exercice 1 :
Compléter le programme suivant à l’aide d’une fonction Turbo-Pascal, qui calcule les images de la fonction mathématique
f(x)=exp(x)-1.
program ffi ;
var x:real;
begin
write(’Entrer un réel ’);readln(x);
writeln(’Son image par f est ’, f(x));
end.
Exercice 2 :
Ecrire une fonction qui donne le maximum de 3 nombres.
Exercice 3 :
Ecrire la fonction puissance qui renvoie xp , lorsque x est un réel quelconque et p est un entier positif.
Utiliser cette fonction pour écrire un programme qui demande deux entiers n et p, et qui affiche la valeur de
n
P
kp .
k=1
Exercice 4 : Calculs des coefficients binomiaux.
1. Reprendre le programme Turbo-pascal du cours, et déterminer, en fonction de n et k le nombre d’opérations
élémentaires ainsi que le nombre d’affectations effectuées pour le calcul de nk .
n−k+1
, écrire un nouveau programme
2. En remarquant que pour tout n et k entiers positifs, nk = nk × n−1
k−1 × ... ×
1
n
Turbo-pascal calculant k à l’aide d’une seule boucle FOR. Quelle est la complexité de ce nouvel algorithme ?
Exercice 5 : Edhec 2012
u2 +1
On considère la suite définie par u0 = 0 = et ∀n ∈ N, un+1 = n2 .
Ecrire une fonction Pascal d’en-tête function u(n:integer):real; qui renvoie la valeur de un .
Exercice 6 : Edhec 97
On considère la déclaration de fonction suivante, rédigée en TurboPascal :
function f(p,q:integer):real;
var j:integer; z:real;
begin
if (p<=0) or (q<0) then write(’valeurs incorrectes’)
else
begin
z:=1;
for j:=1 to (q-1) do z:=z*(1-j/p)
f:=z;
end;
end;
Montrer que si p est un entier naturel non nul et si q est un entier naturel alors f (p, q) =
Exercice 7 : Edhec 2006
Compléter la déclaration de fonction suivante pour qu’elle renvoie la valeur de
n−1
P ak
k=0
function sigma(a : real ; n : integer) : real ;
var k : integer ; p : real ;
Begin
p : = 1 ; s : =1 ;
For k : =1 to n -1 do begin p : = p*a/ k ; s : =....... end ;
s: =............. ;
sigma : = s;
end ;
k!
Aqp
pq
e−a à l’appel de sigma (a, n).
Exercice 8 : Edhec 96
Partie I : Etude de la fonction f définie par f (x) = x − ln x.
Partie II : On considère l’algorithme suivant :
Program iter ;
Var n, k : integer ; a, u, p : real ;
Function f(x :real) : real ;
Begin
If x > 0 then f := x - ln(x) ;
End ;
Begin
Readln(n, a) ; u := a ; p := a ;
For k := 1 to n do begin u := f(u);
p := p*u ;
end ;
Writeln(u, p) ;
End.
1. Dans le cas particulier où n = 2 et a = 3, donner les expressions des contenus des variables u et p à la fin du
programme. Dorénavant, dans le cas général, on note un et pn les contenus respectifs des variables u et p à la fin
de l’algorithme, lorsque leur calcul est possible.
2. Donner la relation liant un+1 et un , ainsi que l’expression mathématique de pn en fonction des (uk ).
3. Donner en fonction de n le nombre d’appels de la fonction f au cours de cet algorithme, ainsi que le nombre de
soustractions, de multiplications et d’affectations nécessaires.
4. Etude mathématique de la suite (un )n∈N en fonction de a. (voir le sujet complet).
Partie III :
1. En considérant ln(pn ), exprimer pn en fonction seulement de a et un+1 .
2. Ecrire un nouvel algorithme en Turbo Pascal, ne contenant aucune multiplication et permettant le calcul de pn .
Partie IV : Etude d’une suite d’intégrales.
Exercice 9 : Méthode de dichotomie (du grec ancien ”couper en deux” )
program dichotomie;
var eps, a, b, c : REAL;
function f (x:REAL) : REAL;
begin
f:=exp(x)-2;
end;
begin
repeat
writeln(’Entrer la valeur de epsilon > 0 : incertitude maximale recherchée’); READLN(eps);
until eps>0;
repeat
writeln(’Entrer les valeur de a et b’); readln(a,b);
until (f(a)*f(b) <= 0);
repeat
c:=(a+b)/2;
if f(b)*f(c)<=0 then a:=c else b:=c;
until abs(b-a)<=2*eps;
c:=(a+b)/2;
writeln(’Une valeur approchée de la solution à ’,eps, ’près est ’, c);
end.
1. Représenter graphiquement la fonction f définie en sous-programme.
2. Comment est choisi epsilon par l’utilisateur ? et a et b ?
A quoi servent les deux premières boucles repeat ... until ?
3. Exécuter à la main le programme pour les valeurs initiales a = −2, b = 2 et epsilon = 1/2 : commencer par
vérifier que a, b et epsilon sont des données acceptables puis exécuter le reste du programme étape par étape.
4. Utiliser la représentation graphique de f pour visualiser toutes les valeurs successives de a, b, et c.
Que représentent a et b au cours du programme ? et c ?
5. Si a = −2, b = 2 mais epsilon = 1/4 ; que devient 3. ?
6. Quelle est la question à laquelle répond ce programme ? A quoi sert epsilon ? et la dernière instruction c :=(a+b)/2 ?
CORRECTION TP 5
Exercice 1 :
function f(x:real):real;
begin
f:=exp(x)-1;
end;
Question : peut-on remplacer la lettre x dans la fonction par une autre lettre genre t ? Et dans le corps du programme ?
Dans le corps du programme : non, à moins de déclarer t dans les variables ! ; par contre, dans la déclaration de la
fonction, peu importe la lettre TANT que c’est la même que celle du corps de la fonction (car elle est déclarée en même
temps que la fonction).
Exercice 2 :
function max3(a,b,c :REAL):REAL;
var tmp :real ;
begin if (a<b) then if (b<c) then tmp := c
else tmp := b
else if (a<c) then tmp :=c
else tmp:=a;
max3 := tmp;
end;
ou
if (a≥ b) and (a≥ c) then tmp:=a;
else if (b≥a) and (b≥c) then tmp:=b;
else tmp:=c;
Exercice 3 :
program sumpuiss;
var p,k,n : integer; s: real;
function puiss(x:real; p:integer):real;
var i:integer; t :real ;
begin
t:=1;
Attention, il n’est pas possible d’écrire : puiss:=1;
for i:=1 to p do
for i:=1 to p do
t:=t*x;
puiss:=puiss*x;
puiss:=t;
car puiss est le nom de la fonction, et n’est pas une variable !
end;
Il faudra toujours que le nom de la fonction n’intervienne qu’une fois :
dans l’affectation qui donne à la fonction sa valeur.
begin
write(’entrer un entier positif p ’); readln(p);
write(’entrer un entier n ’) ; readln(n);
if p < 0 then write(’erreur sur le paramètre p’) else begin s:=0;
for k:=1 to n do s:=s+puiss(k,p);
write(’la valeur de la somme est ’,s);
end;end.
Exercice 4 :
1. Il y a 3 appels de la fonction factorielle(n) : pour chaque appel, il y a 2 + 2n affectations ainsi que n produits.
Il y a donc 2 + 2n + 2 + 2k + 2 + 2(n − k) = 6 + 4n affectations ainsi que n + k + n − k = 2n produits.
Pour l’affichage, encore 1 produit et une division. Soit au total une complexité en 6n + 8 ∼ 6n.
2.
c:=1;
for i:= 1 to k do c:=c*(n-k+i)/i ;
write(c);
Nombre d’affectations : 1+2k. Nombre d’opérations élémentaires : 2k (k produits et k divisions).
Soit une complexité en 3k.
Exercice 5 :
function u(n:integer):real;
var x:real; k:integer;
begin
x:=0;
for k:=1 to n do
x:=(x*x+1)/2;
u:=x;
end;
Exercice 6 :
Faire le tableau de la boucle for du programme afin de comprendre l’évolution de la variable z.
Aqp
p × (p − 1) × (p − 2) × ... × (p − q + 1)
(q facteurs au numérateur et au dénominateur)
Réaliser alors que q =
p
p × p × p × ..... × p
p−k+1
p p−1 p−2
×
× ... ×
= 1 × (1 − p1 ) × (1 − p2 ) × ...(1 − q−1
= ×
p )
p
p
p
p
Exercice 7 :
Principe du programme : calculer la somme (syntaxe dans la boucle for : s:=s+ ...), puis au dernier moment faire le
produit ×e−a .
k
k
ak−1
et donc que la variable p
Pour calculer la somme il faut faire : s:=s+ " ak! ". Remarquer alors que ak! = ka × (k−1)!
évolue justement afin de valoir le terme à sommer (faire le tableau de la boucle for sur la variable p).
Syntaxe : .... s:=s+p; END;
s:=s*exp(-a); .....
II
Exercice 8 :
1. Au départ u = p = 3. Après une étape (k = 1), u = f (3) = 3 − ln(3) et p = 3 ∗ (3 − ln(3)) ; puis après la deuxième
et dernière étape (k = n = 2), u = f (3 − ln(3)) = 3 − ln 3 − ln(3 − ln 3) et p = 3 ∗ (3 − ln 3) ∗ (.....).
n
Q
2. un+1 = f (un ) = un − ln(un ) et pn = u0 × u1 × u2 × ... × un =
uk .
k=0
III
3. Pour chaque étape de la boucle for : 3 affectations (une pour k, une pour u et une pour p) ; un appel de la fonction
f (pour u) et un produit (pour p). Pour chaque appel de la fonction f , une soustraction et une affectation. Donc
au total par étape : 6 opérations élémentaires + 1 appel de f
Avant la boucle for, 2 affectations. Comme il y a n étapes dans la boucle for (donc n appels de la fonction f ), on
a au total : 2 + n × 6 opérations élémentaires +n appels de la fonction soit une complexité en 7n + 2.
n
n
P
P
1. ln(pn ) =
ln(uk ) =
(uk − uk+1 ) (en effet d’après la relation sur la suite u, uk+1 = uk − ln(uk ) donc
k=0
k=0
uk − uk+1 = ln(uk )) = [somme téléscopique] u0 − un+1 = a − un+1 . D’où pn = ea−un+1 .
2. readln(a,n); u:=a;
For k:=1 to n+1 do u:=f(u) ;
p:=exp(a-u); write(p);
Complexité en 5(n + 1) + 2 ∼ 5n.
Exercice 9 : Dichotomie
1. La fonction f est définie sur R par f (x) = ex − 2. La courbe est celle de la fonction exponentielle, translatée
verticalement de 2.
2. L’utilisateur doit choisir eps strictement positif ; et a et b tels que f (a)f (b) ≤ 0 c’est-à-dire tels que l’intervalle
de bornes a et b contienne un zéro de f . Les repeat until font office de garde-fou pour ces données.
3. eps = 1/2 > 0 et f (−2) < 0,
a=
b=
c=
-2
2
0
0
2
1
0
1
f (2) > 0 donc f (−2)f (2) < 0. Les données sont donc acceptables.
b-a=
on entre dans la boucle repeat
2 >2*eps donc on poursuit
1≤ 2*eps donc la boucle repeat s’arrête et le programme renvoie c = 1/2
4. L’intervalle de bornes a et b voit son amplitude diminuer, par emboı̂tement de sous-intervalles [a; b], tels que le
sous- intervalle choisi contienne toujours un zéro de f (i.e. encadre la solution).
c représente à chaque étape le milieu des intervalles [a; b] emboı̂tés et devient a ou b à l’étape suivante.
5. Si maintenant eps vaut 1/4 : tout le début de la question 3. reste identique. Par contre, il faut faire une étape de
plus, ce qui conduit à c = 1/2 ; puis a = 1/2 et b = 1. L’affichage est alors c = 0.75.
6. L’exécution du programme doit conduire à une valeur approchée de la solution α = ln(2) ' 0, 6931471 de
l’équation f (x) = 0, pour n’importe quelles valeurs initiales a et b (avec a < b), par dichotomie.
eps donne la précision souhaitée de l’approximation. Quant à la dernière ligne c := (a + b)/2 : sans cette ligne,
on aurait une valeur approchée à 2*eps près car la boucle repeat until s’arrête quand l’encadrement [a,b] de la
solution est de taille inférieure à 2*eps. Donc on reprend le milieu une dernière fois pour avoir une précision de
2*eps/2=eps.
Remarque : La méthode de dichotomie est une méthode simple mais plutôt efficace car dans notre exemple, il ne
faudrait que 11 manipulations pour obtenir une valeur approchée de la solution à 0.001 près.
Téléchargement