{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Simple Pendulum Example

\n", "

MCHE 513: Intermediate Dynamics

\n", "

Dr. Joshua Vaughan
\n", "joshua.vaughan@louisiana.edu
\n", "http://www.ucs.louisiana.edu/~jev9637/

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we'll determine the equations of motion for the simple pendulum system shown in Figure 1. The system consists of a point mass, $m$, connected to an ideal pin by a massless rod of length $l$. The rotation of the pendulum is represented by $\\theta$.\n", "\n", "

\n", "\t\"Simple
\n", " Figure 1: Simple Pendulum\n", "

" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Import the SymPy Module\n", "import sympy\n", "\n", "# Import the necessary sub-modules and methods for dynamics\n", "from sympy.physics.mechanics import dynamicsymbols\n", "from sympy.physics.mechanics import LagrangesMethod\n", "from sympy.physics.mechanics import Particle, Point, ReferenceFrame\n", "\n", "# initiate better printing of SymPy results\n", "sympy.init_printing()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Define the genearlized coordinate\n", "theta = dynamicsymbols('theta')\n", "\n", "# Also define the first derivative\n", "theta_dot = dynamicsymbols('theta', 1)\n", "\n", "# Define the symbols for the other paramters\n", "m, g, l, t = sympy.symbols('m, g, l, t')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Define the Newtonian reference frame\n", "N = ReferenceFrame('N')\n", "\n", "# Define a body-fixed frame along the pendulum, with y aligned from m to the pin\n", "A = N.orientnew('A', 'Axis', [theta, N.z])\n", "\n", "# Define the points and set its velocity\n", "P = Point('P')\n", "P.set_vel(N, l * theta_dot * A.x)\n", "\n", "mp = Particle('mp', P, m)\n", "\n", "# Set up the force list - each item follows the form:\n", "# (the location where the force is applied, its magnitude and direction)\n", "# Here, there are no non-conservataive external forces\n", "forces = []\n", "\n", "# Form the Lagrangian - L = T - V\n", "L = (1 / 2 * m * l**2 * theta_dot**2) + (m * g * l * sympy.cos(theta))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# This creates a LagrangesMethod class instance that will allow us to form the equations of motion, etc\n", "LM = LagrangesMethod(L, [theta], forcelist = forces, frame = N)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left[\\begin{matrix}g l m \\sin{\\left (\\theta{\\left (t \\right )} \\right )} + 1.0 l^{2} m \\frac{d^{2}}{d t^{2}} \\theta{\\left (t \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 2 ⎤\n", "⎢ 2 d ⎥\n", "⎢g⋅l⋅m⋅sin(θ(t)) + 1.0⋅l ⋅m⋅───(θ(t))⎥\n", "⎢ 2 ⎥\n", "⎣ dt ⎦" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LM.form_lagranges_equations()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The LagrangesMethod class gives us lots of information about the system. For example, we can output the mass/inertia matrix and the forcing terms. Note that the forcing terms include what might be conservative forces and would therefore normally appear in a stiffness matrix." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAaBAMAAAD4TDc7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90iVO8Qq5l2zWaJ\nMkTVU43wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZUlEQVQoFd2TsUsCYRjGf+Z5Gaen9ReIBVJE\nuEWTBgVtuTZ5BEFDoNESQWRLQTRcLdGUQ9DS4NgSHTRG4NzS0dAk5CCCYdnnfYp3Xv0Dvct399zv\n3u953rsP/BU5PPKKE8m0V4BH9gaSnpwlMbjtX03y6n5v/jdmjozd58XqYTafnuH8S8irho9ZltI1\n62m0ung87UKcPurugcNoOSJlwmWIlIYZuHKYQBGlSciEOzfS8yOZWBG9QaaKbulVFyU9S6ZQQm/x\nAC9Liwa1nYULs3Zm93NJJmMRbbMN+U4HrHFTbdlKbogpdZk1uUs0O0Ow7aT07RXtjkeUqn53E4zG\nvX2EZ6UxJpo7pdQJJ5yU7j6BOFozUDQkI+Y0YvGRNjzZxQzD5VjFkkzIomBzEswOGPUTptioxt5N\nyYjPKsZwG+n5Oc7fVEjB1uU+2qlEeIMLWLnve+7Jfyyef+NfMUn/+fLk05OpHyynYLE0cH+gAAAA\nAElFTkSuQmCC\n", "text/latex": [ "$$\\left[\\begin{matrix}1.0 l^{2} m\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 2 ⎤\n", "⎣1.0⋅l ⋅m⎦" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Output the inertia/mass matrix of the system\n", "LM.mass_matrix" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJAAAAAZBAMAAAAs17qbAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90iEM0yVJl2ie9m\nq0RNOTlFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACq0lEQVQ4Ea2VT2gTQRTGv2Q3/5NNtAqKVGLE\nS1BMVfBi6SoEFIXk1JuSi4qUkuhBlB4aBMGKQtBDK6JGoYcKQsCLetCACKkIbVGEQovBox7akmqw\n1sRvJjH/Ey31wdv95s17v8yb2d1goy+AdZvm88O7booE9K4VdIhlJ9K8CAGn6Oa1UM0g296ImKgx\n8/PqQPEA2qZLgBC093SXoDWDMCUSas28Uh2ZWDSgu3UIcSSAIKfUMC8tQFerZc0qw9BuuGMQYhiw\nJ3ifoLcA1TTChAbbyX1JwZ0GBfiTaor34/RmkPK9oRbKmUpE8QLGOKIxIeCnn6Kbso0gy8iox7kI\n7cn+O7PaxHbmmEcnwz2/cPrZuXuiCVscWMjiQZZCm1maBa4xamW0fkUP0Rd3eWA3bEXoPoaYcxh8\nPk4COxJKjkNDGvg0P/9KCssiI2/oznADyLLMbXQkcNYYRl9SHt9XHQl0A9uAVZYYY8Au4JsUVtbj\nAt3iLYOCPmH9cHgQDUQj0ENZDOuYEZVLtyFAm4EfHDqywArMeSmMSUaidDOXVtdaNI1buMsZnusV\nQByfOl6MC9CGCkjNw5qSIP5cG9BUAFvQrcpz9UPLUR2As1ADYmtqAe6EbG0BTPhMmOZtWBEXkseq\nHXgh0q3hg8BlYK4GJDb7JR6Vdn0cF9tsdijgyqFwDEoBfAhMySQwpKNL9FVuzR4HRpSnfKIpbqoJ\n4Dp4/Eys2yNt9rEXmaRYqm0alhsR4Mvk2+xg8cNg8eP5n9OlJo6O6SXR846QfrqJiXUgrjjOeCcT\nb4a0slC8HO2j14EikAchE9tcMn/iZdHypbUvi23tbIZAeb4sghw2fUYsc2OxzpjK96wiulggmXWt\n/Y0i5uUXtiI6fWr/hdYiZ80rasGQoV74/s//2p7ffoinEgPCRP8AAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}- g l m \\sin{\\left (\\theta{\\left (t \\right )} \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "[-g⋅l⋅m⋅sin(θ(t))]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Output the forcing terms of the system\n", "LM.forcing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use builtin functions to write the sytsem as a set of first order ODEs, suitable for simluation." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIIAAAA3BAMAAAAyKo8IAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhCZzXbdqyK7\nZkQR6/c4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEBklEQVRIDZVXTWgcZRh+dndmMpvZ7AZST4LO\nqYQedDyIWlCnEH8OSkbUYquQVWxNFXWl4g8irFXTUBCCikUEWW+lHlwvgiB0L70oIWvAQynC9tiQ\nw2iTIg0mPu+X2d3Mzxdn3zDz/j/7fu/3lwE0ZG1oHLnNZpg7VBNYamgcKfOdO3+nbGIo1jPNCePd\nO39hauaRhFVUc/6sp8zmn2ROV+SryhB/PTNzDw7ETZF2zJ8NlLj+dB34RYnj7cgZY0c0CCdxRMUZ\nt2ET+IBFfQOzEUuNFB3CFM6piHIXNzBRB0ohMD0CgrmF5Wcl/nfgX5RZvsUCnhoBAQeMja7EfwXj\nBn6mUHaBsR7SpBvF2scLglDdhr2NBWBt5dcmrHoagP3KnosodPzWxe9CLFN7mM8ER5Ki/0EoN1Br\n4AumvcKntJTKh6aGnV0KUXMx6+EOJn7OxwhzIwwC5zy8CEEwt0dGeNMXmLke/oGMohoiQDX/KCQX\neBso9IrMYieLjZI/Yifvg8nlbDV/bAMHKbSe48uVuhKknYuDqvPm/AkmXOfuXO5yRfmJbFE1CEcX\nTzun3uknyKoWkrWZomwE80tjE2NeP1p2ltAIO8uqG5OoRb/M1N8UwCi7u+DZLVxTaeq1e8JUhpBD\nl6YPc+3KH8E5c5ChP+V0nSz4s09ivrjnl/RidierF+5/HWufJNOimoQZfHzlTyAYDbHa065yqtfE\nUl9mTUc5Haq0Ug94SDniCMarKnwVh/tZ3BGtvvw9cHksABmX1mtcolJMspO7J8C3qAX9tCE3XC7y\nikeGuQDHuV9bIMVr2D1DzA0UPHEqMv1IGPeZWe6S4QGWwQJ4CWQjGFvgIb+62AIWV5svhM5bjx9i\naBk4i1qP7KfzL8PuAp9pETZRbtqtSh1V13F5h1/yZIVzV7x78odANsdpnnjEV93KGgVrKDQvtSse\nnJv3BoIQjDeBdWAKV4Rhiw3uKEv2KNiHWu+K6ub6Tk8QIAhrkrksrDrJBdEAHiNYZichc3GILhjt\n0tIA4QkgdCZBZreeV5NMsDTCJJzLvGEO8+8iB1tHZ4BwjM2v+CCzmi4mXGCVAIkanFO3msbtKL50\nAtaZD4kwfaZ9/Ka50vqIh205wKNvKFa94MPqAdSSCGIZUPIyszkfpIiNUWQr9AhOK/1/VEcSgI56\nP8gKuyIlZlM55WW8txAMlEhgkpBiZp3bTKk6BOVMvEptZVDMJv6nIyMkACNV1WC+/zXpvI/oxs3N\nQqKMMop9ash2Da3mSqqrQ2e+GnjtaSkfAq9eLeVD4ALXUj4EngdayoXAS1RPuRDsjh6A6yH76yCW\nUmnG1L2KfB3ovlD2xBVm9ihxUb5QclDNzhG0b4h1137u/wBpiyYKhx7STgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{d}{d t} \\theta{\\left (t \\right )}\\\\- \\frac{1.0 g \\sin{\\left (\\theta{\\left (t \\right )} \\right )}}{l}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ d ⎤\n", "⎢ ──(θ(t)) ⎥\n", "⎢ dt ⎥\n", "⎢ ⎥\n", "⎢-1.0⋅g⋅sin(θ(t)) ⎥\n", "⎢─────────────────⎥\n", "⎣ l ⎦" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make the call to set up in state-space-ish form q_dot = f(q, t)\n", "lrhs = LM.rhs()\n", "\n", "# Simplify the results\n", "lrhs.simplify()\n", "\n", "# Output the result\n", "lrhs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also linearize these equations with builtin SymPy methods. Let's do so about the $\\theta = 0$, $\\dot{\\theta} = 0$ operating point. The resulting equations returned are a system of first order ODEs in state-space form:\n", "\n", "$$ \\dot{x} = Ax + Bu $$\n", "\n", "See the [SymPy Documentation](http://docs.sympy.org/0.7.6/modules/physics/mechanics/linearize.html#linearizing-lagrange-s-equations) for much more information." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Define the point to linearize around\n", "operating_point = {theta: 0.0, theta_dot: 0.0}\n", "\n", "# Make the call to the linearizer\n", "A, B, inp_vec = LM.linearize([theta], [theta_dot],\n", " op_point = operating_point, \n", " A_and_B = True)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAF4AAAAzBAMAAADslqLZAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhCZZs3dIrur\nRHbLQ9+lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB1ElEQVRIDd3WvUuCQRwH8K/6qOmDL5BTiw5B\nS1TuDga2V0QQDT0IDYGDuLUJDRFECC01BP4HtrTGM0RTkH/CQ4NLYPbiIpE953Oov8ffE8+t3eJz\n5+eOu3vOr4fs8AN+y+rwHfOlDb8cO6U8Mr61gOsuv7u0+Gd/tz/BXtOjQ35zdvxoGsE668OPz4zX\nTYT6rAfeGJ8ykfhU8AcGEj8KvpWD5vX6uPm0DDWvOh97vSGV9eq3iKrsp/2+InWF/cEltooqfrv7\n4MEr2fPq7Pn0wONm9/kcf+Hx8M+8VhfrTK7kxAdX6Hq1SkOgGgqcFW3UIzTyN0iJ3x5XOB/+QmCN\nw3Yb57UBYlXUuibTh/V9xKykqRt+/QABq9XU6Zyc5OPGt+efah+71+wkH+ch9mfZXtp0kcnn9mnE\n79Cx97+Ap2kOmXzUx4++LW0BwfIhIi+nxMvko54I+scgk8bLx81QnfSWyefltYsOPRIy+UY+fHZt\nl6siGdBVYeczpKU31Ucmn9d8pqTzKJOP9ftMJMrkY32iMTM8ZPKxPmgw3kk+1s9VGe80sT7VVPP0\nZJK+7PivhJAK6+8JIZV17j6TKRIzqYj7DHNf6lkTQp7EfYkp5TbTKJt+AWc2kr1Ix72ZAAAAAElF\nTkSuQmCC\n", "text/latex": [ "$$\\left[\\begin{matrix}0 & 1\\\\- \\frac{1.0 g}{l} & 0\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 0 1⎤\n", "⎢ ⎥\n", "⎢-1.0⋅g ⎥\n", "⎢─────── 0⎥\n", "⎣ l ⎦" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABUAAAAUBAMAAACQZWsAAAAAG1BMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAB4Gco9AAAACHRSTlMAdt3NMolEZgN4ymIAAAAJcEhZcwAADsQAAA7EAZUrDhsA\nAAAgSURBVAgdYyhWYwADRmUHBoYwCJs1AUgPI7YQzI9KDgASXg6/U+SevgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left[\\begin{matrix}\\end{matrix}\\right]$$" ], "text/plain": [ "[]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The $B$ matrix is empty, as we expect, since there are have no external non-conservative forces." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given these two matrices, the system of equations match those that we'd expect:\n", "\n", "$$ \\begin{bmatrix}\\dot{w}_1 \\\\ \\dot{w}_2\\end{bmatrix} = \\begin{bmatrix}0 & 1 \\\\ -\\frac{g}{l} & 0 \\end{bmatrix} \\begin{bmatrix}w_1 \\\\ w_2\\end{bmatrix}$$\n", "\n", "where:\n", "\n", "$$ \\mathbf{w} = \\begin{bmatrix}w_1 \\\\ w_2\\end{bmatrix} = \\begin{bmatrix}\\theta \\\\ \\dot{\\theta}\\end{bmatrix} $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simulation\n", "We can pass these equations of motion to numerical solver for simluation. To do so, we need to import [NumPy](http://numpy.org) and the [SciPy](http://www.scipy.org) ode solver, ```ode```. We'll also import [matplotlib](http://www.scipy.org) to enable plotting of the results.\n", "\n", "For a system as simple as this one, we could easily set up the necessary components for the numerical simulation manually. However, here will automate as much as possible. Following a similar procedure on more complicated systems would be necessary." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# import NumPy with namespace np\n", "import numpy as np\n", "\n", "# import the ode ODE solver\n", "from scipy.integrate import ode\n", "\n", "# import the plotting functions from matplotlib\n", "import matplotlib.pyplot as plt\n", "\n", "# set up the notebook to display the plots inline\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Define the states and state vector\n", "w1, w2 = sympy.symbols('w1 w2', cls=sympy.Function)\n", "w = [w1(t), w2(t)]\n", "\n", "# Set up the state definitions and parameter substitution\n", "sub_params = {theta: w1(t), \n", " theta_dot: w2(t), \n", " g : 9.81, \n", " l : 2.0}\n", "\n", "# Create a function from the equations of motion\n", "# Here, we substitude the states and parameters as appropriate prior to the lamdification\n", "eq_of_motion = sympy.lambdify((t, w), \n", " lrhs.subs(sub_params))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Set up the initial conditions for the solver\n", "theta_init = 10 * np.pi/180 # Initial angle\n", "theta_dot_init = 0.0 # Initial angular velocity\n", "\n", "# Pack the initial conditions into an array\n", "x0 = [theta_init, theta_dot_init]\n", "\n", "# Create the time samples for the output of the ODE solver\n", "sim_time = np.linspace(0.0, 10.0, 1001) # 0-10s with 1001 points in between" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Set up the initial point for the ode solver\n", "r = ode(eq_of_motion).set_initial_value(x0, sim_time[0])\n", " \n", "# define the sample time\n", "dt = sim_time[1] - sim_time[0] \n", "\n", "# pre-populate the response array with zeros\n", "response = np.zeros((len(sim_time), len(x0)))\n", "\n", "# Set the initial index to 0\n", "index = 0\n", "\n", "# Now, numerically integrate the ODE while:\n", "# 1. the last step was successful\n", "# 2. the current time is less than the desired simluation end time\n", "while r.successful() and r.t < sim_time[-1]:\n", " response[index, :] = r.y\n", " r.integrate(r.t + dt)\n", " index += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's plot the results. The first column of the ```response``` vector is the angle of the pendulum, $\\theta$. We plot that below, after setting up plotting parameters to make the plot more readable." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Set the plot size - 3x2 aspect ratio is best\n", "fig = plt.figure(figsize=(6, 4))\n", "ax = plt.gca()\n", "plt.subplots_adjust(bottom=0.17, left=0.17, top=0.96, right=0.96)\n", "\n", "# Change the axis units to serif\n", "plt.setp(ax.get_ymajorticklabels(), family='serif', fontsize=18)\n", "plt.setp(ax.get_xmajorticklabels(), family='serif', fontsize=18)\n", "\n", "# Remove top and right axes border\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "\n", "# Only show axes ticks on the bottom and left axes\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.yaxis.set_ticks_position('left')\n", "\n", "# Turn on the plot grid and set appropriate linestyle and color\n", "ax.grid(True,linestyle=':', color='0.75')\n", "ax.set_axisbelow(True)\n", "\n", "# Define the X and Y axis labels\n", "plt.xlabel('Time (s)', family='serif', fontsize=22, weight='bold', labelpad=5)\n", "plt.ylabel('Angle (deg)', family='serif', fontsize=22, weight='bold', labelpad=10)\n", "\n", "# Plot the data\n", "plt.plot(sim_time, response[:, 0] * 180/np.pi, linewidth=2, linestyle='-', label = '$\\theta$')\n", "\n", "# uncomment below and set limits if needed\n", "# plt.xlim(0, 5)\n", "# plt.ylim(-1, 1)\n", "\n", "# Create the legend, then fix the fontsize\n", "# leg = plt.legend(loc='upper right', ncol = 1, fancybox=True)\n", "# ltext = leg.get_texts()\n", "# plt.setp(ltext, family='serif', fontsize=20)\n", "\n", "# Adjust the page layout filling the page using the new tight_layout command\n", "plt.tight_layout(pad=0.5)\n", "\n", "# Uncomment to save the figure as a high-res pdf in the current folder\n", "# It's saved at the original 6x4 size\n", "# plt.savefig('Simple_Pendulum_Response.pdf')\n", "\n", "fig.set_size_inches(9, 6) # Resize the figure for better display in the notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Licenses\n", "Code is licensed under a 3-clause BSD style license. See the licenses/LICENSE.md file.\n", "\n", "Other content is provided under a [Creative Commons Attribution-NonCommercial 4.0 International License](http://creativecommons.org/licenses/by-nc/4.0/), CC-BY-NC 4.0." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This cell will just improve the styling of the notebook\n", "# You can ignore it, if you are okay with the default sytling\n", "from IPython.core.display import HTML\n", "import urllib.request\n", "response = urllib.request.urlopen(\"https://cl.ly/1B1y452Z1d35\")\n", "HTML(response.read().decode(\"utf-8\"))" ] } ], "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.6.2" } }, "nbformat": 4, "nbformat_minor": 1 }