{ "metadata": { "name": "", "signature": "sha256:3898eae49f8480d68ab6134e43ccf75a40cbf215408c55782eef6494dce39b81" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Simple [optoy](http://optoy.casadi.org) demo" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "from pylab import *\n", "from optoy import *\n", "\n", "s = state(name=\"speed\",init=1)\n", "p = state(name=\"position\")\n", "\n", "u = control(name=\"throttle\")\n", "\n", "tf = var(name=\"final time\",init=1)\n", "\n", "s.dot = u - s\n", "p.dot = s\n", "\n", "smax = 1-sin(2*pi*p)/2\n", "\n", "constraints = [ \n", " \n", " # Boundary conditions\n", " s.start == 0,\n", " p.start == 0, \n", " p.end == 1,\n", "\n", " # Path constraints\n", " u <= 1,\n", " s <= smax\n", "]\n", " \n", "print ocp(tf, constraints, T=tf,verbose=True,N=50)\n", "\n", "plot(value(u),'b');\n", "plot(value(s),'g');\n", "plot(value(smax),'r');" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1, 1)\n", "\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" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "This is Ipopt version 3.11.9, 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...: 453\n", "Number of nonzeros in inequality constraint Jacobian.: 150\n", "Number of nonzeros in Lagrangian Hessian.............: 151\n", "\n", "Total number of variables............................: 153\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.................: 103\n", "Total number of inequality constraints...............: 100\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 0\n", " inequality constraints with only upper bounds: 100\n", "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 0 1.0000000e+00 1.00e+00 7.28e-01 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", " 1 1.2199308e+00 9.04e-01 8.40e+00 -1.7 4.27e+00 - 1.01e-02 9.58e-02h 1\n", " 2 1.4838594e+00 8.27e-01 7.69e+00 -1.7 3.10e+00 - 1.18e-01 8.52e-02h 4\n", " 3 1.5772587e+00 8.00e-01 7.44e+00 -1.7 2.85e+00 - 8.09e-02 3.28e-02h 5\n", " 4 1.7441419e+00 7.45e-01 6.93e+00 -1.7 2.44e+00 - 3.72e-02 6.84e-02h 4" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 5 1.4760314e+00 3.81e-01 1.69e+01 -1.7 1.57e+00 - 3.29e-02 4.89e-01F 1\n", " 6 1.6580267e+00 2.06e-01 1.05e+01 -1.7 1.27e+00 - 8.42e-02 4.58e-01h 1\n", " 7 2.0307307e+00 3.99e-03 7.74e+00 -1.7 5.32e-01 - 1.54e-01 1.00e+00h 1\n", " 8 2.0732984e+00 7.16e-05 6.23e-01 -1.7 3.39e-01 - 8.50e-01 1.00e+00h 1\n", " 9 2.2711672e+00 6.09e-04 8.44e-01 -1.7 2.12e-01 - 5.44e-01 1.00e+00f 1\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 10 2.5765409e+00 1.57e-03 4.68e-01 -1.7 4.06e-01 - 8.13e-01 1.00e+00f 1\n", " 11 2.7228868e+00 3.97e-03 8.30e-02 -1.7 1.51e+00 - 1.00e+00 1.00e+00h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 12 2.1743414e+00 3.33e-03 7.05e-02 -2.5 5.49e-01 - 1.00e+00 1.00e+00f 1\n", " 13 2.0287249e+00 3.01e-03 1.57e-02 -2.5 1.30e+00 - 1.00e+00 1.00e+00h 1\n", " 14 1.9673778e+00 1.97e-03 5.29e-02 -3.8 1.79e+00 - 8.59e-01 5.18e-01h 1\n", " 15 1.9202748e+00 1.26e-03 5.07e-02 -3.8 1.24e+00 - 9.61e-01 7.98e-01h 1\n", " 16 1.9112536e+00 5.05e-05 1.04e-03 -3.8 2.89e-01 - 1.00e+00 1.00e+00h 1\n", " 17 1.9063687e+00 2.59e-05 4.20e-02 -5.7 1.63e-01 - 8.61e-01 6.66e-01h 1\n", " 18 1.9042678e+00 4.76e-06 3.76e-03 -5.7 5.90e-02 - 8.91e-01 8.94e-01h 1\n", " 19 1.9040256e+00 3.40e-08 3.53e-06 -5.7 7.67e-03 - 1.00e+00 1.00e+00f 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 20 1.9039352e+00 4.01e-09 2.98e-05 -8.6 2.25e-03 - 9.82e-01 9.90e-01h 1\n", " 21 1.9039342e+00 4.06e-13 4.07e-11 -8.6 2.45e-05 - 1.00e+00 1.00e+00f 1\n", "\n", "Number of Iterations....: 21\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 1.9039342485569817e+00 1.9039342485569817e+00\n", "Dual infeasibility......: 4.0684922497639088e-11 4.0684922497639088e-11\n", "Constraint violation....: 4.0634162701280729e-13 4.0634162701280729e-13\n", "Complementarity.........: 2.5114027187434402e-09 2.5114027187434402e-09\n", "Overall NLP error.......: 2.5114027187434402e-09 2.5114027187434402e-09\n", "\n", "\n", "Number of objective function evaluations = 39\n", "Number of objective gradient evaluations = 22\n", "Number of equality constraint evaluations = 39\n", "Number of inequality constraint evaluations = 39\n", "Number of equality constraint Jacobian evaluations = 22\n", "Number of inequality constraint Jacobian evaluations = 22\n", "Number of Lagrangian Hessian evaluations = 21\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.028\n", "Total CPU secs in NLP function evaluations = 0.140\n", "\n", "EXIT: Optimal Solution Found.\n", " proc wall num mean mean\n", " time time evals proc time wall time\n", " eval_f 0.012 [s] 0.012 [s] 39 0.30 [ms] 0.30 [ms]\n", " eval_grad_f 0.009 [s] 0.009 [s] 23 0.38 [ms] 0.38 [ms]\n", " eval_g 0.014 [s] 0.014 [s] 39 0.35 [ms] 0.35 [ms]\n", " eval_jac_g 0.043 [s] 0.043 [s] 24 1.80 [ms] 1.80 [ms]\n", " eval_h 0.057 [s] 0.057 [s] 22 2.57 [ms] 2.57 [ms]\n", " main loop 0.171 [s] 0.171 [s]\n", "1.90393424856\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "value(u)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "[DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(0.999999),\n", " DMatrix(0.243004),\n", " DMatrix(0.378936),\n", " DMatrix(0.566987),\n", " DMatrix(0.765166),\n", " DMatrix(0.982053),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(1),\n", " DMatrix(0.999999),\n", " DMatrix(0.999999),\n", " DMatrix(0.999997)]" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "constraints = [ \n", " s.start == 0,\n", " p.start == 0, \n", " p.end == 1,\n", " u <= 1,\n", " s <= smax ]\n", "\n", "print ocp(tf, constraints, T=tf,verbose=True,N=50)\n", "\n", "plot(value(u),'b');\n", "plot(value(s),'g');\n", "plot(value(smax),'r');" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1, 1)\n", "This is Ipopt version 3.11.9, running with linear solver mumps.\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "NOTE: Other linear solvers might be more efficient (see Ipopt documentation).\n", "\n", "Number of nonzeros in equality constraint Jacobian...: 453\n", "Number of nonzeros in inequality constraint Jacobian.: 150\n", "Number of nonzeros in Lagrangian Hessian.............: 151\n", "\n", "Total number of variables............................: 153\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.................: 103\n", "Total number of inequality constraints...............: 100\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 0\n", " inequality constraints with only upper bounds: 100\n", "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 0 1.0000000e+00 1.00e+00 7.28e-01 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", " 1 1.2199308e+00 9.04e-01 8.40e+00 -1.7 4.27e+00 - 1.01e-02 9.58e-02h 1\n", " 2 1.4838594e+00 8.27e-01 7.69e+00 -1.7 3.10e+00 - 1.18e-01 8.52e-02h 4\n", " 3 1.5772587e+00 8.00e-01 7.44e+00 -1.7 2.85e+00 - 8.09e-02 3.28e-02h 5\n", " 4 1.7441419e+00 7.45e-01 6.93e+00 -1.7 2.44e+00 - 3.72e-02 6.84e-02h 4\n", " 5 1.4760314e+00 3.81e-01 1.69e+01 -1.7 1.57e+00 - 3.29e-02 4.89e-01F 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 6 1.6580267e+00 2.06e-01 1.05e+01 -1.7 1.27e+00 - 8.42e-02 4.58e-01h 1\n", " 7 2.0307307e+00 3.99e-03 7.74e+00 -1.7 5.32e-01 - 1.54e-01 1.00e+00h 1\n", " 8 2.0732984e+00 7.16e-05 6.23e-01 -1.7 3.39e-01 - 8.50e-01 1.00e+00h 1\n", " 9 2.2711672e+00 6.09e-04 8.44e-01 -1.7 2.12e-01 - 5.44e-01 1.00e+00f 1\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 10 2.5765409e+00 1.57e-03 4.68e-01 -1.7 4.06e-01 - 8.13e-01 1.00e+00f 1\n", " 11 2.7228868e+00 3.97e-03 8.30e-02 -1.7 1.51e+00 - 1.00e+00 1.00e+00h 1\n", " 12 2.1743414e+00 3.33e-03 7.05e-02 -2.5 5.49e-01 - 1.00e+00 1.00e+00f 1\n", " 13 2.0287249e+00 3.01e-03 1.57e-02 -2.5 1.30e+00 - 1.00e+00 1.00e+00h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 14 1.9673778e+00 1.97e-03 5.29e-02 -3.8 1.79e+00 - 8.59e-01 5.18e-01h 1\n", " 15 1.9202748e+00 1.26e-03 5.07e-02 -3.8 1.24e+00 - 9.61e-01 7.98e-01h 1\n", " 16 1.9112536e+00 5.05e-05 1.04e-03 -3.8 2.89e-01 - 1.00e+00 1.00e+00h 1\n", " 17 1.9063687e+00 2.59e-05 4.20e-02 -5.7 1.63e-01 - 8.61e-01 6.66e-01h 1\n", " 18 1.9042678e+00 4.76e-06 3.76e-03 -5.7 5.90e-02 - 8.91e-01 8.94e-01h 1\n", " 19 1.9040256e+00 3.40e-08 3.53e-06 -5.7 7.67e-03 - 1.00e+00 1.00e+00f 1\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 20 1.9039352e+00 4.01e-09 2.98e-05 -8.6 2.25e-03 - 9.82e-01 9.90e-01h 1\n", " 21 1.9039342e+00 4.06e-13 4.07e-11 -8.6 2.45e-05 - 1.00e+00 1.00e+00f 1\n", "\n", "Number of Iterations....: 21\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 1.9039342485569817e+00 1.9039342485569817e+00\n", "Dual infeasibility......: 4.0684922497639088e-11 4.0684922497639088e-11\n", "Constraint violation....: 4.0634162701280729e-13 4.0634162701280729e-13\n", "Complementarity.........: 2.5114027187434402e-09 2.5114027187434402e-09\n", "Overall NLP error.......: 2.5114027187434402e-09 2.5114027187434402e-09\n", "\n", "\n", "Number of objective function evaluations = 39\n", "Number of objective gradient evaluations = 22\n", "Number of equality constraint evaluations = 39\n", "Number of inequality constraint evaluations = 39\n", "Number of equality constraint Jacobian evaluations = 22\n", "Number of inequality constraint Jacobian evaluations = 22\n", "Number of Lagrangian Hessian evaluations = 21\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.032\n", "Total CPU secs in NLP function evaluations = 0.128\n", "\n", "EXIT: Optimal Solution Found.\n", " proc wall num mean mean\n", " time time evals proc time wall time\n", " eval_f 0.011 [s] 0.011 [s] 39 0.28 [ms] 0.28 [ms]\n", " eval_grad_f 0.008 [s] 0.008 [s] 23 0.33 [ms] 0.33 [ms]\n", " eval_g 0.012 [s] 0.012 [s] 39 0.32 [ms] 0.32 [ms]\n", " eval_jac_g 0.042 [s] 0.042 [s] 24 1.75 [ms] 1.75 [ms]\n", " eval_h 0.055 [s] 0.055 [s] 22 2.49 [ms] 2.48 [ms]\n", " main loop 0.160 [s] 0.159 [s]\n", "1.90393424856" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }