suivant: Trouver un encadrement de
monter: Solution de f (x)
précédent: La solution avec Xcas
Table des matières
Index
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) = -
, on a alors :


=
f'(
x0)
donc


=
n(
x0)*
f'(
x0) = -
f (
x0)
ce qui veut dire que :
f (x0 + h*n(x0)) = f (x0)(1 - h) + h .
(h) avec
(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
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
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