{ "cells": [ { "cell_type": "markdown", "id": "619cd606", "metadata": {}, "source": [ "### Exercise 2 - Numerical Optimization\n", "\n", "Consider the following nonlinear optimization problem\n", "\n" ] }, { "cell_type": "markdown", "id": "f783adbb", "metadata": {}, "source": [ "Compute the gradients of the objective $f(x, y) = \\frac{1}{2}(x-1)^2 + \\frac{1}{2}(10(y - x^2))^2 + \\frac{1}{2}x^2$ and the constraints $g(x, y) = x + (1-y)^2$ and their Hessian on paper.\n", "Write down on paper the Karush-Kuhn-Tucker (KKT) conditions for the above problem. Are these\n", "conditions necessary for optimality? Are they sufficient?" ] }, { "cell_type": "markdown", "id": "837e97bb", "metadata": {}, "source": [ "Gradient of $f(x, y)$\n", "\n", "$\n", "\\nabla f(x,y) = \n", " \\begin{bmatrix} \n", "2x -1 - 200 xy + 200 x^3 \\\\ \n", "100y - 100x^2 \n", "\\end{bmatrix}\n", "$\n", "\n", "Hessian of $f(x, y)$\n", "\n", "$\n", "\\nabla^2 f(x,y) = \\begin{bmatrix}\n", "2 - 200y + 600 x^2 & -200x \\\\ -200 x & 100\n", "\\end{bmatrix}\n", "$\n", "\n", "Gradient of $g(x, y)$\n", "\n", "$\n", "\\nabla g(x,y) \n", "= \\begin{bmatrix}\n", "1 \\\\ -2 + 2y \n", "\\end{bmatrix}\n", "$\n", "\n", "Hessian of $g(x, y)$\n", "\n", "$\n", "\\nabla^2 g(x,y) = \n", "\\begin{bmatrix}\n", "0 & 0 \\\\ 0 & 2\n", "\\end{bmatrix}\n", "$ \n", "\n", " " ] }, { "cell_type": "markdown", "id": "19065e8f", "metadata": {}, "source": [ "Lagrangian for this problem: $\\mathcal{L}(x,y,\\lambda) = f(x,y) + \\lambda^\\top g(x,y)$, $\\lambda \\in \\mathbb{R}$\n", "\n", "KKT conditions (first order necessary conditions):\n", "\\begin{align*}\n", "\\nabla_{(x,y)} \\mathcal{L}(x^*,y^*,\\lambda^*) = \\nabla f(x^*,y^*) + \\nabla g(x^*,y^*) \\lambda^* &= 0 \\\\\n", "g(x^*,y^*) &= 0\n", "\\end{align*}\n", "\n", "If LICQ holds at $(x^*, y^*)$, the KKT conditions are necessary conditions for optimality, but in general not sufficient.\n", "\n", "If the problem is additionally convex, they are also sufficient. The given specific problem is not convex, therefore they are not sufficient." ] }, { "cell_type": "markdown", "id": "46b53fe4", "metadata": {}, "source": [ "Define CasADi functions for $f$ and $g$ and use CasADi to generate the gradient and hessian functions of these two functions." ] }, { "cell_type": "code", "execution_count": 1, "id": "68b966d0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "@1=0.5, (((@1*sq((x-1)))+(@1*sq((10*(y-sq(x))))))+(@1*sq(x)))\n" ] } ], "source": [ "import numpy as np\n", "from casadi import SX, Function, sin\n", "\n", "x = SX.sym('x')\n", "y = SX.sym('y')\n", "\n", "f = 0.5*(x-1)**2 + 0.5*(10*(y-x**2))**2 + 0.5*x**2\n", "g = x + (1-y)**2\n", "\n", "print(f)" ] }, { "cell_type": "code", "execution_count": 2, "id": "7a4fa271", "metadata": {}, "outputs": [], "source": [ "from casadi import Function\n", "\n", "f_fun = Function('f', [x, y], [f])\n", "g_fun = Function('g', [x, y], [g])" ] }, { "cell_type": "code", "execution_count": 3, "id": "07c506e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Function(g:(i0,i1)->(o0) SXFunction)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g_fun" ] }, { "cell_type": "code", "execution_count": 4, "id": "eb90a9f4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g_fun(0, 0).full()" ] }, { "cell_type": "code", "execution_count": 5, "id": "803ae8ee", "metadata": {}, "outputs": [], "source": [ "from casadi import vertcat, jacobian, hessian\n", "\n", "z = vertcat(x, y)\n", "J_f = jacobian(f, z)\n", "J_g = jacobian(g, z)" ] }, { "cell_type": "code", "execution_count": 6, "id": "748455a2", "metadata": {}, "outputs": [], "source": [ "H_f, J_f = hessian(f, z)\n", "H_g, J_g = hessian(g, z)" ] }, { "cell_type": "code", "execution_count": null, "id": "652eb866", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 7, "id": "c8dcfba1", "metadata": {}, "outputs": [], "source": [ "H_g_fun = Function('H_g', [z], [H_g])" ] }, { "cell_type": "code", "execution_count": 8, "id": "c534a62b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.],\n", " [0.]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "J_f_fun = Function('J_f', [x, y], [J_f])\n", "J_f_fun(1, 1).full()" ] }, { "cell_type": "markdown", "id": "f5b3eaf3", "metadata": {}, "source": [ "Solve the above constrained optimization problem using CasADi using the solver IPOPT." ] }, { "cell_type": "code", "execution_count": 9, "id": "bf100400", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "solver:(x0[2],p[],lbx[2],ubx[2],lbg,ubg,lam_x0[2],lam_g0)->(x[2],f,g,lam_x[2],lam_g,lam_p[]) IpoptInterface\n" ] } ], "source": [ "from casadi import nlpsol\n", "\n", "nlp = {'x':z, 'f':f, 'g':g}\n", "\n", "# opts = {'ipopt':{'fixed_variable_treatment':'make_constraint'}}\n", "\n", "# solver = nlpsol('solver', 'ipopt', nlp, opts)\n", "solver = nlpsol('solver', 'ipopt', nlp)\n", "\n", "print(solver)" ] }, { "cell_type": "code", "execution_count": 10, "id": "db19fcf1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "******************************************************************************\n", "This program contains Ipopt, a library for large-scale nonlinear optimization.\n", " Ipopt is released as open source code under the Eclipse Public License (EPL).\n", " For more information visit http://projects.coin-or.org/Ipopt\n", "******************************************************************************\n", "\n", "This is Ipopt version 3.12.3, running with linear solver mumps.\n", "NOTE: Other linear solvers might be more efficient (see Ipopt documentation).\n", "\n", "Number of nonzeros in equality constraint Jacobian...: 2\n", "Number of nonzeros in inequality constraint Jacobian.: 0\n", "Number of nonzeros in Lagrangian Hessian.............: 3\n", "\n", "Total number of variables............................: 2\n", " variables with only lower bounds: 0\n", " variables with lower and upper bounds: 0\n", " variables with only upper bounds: 0\n", "Total number of equality constraints.................: 1\n", "Total number of inequality constraints...............: 0\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 0\n", " inequality constraints with only upper bounds: 0\n", "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 0 2.5000000e+00 1.00e+00 0.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", " 1 3.1201050e+00 3.90e-01 3.07e+01 -1.7 1.89e+00 - 1.00e+00 5.00e-01h 2\n", " 2 1.2655173e+00 4.44e-02 3.60e+00 -1.7 2.11e-01 - 1.00e+00 1.00e+00f 1\n", " 3 1.2933807e+00 1.57e-04 1.38e-01 -1.7 2.60e-02 - 1.00e+00 1.00e+00h 1\n", " 4 1.2934668e+00 1.86e-07 1.07e-04 -2.5 4.65e-04 - 1.00e+00 1.00e+00h 1\n", " 5 1.2934669e+00 9.00e-14 3.34e-11 -5.7 3.00e-07 - 1.00e+00 1.00e+00h 1\n", "\n", "Number of Iterations....: 5\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 1.2934669039384192e+00 1.2934669039384192e+00\n", "Dual infeasibility......: 3.3410829658464536e-11 3.3410829658464536e-11\n", "Constraint violation....: 9.0039087297100195e-14 9.0039087297100195e-14\n", "Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00\n", "Overall NLP error.......: 3.3410829658464536e-11 3.3410829658464536e-11\n", "\n", "\n", "Number of objective function evaluations = 8\n", "Number of objective gradient evaluations = 6\n", "Number of equality constraint evaluations = 8\n", "Number of inequality constraint evaluations = 0\n", "Number of equality constraint Jacobian evaluations = 6\n", "Number of inequality constraint Jacobian evaluations = 0\n", "Number of Lagrangian Hessian evaluations = 5\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.007\n", "Total CPU secs in NLP function evaluations = 0.000\n", "\n", "EXIT: Optimal Solution Found.\n", " solver : t_proc (avg) t_wall (avg) n_eval\n", " nlp_f | 21.00us ( 2.62us) 24.95us ( 3.12us) 8\n", " nlp_g | 49.00us ( 6.12us) 53.86us ( 6.73us) 8\n", " nlp_grad_f | 33.00us ( 4.71us) 29.93us ( 4.28us) 7\n", " nlp_hess_l | 20.00us ( 4.00us) 18.45us ( 3.69us) 5\n", " nlp_jac_g | 17.00us ( 2.43us) 18.70us ( 2.67us) 7\n", " total | 9.68ms ( 9.68ms) 10.08ms ( 10.08ms) 1\n" ] } ], "source": [ "r = solver(x0=[-1, 1], lbg=0, ubg=0)" ] }, { "cell_type": "code", "execution_count": 11, "id": "4207e7c5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'f': DM(1.29347),\n", " 'g': DM(9.00391e-14),\n", " 'lam_g': DM(0.817188),\n", " 'lam_p': DM([]),\n", " 'lam_x': DM([0, 0]),\n", " 'x': DM([-0.51811, 0.280202])}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r" ] }, { "cell_type": "code", "execution_count": 12, "id": "294f13b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x_opt: [-0.51811, 0.280202]\n" ] } ], "source": [ "x_opt = r['x']\n", "lam_g_opt = r['lam_g']\n", "\n", "print('x_opt: ', x_opt)" ] }, { "cell_type": "code", "execution_count": 13, "id": "0a91e4bd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-2.0, 2.0)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "