mapple chapitre2

24
(1.1.3) O (1.1.1) O O O O (1.1.2) 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 restart; u:=n->2*n^2+2; u := n/2 n 2 C 2 u(n); 2 n 2 C 2 u(5); 52 plot(u,1..20, style=point);

Upload: mateus-lanzi-ciola

Post on 25-Oct-2015

39 views

Category:

Documents


2 download

DESCRIPTION

Mapple

TRANSCRIPT

(1.1.3)

OOOO

(1.1.1)OOOO

OOOO

OOOO

OOOO

(1.1.2)

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

restart;

u:=n->2*n^2+2;

u := n/2 n2C2

u(n);

2 n2C2

u(5);52

plot(u,1..20, style=point);

(1.1.6)

(1.1.5)OOOO

OOOO

OOOO

OOOO

(1.1.4)

2 4 6 8 10 12 14 16 18 20

100

200

300

400

500

600

700

800

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).

restart;

f:=x->1/(x+1);

f := x/1

xC1

u:=n->f(u(n-1));u := n/f u nK1

u(0):=3;u(12);u 0 := 3

411665

Représentation des termes d'une suiteLa 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.

OOOO

(1.2.1)

OOOO

OOOO

(1.2.2)

OOOO

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.

restart;

f:=x->1/(x+1);

u:=n->f(u(n-1));

u(0):=1;

f := x/1

xC1u := n/f u nK1

u 0 := 1

seq([n,u(n)], n=0..20);

0, 1 , 1,12

, 2,23

, 3,35

, 4,58

, 5,813

, 6,1321

, 7,2134

, 8,3455

, 9,

5589

, 10,89144

, 11,144233

, 12,233377

, 13,377610

, 14,610987

, 15,9871597

,

16,15972584

, 17,25844181

, 18,41816765

, 19,676510946

, 20,1094617711

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 d e u(n)

directement (c.a.d, si on fait plot(u,0..20) et si on

execute Maple on obtient un message d'erreur)

OOOO

0 5 10 15 200,5

0,6

0,7

0,8

0,9

1,0

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.

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);

f := x/xC1

x2C4

u := n/f u nK1u 0 := 0

OOOO

OOOO

0 2 4 6 8 100

0,1

0,2

0,3

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.

restart;

f:=x->1/(x+1);

u:=n->f(u(n-1));

u(0):=1.;

OOOO

(2.1.3)

OOOO

OOOO

(2.1.2)

(1.3.3)

OOOO

OOOO

(1.3.2)

(2.1.1)

OOOO

(1.3.1)

f := x/1

xC1u := n/f u nK1

u 0 := 1.

u(1);u(3);u(5);0.50000000000.59999999990.6153846154

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

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.

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

01

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 elsef n K 1 C f n K 2 end ifend proc

# 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 := 0f 1 := 1

Représentation graphique d'une telle suite :

OOOO

OOOO

OOOO

OOOO

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

restart;

f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1.:

plot([seq([n,u(n)],n=1..10)]);

1 2 3 4 5 6 7 8 9 100,50

0,52

0,54

0,56

0,58

0,60

0,62

0,64

0,66

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 :

# Exemple

restart;

OOOO

(2.2.1)

OOOO

OOOO

OOOO

OOOO

f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1.:

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

plot([seq(escalier(i),i=1..20)]);

0,50 0,52 0,54 0,56 0,58 0,60 0,62 0,64 0,660,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 :

restart;

f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1:

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

OOOO

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):

display(p1,p2,scaling=constrained);

0 0,1 0,2 0,3 0,4 0,5 0,6 0,70

0,1

0,2

0,3

0,4

0,5

0,6

0,7

et l'on peut bien évidement faire apparaître la courbe de f: restart;

f:=x->1/(1+x): u:=n->f(u(n-1)): u(0):=1:

escalier:=i->([u(i),u(i)],[u(i),u(i+1)]):

p1:=plot([seq(escalier(i),i=1..20)]):

p2:=plot(x,x=0..1):

p3:=plot(f(x),x=0..1):

with(plots):

display(p1,p2,p3,scaling=constrained);

OOOO

OOOO

OOOO

OOOO

(2.2.2)

OOOO

OOOO

0 0,2 0,4 0,6 0,8 1,00

0,2

0,4

0,6

0,8

1,0

Exercice : 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

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);

(2.3.1)

OOOO

OOOO

OOOO

OOOO

OOOO

0 2 4 6 8 100

1

2

3

4

5

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 lorsque 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

restart;

f:=x->R*x: u:=n->f(u(n-1)): u(0):=2:

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

rsolve(v(n)=R*v(n-1),v(n));

v 0 Rn

On notera que l'appel u(n) reste infructueux, bien que l'on espérait faire

OOOO

(2.3.3)

OOOO

(2.3.5)

(2.3.2)

OOOO

OOOO

OOOO

(2.3.4)OOOO

OOOO

OOOO

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

restart;

f:=x->R*x: u:=n->f(u(n-1)): u(0):=2:

rsolve(v(n)=R*v(n-1),v(n));v(n);

v 0 Rn

v n

w:=unapply(rsolve(v(n)=R*v(n-1),v(n)),n);

w := n/v 0 Rn

w(n);

v 0 Rn

v(0):=2: R:=0.1:

seq(w(i),i=1..5);0.2, 0.02, 0.002, 0.0002, 0.00002

plot(w,0..10, style=point);

OOOO

OOOO

OOOO

(2.3.6)

(2.3.7)

(2.3.8)

OOOO

OOOO

(2.3.9)

0 2 4 6 8 100

0,5

1,0

1,5

2,0

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

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

w:=unapply(simplify(rsolve(v(n)=v(n-1)+r,v(n))),n);w := n/v 0 Cr n

w(n);v 0 Cr n

v(0):=2.;r:=0.5; seq(w(i), i=1..10);v 0 := 2.

r := 0.52.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0

plot(w,0..10, style=point);

4.

(3.1.1)

2.

OOOO

1.

OOOO

3.

0 2 4 6 8 102

3

4

5

6

7

Exercices : suites récurrentes simples

Exercice 1Soit 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.

Pour n donné, écrire avec une boucle "for" la séquence des n premiers termes de la suite. Observer la convergence de la suite vers la solution f(x)=x. Tracer le graphe de u(n) en fonction de n. 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.

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 1Ku n

2.7 u n 1Ku n

(3.2.1)

(3.2.3)

OOOO

OOOO

OOOO

OOOO

(3.2.2)

OOOO

Correction de l'exercice 1restart:

f:=x->2.7*x*(1-x);f := x/2.7 x 1Kx

u:=n->f(u(n-1));u(0):=0.1;u := n/f u nK1

u 0 := 0.1

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,

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

p1:=plot(f(x),x=0..1):

p2:=plot(x,x=0..1):

with(plots):

display(p1,p2);

OOOO

x0 0,2 0,4 0,6 0,8 1,0

0

0,2

0,4

0,6

0,8

1,0

# Graphe de u(n) en fonction de n

plot([seq([n,u(n)], n=0..50)], style =point);

OOOO

OOOO

OOOO

0 10 20 30 40 500,1

0,2

0,3

0,4

0,5

0,6

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):

with(plots):

display(p1,p2,p3, scaling=constrained);

OOOO

(3.3.2)

OOOO

(3.3.1)

OOOO

0 0,2 0,4 0,6 0,8 1,00

0,2

0,4

0,6

0,8

1,0

Exercice 2Voici un exemple de suite récurrente définie en utilisant une procédure qui utilise la fonctionalité "remember". Interpréter les résultats obtenus.

restart: fac:=proc(n::nonnegint)#nonnegint :entier non

négatif

option remember;

if n=0 then 1 else n*fac(n-1)

fi

end:

t:=time(); fac(1000):time()-t;t := 6.160

0.031

t:=time(); fac(1500):time()-t;t := 6.191

0.

OOOO

OOOO

OOOO

OOOO

OOOO

Correction de l'exercice 2Si 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).

Exercice 3Ecrire 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 3restart:

with(plots):

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:

G:=x->0.2+1.3*x^2:escargot(G,0.02,0,0.5,20);

(4.1.1)

(4.1.2)

OOOO

1.

OOOO

OOOO

0 0,1 0,2 0,3 0,4 0,50

0,1

0,2

0,3

0,4

0,5

Suite contractanteSoient 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

Définir f et sa dérivée avec Maple.

Correction de 1restart: f:=x->x/2+1/x;

f := x/12

xC1x

f1:=D(f);

(4.4.2)

OOOO

(4.4.1)

OOOO

4.

(4.2.1)

(4.3.1)

OOOO

(4.2.2)

OOOO

(4.1.2)

OOOO

3.

2.

OOOO

f1 := x/12

K1

x2

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})

Correction de 2

#evalf(maximize(f(x),{x},{x=1..2})) avec #Maple 5;

#sur Maple 11

maximize(f(x),x=1..2);32

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 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 3maximize(f1(x), x=1..2);

14

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| .

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 u:=n->f(u(n-1));u(0):=1;u(1);

u := n/f u nK1

u 0 := 132

# On va chercher le point fixe de la fonction f

solve(f(x)-x=0,x);

K 2 , 2

5.

OOOO

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).

Visualiser cette convergence avec la procédure Escargot vue en cours.

Correction de 5escargot:=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);

OOOO

6.

8.

OOOO

7. (4.6.1)

1,0 1,2 1,4 1,6 1,8 2,01,0

1,2

1,4

1,6

1,8

2,0

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# 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

Déterminer un entier p à partir du quel |u(p)-a|< 10^(-5), où a est la limite de u. (faire une boucle while)

Correction de 7i:=0:

while evalf(abs(u(i)-sqrt(2)))>=10^(-5) do

i:=i+1:

(4.1)

OOOO

(4.7.1)

OOOO

9.

OOOO

od:

print(p=i);p = 3

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) .

i:=0:

while evalf(abs(u(i)-sqrt(2)))>=10^(-5) do

i:=i+1:

od:

print(u[p]=u(i));

up =577408