Illustration de l’algorithme de gradient (2)
Auteur ou autrice : Maxime Chupin.
Mise en ligne le 4 février 2026
Illustration de l'algorithme du gradient avec MetaPost. Tous les calculs sont fait par MetaPost lui-même.
Code
if known mplib: else: input latexmp fi;
vardef f(expr x,y)=
aX*x*x+aY*y*y
enddef;
vardef df(expr x,y)=
(2*aX*x,2*aY*y)
enddef;
vardef gradient(expr x)=
save chemin, cpt,pointnext, pointprev;
path chemin;
pair pointnext,pointprev;
cpt:=0;
cptmax:=250;
pointprev:=x;
chemin:=x;
forever:
cpt := cpt+1;
exitif(cpt=cptmax);
%show(abs(pointprev));
exitif(abs(pointprev)<0.000025);
pointprev := pointprev-tau*df(xpart pointprev,ypart pointprev);
chemin := chemin--pointprev;
endfor
chemin
enddef;
vardef drawgrad(expr ch,cch,cp)=
draw ch withcolor cch;
for i:=0 upto length(ch):
draw point i of ch withpen pencircle scaled 2pt;
endfor;
enddef;
u:=0.6cm;
vardef levelset(expr n)=
for i:=1 upto n:
draw fullcircle scaled u xscaled aY yscaled aX scaled (i*i/10) withcolor
(0.3,0.3,0.3) withpen pencircle scaled 0.2pt;
endfor
enddef;
beginfig(1);
pair x[];
path gradch;
x0 := (4u,3u);
aX := 1;
aY := 1.5;
tau := 0.17;
levelset(9);
gradch = gradient(x0);
iterates = length(gradch);
drawgrad(gradch,red,black);
path fenetre;
fenetre := ((-u,-1.2u)--(2u,-1.2u)--(2u,1.2u)--(-u,1.2u)--cycle) scaled 3;
draw fenetre;
clip currentpicture to fenetre;
label.bot(textext("$\tau=" & decimal tau & "\quad (\lambda_1,\lambda_2)=(" &
decimal aX & "," & decimal aY & ")$"),(0.5u,-1.2u)scaled 3);
label.bot(textext("$\mathrm{iterates}=" & decimal iterates& "$"),(0.5u,-1.6u)scaled 3);
endfig;
end.
Mots clés : méthode numériquelevelsetgradient
