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); |
> | sol:=Cauchy(f,a,epsilon); solution proposé par la procédure Cauchy |
> | 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point |
> |
> |
> |
Deuxième exemple
> | f:=x->x^3-4*x+1;a:=1.86;epsilon:=10^(-4); |
> | sol:=Cauchy(f,a,epsilon); solution proposé par la procédure Cauchy |
> | 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point |
> |
Troisième exemple
> | f:=x->x^3-4*x+1;a:=0.254;epsilon:=10^(-4); |
> | sol:=Cauchy(f,a,epsilon); solution proposé par la procédure Cauchy |
> | 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point |
> |
Illustration Graphique
> | f:=x->exp(-0.5*x)-1;sol:=SCauchy(f,a,epsilon): |
> | N:=sol[1]:s:=sol[2..N+1]: |
> | Graphique(f,-a,a,N,s); |
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); |
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;
|
> | g:=unapply(f(x)+x,x); |
> | Diff('g'(a),x)=subs(x=a,diff(g(x),x)); |
> |
Troisième Exemple
> |
> | f:=x->x^3-4*x+1;a:=0.254;
|
> | g:=unapply(f(x)+x,x); |
> | Diff('g'(a),x)=subs(x=a,diff(g(x),x)); |
> |
> | 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)); |
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 |
> |
> | Cauchy(fk,1.86,10^(-4)); |
> | Cauchy(-fk,0.254,10^(-5)); |
> |
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)); |
ici encore k=-1/10 devrait suffire
> | Cauchy(-fk,-2.11,10^(-9)); |
> |
> |