Application Center - Maplesoft

App Preview:

Optimisation d'une fonction de deux variables: Test d'extremum local

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application


 

test_extremum_local.mw

[Inserted Image]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 diff(f(x, y), x) |(a,b) = 0 et diff(f(x, y), y) |(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 diff(f(x, y), x, y) = diff(f(x, y), y, x) .

En fait, on transposera en Maple la dmarche papier-crayon qui a t prsente en classe.

> restart;

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 f(x, y) = x^4-3*x^2*y+3*y-y^3 . Crez la fonction f.

> f:=(x,y)->x^4-3*x^2*y+3*y-y^3;

f := proc (x, y) options operator, arrow; x^4-3*x^2*y+3*y-y^3 end proc

Calculez maintenant les drives partielles diff(f(x, y), x)  et  diff(f(x, y), y) l'aide de l'oprateur de drivation D.

> fx:=D[1](f);
fy:=D[2](f);

fx := proc (x, y) options operator, arrow; 4*x^3-6*x*y end proc

fy := proc (x, y) options operator, arrow; -3*x^2+3-3*y^2 end proc

REMARQUE: En utilisant l'oprateur de drivation D, f[x] et f[y] sont des fonctions des variables x et y.

Ensuite, il faut rsoudre, dans le domaine de dfinition de f, les quations diff(f(x, y), x) = 0 et diff(f(x, y), y) = 0 . 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 x < infinity .

> Sol_symboliques:=solve({fx(x,y)=0,fy(x,y)=0,x<infinity},{x,y});

Sol_symboliques := {x = 0, y = 1}, {x = 0, y = -1}, {y = 1/2, x = RootOf(4*_Z^2-3, -.8660254038)}, {y = 1/2, x = RootOf(4*_Z^2-3, .8660254038)}

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});

Sol_symboliques := {{x = 0, y = 1}, {x = 0, y = -1}, {y = 1/2, x = -1/2*3^(1/2)}, {y = 1/2, x = 1/2*3^(1/2)}}

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

P := [[-1/2*3^(1/2), 1/2], [0, 1], [0, -1], [1/2*3^(1/2), 1/2]]

Les quatres points critiques de cette fonction sont les points [-sqrt(3)/2, 1/2], [0, -1], [0, 1], [sqrt(3)/2, 1/2] .  

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});

Sol_numeriques := {x = 0., y = -1.000000000}

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});

Sol_numeriques := {x = 0., y = -1.000000000}

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 Delta(x, y) , soit les fonctions drives successives d'ordre 2  f[xx] et  f[yy] dfinies respectivement par f[xx](x, y) = diff(f(x, y), `$`(x, 2)) et par f[yy](x, y) = diff(f(x, y), `$`(y, 2)) ainsi que la fonction drive mixte f[xy] dfinie par f[xy](x, y) = diff(f(x, y), x, y) .

> fxx:=D[1](fx);
fyy:=D[2](fy);

fxy:=D[2](fx);

fxx := proc (x, y) options operator, arrow; 12*x^2-6*y end proc

fyy := proc (x, y) options operator, arrow; -6*y end proc

fxy := proc (x, y) options operator, arrow; -6*x end proc

Crez finalement la fonction discriminant Delta qui servira calculer sa valeur avec chacun des points critiques:

Delta(x, y) = f[xx](x, y)*f[yy](x, y)-f[xy]^2(x, y)

> Delta:=(x,y)->fxx(x,y)*fyy(x,y)-(fxy^2)(x,y);

Delta := proc (x, y) options operator, arrow; fxx(x, y)*fyy(x, y)-fxy^2(x, y) end proc

Dans le but d'tre concis, rsumez dans un tableau les valeurs de Delta(x, y) et de f[xx](x, y) 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 [0, -1] est un minimum local, [0, 1] 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.

> with(plots,display);

[display]

> 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]

>

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

Points_surface := [-1/2*3^(1/2), 1/2, 13/16], [0, 1, 2], [0, -1, -2], [1/2*3^(1/2), 1/2, 13/16]

La macro-commande pointplot3d de l'extension plots sera ici trs utile.

> with(plots,pointplot3d);

[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]

>

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

[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]

>

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]

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]

Au point [-sqrt(3)/2, 1/2, 13/16] : 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 [sqrt(3)/2, 1/2, 13/16] : 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]

>

Impuissance du test d'extremum local

Dans le cas o  Delta(x, y) = 0 (ou de la non-existence de  diff(f(x, y), x) ou de  diff(f(x, y), y) ), 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 f(x, y) = x^3+y^2 .

> f:=(x,y)->x^3+y^2;

f := proc (x, y) options operator, arrow; x^3+y^2 end proc

Obtenez les points critiques de cette fonction.

> fx:=D[1](f);
fy:=D[2](f);

fx := proc (x, y) options operator, arrow; 3*x^2 end proc

fy := proc (x, y) options operator, arrow; 2*y end proc

> Sol_symboliques:=solve({fx(x,y)=0,fy(x,y)=0,x<infinity},{x,y});

Sol_symboliques := {x = 0, y = 0}, {x = 0, y = 0}

> Sol_symboliques:=map(allvalues,{Sol_symboliques});

Sol_symboliques := {{x = 0, y = 0}}

Nous avons obtenu qu'un seul point critique.

> P:=Points_Critiques(Sol_symboliques);

P := [[0, 0]]

Calculez maintenant le discriminant Delta .

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

fxx := proc (x, y) options operator, arrow; 6*x end proc

fxy := 0

fyy := 2

Delta := proc (x, y) options operator, arrow; fxx(x, y)*fyy(x, y)-fxy^2(x, y) end proc

0

Ainsi, puisque Delta = 0 , 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]

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]

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]

>

Exemple 2

Soit la fonction f dfinie par f(x, y) = x^2+y^4

> f:=(x,y)->x^2+y^4;

f := proc (x, y) options operator, arrow; x^2+y^4 end proc

Obtenez les points critiques de cette fonction.

> fx:=D[1](f);
fy:=D[2](f);

fx := proc (x, y) options operator, arrow; 2*x end proc

fy := proc (x, y) options operator, arrow; 4*y^3 end proc

> Sol_symboliques:=solve({fx(x,y)=0,fy(x,y)=0,x<infinity},{x,y});

Sol_symboliques := {x = 0, y = 0}, {x = 0, y = 0}, {x = 0, y = 0}

> Sol_symboliques:=map(allvalues,{Sol_symboliques});

Sol_symboliques := {{x = 0, y = 0}}

Nous avons obtenu qu'un seul point critique.

> P:=Points_Critiques(Sol_symboliques);

P := [[0, 0]]

Calculez maintenant le discriminant Delta .

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

fxx := 2

fxy := 0

fyy := proc (x, y) options operator, arrow; 12*y^2 end proc

Delta := proc (x, y) options operator, arrow; fxx(x, y)*fyy(x, y)-fxy^2(x, y) end proc

0

Encore ici, puisque Delta(0, 0) = 0 , 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]

>

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]

> display({Points,Courbe_A,Courbe_B},axes=framed,style=patchnogrid,orientation=[-145,120]);

[Plot]

>

Puisque f(x, y) = x^2+y^4 , 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)

> f:=(x,y)->-(x^2+y^(2/3));

f := proc (x, y) options operator, arrow; -x^2-y^(2/3) end proc

Obtenez les points critiques de cette fonction.

> fx:=D[1](f);
fy:=D[2](f);

fx := proc (x, y) options operator, arrow; -2*x end proc

fy := proc (x, y) options operator, arrow; -2/3/y^(1/3) end proc

diff(f(x, y), y) n'existe pas quand y = 0 . 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 2/3 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]);

f := proc (x, y) options operator, arrow; -x^2-surd(y^2, 3) end proc

[Plot]

>

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]

Le graphique montre clairement que f(0, 0) = 0 est la fois un maximum local et le maximum absolu de f sur tout son domaine R^2

> display({Points},axes=normal,orientation=[50,60]);

[Plot]

>