next up previous contents index
suivant: Trouver un encadrement de monter: Solution de f (x) précédent: La solution avec Xcas   Table des matières   Index

La méthode de Newton avec préfacteur

Lorsqu'on part d'une valeur x0 trop éloignée de la racine de f (x) (si par exemple | f (x0)| est grand), on a intérêt à utiliser un préfacteur pour se rapprocher plus vite de la solution de f (x) = 0.
Posons n(x) = - $\displaystyle {\frac{{f(x)}}{{f'(x)}}}$, on a alors :

$\displaystyle \lim_{{h \rightarrow 0}}^{}$$\displaystyle {\frac{{(f(x_0+h*n(x_0))-f(x_0))}}{{h*n(x_0)}}}$ = f'(x0)

donc

$\displaystyle \lim_{{h \rightarrow 0}}^{}$$\displaystyle {\frac{{(f(x_0+h*n(x_0))-f(x_0))}}{{h}}}$ = n(x0)*f'(x0) = - f (x0)

ce qui veut dire que :
f (x0 + h*n(x0)) = f (x0)(1 - h) + h . $ \epsilon$(h) avec $ \epsilon$(h) tend vers 0 quand h tend vers 0.
Donc, il existe h0 vérifiant :
| f (x0 + h0*n(x0))| < | f (x0)|
Remarque : Il faut minimiser | f (x0 + h0*n(x0))|. or plus h0 est proche de 1 et plus | f (x0)*(1 - h0)| sera petit. Par exemple, on prendra le plus grand h0, dans la liste [1, 3/4,(3/4)2,...] qui vérifie | f (x0 + h0*n(x0))| < | f (x0)|
Pour cette valeur de h0, x0 + h0*n(x0) est probablement plus proche de la racine que x0 : on dit que h0 est le préfacteur de la méthode de Newton.
On va choisir par exemple au début h0 = 1, et on regarde si | f (x0 + n(x0))| < | f (x0)|, si ce n'est pas le cas on prend h0 = (3/4) et on regarde si | f (x0 +3/4*n(x0))| < | f (x0)|, si ce n'est pas le cas on prend h0 = (3/4)2 etc...
On change de préfacteurs à chaque étape jusqu'à ce que : abs(f (x1)) - abs(f (x0)) < 0 sans préfacteur, on continue alors l'itération sans préfacteur, c'est à dire avec la méthode de Newton normale. On écrit donc :
newton_prefacts(f,x0,eps):={
local x1,h,h0,prefact,niter;
//prefact est egal par ex a 3/4
h0:=1.0;
niter:=0;
prefact:=0.75;
x1:=x0-h0*f(x0)/function_diff(f)(x0);
while (abs(f(x1))-abs(f(x0))>0) {
   h0:=h0*prefact;
   x1:=x0-h0*f(x0)/function_diff(f)(x0);
} 
h:=eps;
while (h0!=1 and niter<100){
   x0:=x1;
   x1:=x1-h0*f(x1)/function_diff(f)(x1);
   while (abs(f(x1))-abs(f(x0))>0) {
      h0:=h0*prefact;
      x1:=x0-h0*f(x0)/function_diff(f)(x0);
   } 
   while (abs(f(x1))-abs(f(x0)<0 and h0!=1)) {
      h0:=h0/prefact;
      x1:=x0-h0*f(x0)/function_diff(f)(x0);
   } 
niter:=niter+1;   
}
while (f(x1-h)*f(x1+h)>0  and niter<200){
   x0:=x1;
   x1:=x1-f(x1)/function_diff(f)(x1);
   niter:=niter+1;
}

if  (niter<200) {return x1;} else {return "pas trouve";} 
}
On définit la fonction f par $ \tt f(x):=x^2-2$ et on met ce programme dans un niveau éditeur de programmes (que l'on ouvre avec Alt+p), puis on le teste et on le valide avec OK.
On tape :
newton_prefacts(f,100,1e-10)
On obtient :
1.41421356237 On tape :
newton_prefacts(f,3,1e-5)
On obtient :
1.41421378005


next up previous contents index
suivant: Trouver un encadrement de monter: Solution de f (x) précédent: La solution avec Xcas   Table des matières   Index
Documentation de giac écrite par Renée De Graeve