next up previous contents index
suivant: Exercice sur la méthode monter: Solution de f (x) précédent: Solution de f (x)   Table des matières   Index

La méthode de Newton

Soit f deux fois dérivable ayant un zéro et un seul r dans l'intervalle [a ; b]. Supposons de plus que f' et f'' ont un signe constant sur [a ; b]. La méthode de Newton consiste à approcher r par l'abscisse x1 du point commun à Ox et à la tangente en un point M0 du graphe de f. Si M0 a pour coordonées (x0, f (x0)) ( x0 $ \in$ [a ; b]) , la tangente en M0 a pour équation :
y = f (x0) + f'(x0)*(x - x0) et donc on a :

x1 = x0 - $\displaystyle {\frac{{f(x_0)}}{{f'(x_0)}}}$

On peut alors réitérer le processus, et on obtient une suite xn qui converge vers r soit par valeurs supérieures, si f'*f''>0 sur [a ; b] (i.e. si f'(r) > 0 et si f est convexe (f''>0 sur [a ; b]) ou si f'(r) < 0 et si f est concave (f''<0 sur [a ; b])) soit par valeurs inférieures, si f'*f''<0 sur [a ; b] (i.e. si f'(r) < 0 et si f est convexe (f''>0 sur [a ; b]) ou si f'(r) > 0 et si f est concave (f''<0 sur [a ; b])).
On fait le dessin en tapant :
f:=sq-2;
x0:=5/2;
G:=plotfunc(f(x));
T0:=tangent(G,x0);
Ox:=droite(0,1);
M1:=inter(T0,Ox)[0];
x1:=affixe(M1)
segment(point(x1,0),point(x1,f(x1)));
T1:=tangent(G,x1);
M2:=inter(T1,droite(0,1))[0]
x2:=affixe(M2):
segment(point(x2,0),point(x2,f(x2)));
ou encore pour faire le dessin de la méthode de Newton pour la fonction f en partant du point de coordonnèes (a, f (a)) et obtenir p nouveaux points.
plotnewton(f,a,p):={
local L,P,m,j,b;
L:=plotfunc(f(x),x,affichage=vert);
L:=L,point(a,couleur=point_width_4+rouge);
for (j:=1;j<=p;j++) {
b:=f(a);
L:=L,segment(a,a+i*b,couleur=ligne_tiret+rouge);
m:=function_diff(f)(a);
L:=L,plotfunc(b+(x-a)*m,x);
if (m==0){return "pente nulle"}
a:=a-f(a)/m;
P:=point(a,couleur=point_width_4+rouge);
L:=L,P;
}
return affixe(P),L;
};
On tape : plotnewton(sq-2,4,3)
pour obtenir les termes u0, u1, u2, u3 de la suite de Newton qui converge vers sqrt2.
On remarquera que : plotnewton(sq-2,4,3)[0] renvoie :
23137/16272 $ \simeq$ 1.42189036382

On peut aussi faire une animation, pour cela, on tape :

newtonsuite(f,a,p):={
local L,P,m,j,b,LT;
P:=point(a,couleur=point_width_4+rouge);
LT:=P;
f1:=function_diff(f);
for (j:=1;j<=p;j++) {
b:=f(a);
L:=L,segment(a,a+i*b,couleur=ligne_tiret+rouge);
m:=f1(a);
L:=L,plotfunc(b+(x-a)*m,x);
if (m==0){return "pente nulle"}
a:=a-f(a)/m;
P:=point(a,couleur=point_width_4+rouge);
LT:=LT,[LT,L,P];
}
print(affixe(P));
return LT;
};
animnewton(f,a,p):={
local LT;
LT:=newtonsuite(f,a,p);
return plotfunc(f(x),x,affichage=vert),animation(LT);
};
On tape : animnewton(sq-2,4,3)

Puis, on écrit la fonction newton_rac qui renvoie la valeur approchée à eps près de la racine de f (x) = 0 on commençant l'itération avec x0.
On remarquera que le paramètre f est une fonction et donc, que sa dérivée est la fonction g:=function_diff(f).
On cherche une valeur approchée donc il faut écrire :
x0:=evalf(x0-f(x0)/g(x0))
car si on ne met pas evalf, les calculs de l'itération se feront excactement et seront vite compliqués.

newton_rac(f,x0,eps):={
local x1,h,g;
g:=function\_diff(f)
x0:=evalf(x0-f(x0)/g(x0));
x1:=x0-f(x0)/g(x0);
if (x1>x0) {h:=eps;} else {h:=-eps;}
while (f(x1)*f(x1+h)>0){
   x1:=x1-f(x1)/g(x1);
}
return x1;
}


next up previous contents index
suivant: Exercice sur la méthode monter: Solution de f (x) précédent: Solution de f (x)   Table des matières   Index
Documentation de giac écrite par Renée De Graeve