| Hosted by CoCalc | Download

Les multiplicateurs de Lagrange

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.

import matplotlib.cm; var('u,v') f(x,y)=(x-1)^2+(y-2)^2 r=sqrt(45)
(u, v)
cmsel = [colormaps['autumn'](i) for i in sxrange(0,1,0.05)]

D'un point de vue plus géométrique, il s'agit de trouver le point sur le paraboloïde et au dessus du cercle bleu qui est le plus hau / le plus bas.

S=plot3d(f(u,v),(u,-r,r),(v,-r,r), adaptive = True, color = cmsel); C=parametric_plot3d([r*cos(v),r*sin(v),0],(v,0,2*pi), color='blue', thickness=2) CS=parametric_plot3d([r*cos(v),r*sin(v),f(r*cos(v), r*sin(v))],(v,0,2*pi), color='blue', thickness=3) show(S+C+CS, frame_aspect_ratio=[5,5,1]);
3D rendering not yet implemented
df=f.gradient()
%md Voyons le problème en termes de courbes de niveau et du champ gradient de $f$. Rappelons que $\nabla f(x_0,y_0)$ donne la direction dans laquelle il faut se déplacer à partir de $(x_0,y_0)$ pour avoir la plus forte augmentation dans la valeur de $f$ . Ci-bas, on trouve les courbes de niveau de $f$, le champ $\nabla f$ et la courbe $x^2+y^2=45$ (en bleu)

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 bleu)

Champf=plot_vector_field(df, (x,-r,r), (y,-r,r), color='black',aspect_ratio=1) Contourf=contour_plot(f(u,v),(u,-r,r),(v,-r,r),cmap='autumn', labels=True, linestyles='solid',label_colors = "black",aspect_ratio=1); Cercle = parametric_plot([r*cos(u),r*sin(u)],(u,0,2*pi), color='blue', thickness=2,aspect_ratio=1) show(Contourf+Cercle+Champf, figsize=6);

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.2*r*cos(2*t*pi/20),1.2*r*sin(2*t*pi/20)) for t in range(20)]; Vecs=[arrow(Pts[j],Pts1[j],color='blue', width=1) for j in range(20)]; Champg=sum(Vecs)

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')
L\displaystyle L
solve([df[0](x,y)==L*dg[0](x,y), dg[1](x,y)==L*dg[1](x,y), g(x,y)==1],x,y,L)
[[x=(1)\displaystyle x = \left(-1\right), y=0\displaystyle y = 0, L=2\displaystyle L = 2], [x=1\displaystyle x = 1, y=0\displaystyle y = 0, L=0\displaystyle L = 0]]

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
(x,y)  (2x,2y)\displaystyle \left( x, y \right) \ {\mapsto} \ \left(2 \, x,\,2 \, y\right)
dg[0]
(x,y)  2x\displaystyle \left( x, y \right) \ {\mapsto} \ 2 \, x
dg[0](pi,-pi)
2π\displaystyle 2 \, \pi