Chapitre 2 : Les suites avec MAPLE

publicité
Chapitre 2 : Les suites avec MAPLE
Généralité sur les suites
Définir une suite
Une suite étant une application sur des entiers, on la définera comme une
fonction à une variable, sauf que l'on n'oubliera pas que la variable est
entière :
Exemple 1 : Définir la suite de terme général u(n)=2n^2+2, avec un
appel paramètrique et un appel par valeur. Puis construire le graphe de
u pour n entre 1 et 20
O restart;
O u:=n->2*n^2+2;
u := n/2 n C2
2
(1.1.1)
2 n2 C2
(1.1.2)
52
(1.1.3)
O u(n);
O u(5);
O plot(u,1..20, style=point);
800
700
600
500
400
300
200
100
2
4
6
8
10
12
14
16
18
20
Exemple 2 : Définir une suite récurrente de type u(n)=f(u(n-1)), avec
u(0)=3 et f:x->1/(x+1), puis donner la valeur de u(12).
O restart;
O f:=x->1/(x+1);
f := x/
O u:=n->f(u(n-1));
1
x C1
u := n/f u n K1
(1.1.4)
(1.1.5)
O u(0):=3;u(12);
u 0 := 3
411
665
(1.1.6)
Représentation des termes d'une suite
La fonction plot permet aussi de représenter graphiquement les termes
d'une suite et d'en déduire ainsi le comportement de la suite à l'infini.
Exemple 1: Représenter graphiquement la suite récurrente de type u(n)=f
(u(n-1)), avec u(0)=1 et f:x->1/(x+1) , pour n entre 0 et 20.
O restart;
O f:=x->1/(x+1);
u:=n->f(u(n-1));
u(0):=1;
1
x C1
u := n/f u n K1
u 0 := 1
f := x/
O seq([n,u(n)], n=0..20);
1
2
3
5
0, 1 , 1,
, 2,
, 3,
, 4,
, 5,
2
3
5
8
55
89
144
233
, 10,
, 11,
, 12,
89
144
233
377
1597
2584
4181
16,
, 17,
, 18,
,
2584
4181
6765
8
13
21
34
, 6,
, 7,
, 8,
, 9,
13
21
34
55
377
610
987
, 13,
, 14,
, 15,
,
610
987
1597
6765
10946
19,
, 20,
10946
17711
(1.2.1)
(1.2.2)
O plot([seq([n,u(n)], n=0..20)], style=point);
#puisque u(n) est donnée en fonction de u(n-1) et n'est pas
en fonction de n, on ne peut pas tracer la courbe de u(n)
directement (c.a.d, si on fait plot(u,0..20) et si on
execute Maple on obtient un message d'erreur)
1,0
0,9
0,8
0,7
0,6
0,5
0
5
10
15
20
Exemple 2 : Soit f la fonction définie en tout point par
f(x)=(x+1)/(x^2+4). On considère la suite entière suivante
u(n)=f(u(n-1)), avec u(0)=0, écrire et représenter u pour n entre 0 et 10.
O restart;
f:=x->(x+1)/(x^2+4);
u:=n->f(u(n-1));
u(0):=0;
plot([seq([n,u(n)],n=0..10)], style=point);
x C1
f := x/ 2
x C4
u := n/f u n K1
u 0 := 0
0,3
0,2
0,1
0
0
2
4
6
8
10
Calcul des termes d'une suite
On peut calculer simplement la valeur des termes d'une suite et même le
calcul de plusieurs d'entre eux (à l'aide de la demande de boucle seq par
example)
On notera par ailleurs qu'il peut être bon de travailler avec des nombres
en virgule flottante ("1." et non par "1") , afin que Maple ne travaille pas
de manière symbolique.
Considérons l'exemple 1 du pragraphe ci-dessous. donner les valeurs de
u en 1 , 3 et 5, puis les valeurs de u sur une ligne pour tout n entre 1 et
10.
O restart;
O f:=x->1/(x+1);
u:=n->f(u(n-1));
u(0):=1.;
1
x C1
u := n/f u n K1
u 0 := 1.
f := x/
(1.3.1)
O u(1);u(3);u(5);
0.5000000000
0.5999999999
0.6153846154
O seq(u(n), n=1..10);
0.5000000000, 0.6666666667, 0.5999999999, 0.6250000000, 0.6153846154,
0.6190476192, 0.6176470588, 0.6181818181, 0.6179775282, 0.6180555556
(1.3.2)
(1.3.3)
O
Les suites récurrentes simples du type u_n=f(u_{n-1}) :
Définition d'une telle suite
Les deux paragraphes précédents donnent des exemples complet pour
définir une suite récurrente simple (suite où u_n dépend de
u_{n-1}). On peut ajouter l'utilisation de la table "remember" pour
accélerer les appels.
O restart: f := proc(n) if n<2 then n else f(n-1)+f(n-2) fi
end;f(0);f(1);
f := proc n if n ! 2 then n else f n K 1 Cf n K 2 end if end proc
0
1
(2.1.1)
O restart:
f := proc(n) option remember;
if n<2 then n else f(n-1)+f(n-2) fi end;
f := proc n
option remember;
if n ! 2 then n else f n K 1 Cf n K 2 end if
end proc
O # On peut définir la fonction autrement
restart: f := proc(n) f(n-1)+f(n-2) end;
f(0):= 0;f(1):= 1;
f := proc n f n K 1 Cf n K 2 end proc
f 0 := 0
f 1 := 1
Représentation graphique d'une telle suite :
(2.1.2)
(2.1.3)
Ces suites ont un comportement relativement prévisible (vous verrez
dans un de vos cours de mathématiques que ce comportement dépend
essentiellement du premier terme, de la monotonie ou du caractère
contractant de la fonction, etc.).
Exemple : Un premier tracé à l'aide de la fonction plot permet de voir le
comportement asymptotique de la suite
O restart;
O f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1.:
plot([seq([n,u(n)],n=1..10)]);
0,66
0,64
0,62
0,60
0,58
0,56
0,54
0,52
0,50
1
2
3
4
5
6
7
8
9
10
On peut néanmoins le préciser en traçant ce qui est appelé l'escalier (ou
l'escargot selon le cas).
Pour cela, on est amené à introduire une fonction ou une procédure
"escalier" qui va tracer l'escalier à proprement dit :
O # Exemple
O restart;
O f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1.:
O escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):
[seq(escalier(i),i=1..10)];
0.5000000000, 0.5000000000 , 0.5000000000, 0.6666666667 , 0.6666666667,
0.6666666667 , 0.6666666667, 0.5999999999 , 0.5999999999, 0.5999999999 ,
0.5999999999, 0.6250000000 , 0.6250000000, 0.6250000000 , 0.6250000000,
0.6153846154 , 0.6153846154, 0.6153846154 , 0.6153846154, 0.6190476192 ,
0.6190476192, 0.6190476192 , 0.6190476192, 0.6176470588 , 0.6176470588,
0.6176470588 , 0.6176470588, 0.6181818181 , 0.6181818181, 0.6181818181 ,
0.6181818181, 0.6179775282 , 0.6179775282, 0.6179775282 , 0.6179775282,
0.6180555556 , 0.6180555556, 0.6180555556 , 0.6180555556, 0.6180257509
(2.2.1)
O plot([seq(escalier(i),i=1..20)]);
0,66
0,64
0,62
0,60
0,58
0,56
0,54
0,52
0,50
0,50
0,52
0,54
0,56
0,58
0,60
0,62
0,64
0,66
et pour retrouer l'aspect escalier qui rebondit sur la première bissectrice,
on trace simultanément l'escalier et cette dernière :
O restart;
O f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1:
O
O
O
O
escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):
p1:=plot([seq(escalier(i),i=1..20)]):
p2:=plot(x,x=0..0.7):
with(plots):
O display(p1,p2,scaling=constrained);
0,7
0,6
0,5
0,4
0,3
0,2
0,1
0
0
0,1
0,2
0,3
0,4
0,5
0,6
et l'on peut bien évidement faire apparaître la courbe de f:
O restart;
O f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1:
O escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):
O
O
O
O
p1:=plot([seq(escalier(i),i=1..20)]):
p2:=plot(x,x=0..1):
p3:=plot(f(x),x=0..1):
with(plots):
O display(p1,p2,p3,scaling=constrained);
0,7
1,0
0,8
0,6
0,4
0,2
0
0
0,2
0,4
0,6
0,8
Exercice :
O restart: # Correction de l'exercice
f:=x->(3*x-1)/(x+4):
g:=x->1/x:
u:=n->f(u(n-1))+g(u(n-1)): u(0):=0.2;
u 0 := 0.2
O
O
O
O
O
p1:=plot([seq([n,u(n)],n=1..10)], style=point):
escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):
p2:=plot([seq(escalier(i), i=0..10)]):
p3:=plot(x,x=0..5):
with(plots):
display(p1,p2,p3);
1,0
(2.2.2)
5
4
3
2
1
0
0
2
4
6
8
10
Calculs de termes généraux :
La fonction rsolve :
La fonction rsolve permet de calculer le terme général d'une suite dés lors
que celle-ci est définie par une expression de récurrence.
Exemple : Déterminer le terme général des suites qui vérifient :
u(n+1)=R*u(n) avec u(0)=2
O restart;
O
O f:=x->R*x: u:=n->f(u(n-1)): u(0):=2:
O u(n);
Maple ne peut pas donner l'expression de u(n) en fonction de n, pour cela il faut utiliser rsolve
Error, (in u) too many levels of recursion
O rsolve(v(n)=R*v(n-1),v(n));
v 0 Rn
(2.3.1)
On notera que l'appel u(n) reste infructueux, bien que l'on espérait faire
apparaître le terme général. La fonction rsolve (s'utilise de la même
manière que dsolve pour la résolution d'équations différentielles que
nous n'aborderons pas dans notre cours).
On peut alors récupérer ces solutions et travailler avec :
Soit u(n) la suite définie par u(n+1)=R*u(n) et u(0):=a.
Exprimer u(n) en fonction de n en utilisant rsolve
O restart;
O f:=x->R*x: u:=n->f(u(n-1)): u(0):=2:
O rsolve(v(n)=R*v(n-1),v(n));v(n);
n
v 0 R
v n
(2.3.2)
O w:=unapply(rsolve(v(n)=R*v(n-1),v(n)),n);
w := n/v 0 Rn
(2.3.3)
O w(n);
v 0 Rn
O v(0):=2: R:=0.1:
O seq(w(i),i=1..5);
0.2, 0.02, 0.002, 0.0002, 0.00002
O plot(w,0..10, style=point);
(2.3.4)
(2.3.5)
2,0
1,5
1,0
0,5
0
0
2
4
6
8
10
On va donner l'expression du terme générale de la suite définie par
u(n+1)=r+u(n),u(0)=2
O restart:
f:=x->x+r:
u:=n->f(u(n-1)):u(0):=2:
simplify(rsolve(v(n)=v(n-1)+r,v(n)));
v 0 Cr n
(2.3.6)
O w:=unapply(simplify(rsolve(v(n)=v(n-1)+r,v(n))),n);
w := n/v 0 Cr n
(2.3.7)
O w(n);
v 0 Cr n
O v(0):=2.;r:=0.5; seq(w(i), i=1..10);
v 0 := 2.
r := 0.5
2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0
O plot(w,0..10, style=point);
(2.3.8)
(2.3.9)
7
6
5
4
3
2
0
2
4
6
8
10
O
Exercices : suites récurrentes simples
Exercice 1
Soit f la fonction définie par f(x)=2.7x(1-x) et la suite récurrente donnée par
u(n+1) =f(u(n)) et u(0)=0.1.
1. Pour n donné, écrire avec une boucle "for" la séquence des n premiers termes de la suite.
2. Observer la convergence de la suite vers la solution f(x)=x.
3. Tracer le graphe de u(n) en fonction de n.
4. Tracer sur un même graphique la courbe représentant f, la bissectrice et la ligne brisée
joinant les points (u(n),u(n)) et (u(n), f(u(n)).
Reprendre l'exercice avec f(x)=x(x+2)/(x+5) et u(0)=2.
O restart: f:=x->2.7*x*(1-x):u(n+1):=f(u(n)):u(0):=0.2:
w:=unapply(u(n+1),n);w(n);
w := n/2.7 u n 1 Ku n
2.7 u n 1 Ku n
(3.1.1)
Correction de l'exercice 1
O restart:
O f:=x->2.7*x*(1-x);
f := x/2.7 x 1 Kx
O u:=n->f(u(n-1));u(0):=0.1;
u := n/f u n K1
u 0 := 0.1
(3.2.1)
(3.2.2)
O liste:=proc(n)
local lis, i;
lis:=[];
for i from 1 to n do
lis:=[op(lis),u(i)]
od
end:liste(26);
# on observe que u convergente et sa limite est trés proche de 0.629, on peut vérifier ce résultat
en cherchons le point fixe de f, c'est-à-dire résoudre l'équation f(x)=x
0.243, 0.4966677, 0.6749700186, 0.5923408299, 0.6519775622, 0.6126376156,
(3.2.3)
0.6407444723, 0.6215156824, 0.6351316349, 0.6256964913, 0.6323410588,
0.6277117793, 0.6309621938, 0.6286920402, 0.6302835689, 0.6291707175,
0.6299502994, 0.6294048830, 0.6297868159, 0.6295195326, 0.6297066648,
0.6295756890, 0.6296673801, 0.6296032004, 0.6296481282, 0.6296166797
O p1:=plot(f(x),x=0..1):
p2:=plot(x,x=0..1):
with(plots):
display(p1,p2);
1,0
0,8
0,6
0,4
0,2
0
0
0,2
0,4
0,6
0,8
x
O # Graphe de u(n) en fonction de n
plot([seq([n,u(n)], n=0..50)], style =point);
1,0
0,6
0,5
0,4
0,3
0,2
0,1
0
10
20
30
O escalier:=i->([u(i),u(i)], [u(i),u(i+1)]):
p1:=plot([seq(escalier(i),i=0..20)]):
p2:=plot(x,x=0..1):
p3:=plot(f(x),x=0..1):
O with(plots):
O display(p1,p2,p3, scaling=constrained);
40
50
1,0
0,8
0,6
0,4
0,2
0
0
0,2
0,4
0,6
0,8
1,0
Exercice 2
Voici un exemple de suite récurrente définie en utilisant une procédure qui utilise la fonctionalité
"remember". Interpréter les résultats obtenus.
O restart: fac:=proc(n::nonnegint)#nonnegint :entier non
négatif
option remember;
if n=0 then 1 else n*fac(n-1)
fi
end:
O t:=time(); fac(1000):time()-t;
t := 6.160
0.031
(3.3.1)
O t:=time(); fac(1500):time()-t;
t := 6.191
0.
(3.3.2)
Correction de l'exercice 2
Si l'utilisateur utilise l'otion remember, tous les calculs effectués par la procédure seront gardés
dans la table remember associée ainsi crée. Le temp de calcul de fac(1500) est court que celui de
fac(1000).
O
Exercice 3
Ecrire une procédure "escargot" qui permet une étude graphique pour les suites récurrentes
simples, pour une valeur donnée de u0, pour N fixé et x entre a et b.
Correction de l'exercice 3
O restart:
O with(plots):
O escargot:=proc(f,u0,a,b,N)
local p1,p2,p3,u,escalier:
u:=n->f(u(n-1)):
u(0):=u0:
escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):
p1:=plot([seq(escalier(i),i=1..N)]):
p2:=plot(x,x=a..b):
p3:=plot(f(x),x=a..b):
with(plots):
display(p1,p2,p3,scaling=constrained);
end:
O G:=x->0.2+1.3*x^2:escargot(G,0.02,0,0.5,20);
0,5
0,4
0,3
0,2
0,1
0
0
0,1
0,2
0,3
0,4
0,5
O
Suite contractante
Soient I un intervalle de R (non vide et non réduit à un point), f une application de I dans R et k un
réel positif et strictement inférieur à 1.
On dit que f est contractante si, pour tout x,y dans I,
|f(x)-f(y)| <= k |x-y|.
Une suite u recurrente (u(n)=f(u(n-1))) est dite contractante si, pour tout, n,m deux entiers, on a
|u(n+1)-u(m+1)| <= k|u(n)-u(m)|
Remarque : abs(x) c'est la valeur absolu de x
On va étudier la convergence des suites contractantes.
On considère la fonction f définie sur [1,2] par f (x)=x/2+1/x
1. Définir f et sa dérivée avec Maple.
Correction de 1
O restart: f:=x->x/2+1/x;
f := x/
1
1
xC
2
x
(4.1.1)
O f1:=D(f);
(4.1.2)
1
1
K 2
(4.1.2)
2
x
2. Montrer avec Maple que, pour tout x dans [1,2], f est à valeur dans [1,2].(utiliser maximize et
minimize, (maximize(f(x),x=a..b) pour Maple 11 et maximize(f(x),{x},{x=1..2})
f1 := x/
Correction de 2
O
#evalf(maximize(f(x),{x},{x=1..2})) avec #Maple 5;
#sur Maple 11
maximize(f(x),x=1..2);
3
2
(4.2.1)
O minimize(f(x),x=1..2);
Nous remarquons alors que f est à valeur dans [sqrt(2),3/2], qui est inclus dans [1,2].
2
(4.2.2)
3. Montrer que, pour tout x dans l'inteval [1,2], on a |D(f)(x)| est inférieure ou égale à 1/2. En
déduire que, pour tout x,y dans l'interval [1,2], on a
|f(x)-f(y)| est inférieure ou égale à 1/2 |x-y| .
Correction de 3
O maximize(f1(x), x=1..2);
1
4
(4.3.1)
O
On va utiliser maintenant le théorème des acroisement fini, puisque f est continue sur [1,2] et
dérivable sur ]1,2[ et pour tout c entre 1 et 2, on a |f'(c)|<=1/2, alors pour tout x,y dans [1,2], on
a
|f(x)-f(y)| <= 1/2 |x-y| .
4. Montrer que la suite u définie par u0= 1 et u(n+1)=f(u(n)) converge et préciser sa limite a.
(définir la suite u par Maple et après déduire sa convergence en utilisant la question 3 et la
solution de l'équation f(x)-x=0)
Correction de 4
O
u:=n->f(u(n-1));u(0):=1;u(1);
u := n/f u n K1
u 0 := 1
3
2
O # On va chercher le point fixe de la fonction f
solve(f(x)-x=0,x);
K 2, 2
(4.4.1)
(4.4.2)
Donc sur l'interval [1,2], f possède un unique point fixe qui est
a= sqrt(2), (on ne prend pas la valeur -sqrt(2) car elle n'appartient pas à l'interval [1,2])
d'après 3, on a |f(x)-f(a)|<=1/2|x-a|, donc pour tout n, on a |f(u(n))-a|<=1/2|u(n-1)-a|, on peut
montrer par récurrence que |u(n)-a|<=(1/2)^n|u(0)-a|, donc lorsqu'on fait tendre n vers l'infini on
déduit que u est une suite convergente et qu'elle converge vers a=sqrt(2).
5. Visualiser cette convergence avec la procédure Escargot vue en cours.
Correction de 5
O escargot:=proc(f,u0,a,b,N)
local p1,p2,p3,u,escalier:
u:=n->f(u(n-1)):
u(0):=u0:
escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):
p1:=plot([seq(escalier(i),i=1..N)]):
p2:=plot(x,x=a..b):
p3:=plot(f(x),x=a..b):
with(plots):
display(p1,p2,p3,scaling=constrained);
end:escargot(f,1,1,2,10);
2,0
1,8
1,6
1,4
1,2
1,0
1,0
1,2
1,4
1,6
1,8
2,0
6. Pour tout n entier positif, donner une majoration de l’erreur |u(n)-a| (par une expression ne
contenant pas a). On rappelle que, pour tout n entier positif, on a
|u(n)-a| <= k^n/(1-k)|u(1)-u(0)| (avec k=1/2 dans ce cas)
Nous remarquons alors que k^n/(1-k)|u(1)-u(0)| est un majorant de |u(n)-a|
Correctin de 6
O # On note M un majorant de |(u(n)-a|,
M:=evalf((1/2)^n/(1-1/2)*(abs(u(1)-u(0))));
M := 0.5000000000n
7. Déterminer un entier p à partir du quel |u(p)-a|< 10^(-5), où a est la limite de u. (faire une
8. boucle while)
Correction de 7
O i:=0:
while evalf(abs(u(i)-sqrt(2)))>=10^(-5) do
i:=i+1:
(4.6.1)
od:
print(p=i);
p =3
(4.7.1)
9. D’après la question précédente u(p) est une valeur approchée de a=sqrt(2) à 10^(-5) près.
Écrire un bloc de commande Maple permettant de calculer u(p) .
O i:=0:
while evalf(abs(u(i)-sqrt(2)))>=10^(-5) do
i:=i+1:
od:
print(u[p]=u(i));
577
up =
408
O
O
(4.1)
Téléchargement