| Hosted by CoCalc | Download
%html <h2 style="text-align: center;"><span style="font-size: medium;"><strong>Les multiplicateurs de Lagrange :&nbsp; motivation<br /></strong></span></h2> <p><span style="font-size: medium;"><strong><br /></strong></span></p> <p><span style="font-size: medium;"><strong>Exemple:</strong> On consid&eacute;re la fonction $f(x,y)=(x-1)^2+(y-2)^2$. Parmi les points $(x,y)$ sur le cercle $x^2+y^2=45$, on cherche celui o&ugrave; $f$ atteint son minimum/maximum.</span></p>

Les multiplicateurs de Lagrange :  motivation


Exemple: On considére la fonction f(x,y)=(x1)2+(y2)2f(x,y)=(x-1)^2+(y-2)^2. Parmi les points (x,y)(x,y) sur le cercle x2+y2=45x^2+y^2=45, on cherche celui où ff atteint son minimum/maximum.

(u\displaystyle u, v\displaystyle v)
3D rendering not yet implemented
df=f.gradient()

Voyons le problème en termes de courbes de niveau et du champ gradient de ff. Rappelons que f(x0,y0)\nabla f(x_0,y_0) donne la direction dans laquelle il faut se déplacer à partir de (x0,y0)(x_0,y_0) pour avoir la plus forte augmentation dans la valeur de ff .


Ci-bas, on trouve les courbes de niveau de ff, le champ f\nabla f et la courbe x2+y2=45x^2+y^2=45 (en rouge)

r2 = sqrt(48) Champf=plot_vector_field(df, (x,-r,r), (y,-r,r), color='darkblue',aspect_ratio=1) Contourf=contour_plot(f(u,v),(u,-r,r),(v,-r,r),cmap='Blues',labels=True, linestyles='solid',aspect_ratio=1); Cercle = parametric_plot([r*cos(u),r*sin(u)],(u,0,2*pi), color='red', thickness=2,aspect_ratio=1) Cercle2 = parametric_plot([r2*cos(u),r2*sin(u)],(u,0,2*pi), color='red', linestyle = "dashed",thickness=1,aspect_ratio=1) show(Contourf+Cercle+Champf);

La courbe de contrainte est donné par g(x,y)=45g(x,y)=45, où g(x,y)=x2+y2g(x,y)=x^2+y^2, c'est donc une courbe de niveau pour la fonction de contrainte gg. Cette fonction a aussi un champ gradient, g\nabla g. Dessinons les vecteurs de ce champ, mais seulement ceux qui correspondent aux points sur la courbe.

Pts=[(r*cos(2*t*pi/20),r*sin(2*t*pi/20)) for t in range(20)]; Pts1=[(1.1*r*cos(2*t*pi/20),1.1*r*sin(2*t*pi/20)) for t in range(20)]; Vecs=[arrow(Pts[j],Pts1[j],color='red', width=1) for j in range(20)]; Champg=sum(Vecs)
show(Contourf+Cercle+Champf+Champg,aspect_ratio=1, figsize = 8);

Conjecture : Les points de maximum / minimum de ff sur la courbe g=45g=45 sont précisément ceux pour lequels les vecteurs gradient f\nabla f et g\nabla g sont colinéaires. En d'autres termes, il doit exister λR\lambda\in \mathbb{R} tel  que  f=λg\nabla f = \lambda \nabla g


Demandons à SAGE de résoudre les équations qu'on a besoin de résoudre. La fonction ff a déjà été définie, mais pas gg, et nous avons également besoin d'une variable supplémentaire LL, pour λ\lambda.

g(x,y)=x^2+y^2 dg=g.gradient() var('L') df(x,y) dg(x,y)
L (2*x - 2, 2*y - 4) (2*x, 2*y)
solve([df[0](x,y)==L*dg[0](x,y), df[1](x,y)==L*dg[1](x,y), g(x,y)==45],[x,y,L])
[[x == -3, y == -6, L == (4/3)], [x == 3, y == 6, L == (2/3)]]

Ici, dfdf est le gradient de ff, c'est donc une paire de fonctions de deux variables (voir plus bas). Ainsi df[0] est la première de ces deux fonctions (il y a des gens qui commencent à compter à 0), c'est à dire fx\frac{\partial f}{\partial x} puis df[0](x,y)df[0](x,y) est la première de ces fonctions évaluée en (x,y).

dg
dg[0]
(x, y) |--> 2*x
dg[0](pi,-pi)
2*pi