Exercices du chapitre VIII

> restart;

VII.1

Première méthode, récursive

> suite:=proc(n::integer)
option remember:
if n=0
then [1,sqrt(2)]
else [sqrt(op(1,suite(n-1))*op(2,suite(n-1))),
(op(1,suite(n-1))+op(2,suite(n-1)))/2]
fi:
end:

> suite(0);

[1, sqrt(2)]

> suite(1);

[2^(1/4), 
1/2+1/2*sqrt(2)]

> evalf(suite(1));

[1.189207115, 
1.207106781]

Seconde méthode, itérative

> suite2:=proc(n::integer)
local k,a,b,c,d:
a:=1:b:=sqrt(2):
for k to n
# Au rang k, a représente uk-1, b vk-1, c uk et d vk
do c:=sqrt(a*b):
d:=(a+b)/2:
# On remplace alors a et b pour qu'elles représentes uk et vk
a:=c:
b:=d:
od:
[a,b]: # C'est la dernière expression évaluée qui sera renvoyée par suite2
end:

> suite2(0);

[1, sqrt(2)]

> suite2(1);

[2^(1/4), 
1/2+1/2*sqrt(2)]

> evalf(suite2(1));

[1.189207115, 
1.207106781]

Vitesse de convergence

On pourrait utiliser les procédures précédentes, mais cela sera couteux en temps puisqu'il faudra à chaque fois recalculer tous les termes de la suite. Seule la procédure récursive, avec l'option remember peut ici se justifier.

> vitesse:=proc(epsilon::positive)
local k,a,b,c,d:
Digits:=floor(evalf((-ln(epsilon)/ln(10))))+3: # Permet de fixer le nombre de décimale pour dépasser de 2 chiffres la précision attendue (1 chiffre après la virgule et -log(epsilon)+2 après la virgule)
a:=1:b:=sqrt(2):
for k while is(abs(b-a)>epsilon)
do
c:=sqrt(a*b): # On travaille quand même par valeurs exactes pour ne pas cumuler les erreurs
d:=(a+b)/2:
a:=c:
b:=d:
od:
[evalf((a+b)/2),k]:
end:

> vitesse(10^(-30));

[1.19814023473559220743992249228032, 6]

Avec l'intégrale

> J:=2/Pi*Int(1/sqrt(1-t^4),t=0..1);

J := 
2*Int(1/(sqrt(1-t^4)),t = 0 .. 1)/Pi

> for k to 5 do evalf(op(1,suite(k))*J); od;

.9925441784

.9999860510

1.000000000

1.000000000

1.000000000

On peut donc conjecturer que le produit tend vers 1.

>

> restart;

VIII.2

1. Approche graphique

> f:=x->(1+x^2)/2:

> with(plots):

Warning, the name changecoords has 
been redefined

> F:=plot(f,-0.1..1.1,-0.1..1.1,colour=red): X:=plot(x->x,-0.1..1.1,-0.1..1.1,colour=blue):

> display([F,X]);

[Maple 
Plot]

Les coordonnées recherchées sont [u[0], 0], 
[u[0], u[1]], [u[1], u[1]], [u[1], u[2]]...

> u0:=0:u:=n->(f@@n)(u0):

> L:=[u(0),0]:

> for k to 10 do L:=L,[u(k-1),u(k)],[u(k),u(k)] od:

> L:=[L]:

> U:=plot(L,colour=green):

> display([F,X,U]);

[Maple 
Plot]

>

2. Étude précise

Si la suite converge, par passage à la limite dans l'égalité f(u[n]) = 
u[n+1] , en utilisant la continuité de f en la limite x , elle converge vers x tel que f(x) = x . On résout donc cette équation.

> solve(f(x)=x,x);

1, 1

Il y a donc une unique racine (double) à cette équation. Si la suite converge, c'est vers 1 .

>

Pour étudier le signe de f(x)-x , on cherche d'abord sa forme factorisée.

> factor(f(x)-x);

1/2*(x-1)^2

C'est un carré, donc on a pour tout n , u[n] <= 
u[n+1]

La suite est croissante. Par récurrence immédiate, comme u[0] <= 1 et f est croissante, alors elle est majorée par 1 donc convergente, vers 1 d'après 2a.

>

> restart;

VIII.3

> visu:=proc(g::procedure,alpha::realcons,n::integer,I1::range,I2::range)
local u,L,k,F,G,H;
with(plots):
# Premiere methode
#u:=i->(g@@i)(alpha);
#L:=[[u(0),0]];
#for k to n
# do L:=[op(L),[u(k-1),u(k)],[u(k),u(k)]]
# end do;
# seconde methode
u:=alpha;L:=[[u,0]];
for k to n
do
L:=[op(L),[u,g(u)],[g(u),g(u)]];
u:=g(u);
end do;
F:=plot(x,x=I1,I2,color=green):
G:=plot(g,I1,I2,color=red):
H:=plot(L,I1,I2):
display([F,G,H]);
end:

> visu(x->(1+x^2)/2,0,10,-0.1..1.1,-0.1..1.1);

[Maple 
Plot]

> visu(x->1-x^2,1/2,15,-1..2,-1..2);

[Maple 
Plot]

> visu(x->1-x^2,-3/2,10,-2..1,-2..2);

[Maple 
Plot]

> visu(cos,1/2,20,0..1,0..1);

[Maple 
Plot]

> f:=x->(3*x-2)/(1-x):

> visu(f,1/2,10,-4..3,-6..4);

[Maple 
Plot]

> visu(f,3/4,10,-4..3,-6..4);

Error, (in f) division by zero

Le problème vient du fait qu'avec cette valeur de u[0] , la suite n'est pas bien définie. Le terme u[n] n'est pas défini si h(u[n-1]) = 
1 . Pour chercher les valeurs interdites, on cherche les valeurs de u[0] telles que `@@`(f,n)(u[0]) = 1 , c'est-à-dire si on note alpha la dernière valeur interdite f(u[0]) = 
alpha .

> v[0]:=1;

v[0] := 1

> for k to 10 do v[k]:=solve(f(x)=v[k-1],x) end do:

> seq(v[i],i=0..10);

1, 3/4, 
11/15, 41/56, 153/209, 571/780, 2131/2911, ...

> restart;

VIII.4

Définition des deux suites.

> u:=n->2*sqrt(n)-sum(1/sqrt(k),k=1..n);
v:=n->2*sqrt(n+1)-sum(1/sqrt(k),k=1..n);

u := proc 
(n) options operator, arrow; 2*sqrt(n)-su...

v := proc 
(n) options operator, arrow; 2*sqrt(n+1)-...

Variations de v

> combine(v(n+1)-v(n));

-1/(sqrt(n+1))+2*sqrt(n+2)-2*sqrt(n+1)

> normal(%);

(-3+2*sqrt(n+2)*sqrt(n+1)-2*n)/(sqrt(n+1))

> numer(%);

-3+2*sqrt(n+2)*sqrt(n+1)-2*n

Il faut comparer 3+2*n et 2*sqrt((n+1)*(n+2)) . On va étudier le signe de la différence de leurs carrés.

> (2*sqrt((n+1)*(n+2)))^2-(3+2*n)^2;

4*(n+1)*(n+2)-(3+2*n)^2

> expand(%);

-1

v est donc décroissante.

Variations de u

> combine(u(n+1)-u(n));

-1/(sqrt(n+1))+2*sqrt(n+1)-2*sqrt(n)

> normal(%);

-(-1-2*n+2*sqrt(n)*sqrt(n+1))/(sqrt(n+1))

La différence est du signe de

> (1+2*n)^2-4*n*(n+1);

(1+2*n)^2-4*n*(n+1)

> expand(%);

1

Donc u est croissante.

Limite de v-u

> v(n)-u(n);

2*sqrt(n+1)-2*sqrt(n)

> limit(%,n=infinity);

0

Les deux suites sont bien adjacentes.

> with(plottools):with(plots):

Warning, the name changecoords has 
been redefined

> UU:=[]:VV:=[]:
for i to 100 do
U||i:=point([i,u(i)], color=blue);
UU:=[op(UU),U||i];
V||i:=point([i,v(i)], color=green);
VV:=[op(VV),V||i];
od:

> display([op(UU),op(VV)]);

[Maple 
Plot]

> limit(u(n),n=infinity);

-Zeta(1/2)

> evalf(%);

1.460354509

> limit(v(n),n=infinity);

-Zeta(1/2)

Tout va bien...