test_extremum_local.mw
Optimisation d'une fonction de deux variables:
test d'extremum local
Pierre Lantagne (juin 2001)
Collge de Maisonneuve
plantag@edu.cmaisonneuve.qc.ca
http://math.cmaisonneuve.qc.ca/plantagne
Cette feuille a pour objectif de montrer comment utiliser Maple pour trouver les extremums locaux d'une fonction f explicite de deux variables par l'application du test d'extremum local. La fonction doit d'abord satisfaire la condition d'applicabilit du test, soit rechercher avec Maple les points critiques (a,b) d'une fonction f telles que
|(a,b) = 0 et
|(a,b) = 0. Ensuite, pour obtenir la nature de ces points critiques, il faudra tester chacun de ces points afin de dterminer laquelle des conditions suffisantes du test est satisfaite. Rappelons que la validit du test repose sur l'galit des drives mixtes
.
En fait, on transposera en Maple la dmarche papier-crayon qui a t prsente en classe.
Dtermination des points critiques
La premire tape dans la recherche d'un extremum relatif consiste rechercher ses points critiques, c'est--dire les points o les drives partielles s'annulent ou les points o les drives partielles n'existent pas.
Soit
. Crez la fonction f.
> |
f:=(x,y)->x^4-3*x^2*y+3*y-y^3; |
Calculez maintenant les drives partielles
et
l'aide de l'oprateur de drivation D.
> |
fx:=D[1](f);
fy:=D[2](f); |
REMARQUE: En utilisant l'oprateur de drivation D,
et
sont des fonctions des variables x et y.
Ensuite, il faut rsoudre, dans le domaine de dfinition de f, les quations
et
. Vous allez rsoudre ces quations de deux manires: symboliquement et numriquement (autrement dit: de manire exacte et de manire approximative).
Rsolution symbolique (rsolution exacte)
La macro-commande utiliser pour la rsolution symbolique d'une quation (d'inquation), d'un ensemble d'quations (d'inquations) , est la macro-commande solve. De plus, afin de ne retenir que les racines relles, vous utiliserez l'astuce suivante: rsolvez en mme temps l'inquation
.
> |
Sol_symboliques:=solve({fx(x,y)=0,fy(x,y)=0,x<infinity},{x,y}); |
Lorsqu'on utilise la macro-commande solve, les racines obtenues peuvent ne pas tre donnes de manire explicite. Afin d'obtenir de faon explicite ces racines formules en termes de RooOf, appliquez la macro-commande allvalues sur ces racines.
> |
Sol_symboliques:=map(allvalues,{Sol_symboliques}); |
L'usage des accolades a pour but d'viter la rptition des racines.
Le listage de tous les points critiques est fait automatiquement grce la procdure maison suivante. On pourrait tout aussi bien tablir la liste manuellement.
Initialisez donc cette procdure en excutant tout le bloc.
> |
Points_Critiques:=proc(Sol_symboliques::set)
global x,y;
local Ensemble,k,ordre;
Ensemble:={};
for k from 1 to nops(Sol_symboliques) do
assign(Sol_symboliques[k]);
Ensemble:=Ensemble union {[x,y]};
x:='x':y:='y':
od;
ordre:=(x,y)->evalb(evalf(op(1,x)<=op(1,y))):
sort(convert(Ensemble,list),ordre)
end: |
Par commodit, donnez donc le nom P la liste des points critiques.
> |
P:=Points_Critiques(Sol_symboliques);
|
Les quatres points critiques de cette fonction sont les points
.
Rsolution numrique (rsolution approximative)
La macro-commande fsolve est utiliser pour trouver une approximation dcimale des racines. Cette mthode est, en gnral, plus dlicate d'application. En fait, l'efficacit de cette approche repose beaucoup sur la connaissance de valeurs d'amorce qui sont pas "trop" loignes des racines qu'on cherche approximer.
> |
Sol_numeriques := fsolve({fx(x,y)=0,fy(x,y)=0},{x,y}); |
Sachez qu'en donnant un intervalle d'amorce appropri, la macro-commande fsolve s'avrera plus efficace. Par exemple,
> |
Sol_numeriques := fsolve({fx(x,y)=0,fy(x,y)=0},{x,y},{x=-2..0,y=-1..0}); |
Les intervalles d'amorce ne s'obtiennent videmment pas par hasard. Un graphique de la situation est trs utile.
Application du test d'extremum local
Crez les fonctions ncessaires au calcul du discriminant
, soit les fonctions drives successives d'ordre 2
et
dfinies respectivement par
et par
ainsi que la fonction drive mixte
dfinie par
.
> |
fxx:=D[1](fx);
fyy:=D[2](fy);
fxy:=D[2](fx); |
Crez finalement la fonction discriminant
qui servira calculer sa valeur avec chacun des points critiques:
> |
Delta:=(x,y)->fxx(x,y)*fyy(x,y)-(fxy^2)(x,y); |
Dans le but d'tre concis, rsumez dans un tableau les valeurs de
et de
en chacun des points critiques.
> |
printf(`\n Points critiques | Discriminant | Valeur de fxx \n`);
seq(printf("%25a | %10a |%10a \n", P[k],Delta(op(1,op(k,P)),op(2,op(k,P))),fxx(op(1,op(k,P)),op(2,op(k,P)))),k=1..nops(P)); |
Points critiques | Discriminant | Valeur de fxx
[-1/2*3^(1/2), 1/2] | -45 | 6
[0, 1] | 36 | -6
[0, -1] | 36 | 6
[1/2*3^(1/2), 1/2] | -45 | 6
Reste donc conclure: le point
est un minimum local,
est un maximum local , et les deux autres points crtitiques sont des points-selle.
Graphique de la surface et des points critiques
Illustrez maintenant la nature de ces quatre points critiques en superposant d'abord le trac de la surface et celui des points critiques (qui appartiennent, bien sr, la surface).
La difficult surmonter avec une telle reprsentation est, videmment, de prciser des intervalles appropris pour les variables x et y de sorte qu'on puisse inclure tous les points critiques dans la superposition pour que cela puisse se voir de faon clair. L'exemple qui est ici s'y prte bien sans trop de difficults.
Crez d'abord la structure graphique de cette surface puis affichez-la.
> |
Surface:=plot3d([x,y,f(x,y)],x=-1.5..1.5,y=-1.5..1.5):
display(Surface,axes=framed,orientation=[131,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_40.gif)
Ensuite, obtenez le trac de tous les points critiques de la surface en crant d'abord la liste de ces points critiques comme points de l'espace.
> |
Points_surface:=seq([op(1,P[k]),op(2,P[k]),f(op(1,P[k]),op(2,P[k]))],k=1..nops(P)); |
La macro-commande pointplot3d de l'extension plots sera ici trs utile.
> |
with(plots,pointplot3d); |
Donnez l'option patchnogrid pour mieux voir ces points critiques sur la surface.
> |
Points:=pointplot3d([Points_surface],symbol=circle,color=black):
display({Surface,Points},axes=framed,style=patchnogrid,orientation=[131,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_43.gif)
l'aide de la macro-commande spacecurve de l'extension plots, tracez des courbes sur cette surface afin de mettre en vidence la nature de ces extrema locaux.
> |
with(plots,spacecurve); |
> |
Courbe_max:=spacecurve([x,1,f(x,1)],x=-1.5..1.5,color=navy,thickness=3):
Courbe_min:=spacecurve([x,-1,f(x,-1)],x=-1.5..1.5,color=orange,thickness=3):
Courbe:=spacecurve([0,y,f(0,y)],y=-1.5..1.5,color=magenta,thickness=3): |
> |
display({Surface,Courbe_max,Courbe_min,Courbe,Points},axes=framed, style=patchnogrid,orientation=[131,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_45.gif)
Pour mieux observer la nature de ces points critiques, cliquez sur le graphique prcdent en maintenant le bouton gauche enfonc et modifiez l'orientation du graphique.
Au point [0,1,2]: dans la direction de la courbe de couleur bleu, le point critique prsente un maximum local et de mme dans la direction de la courbe de couleur magenta.
Au point [0,-1,-2]: dans la direction de la courbe de couleur orange, le point critique prsente un minimum local et de mme dans la direction de la courbe de couleur magenta.
> |
display({Courbe_max,Courbe_min,Courbe,Points},axes=framed, style=patchnogrid,orientation=[131,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_46.gif)
Tracez maintenant des courbes sur cette surface afin de mettre en vidence la nature des points-selle.
> |
Courbe_A:=spacecurve([-sqrt(3)/2,y,f(-sqrt(3)/2,y)],y=-1.5..1.5,color=navy,thickness=3):
Courbe_B:=spacecurve([sqrt(3)/2,y,f(sqrt(3)/2,y)],y=-1.5..1.5,color=orange,thickness=3):
Courbe:=spacecurve([x,0.5,f(x,0.5)],x=-1.5..1.5,color=magenta,thickness=3): |
> |
display({Surface,Points,Courbe_A,Courbe_B,Courbe},axes=framed,style=patchnogrid,orientation=[130,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_47.gif)
Au point
: dans la direction de la courbe de couleur bleu, le point critique prsente un maximum local et un minimum local dans la direction de la courbe de couleur magenta.
Au point
: dans la direction de la courbe de couleur orange, le point critique prsente un maximum local et un minimum local dans la direction de la courbe de couleur magenta.
Ces deux points sont donc bien des points-selle.
> |
display({Points,Courbe_A,Courbe_B,Courbe},axes=framed,style=patchnogrid,orientation=[125,80]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_50.gif)
Impuissance du test d'extremum local
Dans le cas o
(ou de la non-existence de
ou de
), le test est impuissant: on ne peut rien conclure quant la nature des points critiques. Dans ce cas, l'approche graphique est d'une trs grande utilit pour examiner la fonction au voisinage du ou des points critiques.
Exemple 1
Soit la fonction f dfinie par
.
Obtenez les points critiques de cette fonction.
> |
fx:=D[1](f);
fy:=D[2](f); |
> |
Sol_symboliques:=solve({fx(x,y)=0,fy(x,y)=0,x<infinity},{x,y}); |
> |
Sol_symboliques:=map(allvalues,{Sol_symboliques}); |
Nous avons obtenu qu'un seul point critique.
> |
P:=Points_Critiques(Sol_symboliques); |
Calculez maintenant le discriminant
.
fxx:=D[1](fx);
fxy:=D[2](fx);
fyy:=D[2](fy);
Delta:=(x,y)->fxx(x,y)*fyy(x,y)-(fxy^2)(x,y);
Delta((0,0));
Ainsi, puisque
, on ne peut rien conclure quant la nature de ce point critique. Esquissez un graphique de cette situation.
> |
Surface:=plot3d([x,y,f(x,y)],x=-2..2,y=-2..2,axes=framed):
Points:=pointplot3d([0,0,f(0,0)],symbol=circle,color=black):
display({Surface,Points},axes=framed,style=patchnogrid,orientation=[-150,65]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_68.gif)
Pour mieux observer la nature de ce point critique, cliquez sur le graphique prcdent en maintenant le bouton gauche enfonc et modifiez l'orientation du graphique.
On observe donc que ce point n'est ni un minimum local ni un maximum local. Ce point n'est pas non plus un point-selle.
Tracez des courbes sur cette surface afin de mettre en vidence la nature de ce point critique.
> |
Courbe_A:=spacecurve([0,y,f(0,y)],y=-2..2,color=navy,thickness=3):
Courbe_B:=spacecurve([x,0,f(x,0)],x=-2..2,color=orange,thickness=3):
display({Surface,Points,Courbe_A,Courbe_B},axes=framed,style=patchnogrid,orientation=[-150,65]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_69.gif)
On voit maintenant que ce point critique n'est pas un point-selle. En effet, dans la direction de la courbe de couleur bleu, le point critique se prsente comme un minimum local mais dans la direction de la courbe de couleur orange, le point critique se prsente pas comme un maximum local mais plutt comme un point plateau , c'est--dire comme un point d'inflexion o la tangente est horizontale.
> |
display({Points,Courbe_A,Courbe_B},axes=framed,style=patchnogrid,orientation=[-115,90]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_70.gif)
Exemple 2
Soit la fonction f dfinie par
Obtenez les points critiques de cette fonction.
> |
fx:=D[1](f);
fy:=D[2](f); |
> |
Sol_symboliques:=solve({fx(x,y)=0,fy(x,y)=0,x<infinity},{x,y}); |
> |
Sol_symboliques:=map(allvalues,{Sol_symboliques}); |
Nous avons obtenu qu'un seul point critique.
> |
P:=Points_Critiques(Sol_symboliques); |
Calculez maintenant le discriminant
.
> |
fxx:=D[1](fx);
fxy:=D[2](fx);
fyy:=D[2](fy);
Delta:=(x,y)->fxx(x,y)*fyy(x,y)-(fxy^2)(x,y);
Delta((0,0)); |
Encore ici, puisque
, on ne peut rien conclure quant la nature de ce point critique. Esquissez un graphique de cette situation.
> |
Surface:=plot3d([x,y,f(x,y)],x=-2..2,y=-2..2,axes=framed):
Points:=pointplot3d([0,0,f(0,0)],symbol=circle,color=black):
display({Surface,Points},axes=framed,style=patchnogrid,orientation=[-150,45]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_85.gif)
Pour mieux observer la nature de ce point critique, cliquez sur le graphique prcdent en maintenant le bouton gauche enfonc et modifiez l'orientation du graphique.
On observe donc que ce point est effectivement un minimum local.
Tracez des courbes sur cette surface afin de mettre en vidence la nature de ce point critique.
> |
Courbe_A:=spacecurve([0,y,f(0,y)],y=-2..2,color=navy,thickness=3):
Courbe_B:=spacecurve([x,0,f(x,0)],x=-2..2,color=orange,thickness=3):
display({Surface,Points,Courbe_A,Courbe_B},axes=framed,style=patchnogrid,orientation=[-145,120]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_86.gif)
> |
display({Points,Courbe_A,Courbe_B},axes=framed,style=patchnogrid,orientation=[-145,120]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_87.gif)
Puisque
, on conclu mme que le point [0,0] est un minimum absolu.
Exemple 3
Soit la fonction f dfinie par
=
> |
f:=(x,y)->-(x^2+y^(2/3)); |
Obtenez les points critiques de cette fonction.
> |
fx:=D[1](f);
fy:=D[2](f); |
n'existe pas quand
. Ce qui rend tout l'axe des x en points critiques: la fonction f possde donc une infinit de points critiques.
Puisque la condition ncessaire d'applicabilit du test n'est pas satisfaite, le test d'extremum local est impuissant. Tracez donc le graphique en mettant en vidence l'axe des x.
Pour obtenir un trac correct de la fonction, il est ncessaire de redfinir la puissance
avec la macro-commande surd (pourquoi ?).
> |
f:=(x,y)->-(x^2+surd(y^2,3));
Surface:=plot3d([x,y,f(x,y)],x=-1..1,y=-2..2):
display({Surface},axes=normal,orientation=[50,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_98.gif)
Superposez la surface tous les points critiques.
> |
Points:=spacecurve([x,0,f(x,0)],x=-1..1,thickness=3,color=orange):
display({Surface,Points},axes=normal,orientation=[50,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_99.gif)
Le graphique montre clairement que
est la fois un maximum local et le maximum absolu de f sur tout son domaine
> |
display({Points},axes=normal,orientation=[50,60]); |
![[Plot]](/view.aspx?SI=4053/test_extremum_local_102.gif)