L2ande 2019-20 - corrigé de l'ex.2B du projet

F-X. Dehon, dehon[@]unice.fr, 8 juin 2020

Enoncé ci-dessous. Ressources pour cette partie :

  • Le corrigé du TD2 "Maximisation de l'utilité" ex1.3-4. Dans ce corrigé on explique :
    • l'existence d'une solution (remarque p15),
    • on rappelle les conditions nécessaires sur le Lagrangien pour qu'un panier de bien x¯ maximise l'utilité (p7-8),
    • on observe pour les données de l'exercice que le gradient de U est à composantes strictement positives et on en déduit que la contrainte de budget est saturée lorsque U est maximal,
    • on est ramené à étudier le tableau de variation de la fonction x1U(x1,x2(x1)).
  • Le corrigé "notebook2" dans lequel on montre des scripts sagemath pour faire des représentations graphiques, calculer une approximation numérique du max de U, résoudre algébriquement le problème du Lagrangien avec une contrainte puis à l'intersection de deux contraintes. On donne une méthode (fort simple) pour déterminer le point où U est maximal parmi un ensemble fini de candidats.

Enoncé de l'ex.2B :

Ex.1 Discuter du maximum de la fonction d'utilité U(x,y)=3x3+x2y17x24xy+17xy+5 sous les contraintes x0, y0 et la contrainte de revenu 5x+3yr pour r=20 puis pour r=5.

Ex.2 Soit U:(x,y)U(x,y) une fonction d'utilité (à valeurs dans R) dont on cherche le maximum sous les contraintes conjointes c1(x,y)0, c2(x,y)0 et c3(x,y)0. On ne précise ni U ni les ci. 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 (x,y)U est maximal ? Expliquer. Que peut on dire des couples (x,y)U 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)

Corrigé

Un corrigé sans calcul sur ordinateur est possible. Néanmoins le script de l'exercice 2 (complété par les définitions de U et des ci) permet de répondre rapidement à l'exercice 1. Commençons donc par répondre à l'ex.2 :

le script donne la liste des couples (x,y) 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 ci.

On ne retient de la liste que les couples (x,y) satisfaisant les contraintes (donc tels que c1,c2,c30) 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 (0.00,1.7) du cas 5.

Pour chercher le minimum on exécuterait ce même script avec U à la place de U, ce qui équivaut à exécuter le script avec U et ne retenir que les points où les contraintes ci0 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 (x,y)=(0,0).

Rq. dans le cas 5 deux multiplicateurs sont non nuls donc deux contraintes sont saturées : c1 et c3 ; le point (0.00,1.7) est à l'intersection des courbes c1=0 et c3=0, c'est un coin. Idem pour le cas 3.

Rq. si plusieurs cas étaient retenus, il nous faudrait la valeur de U pour conclure.

Venons en à l'exercice 1 :

On exécute le script pour r=5, on dessine le graphe de U au dessus du domaine. On fait de même ensuite pour r=20 :

In [8]:
#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
no (x,y), U(x,y), (l,m,n), (c1(x,y),c2(x,y),c3(x,y))
1 (-1.2, 7.5) (0.00, 0.00, 0.00) (1.2, -7.5, 11.)
2 (3.2, -1.5) (0.00, 0.00, 0.00) (-3.2, 1.5, 6.8)
3 (2.9, 0.00) (0.00, 1.4, 0.00) (-2.9, -0.00, 9.4)
4 (0.11, 0.00) (0.00, 4.2, 0.00) (-0.11, -0.00, -4.4)
5 (0.00, 0.00) (-2.0, 4.0, 0.00) (-0.00, -0.00, -5)
6 (7.3, -10.) (0.00, 0.00, 11.) (-7.3, 10., 0.00)
7 (0.73, 0.45) (0.00, 0.00, -1.6) (-0.73, -0.45, 0.0078)
8 (0.00, 1.7) (-5.3, 0.00, -1.3) (-0.00, -1.7, 0.00)
9 (1.0, 0.00) (0.00, -1.0, -2.0) (-1.0, -0.00, 0.00)

Comme pour l'ex.2 on ne retient de la liste le cas 4.

In [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)
Out[4]:
4(1669+32,0)
False

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 :

In [5]:
ns=7
x,y=(S[ns-1][i].rhs() for i in range(2))
show(ns,(x,y))
print bool(c3(x,y)==0)
Out[5]:
7(436+4,20965)
True

Graphe de U :

In [6]:
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
Out[6]:

Cas r=20 maintenant :

In [10]:
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
(x,y), U(x,y), (l,m,n), (c1(x,y),c2(x,y),c3(x,y)) =
1 (-1.24, 7.47) -0.000977 (0.000, 0.000, 0.000) (1.24, -7.47, -3.76)
2 (3.24, -1.47) 0.000977 (0.000, 0.000, 0.000) (-3.24, 1.47, -8.24)
3 (2.88, 0.000) -1.11 (0.000, 1.45, 0.000) (-2.88, -0.000, -5.58)
4 (0.115, 0.000) 20.1 (0.000, 4.22, 0.000) (-0.115, -0.000, -19.4)
5 (0.000, 0.000) 20 (-2.00, 4.00, 0.000) (-0.000, -0.000, -20)
6 (1.38, 4.37) -10.3 (0.000, 0.000, -1.62) (-1.38, -4.37, -0.000977)
7 (-3.38, 12.3) 7.66 (0.000, 0.000, 4.73) (3.38, -12.3, 0.000)
8 (0.000, 6.67) -6.67 (4.67, 0.000, -1.33) (-0.000, -6.67, 0.000)
9 (4.00, 0.000) 12.0 (0.000, 11.6, 5.20) (-4.00, -0.000, 0.000)

On retient cette fois les cas 3,4,9. Pour les distinguer, on affiche la valeur prise par U 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 (0.115,0) (cas 4).

Expression algébrique de (x,y) :

In [12]:
ns=4
x,y=(S[ns-1][i].rhs() for i in range(2))
show(ns,(x,y))
Out[12]:
4(1669+32,0)

Graphe de U :

In [12]:
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')
Out[12]:

Remarque : Pour r=5 comme pour r=20 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.