Chap13 2010
Chap13 2010
2 Analyse et Turbo-Pascal 5
2.1 Déclaration d’une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Suites récurrentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 Calcul du terme de rang n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 Vitesse de convergence vers une limite connue . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.3 Majoration par une suite géométrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.4 Récurrence portant sur plusieurs termes . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Calcul de sommes et applications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.2 Calcul approché de la somme d’une série . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.3 Calcul approché d’intégrales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Solution d’une équation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1 Méthode de dichotomie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.2 Méthode de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Procédures. 9
3.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1 Déclaration de la procédure : passage par valeur ou par variable. . . . . . . . . . . . . . 9
3.1.2 Variable locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Exemples de procédures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2.1 Calcul du terme de rang n d’une suite définie par récurrence . . . . . . . . . . . . . . . 9
3.2.2 Recherche de la solution d’une équation par dichotomie . . . . . . . . . . . . . . . . . . 10
3.2.3 Procédure échange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Récursivité. 11
4.1 Fonction récursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.1.1 Fonction factorielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.1.2 Fonction puissance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2 Procédure récursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
BEGIN
{PROGRAMME PRINCIPAL}
END.
Dans la partie déclarative : déclarer une variable, c’est réserver cette “ case ”, en lui donnant un nom,
qu’on appelle un identificateur, et en définissant le type de cette variable, c’est-à-dire l’ensemble auquel elle
appartient.
Un identificateur est soit une lettre (x,u,k...) soit un mot (alea, limit...).
Un type est un ensemble muni d’opérations et de fonctions.
Les types utilisés cette année sont les suivants :
b) longint : ensemble Z des entiers relatifs. On utilise ce type quand on doit utiliser des entiers dépassant la
valeur 215 . Les opérations sont les mêmes que pour integer.
d) boolean : une variable de ce type n’est pas un nombre mais ne peut prendre que deux valeurs, TRUE
ou FALSE.
Remarque : On utilisera également des expressions booléennes, pouvant prendre également les 2 valeurs
TRUE ou FALSE, représentant une condition, qui peut être réalisée ou non, souvent sous forme de comparaison.
Exemples : i=1, f(a)>=0, abs(b-a)<1e-8 (ce qui se traduit par : |b − a| < 10−8 ).
Une expression booléenne, ou une variable booléenne, est attendue après while ou if ou until.
e) array[a..b] of integer : Il s’agit d’un tableau unidimensionnel de nombres du type précisé (ici des
entiers) dont les “cases” sont numérotées de a à b. Les différentes cases du tableau sont notées t[k], (élément
numéro k du tableau) et se comportent comme des variables du type précisé. (Voir chapitre 4.)
Dans le programme principal : on donne une valeur à une variable de deux façons possibles :
b) lecture : readln(x) ; (pendant l’exécution du programme, l’utilisateur entre au clavier la valeur qu’il
désire affecter à x. L’instruction readln(x) ; effectue “ l’enregistrement ” de cette valeur à l’adresse x.
Remarques :
• quand il n’y a qu’une seule instruction, il est inutile de mettre “ begin ” et “ end ; ”
• La variable k est forcément de type entier (integer).
• Les instructions ne doivent jamais modifier la valeur de k (ne pas affecter une valeur à k).
• On doit avoir n ≥ p.
Exécution : k prend d’abord la valeur p (affectation initiale) et augmente de 1 à chaque étape. A chaque
étape, le programme effectue les instructions encadrées par begin et end. Après l’étape correspondant à k=n,
le programme passe à l’instruction qui suit le “ end ” de la boucle.
Exemples
u :=a ; for k :=1 to n do u :=f(u) ; (calcul du terme un d’une suite de premier terme u0 = a et définie
par la relation de récurrence un+1 = f (un )).
Exemple : Soit u une suite de premier terme u0 = a et définie par : un+1 = f (un ), qui converge vers une
limite `. La boucle qui suit calcule le plus petit rang n tel que un soit une valeur approchée de ` à 10−8 près :
u :=a ; n :=0 ;
while abs(u-`)>1e-8 do
begin
u :=f(u) ; n :=n+1 ;
end ;
u :=a ; n :=0 ;
repeat
u :=f(u) ;
n :=n+1 ;
until abs(u-`)<=1e-8
On note qu’il n’est pas nécessaire d’encadrer les instructions effectuées dans la boucle par begin et end.
La structure est :
if <condition> then <instruction 1>
else <instruction 2> ;
Traduction : Si la condition est vraie alors effectuer l’instruction 1, sinon effectuer l’instruction 2.
La fonction random ;, sans variable donne un nombre réel au hasard dans l’intervalle [0, 1].
Si on a l’instruction X :=random ; dans un programme, la variable X est une variable aléatoire qui suit une loi
uniforme sur l’intervalle [0, 1] (variable à densité).
2 Analyse et Turbo-Pascal
2.1 Déclaration d’une fonction
La déclaration d’une fonction se fait entièrement dans la partie déclarative.
Bien vérifier que le type de la variable d’entrée et celui de la variable de sortie sont cohérents avec le problème
proposé.
Exemple 1 :
function f(x :real) :real ;
begin
f :=2*x/(1+x*x) ;
end ;
2x
Si x est la variable d’entrée, la variable de sortie sera ; f est une fonction réelle de variable réelle.
1 + x2
Dans le programme principal on peut utiliser par exemple f(5), f(u) (où u est une variable réelle), f(k)(où
k est une variable entière). Attention ! ces expressions ne s’utilisent pas comme des variables mais comme des
constantes : on peut soit afficher leur valeur, soit affecter leur valeur à une certaine variable, soit les utiliser
dans un calcul.
Exemple 2 : lorsqu’il y a un problème d’ensemble de définition, il faut penser à utiliser une structure condi-
tionnelle.
Function f(x :real) :real ;
begin
if x<=-1 then f :=0
else f :=sqrt(x+1) ;
end ;
Exemple 3 : le calcul des valeurs d’une fonction peut s’écrire avec un algorithme plus complexe, avec utilisa-
tion éventuelle de variable(s) locale(s).
u :=a ;
for k :=1 to n do u :=f(u) ;
u :=a ;
n :=0 ;
while abs(u-`)>1e-8 do begin
u :=f(u) ;
n :=n+1 ;
end ;
writeln(’le rang cherché est ’,n) ;
u :=a ; v :=v0 ;
while v>1e-4 do begin
u :=f(u) ;
v :=q*v ;
end ;
writeln(’valeur de la limite : ’,u :7 :4) ;
u :=a ; v :=b ;
for k :=2 to n do begin
w :=sqrt(u*v) ;
u :=v ;
v :=w ;
end ;
writeln(’le terme de rang ’,n,’ est ’,w :6 :4) ; {pour n ≥ 2}
s :=0 ;
for k :=1 to n do s :=s+f(k) ;
Remarque : dans les cas simples il n’est pas nécessaires de déclarer la fonction.
Exemple : pour calculer la somme des carrés des n premiers entiers non nuls :
s :=0 ;
for k :=1 to n do s :=s+k*k ;
Pour n “grand”, la somme partielle Sn sera une valeur approchée de la somme de la série.
Cas particulier : série alternée. Soit (un ) une suite positive décroissante de limite nulle, et (vn ) la suite définie
par : ∀n ∈ N vn = (−1)n un .
Alors la série de terme général vn est convergente.
Soit Sn la somme partielle de cette série, alors pour tout entier n impair, Sn ≤ S ≤ Sn+1 . D’autre part comme
lim (Sn+1 − Sn ) = lim un+1 = 0, la somme partielle Sn (ou Sn+1 ) est une valeur approchée de S à 10−4
n→+∞ n→+∞
près dès que |un+1 | < 10−4 .
Program Harmalt ;
var n :integer ;
s :real ;
BEGIN
s :=0 ; n :=1 ;
while 1/(n+1)>1e-4 do begin
if (n div 2)=0 then u :=u + 1/n else u :=u - 1/n ;
n :=n+1 ;
end ;
writeln(’la somme de la série est : ’,u :7 :4) ;
readln ;
END.
b n−1 n
b−a X b−a b−a X b−a
Z
f (t)dt = lim f a+k = lim f a+k
a n→+∞ n n n→+∞ n n
k=0 k=1
Chacune des deux sommes Sn et Sn0 de cette formule est une valeur approchée de l’intégrale, pour n “assez
grand”.
Leur moyenne est également une valeur approchée, encore plus précise (méthode des trapèzes).
x ln x
Calcul de l’intégrale sur [0, 1] de la fonction : f (x) = .
x−1
Cette fonction admet un prolongement par continuité sur [0, 1], en prenant : f (0) = 0 et f (1) = 1.
Program calculintegrale ;
Var s,t :real ;
k,n :integer ;
function f(x :real) :real ;
begin
BEGIN
s :=0 ; n :=100 ;
for k :=0 to n-1 do s :=s+f(k/n) ;
s :=s/n ;
t :=s - f(0)/n + f(1)/n ;
writeln(‘v.a. par méthode des rectangles :’,s :8 :6,’ ou ‘,t :8 :6) ;
writeln(‘v.a. par méthode des trapèzes :’,(s+t)/2 :8 :6) ;
readln ;
END.
f (a)
x1 = a −
f 0 (a)
De même la tangente à la courbe de f au point d’abscisse x1 coupe l’axe des abscisses en un point d’abscisse
f (x1 )
x2 = x1 − 0 .
f (x1 )
En renouvelant l’opération, on définit une suite (xn )n∈N , en prenant x0 = a, et pour tout entier naturel n,
f (xn )
xn+1 = xn − 0 .
f (xn )
Cette suite converge vers la racine α de l’équation f (x) = 0.
Il suffit d’écrire un programme calculant le terme de rang n d’une suite définie par récurrence, pour n “assez
grand”. (Voir paragraphe 10.1)
3 Procédures.
3.1 Généralités
3.1.1 Déclaration de la procédure : passage par valeur ou par variable.
Une procédure est un sous-programme entièrement écrit dans la partie déclarative. Ce programme effectue
une certaine “ tâche ” lorsque l’on effectue dans le programme principal un appel de la procédure utilisant
l’identificateur (= nom) de la procédure ainsi que la ou les variable(s) auxquelles on veut l’appliquer. On peut
ainsi appeler plusieurs fois une même procédure, en l’appliquant éventuellement à différentes variables, ce qui
a pour avantage d’allèger et clarifier le programme principal.
Dans ce cas, si on effectue dans le programme principal l’appel : truc(u) ;, la procédure effectue le calcul
contenu dans la procédure “ truc ” en remplaçant x par la variable u, et la modification sur u opérée par cette
procédure est conservée dans le programme principal.
Conclusion : on utilise le passage par variable quand on veut que la procédure modifie la valeur de la
variable (exemples : procédure “ échange ”, procédure de lecture d’une variable dont la valeur est entrée au
clavier,...), on utilise le passage par valeur quand on veut simplement utiliser la valeur d’une variable, sans la
modifier (exemples : procédure d’affichage d’un résultat, procédure de calcul d’un discriminant à partir des
paramètres a, b, c d’une équation du second degré...).
Remarque : Toute variable du programme principal utilisée dans une procédure (avec ou sans variable) passe
par variable dans la procédure.
BEGIN
writeln(’donner le premier terme u0 de la suite’) ;
readln(u) ;
writeln(’donner le rang’) ;
readln(n) ;
suite(n) ;
writeln(’le terme de rang ’,n,’ est ’,u :8 :6) ;
readln ;
END.
Remarques : Ici le nombre entier n est passé par valeur, car on n’a pas à le modifier, mais simplement
l’utiliser.
La variable u n’est pas une variable de la procédure, mais du programme principal : elle passe automatique-
ment par variable dans la procédure, et la modification effectuée sur u par la procédure est effective dans le
programme principal.
La variable k est une variable locale de la procédure, on n’en a pas besoin dans le programme principal.
program chap3ex2 ;
var a,b :real ;
function f(x :real) :real ;
(...)
procedure dichotomie(var a,b :real) ;
var c : real ;
begin
while b-a>1e-4 do begin
c :=(a+b)/2 ;
if f(a)*f(c)<0 then b :=c else a :=c ;
end ;
BEGIN
a :=1 ; b :=3 ;
dichotomie(a,b) ;
writeln(’la solution est : ’,a :6 :4) ;
readln ;
END.
Remarques : Le type est integer dans cet exemple, la variable locale z est donc de ce même type.
Les deux variables x et y sont passées par variable, puisque la procédure doit entraı̂ner une modification de ces
variables.
4 Récursivité.
4.1 Fonction récursive
Une fonction est dite récursive dans le cas où elle s’applique aux entiers naturels, et que la valeur au rang
n + 1 dépend directement de la valeur au rang n.
Dans ce cas, dans la déclaration de la fonction on peut appeler cette même fonction, comme s’il s’agissait d’une
boucle.
0! = 1 et ∀n ∈ N∗ n! = n(n − 1)!
Remarque : la variable de sortie de cette fonction est longint ; ou même real ; car on atteint très vite
des grandes valeurs entières, dépassant la capacité du type integer ;.
x0 = 1 et ∀n ∈ N∗ xn = xxn−1
Remarque : si on veut passer la variable u par adresse, on est obligé de définir une variable locale v car
la procédure ne peut pas marcher avec f (u) qui est considérée comme une constante et non comme une
variable. On contourne ce problème en donnant à une variable la valeur de cette constante.
Le type tab s’emploie alors de la même façon que n’importe quelle variable simple (entière ou réelle) mais
avec les caractéristiques d’un tableau, c’est-à-dire que l’on ne peut l’utiliser qu’à l’aide d’une boucle.
Dans le programme principal : un tableau s’utilise toujours avec une boucle, le cas le plus fréquent étant
celui d’une boucle for...to...do.
Exemple :
for i := 1 to 200 do begin
t[i] := random(1000) ;
write(t[i] :4) ;
end ;
{tire au sort un tableau de 200 entiers compris entre 0 et 999, et l’affiche}.
Remarque : i est le numéro de la “case”, t[i] est la valeur contenue dans la “case”.
5.1.2 Compteur
Il s’agit d’un entier, noté par exemple n, que l’on initialise à la valeur 0, et auquel, à chaque étape d’une
certaine boucle, on va ajouter 1 si une certaine condition est remplie.
Exemple 1 : pour compter le nombre d’éléments d’un tableau t qui sont supérieurs à 700 :
For i := 1 to 200 do if t[i]>700 then n :=n+1 ;
Writeln(’le nombre cherché est ’,n) ;
On peut aussi utiliser un compteur pour compter le nombre de passages dans une boucle, le nombre d’af-
fectations effectuées, le nombre de comparaisons...
Exemple 2 :soit une suite définie par son premier terme u0 , et par une relation de récurrence du type :
un+1 = f (un ), et dont on connaı̂t par ailleurs la limite l.
n :=0 ;
While abs(u-l)>1e-8 do begin
u :=f(u) ;
n :=n+1 ;
end ;
Le nombre n obtenu est le plus petit rang pour lequel un est une approximation de l à moins de 10−8 près.
end ;
Remarque : La boucle intérieure appelée petit tri a pour effet de placer le plus grand des j + 1 premiers
éléments du tableau en (j + 1)-ème position.
b) Recherche dichotomique :
Remarque : La recherche dichotomique est une fonction récursive. Elle est plus rapide que la recherche
séquentielle pour les tableaux de taille importante.
On sait que les fonctions random et random(n) permettent d’effectuer des tirages au sort. On va donc utiliser
ces fonctions pour simuler des expériences aléatoires permettant d’obtenir une valeur pour une variable suivant
une certaine loi de probabilité, usuelle ou non. En effet cette variable aléatoire est souvent définie au départ
comme nombre de ceci, ou rang de cela, à l’issue d’un certain processus.
BEGIN
randomize ;
X :=0 ;
repeat
Y :=random(5) ;
X :=X+1 ;
until Y<=1 ;
writeln(’X=’,X) ;
END.
2
Remarque : On peut remplacer par un paramètre p quelconque, sachant que la fonction random suit une loi
5
uniforme sur [0, 1], et donc que si Y :=random on a P (Y ≤ p) = p. Cela donne le programme suivant :
BEGIN
randomize ;
writeln(’donner le paramètre’) ;
readln(p) ;
X :=0 ;
repeat
Y :=random ;
X :=X+1 ;
until Y<=p ;
writeln(’X=’,X) ;
END.
Si on renouvelle cette expérience un grand nombre de fois, par exemple 10 000 fois, la moyenne des valeurs
obtenues pour X est une estimation de l’espérance de X.
On peut ainsi vérifier (à l’aide d’une boucle for..to..do) que l’espérance d’une variable de loi géométrique
1
G(p) est .
p
BEGIN
randomize ;
writeln(’donner les paramètres n et p’) ;
readln(n) ; readln(p) ;
X :=0 ;
for k :=1 to n do
begin
Y :=random ;
if Y<=p then X :=X+1 ;
end ;
writeln(’X=’,X) ;
END.
Program loihyper ;
var t : array[1..100] of integer ;
i,k :integer ;
procedure echange (...)
BEGIN
readln(k) ;
for i :=1 to 35 do t[i] :=1 ;
for i :=36 to 100 do t[i] :=0 ;
X :=0 ;
for i :=1 to k do
begin
a :=1+random(101-i) ;
if t[a]=1 then X :=X+1 ;
echange(t[a],t[101-i]) ;
end ;
writeln(’X=’,X) ;
END.
La fonction suivante donne une valeur de Y ,→ E(a), où a est un réel strictement positif.
Remarque : cette méthode peut s’appliquer à la construction de n’importe quelle variable Y = g(X), où
X ,→ U(]0, 1[) et où g est une bijection de ]0, 1[ vers l’ensemble de valeurs de Y , avec :
Y :=g(random) ;
la fonction g étant déclarée par ailleurs.
On va prendre une suite de variables aléatoires de loi uniforme sur [0, 1] (la plus facile à modéliser en Turbo-
Pascal, à l’aide de la fonction random !) et caculer une valeur de Zn pour n assez grand.
La fonction suivante donne une valeur de la variable T , qui suit une loi normale centrée réduite, pour un n
donné dans le programme principal par l’utilisateur.