F-X. Dehon, dehon[@]unice.fr, 8 juin 2020
Enoncé ci-dessous. Ressources pour cette partie :
Ex.1 Discuter du maximum de la fonction d'utilité sous les contraintes , et la contrainte de revenu pour puis pour .
Ex.2 Soit une fonction d'utilité (à valeurs dans ) dont on cherche le maximum sous les contraintes conjointes , et . On ne précise ni ni les . On a exécuté avec Sagemath la suite d'instructions ci-dessous et obtenu la réponse qui suit. Que peut on dire des couples où est maximal ? Expliquer. Que peut on dire des couples où est minimal ?
var('l,m,n')
L=(U-l*c1-m*c2-n*c3).gradient()(x,y)
S=solve([L[0]==0,L[1]==0,l*c1==0,m*c2==0,n*c3==0],[x,y,l,m,n])
print '(x,y), (l,m,n), (c1(x,y),c2(x,y),c3(x,y)) ='
ns=1
for s in S:
x,y,l,m,n=(s[i].rhs().n(digits=2) for i in range(5))
print ns,(x,y),(l,m,n),(c1(x,y),c2(x,y),c3(x,y))
ns=ns+1
(x,y), (l,m,n), (c1(x,y),c2(x,y),c3(x,y)) =
1 (-2.0, 0.67) (0.00, 0.00, 0.00) (2.0, -0.67, -13.)
2 (-1.0, 0.00) (0.00, -3.0, 0.00) (1.0, 0.00, -10.)
3 (0.00, 0.00) (-2.0, -6.0, 0.00) (0.00, 0.00, -5.0)
4 (-0.38, 2.3) (0.00, 0.00, 1.6) (0.38, -2.3, 0.00)
5 (0.00, 1.7) (3.0, 0.00, 2.0) (0.00, -1.7, 0.00)
6 (1.0, 0.00) (0.00, -6.6, 0.80) (-1.0, 0.00, 0.00)
Un corrigé sans calcul sur ordinateur est possible. Néanmoins le script de l'exercice 2 (complété par les définitions de et des ) permet de répondre rapidement à l'exercice 1. Commençons donc par répondre à l'ex.2 :
le script donne la liste des couples où le gradiant du lagrangien s'annule avec saturation des contraintes dont le multiplicateur est non nul, avec les valeurs des multiplicateurs associés et les valeurs prises par les contraintes .
On ne retient de la liste que les couples satisfaisant les contraintes (donc tels que ) et tels que les multiplicateurs associés soient positifs (gradiant nul ou sortant du domaine déterminé par les contraintes). De la sorte on ne retient que le cas 5. Puisque le maximum est atteint en l'un des points de la liste, c'est en le point du cas 5.
Pour chercher le minimum on exécuterait ce même script avec à la place de , ce qui équivaut à exécuter le script avec et ne retenir que les points où les contraintes sont statisfaites et où les multiplicateurs sont tous négatifs (gradiant nul ou rentrant dans le domaine). De la sorte on ne retient que le cas 3 avec .
Rq. dans le cas 5 deux multiplicateurs sont non nuls donc deux contraintes sont saturées : et ; le point est à l'intersection des courbes et , c'est un coin. Idem pour le cas 3.
Rq. si plusieurs cas étaient retenus, il nous faudrait la valeur de pour conclure.
Venons en à l'exercice 1 :
On exécute le script pour , on dessine le graphe de au dessus du domaine. On fait de même ensuite pour :
#2B
r=5
var('x,y,l,m,n')
U(x,y)=2*x^3+x^2*y-9*x^2-2*x*y+2*x-4*y+20
c1(x,y)=-x
c2(x,y)=-y
c3(x,y)=5*x+3*y-r
L=(U-l*c1-m*c2-n*c3).gradient()(x,y)
S=solve([L[0]==0,L[1]==0,l*c1==0,m*c2==0,n*c3==0],[x,y,l,m,n])
print 'no (x,y), U(x,y), (l,m,n), (c1(x,y),c2(x,y),c3(x,y))'
ns=1
for s in S:
x,y,l,m,n=(s[i].rhs().n(digits=2) for i in range(5))
print ns,(x,y),(l,m,n),(c1(x,y),c2(x,y),c3(x,y))
ns=ns+1
Comme pour l'ex.2 on ne retient de la liste le cas 4.
ns=4
x,y=(S[ns-1][i].rhs() for i in range(2))
show(ns,(x,y))
print bool(c3(x,y)==0)
Le cas 7 correspond à 'TMS'. La valeur numérique de c3 est ici strictement positive alors qu'on s'attend à c3(x,y)=0 si l=m=0 et n≠0. Cet écart vient de l'approximation numérique. Vérification :
ns=7
x,y=(S[ns-1][i].rhs() for i in range(2))
show(ns,(x,y))
print bool(c3(x,y)==0)
Graphe de :
xmax=r/5;ymax=r/3
var('x,y,z')
show(implicit_plot3d(c3(x,y)==0,(x,0,xmax),(y,0,ymax),(z,5,20.1),color='lightblue')+plot3d(U(x,y),(x,0,xmax),(y,0,ymax), opacity=0.8),viewer='threejs')#,axes=True
Cas maintenant :
r=20
var('x,y,l,m,n')
U(x,y)=2*x^3+x^2*y-9*x^2-2*x*y+2*x-4*y+20
c1(x,y)=-x
c2(x,y)=-y
c3(x,y)=5*x+3*y-r
L=(U-l*c1-m*c2-n*c3).gradient()(x,y)
S=solve([L[0]==0,L[1]==0,l*c1==0,m*c2==0,n*c3==0],[x,y,l,m,n])
print '(x,y), U(x,y), (l,m,n), (c1(x,y),c2(x,y),c3(x,y)) ='
ns=1
for s in S:
x,y,l,m,n=(s[i].rhs().n(digits=3) for i in range(5))
#print ns,(x,y),U(x,y),bool(l>=0 and m>=0 and n>=0),(bool(c1(x,y)<=0 and c2(x,y)<=0 and c3(x,y)<=0))
print ns,(x,y),U(x,y),(l,m,n),(c1(x,y),c2(x,y),c3(x,y))
ns=ns+1
On retient cette fois les cas 3,4,9. Pour les distinguer, on affiche la valeur prise par et on retient la plus grande (il faut augmenter la précision numérique pour distinguer 4 de 5). On conclut que le max est atteint en (cas 4).
Expression algébrique de :
ns=4
x,y=(S[ns-1][i].rhs() for i in range(2))
show(ns,(x,y))
Graphe de :
xmax=r/5;ymax=r/3
var('x,y,z')
show(implicit_plot3d(c3(x,y)==0,(x,0,xmax),(y,0,ymax),(z,-22,38),color='lightblue')+plot3d(U(x,y),(x,0,xmax),(y,0,ymax), opacity=0.8),viewer='threejs')
Remarque : Pour comme pour le max n'est pas atteint en un point où la contrainte budgétaire est saturée. Les préférences ne peuvent donc pas être "monotones". Ceci est cohérent avec ce qu'on voit sur le dessin.