Illustration de l’algorithme de gradient (2)

Auteur ou autrice : Maxime Chupin.

Mise en ligne le 4 février 2026

Image du résultat de l’exemple

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

Fichiers

Télécharger l’archive complète