Cauchy.mw

Exercice 2

> restart;with(plots):secu:=50:Digits:30:secu est un nombre maximal d'itérations, évitant les boucles trop longues

Warning, the name changecoords has been redefined

>

>

Question a)

> Cauchy:=proc(f,a,epsilon)
local aa,bb,compteur,milieu;

aa:=a;bb:=f(aa)+aa;compteur:=1;

while is(abs(bb-aa)>epsilon) and compteur<secu do

compteur:=compteur+1;aa:=bb;bb:=f(bb)+bb;

od;

[compteur,aa];

end:

>

Question b)

>

Premier exemple

> f:=x->exp(-0.5*x)-1;a:=4;epsilon:=10^(-8);

f := proc (x) options operator, arrow; exp(-.5*x)-1 end proc

a := 4

epsilon := 1/100000000

> sol:=Cauchy(f,a,epsilon); solution proposé par la procédure Cauchy

sol := [32, 0.140e-7]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f(0.140e-7) = -0.70e-8

>

>

>

Deuxième exemple

> f:=x->x^3-4*x+1;a:=1.86;epsilon:=10^(-4);

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := 1.86

epsilon := 1/10000

> sol:=Cauchy(f,a,epsilon); solution proposé par la procédure Cauchy

sol := [29, Float(infinity)]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f(Float(infinity)) = Float(undefined)

>

Troisième exemple

> f:=x->x^3-4*x+1;a:=0.254;epsilon:=10^(-4);

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := .254

epsilon := 1/10000

> sol:=Cauchy(f,a,epsilon); solution proposé par la procédure Cauchy

sol := [33, Float(infinity)]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f(Float(infinity)) = Float(undefined)

>

Illustration Graphique

> f:=x->exp(-0.5*x)-1;sol:=SCauchy(f,a,epsilon):

f := proc (x) options operator, arrow; exp(-.5*x)-1 end proc

> N:=sol[1]:s:=sol[2..N+1]:

> Graphique(f,-a,a,N,s);

[Plot]

sur l'axe des abbscissdes apparaissent les points de la suite x(n+1)=xn+f(xn)
la
courbe est cell de f

>

>

> points:=seq([i,s[i]],i=1..N):

> plot([points],color=black,thickness=2,style=point);

[Plot]

Les points tracés sont ceux de coordonnées (n,xn)

>

>

> Quelques Explications

>

Pour que la méthode du point fixe de Cauchy-Picard marche correctement encore faut-il que la fonction g(x)=f(x)+x soit contractante sur un intervalle stable contenant a
A défaut de pouvoir justifier rigoureusement le défaut de la méthode pour les deux derniers exemples, la
grande valeur de |g'(a)| perment de voir comment la propriété "g est contractante" est mise en défaut (cf théorème des accroissements finis)

>

Deuxième Exemple

>

> f:=x->x^3-4*x+1;a:=1.86;

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := 1.86

> g:=unapply(f(x)+x,x);

g := proc (x) options operator, arrow; x^3-3*x+1 end proc

> Diff('g'(a),x)=subs(x=a,diff(g(x),x));

Diff(g(1.86), x) = 7.3788

>

Troisième Exemple

>

> f:=x->x^3-4*x+1;a:=0.254;

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := .254

> g:=unapply(f(x)+x,x);

g := proc (x) options operator, arrow; x^3-3*x+1 end proc

> Diff('g'(a),x)=subs(x=a,diff(g(x),x));

Diff(g(.254), x) = -2.806452

>

> Comment y remédier

>

Au lieu de résoudre f(x)+x=x pour trouver les zeros de f, il s'agit de chercher les zeors de f comme étant solution de
k f(x) + x = x

où k est choisi de facon à rendre
g(x)=kf(x)+x contractante (au moins sur un intervalle stable contenant a)

>

>

> a:=0.254;Diff('f'(a),x)=subs(x=a,diff(f(x),x));

a := .254

Diff(f(.254), x) = -3.806452

Aucune valeur de k ne rendra g contractante sur R, cependant en prenant k=-1/10 et k=1/10, on a aura |g'(a)|<1 (pour a=1.86 et a=0.254)
on peut raisonablement penser que cela restera encore
vraie en tout point d'un voisinage I de a (par continuité de g').
Encore faut-il choisir
a est suffisament proche d'un  point fixe pour que toute valeur successive de la suite définie par  x(n+1)=g(xn)  reste dans I

>

> fk:=unapply(f(x)/10,x); ici fk=k*f

fk := proc (x) options operator, arrow; 1/10*x^3-2/5*x+1/10 end proc

>

> Cauchy(fk,1.86,10^(-4));

[35, .2542647115]

> Cauchy(-fk,0.254,10^(-5));

[37, -2.114905260]

>

On voit apparaitre un nouveau candidat pour être zero de f, on calcule la dérivée en ce point

> a:=-2.11;Diff('f'(a),x)=subs(x=a,diff(f(x),x));

a := -2.11

Diff(f(-2.11), x) = 9.3563

ici encore k=-1/10 devrait suffire

3.984859398

> Cauchy(-fk,-2.11,10^(-9));

[7, -2.114907541]

>

>