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)
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; }