{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **Two-phase Schwartz OCP**\n", "(c) 2023 Devakumar Thammisetty\n", "\n", "MPOPT is an open-source Multi-phase Optimal Control Problem (OCP) solver based on pseudo-spectral collocation with customized adaptive grid refinement techniques.\n", "\n", "https://mpopt.readthedocs.io/\n", "\n", "Download this notebook: [twophaseschwartz.ipynb](https://github.com/mpopt/mpopt/blob/docs/docs/source/notebooks/twophaseschwartz.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Install mpopt from pypi using the following. Disable after first usage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import mpopt (Contains main solver modules)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#!pip install mpopt\n", "from mpopt import mp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Defining OCP\n", "\n", "OCP:\n", "https://tomopt.com/docs/propt/tomlab_propt123.php\n", "\n", " \\begin{aligned}\n", "&\\min_{x, u} & \\qquad & J = 5(x_0(t_f)^2 + x_1(t_f)^2) + \\int_{t_0}^{t_f}0dt\\\\\n", "&\\text{subject to} & & \\dot{x_0} = x_1\\\\\n", "& & & \\dot{x_1} = u - 0.1(1+2x_0^2)x_1\\\\\n", "& \\quad \\textit{Phase 1: } & & 1 - 9(x_0-1)^2 -\\left(\\dfrac{x_1-0.4}{0.3}\\right)^2 \\leq 0 \\\\\n", "& & & x_1 \\geq -0.8 \\\\\n", "& & & -1 \\leq u \\leq 1 \\\\\n", "& & & x_0(t_0) = 1; \\ x_1(t_0) = 1; \\\\\n", "& & & t_0 = 0; \\ t_f = 1 \\\\\n", "& \\quad \\textit{Phase 2: } & & t_0 = 1; \\ t_f = 2.9 \\\\\n", "& & & x \\in {\\rm I\\!R}^{2}; \\ u \\in {\\rm I\\!R}\n", " \\end{aligned}\n", "\n", "\n", "We first create an OCP object and then polulate the object with dynamics, path_constraints, terminal_constraints and objective (running_costs, terminal_costs)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "ocp = mp.OCP(n_states=2, n_controls=1, n_phases=2)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Step-1 : Define dynamics\n", "def dynamics0(x, u, t):\n", " return [x[1], u[0] - 0.1 * (1.0 + 2.0 * x[0] * x[0]) * x[1]]\n", "\n", "\n", "ocp.dynamics = [dynamics0, dynamics0]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Step-2: Add path constraints\n", "def path_constraints0(x, u, t):\n", " return [\n", " 1.0 - 9.0 * (x[0] - 1) * (x[0] - 1) - (x[1] - 0.4) * (x[1] - 0.4) / (0.3 * 0.3)\n", " ]\n", "\n", "\n", "ocp.path_constraints[0] = path_constraints0" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Step-3: Add terminal cost\n", "def terminal_cost1(xf, tf, x0, t0):\n", " return 5 * (xf[0] * xf[0] + xf[1] * xf[1])\n", "\n", "\n", "ocp.terminal_costs[1] = terminal_cost1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initial state and Final guess" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "ocp.x00[0] = [1, 1]\n", "ocp.x00[1] = [1, 1]\n", "ocp.xf0[0] = [1, 1]\n", "ocp.xf0[1] = [0, 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Box constraints" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "ocp.lbx[0][1] = -0.8\n", "ocp.lbu[0], ocp.ubu[0] = -1, 1\n", "ocp.lbt0[0], ocp.ubt0[0] = 0, 0\n", "ocp.lbtf[0], ocp.ubtf[0] = 1, 1\n", "ocp.lbtf[1], ocp.ubtf[1] = 2.9, 2.9" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "ocp.validate()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solve and plot the results in one line\n", "\n", "Lets solve the OCP using following pseudo-spectral approximation\n", "* Collocation using Legendre-Gauss-Radau roots\n", "* Let's plot the position and velocity evolution with time starting from 0.\n" ] }, { "cell_type": "code", "execution_count": 9, "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", "Total number of variables............................: 125\n", " variables with only lower bounds: 21\n", " variables with lower and upper bounds: 21\n", " variables with only upper bounds: 0\n", "Total number of equality constraints.................: 88\n", "Total number of inequality constraints...............: 41\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 20\n", " inequality constraints with only upper bounds: 21\n", "\n", "\n", "Number of Iterations....: 9\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 6.4094433643382967e-22 6.4094433643382967e-22\n", "Dual infeasibility......: 4.9116413862415506e-11 4.9116413862415506e-11\n", "Constraint violation....: 1.5082379789532752e-12 1.5181189638724391e-12\n", "Complementarity.........: 2.5210268504311982e-09 2.5210268504311982e-09\n", "Overall NLP error.......: 2.5210268504311982e-09 2.5210268504311982e-09\n", "\n", "\n", "Number of objective function evaluations = 11\n", "Number of objective gradient evaluations = 10\n", "Number of equality constraint evaluations = 11\n", "Number of inequality constraint evaluations = 11\n", "Number of equality constraint Jacobian evaluations = 10\n", "Number of inequality constraint Jacobian evaluations = 10\n", "Number of Lagrangian Hessian evaluations = 9\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.022\n", "Total CPU secs in NLP function evaluations = 0.001\n", "\n", "EXIT: Optimal Solution Found.\n", " solver : t_proc (avg) t_wall (avg) n_eval\n", " nlp_f | 35.00us ( 3.18us) 35.40us ( 3.22us) 11\n", " nlp_g | 335.00us ( 30.45us) 333.19us ( 30.29us) 11\n", " nlp_grad | 57.00us ( 57.00us) 56.50us ( 56.50us) 1\n", " nlp_grad_f | 47.00us ( 4.27us) 44.33us ( 4.03us) 11\n", " nlp_hess_l | 122.00us ( 13.56us) 123.24us ( 13.69us) 9\n", " nlp_jac_g | 523.00us ( 47.55us) 511.58us ( 46.51us) 11\n", " total | 29.37ms ( 29.37ms) 28.73ms ( 28.73ms) 1\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# ocp.du_continuity[0] = 1\n", "mpo, post = mp.solve(ocp, n_segments=1, poly_orders=20, scheme=\"LGR\", plot=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Retrive the solution*\n", "\n", "x: states, u: Controls, t:time, a:Algebraic variables" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Terminal time, state : 2.9000 vs 2.9 (Exact), [ 9.53605506e-12 -6.10348435e-12]\n" ] } ], "source": [ "x, u, t, a = post.get_data()\n", "print(f\"Terminal time, state : {t[-1][0]:.4f} vs 2.9 (Exact), {x[-1]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solve again with Chebyshev-Gauss-Lobatto (CGL) roots" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of variables............................: 125\n", " variables with only lower bounds: 21\n", " variables with lower and upper bounds: 21\n", " variables with only upper bounds: 0\n", "Total number of equality constraints.................: 88\n", "Total number of inequality constraints...............: 41\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 20\n", " inequality constraints with only upper bounds: 21\n", "\n", "\n", "Number of Iterations....: 9\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 6.7496749138057129e-22 6.7496749138057129e-22\n", "Dual infeasibility......: 5.0501516418909649e-11 5.0501516418909649e-11\n", "Constraint violation....: 1.5804024755539103e-12 1.5804024755539103e-12\n", "Complementarity.........: 2.5216728438899515e-09 2.5216728438899515e-09\n", "Overall NLP error.......: 2.5216728438899515e-09 2.5216728438899515e-09\n", "\n", "\n", "Number of objective function evaluations = 11\n", "Number of objective gradient evaluations = 10\n", "Number of equality constraint evaluations = 11\n", "Number of inequality constraint evaluations = 11\n", "Number of equality constraint Jacobian evaluations = 10\n", "Number of inequality constraint Jacobian evaluations = 10\n", "Number of Lagrangian Hessian evaluations = 9\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.024\n", "Total CPU secs in NLP function evaluations = 0.002\n", "\n", "EXIT: Optimal Solution Found.\n", " solver : t_proc (avg) t_wall (avg) n_eval\n", " nlp_f | 37.00us ( 3.36us) 35.08us ( 3.19us) 11\n", " nlp_g | 338.00us ( 30.73us) 335.83us ( 30.53us) 11\n", " nlp_grad | 58.00us ( 58.00us) 56.75us ( 56.75us) 1\n", " nlp_grad_f | 50.00us ( 4.55us) 47.37us ( 4.31us) 11\n", " nlp_hess_l | 127.00us ( 14.11us) 125.98us ( 14.00us) 9\n", " nlp_jac_g | 515.00us ( 46.82us) 519.92us ( 47.27us) 11\n", " total | 27.65ms ( 27.65ms) 27.21ms ( 27.21ms) 1\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "mpo, post = mp.solve(ocp, n_segments=1, poly_orders=20, scheme=\"CGL\", plot=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Terminal time, state : 2.9000 vs 2.9s (Exact), [ 9.78414149e-12 -6.26610513e-12]\n" ] } ], "source": [ "x, u, t, a = post.get_data()\n", "print(f\"Terminal time, state : {t[-1][0]:.4f} vs 2.9s (Exact), {x[-1]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solve again with Legendre-Gauss-Lobatto (LGL) roots" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of variables............................: 125\n", " variables with only lower bounds: 21\n", " variables with lower and upper bounds: 21\n", " variables with only upper bounds: 0\n", "Total number of equality constraints.................: 88\n", "Total number of inequality constraints...............: 41\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 20\n", " inequality constraints with only upper bounds: 21\n", "\n", "\n", "Number of Iterations....: 9\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 6.7267963401089627e-22 6.7267963401089627e-22\n", "Dual infeasibility......: 4.9171301510338480e-11 4.9171301510338480e-11\n", "Constraint violation....: 1.5127898933542383e-12 1.5127898933542383e-12\n", "Complementarity.........: 2.5210877471234159e-09 2.5210877471234159e-09\n", "Overall NLP error.......: 2.5210877471234159e-09 2.5210877471234159e-09\n", "\n", "\n", "Number of objective function evaluations = 11\n", "Number of objective gradient evaluations = 10\n", "Number of equality constraint evaluations = 11\n", "Number of inequality constraint evaluations = 11\n", "Number of equality constraint Jacobian evaluations = 10\n", "Number of inequality constraint Jacobian evaluations = 10\n", "Number of Lagrangian Hessian evaluations = 9\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.021\n", "Total CPU secs in NLP function evaluations = 0.001\n", "\n", "EXIT: Optimal Solution Found.\n", " solver : t_proc (avg) t_wall (avg) n_eval\n", " nlp_f | 35.00us ( 3.18us) 33.39us ( 3.04us) 11\n", " nlp_g | 334.00us ( 30.36us) 332.27us ( 30.21us) 11\n", " nlp_grad | 57.00us ( 57.00us) 56.27us ( 56.27us) 1\n", " nlp_grad_f | 50.00us ( 4.55us) 46.60us ( 4.24us) 11\n", " nlp_hess_l | 123.00us ( 13.67us) 123.49us ( 13.72us) 9\n", " nlp_jac_g | 526.00us ( 47.82us) 532.02us ( 48.37us) 11\n", " total | 27.35ms ( 27.35ms) 26.99ms ( 26.99ms) 1\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "mpo, post = mp.solve(ocp, n_segments=1, poly_orders=20, scheme=\"LGL\", plot=True)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Terminal time, state : 2.9000 vs 2.9s (Exact), [ 9.76831449e-12 -6.25427524e-12]\n" ] } ], "source": [ "x, u, t, a = post.get_data()\n", "print(f\"Terminal time, state : {t[-1][0]:.4f} vs 2.9s (Exact), {x[-1]}\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }