{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### Maximisation de la fonction d'utilité sous contrainte :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "r=20#revenu\n",
    "x,y,z = var('x,y,z')\n",
    "\n",
    "b(x,y)=r-(5*x+3*y) #contrainte revenu - prix\n",
    "U(x,y)=(x+2)*(x+3*y) #utilité"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(x + 3*y)*(x + 2)\n"
     ]
    }
   ],
   "source": [
    "print U(x,y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "Approximation numérique du point où $U$ est maximal donnée par la fonction Sagemath `minimize_constrained`.\n",
    "\n",
    "Attention à la syntaxe pour les définitions de `f`,`c0`,`c1`,`c2` ci-dessous, cf `minimize_constrained?`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a = (1.500057102546868, 4.16657149575522) , b(a) = 0.0 , U(a) = 48.9999999869572\n"
     ]
    }
   ],
   "source": [
    "f=lambda (x,y):-U(x,y)\n",
    "c0=lambda (x,y):r-(5*x+3*y)#c0=lambda (x,y):b(x,y) ne donne pas le résultat escompté\n",
    "c1=lambda (x,y):x\n",
    "c2=lambda (x,y):y\n",
    "a=minimize_constrained(f,[c1,c2,c0],(1,2))\n",
    "print 'a =',a,', b(a) =',c0(a),', U(a) =',U(*a)#comparer avec ce qu'on voit sur le dessin"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "Annulation du gradient de $U$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(x, y) |--> (2*x + 3*y + 2, 3*x + 6)\n",
      "[2*x + 3*y + 2, 3*x + 6]\n"
     ]
    }
   ],
   "source": [
    "print U.gradient()\n",
    "print U.gradient()(x,y).list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(x, y) |--> (-5, -3)\n"
     ]
    }
   ],
   "source": [
    "print b.gradient()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[x == -2, y == (2/3)]]"
      ]
     },
     "execution_count": 17,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solve([2*x + 3*y + 2==0,3*x + 6==0],[x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[x == -2, y == (2/3)]]"
      ]
     },
     "execution_count": 20,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solve([e==0 for e in U.gradient()(x,y).list()],[x,y])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "dessin (cf utilite.ipynb):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "source": [
    "xmin,xmax=(-4,8)\n",
    "ymin,ymax=(-4,8)\n",
    "zmin,zmax=(-60,80)\n",
    "\n",
    "A=line3d([(xmin,0,0),(xmax,0,0),(xmin,0,0)])+line3d([(0,ymin,0),(0,ymax,0),(0,ymin,0)])+line3d([(0,0,zmin),(0,0,zmax),(0,0,zmin)])#bug avec line3d et threejs\n",
    "T=text3d('x', (xmax*3/4, -.5, -.5))+text3d('y', (-.5, ymax*3/4, -.5))+text3d('z', (-.5, -.5,zmax*3/4))+text3d(str(xmax),(xmax,-.5,-.5))+text3d(str(ymax),(-.5,ymax,-.5))+text3d(str(zmax),(-.5,-.5,zmax))\n",
    "\n",
    "P = implicit_plot3d(z-U(x,y),(x,xmin,xmax),(y,ymin,ymax),(z,zmin,zmax),color='orange', opacity=0.8)\n",
    "\n",
    "show(P+A+T,frame=false,aspect_ratio=[1,1,.1],viewer='threejs')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "$(-2,\\frac{2}{3})$ est un point selle ! Ni minimum ni maximum en ce point.\n",
    "\n",
    "Par ailleurs il ne vérifie pas les contraintes $x\\geq 0, y\\geq 0, 5x+3y\\leq r$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "Multiplicateurs de Lagrange"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "c1(x,y)=x\n",
    "c2(x,y)=y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "source": [
    "var('l,m,n')\n",
    "solve([e==0 for e in ,[x,y,l,m,n])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath (default)",
   "language": "sagemath",
   "metadata": {
    "cocalc": {
     "description": "Open-source mathematical software system",
     "priority": 10,
     "url": "https://www.sagemath.org/"
    }
   },
   "name": "sagemath"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
