Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Quelques notebooks SAGE / Python. Équations différentielles ou calcul multivariable.

Project: Calcul Libre
Views: 1413
Image: ubuntu2004
Kernel: SageMath 9.0
%display typeset

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 /ceux où ff atteint son minimum/maximum.

var('x,y,u,v') f(x,y)=(x-1)^2+(y-2)^2 r=sqrt(45)
cm = colormaps.Blues # There are several names predefined def c(x,y): return float((f(x,y))/170) S=plot3d(f(u,v),(u,-r-1,r+1),(v,-r-1,r+1), color=(c,cm)) C = parametric_plot3d([r*cos(v),r*sin(v),0],(v,0,2*pi), color='red', thickness=2) CS =parametric_plot3d([r*cos(v),r*sin(v),f(r*cos(v), r*sin(v))],(v,0,2*pi), color='green', thickness=3) show(S+C+CS, aspect_ratio=[5,5,1]);
df=f.gradient()

Voyons le probè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, ainsi que le champ f\nabla f et la courbe x2+y2=45x^2 + y^2 = 45 (en rouge).

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) show(Contourf+Cercle+Champf);
Image in a Jupyter notebook

La courbe de contrainte est donnée par par g(x,y)=45g(x,y)=45 ou (x,y)=x2+y2(x,y) = x^2 + y^2 est la fonction de contrainte. 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, arrowsize = 2) for j in range(20)]; Champg=sum(Vecs)
show(Contourf+Cercle+Champf+Champg,aspect_ratio=1, figsize = 8);
Image in a Jupyter notebook

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 d'une nouvelle variable LL qui jouera le rôle de λ\lambda.

g(x,y)=x^2+y^2 dg=g.gradient() var('L') df(x,y) dg(x,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])

Ici df est le gradient de ff, c'est donc une fonction de deux variables, à valeurs dans R2\mathbb{R}^2, c'est à dire une paire de fonctions. Ainsi, df[0] est la première de ces deux fonctions (on commence à compter à 00, c'est à dire fxf_x ou encore fx\frac{\partial f}{\partial x}), et donc df[0](x,y) est la fonction évaluée en (x,y)(x,y).