{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Following a recent [Lindy Hop](https://www.youtube.com/watch?v=tCc6ft3xmPs) class, I'm now interesting in bouncing off the ground with my feet.\n", "\n", "But what is bouncing? How does it work? And, most importantly, what are its equations? Follow me into the world of elastic collisions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The mathematics of bouncing: a falling ball" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I'd like to formulate the bouncing problem in terms of a simple analogy: the movement of a ball that falls on the ground and bounces off from it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We consider our ball to have a mass $m$, a (two-dimensional) position vector $\\vec{x}$, speed $\\vec{v} = \\vec{\\dot{x}}$. Let's suppose the ball is on earth and gravity applies. We can thus write:\n", "\n", "$$m \\frac{d \\vec{v}}{dt} = m \\vec{g}$$\n", "\n", "Gravity is constant and thus we can integrate twice to get the following formula:\n", "\n", "$$\n", "\\vec{x} = \\frac{1}{2}\\vec{g}t^2 + \\vec{v_0}t + \\vec{x_0}\n", "$$\n", "\n", "This is already interesting, as this equation describes the trajectory of a cannon ball when friction is negligible, or a thrown rock, a basketball and numerous other things. Let's implement this." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns; sns.set()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def plot_trajectory(x_0, v_0, t_min, t_max):\n", " t = np.linspace(t_min, t_max)\n", " x = 1/2. * 9.81 * np.array([0, -1.])[:, np.newaxis] * t**2 + v_0[:, np.newaxis] * t + x_0[:, np.newaxis]\n", " plt.plot(x[0, :], x[1, :], '-o')\n", " plt.plot(x[0, 0], x[1, 0], 'or', ms=15)\n", " plt.xlabel('x (m)')\n", " plt.ylabel('y (m)')\n", " plt.title('trajectory over duration $\\Delta t = {}$ seconds'.format(t_max - t_min))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_trajectory(x_0=np.array([10, 0]),\n", " v_0=np.array([1, 50]),\n", " t_min=0, \n", " t_max=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This seems to work, let's see what happens if we make it interactive." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":0: FutureWarning: IPython widgets are experimental and may change in the future.\n" ] } ], "source": [ "from IPython.html.widgets import interact" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(lambda v_0x, v_0y, t_max: plot_trajectory(np.array([0., 0.]), np.array([v_0x, v_0y]), 0, t_max),\n", " v_0x=(-50, 50), \n", " v_0y=(-50, 50), \n", " t_max=(0, 20, 0.1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can produce a simple animation from the previous code." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from JSAnimation import IPython_display\n", "from matplotlib import animation\n", "\n", "frames = 20\n", "fig = plt.figure()\n", "ax = plt.axes(xlim=(-4, 4), ylim=(-4, 4))\n", "ax.set_xlabel('x (m)')\n", "ax.set_ylabel('y (m)')\n", "t = np.linspace(0, 4.5, num=frames)\n", "v_0 = np.array([8, 22])\n", "x_0 = np.zeros((2,))\n", "x = 1/2. * 9.81 * np.array([0, -1.])[:, np.newaxis] * t**2 + v_0[:, np.newaxis] * t + x_0[:, np.newaxis] \n", "ax.set_xlim(0, 40)\n", "ax.set_ylim(0, 25)\n", "\n", "def init():\n", " ax.plot(x[0, :], x[1, :], '-o')\n", " ax.plot(x[0, 0], x[1, 0], 'or', ms=10)\n", "\n", "def animate(i):\n", " ax.plot(x[0, i], x[1, i], 'or', ms=10)\n", " ax.set_title(\"$t = {:.2f}$ seconds\".format(t[i]))\n", " return \n", "\n", "animation.FuncAnimation(fig, animate, init_func=init,\n", " frames=frames, interval=200, blit=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can notice in the previous animation, the ball comes to a stop when reaching the highest altitude. This is typical for a gravity-based ball throw." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Adding an elastic collision to create a bouncing effect " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we are done with throwing balls, we can work in the collision part. \n", "\n", "The basic equations can be found on [Wikipedia](https://en.wikipedia.org/wiki/Elastic_collision). They follow from the conservation of momentum as well as from the conservation of energy. \n", "\n", "We will implement the vector form of the formula describing the change in velocity for two moving objects:\n", "$$\n", "\\begin{align}\n", "\\mathbf{v}'_1&=\\mathbf{v}_1-\\frac{2 m_2}{m_1+m_2} \\ \\frac{\\langle \\mathbf{v}_1-\\mathbf{v}_2,\\,\\mathbf{x}_1-\\mathbf{x}_2\\rangle}{\\|\\mathbf{x}_1-\\mathbf{x}_2\\|^2} \\ (\\mathbf{x}_1-\\mathbf{x}_2),\n", "\\\\\n", "\\mathbf{v}'_2&=\\mathbf{v}_2-\\frac{2 m_1}{m_1+m_2} \\ \\frac{\\langle \\mathbf{v}_2-\\mathbf{v}_1,\\,\\mathbf{x}_2-\\mathbf{x}_1\\rangle}{\\|\\mathbf{x}_2-\\mathbf{x}_1\\|^2} \\ (\\mathbf{x}_2-\\mathbf{x}_1)\n", "\\end{align}\n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def compute_velocity_after_collision(v1, m1, x1):\n", " \"\"\"\n", " computes the new velocity of the ball, in vector form, after collision\n", " \"\"\"\n", " m2 = 10 * m1\n", " v2 = np.zeros((2,))\n", " x2 = x1 - np.array([0, -0.1])\n", " \n", " v1_prime = v1 - 2 * m2 / (m1 + m2) * np.sum((v1 - v2) * (x1 - x2)) / np.linalg.norm(x1 - x2)**2 * (x1 - x2)\n", " return v1_prime" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see what the result of this formula is, using an interactive animation." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def plot_collision_outcome(v1x, v1y, m1):\n", "\n", " \n", " v1 = np.array([v1x, v1y])\n", " \n", " x1x = 0.\n", " x1y = 0.\n", " x1 = np.array([x1x, x1y])\n", " v1_prime = compute_velocity_after_collision(v1, m1, x1)\n", " ax = plt.gca()\n", " ax.arrow(x1x, x1y, v1x, v1y, head_width=0.05, head_length=0.1, fc='b', ec='b')\n", " ax.arrow(x1x, x1y, v1_prime[0], v1_prime[1], head_width=0.05, head_length=0.1, fc='k', ec='k')\n", " ax.set_xlim(-10, 10)\n", " ax.set_ylim(-10, 10)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nB81IXMX3l9pNThctcPXrNy1uxs5Jor/UbvJW0wJXv37T4gZomBY4y2EHzUhcxfeX2rVrOS1w9es3\nLW7Gzkmiv9SufYu1wNWv3wQ0Y+ck0V9q1y+7du3Mtdd+/IkW+Jvf/Eb16zEBzdg5yfeX2vXXtm23\n5Pvf/5/Mz29o9s9hsjgBzdg5yfeX2vXb3Nxs7r33D83+OUwW5y5ugHXMXeDTwQ6akdiF9Zfa9dti\n9Wvhz2GyOC1uxs5Jvr/Urt+WU79J/jlMFqfFDTDFtMDXBztoRmIX1l9q12+rqZ8W+ORpcTN2TvL9\npXb91kX9tMAnR4sbgMM6tAV+0UUX5J57fpZzz31rLrzwogwGy84QxmjDpBcAwOSccMKJ+dznvpCv\nfOVrmZk5Ir/97W8mvSSG7KABptyGDRty0kklJ51UJr0UFrCDBoAGCWgAaJCABoAGCWgAaJCABoAG\nCWgAaJCABoAGCWgAaJCABoAGCWgAaJCABoAGCWgAaJCABoAGCWgAaJCABoAGCWgAaJCABoAGCWgA\naJCABoAGCWgAaNCmrg5UShkkuS/JjuFTP6i1XtbV8QFgmnQW0EmOT/KTWutrOjwmAEylLgP6hUme\nXUq5M8nDSS6pte5Y4j0AwFMYKaBLKecnufiQp9+Z5CO11m2llNOS3JTkxatcHwBMpcH8/HwnByql\nHJXksVrrvuHj+2qtf7PIW7r5YADoj8FyX9hli/uKJA8kuaaUckqSe5d6w+7dD3X48aylublZ9esp\ntes39eu3ubnZZb+2y4C+OslNpZSzkjyW5NwOjw0AU6WzgK61/jnJq7s6HgBMM4NKAKBBAhoAGiSg\nAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBB\nAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoA\nGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSg\nAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBB\nAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoAGiSgAaBBAhoA\nGiSgAaBBAhoAGiSgAaBBm0Z9YynlH5L8Y631n4aPX5Lk2iSPJflerfWD3SwRAKbPSDvoUsqnknwk\nyWDB059N8sZa68uSnFpKeX4H6wOAqTRqi/uuJO/IMKBLKVuSbK61/nr4v9+e5BWrXx4ATKdFW9yl\nlPOTXHzI0+fWWm8ppbx8wXNbkuxZ8PihJMd1skIAmEKLBnStdWuSrcs4zp4kswseb0nypyXeM5ib\nm13iJbRM/fpL7fpN/aZDJ3dx11r3JPlrKeW4UsogyauSbO/i2AAwjUa+izvJ/PC/gy5McnOSjUlu\nr7X+aDULA4BpNpifn1/6VQDAmjKoBAAaJKABoEECGgAaJKABoEGruYt7ZOZ499/wn9Pdl2TH8Kkf\n1Fovm+CSWEIpZUOSzyQ5OcmjSd5aa/3lZFfFSpRSfprkz8OHv6q1nj/J9bC0UsqpSa6utZ5RSjkh\nyZeS7E/y8yQX1VoPe6f2mgf0cI73q5LcveDpzyY5p9b661LKf5dSnl9r/dlar40VOT7JT2qtr5n0\nQli2s5PM1FpfOjxpfGL4HD1QSjkySWqtZ0x6LSxPKeW9Sf45yV+GT30yyWW11u2llM8meW2S2w73\n/km0uM3xXh9emOTZpZQ7hxdVJ016QSzptCTfTZJa6w+TvGiyy2GFTknytFLK7aWUO4YXWbRtV5Jz\n8v9/WOoFtdaDQ7y+kyWybmw7aHO814/D1PKdST5Sa91WSjktyU1JXrzmi2MlDv2uPV5K2VBr3T+p\nBbEie5NcU2vdWko5Mcl3SiknqV+7aq3fLKUcs+CphX8B8i9Jnr7Y+8cW0GOe480aeqpallKOyoF7\nBlJrvauU8qxJrI0VOfS7Jpz7ZUcO7MhSa91ZSvljkqOT3D/RVbESC79vs1ki6yZ+F7c53r11RYa7\n6lLKKUnunexyWIa7kpyVPHFj5j2TXQ4rdF4O3DeQ4QXxliS/n+iKWKm7SymnD38+M0tk3UTu4o45\n3uvB1UluKqWclQM76XMnuxyW4dYkryyl3DV8fN4kF8OKbU3yxVLKwZP6eTogvXEw796V5POllJkk\nv0jyjcXeZBY3ADRo4i1uAODJBDQANEhAA0CDBDQANEhAA0CDBDQANEhAA0CD/g8jK08yZ9owHQAA\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(plot_collision_outcome,\n", " v1x=(-10, 10),\n", " v1y=(-10, 10),\n", " m1=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our formula seems to be working. So let's move on to the animation of the bouncing ball with an elastic collision!\n", "\n", "We'll make use of the fact that we know exactly at which times the ball hits the ground, which we put at $y=0$. \n", "Indeed, we can determine that the bouncing time satisfies the following equation:\n", "\n", "$$\n", "-1/2 g t^2 + v_{y0} t + x_{y0} = 0\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def compute_bounce_time(vy0, xy0):\n", " roots = np.roots(np.array([-0.5 * 9.81, vy0, xy0]))\n", " return roots[roots > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the example from the animation we drew in the first part of this post to check that our function is correct. In that animation, the bouncing time was around 4.5 seconds for an initial vertical velocity of 22 m/s and an initial vertical position of 0 meters." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 4.48521916])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "compute_bounce_time(22, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This seems to work.\n", "\n", "So now all that's left to do is do an animation using the functions we have put together. We'll specify the number of bounces we want to observe and animate the whole thing." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_trajectory_with_bounce(x_0, v_0, number_of_bounces):\n", " x = np.zeros((2, 1))\n", " start_time = 0.\n", " total_time = 0.\n", " for i in range(number_of_bounces):\n", " bounce_time = compute_bounce_time(v_0[1], x_0[1])\n", " if bounce_time.size == 0:\n", " continue\n", " else:\n", " # we only keep the biggest bouncing time (in case there's a near zero one)\n", " bounce_time = np.max(bounce_time)\n", " \n", " t = np.linspace(start_time, bounce_time)\n", " x = np.hstack((x, \n", " 1/2. * 9.81 * np.array([0, -1.])[:, np.newaxis] * t**2 + v_0[:, np.newaxis] * t + x_0[:, np.newaxis]))\n", " v1 = 9.81 * np.array([0, -1.])[:, np.newaxis] * t + v_0[:, np.newaxis] \n", " v1_prime = compute_velocity_after_collision(v1[:, -1], 1.0, x[:, -1])\n", " v_0 = v1_prime\n", " x_0 = x[:, -1]\n", " total_time += bounce_time\n", "\n", " x = x[:, 1:]\n", " plt.plot(x[0, :], x[1, :], '-o')\n", " plt.xlabel('x (m)')\n", " plt.ylabel('y (m)')\n", " plt.title(\"total time: {:.2f} seconds\".format(total_time))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGLiIj4iBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiIEreI\niIiPKHGLiIj4iBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGLiIj4iBK3iIiIjyhx\ni4iI+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGLiIj4iBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiI\nEreIiIiPKHGLiIj4iBK3iIiIjyhxi4iI+Ei52wGUivaOTh7d3k0s5eshoKa6nMHhcQCOW1dP28bm\noscnIiL+oBZ3EbR3dPJImqQNEAMODo8Ti//7ke3dvP8LD7BjT39xgxQREV9Qi7uAMrWy59LdP8KV\n3/w9X/nA2QWJS0RE/KvoidsY80egN/7wSWvtBcWOoRgSreyFGp+I8f4vPEBrSxON0UgeIxMRET8r\nauI2xlQDWGsD3ZRcbNJOUMtbRERSFXuM+wSgxhhzpzHmLmPMi4r8+gW3kKQdCmX+XqLlrTFvERGB\n4ifug8A11tqXARcD/22MCdQEuUezJO1QyJlBHqmpYFldJZGaCuojVVx4znrKyzJn7+7+EW68/eFC\nhCsiIj4TisXmO3Vq4YwxlUDYWjscf/xb4LXW2mfSHF68wPLkY1/6FX96vCvt98Ih+EH7v2T9+c1X\n3Mn+3uGM3z/xmAY+efEpi4pRREQ8LUsfbPyAIifudwJN1tpLjDFrgbuAF1hrJ9McHuvq8k/3cLYu\n8lAILjxnPSe/IDr1tYaGCKnnt2NPP1d+8/eMT2R+T+ojVb6YsJbu/IJE5+dfQT430Pn5XUNDZM7E\nXexu6puApcaY+4EO4O0ZkrbvZOoiD4Xgpg+9ZEbSzqQxGuErHzib+khVxmPUbS4iUtqKOqvcWjsO\nvLWYr+m2uiUV8/6Z1pYmbrz9Ybr7RwoQkYiI+FmgJoa5ob2jkwuuujvtgHx9pIr3veHEeT9nYzTC\ntZecyvp19Wm/X1+XuUUuIiLBpsS9CNlKmdZHqrj2klMXNRbdtrE5bbf5k7v7tERMRKREKXEvQrZx\n7daWpry8Rqbn0Vi3iEhpUuIugOV1VXmb9d0Yjcy9NkBEREqGEvcCtXd0Zuwiz1drO+E4jXWLiEic\nEvcCZFqzHampWPS4djoa6xYRkQQl7gXIVta0UDTWLSIioMSdV+VlhbucGusWERFQ4l6QdGPOhRjb\nzul16wr/uiIi4h1K3PPU3tE5q6s8H2u2c5FurLt7YIQrbn6Q9o7Ogr62iIh4gxL3PKQruBIKwevP\nOqpoMbS2NFEfqaIsPN1xHgMe2d6tiWoiIiVAiXse0k1Ki8Xg1nufKFoMiXKok5OzF6NpopqISPAp\ncYuIiPiIEvc8uDUpzeuxiIhI8Shxz8N7Xtc0Y0lWsSalpZM6Ua22uty1WEREpHiKuh+3XyVmkidG\nlasqyqipLne9ddva0sRnb32IvoOjHBwe54Kr7ua4dfW0bWx2NS4RESkctbjnkG4meVVlmNaWJtdb\nt43RCIc11E491uxyEZHgU+KeQ7qZ5H0HxzwzeztdfJpdLiISXErcIiIiPqLEPQevz972enwiIpJf\nStxzaNvYTKSmYuqxmzPJ00mdXV5ZEfZUfCIikl9K3Dk4/siVgLPkyost2daWJurrqgiFoCwcZnxi\n0u2QRESkQLQcLIvkZWDhEFy35VQqysvcDmuWxmiEa7ecStsXHuBA/wgXXXMv67UsTEQkkNTiziB1\nGdhkDD785d94dplVe0cnB/pHph5rWZiISDApcWfgt2VWfotXREQWRolbRETER5S4M/DbMiu/xSsi\nIgujxJ1B28ZmqiunJ6J5bRlYqtRlYSHgmned4tl4RURkYZS4s6iLr99eXlfpi5Zra0sT9ZEqKivC\nxIBtz/S6HZKIiOSZEncGzx0YZF/PMCcevYrrtpzmi5ZrYzTCtZecyiXnHQ/AHx/rcjkiERHJN63j\nTiOxFAxgb/egy9HM3/OPqCccgp89uJP/e3CntvoUEQkQtbhTJCdtgGf3D/puPfQNtz3EZHwBurb6\nFBEJFiXuFEFYDx2EcxARkfSUuEVERHxEiTtFENZDB+EcREQkvaInbmPMIcaYncaYY4v92rl43xtP\nJJT02Ovrt9NJXdNdW13uu3MQEZH0ipq4jTEVwJeBg8V83fnYsaefGM6+1n5upba2NE3tI37MYctd\njkZERPKl2C3ua4AvAruL/Lo5+/OT+wG44FXrfd1KbYxG+Oylp1G3pILte/qIxWJz/5CIiHhe0RK3\nMWYz0GWt/Vn8S6Esh7uivaOT7//iKQDu/uMul6NZvHAoRFk4RM/AKBdcfQ/tHZ1uhyQiIotUzBb3\n24F/NsbcA5wI3GKMWV3E188qdf22fbrH92uf2zs66T04OvVY67lFRPwv5EYXajx5v9Na+1iWw4oa\n2KvbfkC6S7FyWTU3b31ZMUPJmyCek4hIwM3ZG+3pkqddXUVsGWa4TZicjBUkjoaGSOHPr8jnlKwo\n5+cinZ9/BfncQOfndw0Nc8+rcmUdt7X27Dla20UXxLXPQTwnEZFSpwIscZtf8fwZj/24fjtV6nru\n6soy35+TiEipU+KOe3SHMzFtSVV5oFqlrS1NLK+rBGDF0qo5jhYREa/z9Bh3MSUS90f+9YUc1lDn\ncjT50xiNcN2W0/j0//sD257pZXB4jJrqCrfDEhGRBVKLG4jFYjy6o5ulNRUcuqrW7XAK4rjGemIx\nsDt73A5FREQWoeRb3O0dnTy6vZsYsLS2glDIc3Vh8uKhJ5yKcJ+7/c+sX1dP28ZmlyMSEZGFKOkW\nd6LoSmLVVN/BsUAWKGnv6JxxTirEIiLiXyWduB9NqpSW0N0/wo23P+xCNIVTKucpIlIKSjpxi4iI\n+E1JJ+5SKVBSKucpIlIKSjpxt21spqZqen5eEIqupJNaiKUsHArkeYqIlIKSTtwARx26FIClNRWB\nboG2tjRRH6mivCzExGSMweFxt0MSEZEFKPnE/ey+g9QtqeCzl54W6BZoYzTCtZecystfdAQA257p\ndTkiERFZiJJO3Pt7h9nfN8Ixhy0L7PrtVMcethyAx3epEIuIiB+VbAGWxBpucFrdpeKoQ5cB8JNf\n7+B/fr2D41SMRUTEV0qyxZ2ctAGe6x4qmYIkX/jen6f+HUPFWERE/KYkE3cpFyQp5XMXEQmCkkzc\nIiIiflWSibuUC5KU8rmLiARBSSbuto3NVFeWTT0OauGVdFKLsdTXlc65i4gEQcnOKo+uqGH7nn6W\n11WWXGuztaWJ//h/f2BsfJI3v/RYt8PxlORtXgFCoJn3IuIpJdninpyMsfvAIGtW1nDdlmAXXkmn\nMRrh9WcdBcDwiCqogZOwz7/q7hnbvML0zPuLrrlHM+9FxBNKssW9q2uAkdGJqTXNpShx7k8808up\nx69xORr3pC4NzGR8IsYnbn6QI9cs5bJNJxUhMhGR9EoycT/xbB8AR5dw4j78kDoqy8Nse6bP7VBc\nkWvCTvXk7j7Ov+pujj1iOR9+8wsLEJmISHYl2VX+RLxO91Frl7ociXvKy8Ksi0Z4Zt8AQyXWXb7Q\npJ3ssad7VLhGRFxRcom7vaOTX/1lDwDf+vnjLkfjrv19I8RicMln76e9o9PtcIoiH0k7obt/hCu/\n+fu8PJeISK5KKnGnfmg/uqN0y322d3Syv2946nEplD7NNWmHQhCpqSCXfWfGJ2KBv24i4i0llbhV\n7nNaKV6LdOecLBRy1vRv3bSBG1pPZ+umDdRHquZM4EG/biLiLSU5OU1KT3tH54xlXqkS1eOSlwYm\n9jDfsaefG29/mJ4BZ2ghnf7B0fwGLCKSQUm1uFXuc1opXYtsXeShEFx07vqs1eMSCXzrpg2Ul6Vv\nfqvLXESKpaQS9/vfeCLJH7ulVOo0VWrp09rq8sBei0xd5KEQ3PShl3DyC6I5PU9jNMJXPnD2jOuW\nTF3mIlIMJZW49/UOEwMqysOBbV3OR2tLE3VLKgBoOnqVy9EURrYu8sS5z1e23xt1mYtIoZVU4n5q\nt1Ns5LzTjwxs63I+GqMRrr74xYSA7qQZ5kGRrYu8PlLF+95w4oKetzEa4cRjGtJ+T13mIlJoJZm4\nn7emtBN2siVV5URX1vDUnn4mJ7NN3/KfbF3ki71x++TFp6jLXERcUWKJu59QiJJvaad63pqljIxO\nsPvAoNuh5E0hushTqctcRNxQMol7cjLGjj39rF1ZS3WlVsEle94ap/Tr9t3BqFteqC7yVI3RCOvT\nzM4HdZmLSOGUROJu7+jkws/cw8jYBAPDY26H4zm/+stuAG76yaOBKH1ayC7yVKmz85Opy1xECqGo\nidsYU2aM+Zox5pfGmF8YY15Q6NdMtL4S3aa9A6NqCSVp7+jkqd3T1yLIpU/z1UWeqtRXJ4hIcRW7\nxX0OMGmtPQ24DLiy0C9YiqU95yNo1yfT2HY+u8hTZesyr69L3xoXEVmooiZua+0PgHfGH64D8rNN\nkwiZx7YjNRUFX/6Xqcv8yd19ge3BEBF3FH2M21o7YYy5GbgR+FahX6+USnsuRJCuz1ybiBRapmvm\n5x4MEfGeUCzTrgkFZoxZDfwWOM5aO5TmkLwF9tbLf0rPwAgAK5dVc/PWl+XrqQNh8xV3sr/XKcBS\nXVnGrZ8+x+WIFubVbT9IuwlIMd9zL8QgIr4254bCRV0XZYx5K3CYtfbTwBAwGf+TVldXfroXzzxx\nDT/45XZqqsrZct7xeXvexWhoiHgiDoAt5x3PDbc9RM/AKKuWVuclLjfO77jG+lld5fWRqoK855nO\nr5gxFJKXfj/zLcjnBjo/v2tomHtIr9hd5bcBJxpj7gN+CrzHWjtS6Bc9ODwOwL+94QQVX0mjMRrh\nui2ncfghdeztGQpMBTU3NpFJN9bd0z/CrfduK1oMIhJsxZ6cNmStfaO19kxr7SnW2h8V43Wf3uNU\nTDvskLpivJxvHbG6jtHxSV9WUEs3MW18YtKVSWGtLU0ztv+MEexldiJSXIEvwDIZi7Fj7wBrVtZS\nVVHmdjie1rjaaZk+7cPkkm5iWv/gmCuTwhqjESYmZvdaaJKaiORD4BP33u4hRkYnaFyt1vZcEl3K\nO57zX+IWESkVgU/cT8eTUKI1KZkdfkgdIfBld645Yvmsr7m5rC1Iy+xExFsCnbjbOzr50g/+CsCv\nH3nO5Wi8r7qynIqKMHZnDxdcdbdv6pa3d3Tyt6d7ZnzNjYlpyTRJTUQKJbCJO3Wy0o49/ZocNIf2\njk5Gx5zVeX6ZUJVuUlooBK8/6yiXIpqmSWoiUgiBTdxBq8FdDH68ZulijsXg1nufcCGamTRJTUQK\nIbCJW0REJIjmrJxmjDkSZ1evY3CqnD0O/Mhau6PAsS3KcevSV7DS5KDM/HjNvB6z1+MTEf/J2OI2\nxqw1xnwH+DbQiJOw/xb/93eNMd8xxhxWnDDnr21jM9WV0+u23Z6s5AepE6q8fs3aOzpndZV7LeZ0\nk9TWrKzxTHwi4j/ZWtyfBj5hrX0k3TeNMScAVwH/WojA8uF5a5fy6PZultVWqoWTo9aWJq785h8Y\nn5jkHeesdzucjLw8KS1VfV0V3f3TlX0TE9RaW5qUwEVk3jK2uK21mzIl7fj3H7LWejZpAxzoG6Gm\nqpzrtninBeZ1jdEIL91wuNthzMnLk9JSPbW7b9bXNEFNRBYqlzHu5wMXAckVJWLW2vMLFlUejIxO\nsPfAIMcevpxQaM5d0iTJ4fGa7jv3DnBc4+xCIiIi4p5cZpV/D+gB7gXuS/rjabv2DRBjOglJ7qYT\nt3fXGvupMpmfYhUR78tlP+5ua+0VBY8kz3buHQCUuBdi9YolVJSHp66hF7VtbOYdn7lnagvSxKQ0\nL2rb2Mz7v/DAjHHurZs3sKy20sWoRMSvckncNxtjrgTuAsYTX7TW3l+wqPJgKnFrc5F5KwuHOXRV\nLbu6BhifmKS8zFvL/ROzyWNACFjug9Zra0sTN97+ML0DI0zG4N8+90vWr6unbWOz26GJiM/kkrjP\nAjYAp6R8/ey8R5NHO/cOEA6FOHRVrduh+NLhh9SxfU8/ew4McliDd25+UmeTz65L5k2N0QhrVtZo\ndrmILFouTamTgGOttWcn/yl0YItxzbc72barl8lYjBtu08zdhXh8l7Npx9abfuepzUb8WJY1wc+x\ni4h35JK4/wx4ux8ySXtHJ4/umP6A1KYO89fe0cmeA0NTj3UNRUS8I5fEfRTwR2PMM8aYp+J/nix0\nYAulVs3iefka+nmGtp9jFxHvyCVxvwYneZ+KM659NvCSQgYlkknbxmYqyqd/bb1W4jSb1PKnIeCa\nd5/ii9hFxDsyTk4zxlwK/Ke1dnuG75cD77bW3lig2BZEmzosnpev4fjEJCEgHIJltd6IaT4Ss8sP\nDo8xOjbJU7v7OGrtMrfDEhEfyTarfAdwvzHmPuB+YBfOcrB1TLe6ryx0gPPlp/W9XpW67jiypMIT\n1zB5RvmKSBXtHohpvhqjEa695FS23vQ7dnUNcOU3/qBlYSIyL9lqlf8QJzlvA94JdADfjf/bAqdZ\na79fjCDnY2x8kthkjLJwyDOtRD9qbWmiptq5rzvthDUuRzN7GdiB/hHfTphr7+hkV9d0cRtN/hOR\n+ci6jttaOwJ8Lf7HF/YcGCQGnNa0hk0vf77b4fhWYzTCBzY284mbH2R4ZMLtcLJOmPNCb8B8BOlc\nRKT4vFUSKw+eibdkVHhl8dasrCEUmr6mIiLivlwqp/nKrq6DAJ6q9uVXlRVlrK6vYVfXQWKxmKu7\nrHl5wtx8Belcskm3Z3pCCOc6aGxfZP7mbHEbYzYUI5B8SbQO1zaoxZ0PhzbUMjgyTs/AqKtx+HkZ\nWKpZy8JCwVoW1t7RyflX3Z0xaYNTqvaR7d1cdM09GtsXmadcuso/Y4z5izHmA8aYaMEjWqRn9h1k\naW0lS2u081I+JIYc3O4un4xPOAyHoL7O/63T1pYm6iNVVJaHicVgl4d3YpuPS6+/P2vCTjU+EeMT\nNz/Ip275fQGjEgmWORN3vC75q4Bq4GfGmB8bY15njKkoeHTzNDQyzr7eYQ5TaztvEkMOiSEIN7R3\ndPKOz9zD8OgES2sruXaLP1vayRLLwhqWLwHg419/0FM14ecr0co+ODw+98FpPLm7T61vkRzlNDnN\nWrsD+AbwbeB4oBX4qzHmtQWMbV7aOzq55LPOTqN79g+6HE1w3Png0wB8955triSW1HHSnoHRwCyd\nau/o5Jl90zdEfl0Wlm0sez7GJ2JcccuDvjt/kWLLZYz7wngRlp8DZcCp1tozcLb7/FJhw8tNkNb4\nekl7RydPPNM39diNxOLluumLFZRzy0fSTojF4MpvqttcJJtcWtynA5fjbO35KWvtLgBr7bPAuwsZ\nXK6C8gHoNbquMpdcemFCIaipLidSU0GkpoK5FieMT8R04y2SxZzLway1b8vyvdvyG47ITEFeOuX3\nc5urizwUgq2bNsyaj7BjTz833v7wVEnddFSQRiSzQBRg0XaJheGF69q2sZnqyrIZr+/XZWCpUpeF\nlZWFfHNuC03aMD0x7/LNG7K2vnsGRtTqFkkjEIm7bWMzy+uml38F6cPdTamJZUllmSvXddWyagCW\n11UG7mYssSysLBwiNhljZNT98rK5yJa0IzUVGZN2ssZohK2bNlBelj57a7xbJL1AJG6A155xFABV\nFWWB+3B3U2tLE0trnZuiow9bXtTXbu/o5IKr7mZX10GWVJZx3ZbTAnczlmh9Lq+rYjIG77ruPs8v\nC8sWXygEN7SenvP71BiN8JUPnJ3x+xrvFpmtqInbGFNhjPmmMeZ+Y8xvjTHn5uu5J2PONp5v+qdj\nAvfh7iYnsZxCeVmYvsHiVU9LdMXG4o+HRicC+wHe3tHJ/r7hqcdeXxaWbtJiwoXnrF/Qcx65ZmnG\n72lCpMhMxW5xvwXoii8neznw+Xw98bPx9bBrtblI3pWFw0RX1LB7/8GpG6RCK6UZ7X461/aOTjL9\nBtRHqjj5BQsrrnjZppNmDMuISGbFTty3AluTXnthZZbSeHZ/PHGvrMnXU0qStatqGB2b5EDv8NwH\nSyBlm5AWqalY9BBVa0tTxvHu8YlJz/ZAiBRbURO3tfagtXbAGBPBSeIfzddz7953kOV1ldRUe64S\nayAkejISN0iF5oUZ7cXil3PN1EU+33HtTLKNd/cPjnmyB0LEDUXf1tMYczhwB/AFa21HtmMbGnL7\nIBgcHmN/3wgnHtOQ8894gZ9iff6Rq+AXT9E7NJFz3Is5v6svPYO3bP1f+g464+orl1Vz89aXLfj5\nCiFf79/Vl57B5ivuZH+8N2NJVTnf+PjL8/Lci5F8fh/70q8ydpEvra3M6+9yCNK+1sDQWN5ex0//\n9xZC5xdsRU3cxpjVwM+Ad1tr75nr+K6u3LrGntrtlOVctbQq559xW0NDxDexAtRVOJ0zj+84kFPc\n+Ti/5mNWcd+fnqV2STlbzjveU9cr3+/flvOO54bbHqJnYJTV9dWun2vy+WXrIk/0DOQz3nSFaQDG\nxid528d/SmtL06Ja9377vzdfOj9/y+WmpNhj3P8OLAO2GmPuif+pXuyTamJa4R1Sv4SycKhoXeUA\ne7uHAPh/PlMxAAAgAElEQVT0RS8O/EqBxmiE67acxmENtTy7b5DxiUm3Q5qSrYu8EOv6U+sHJPPq\npD2RYipqi9ta+x7gPfl8zuTWwP0PPctZzYfm8+kl7vpbH2JiMsaTz/bR/u1O2t7UXLDXau/o5NH4\nUrCqijB1S0pn3sLB4XFGxye56Jp7Wb+unraNhbvOucrURV7I96W1pYlP3Pxg2u/1F3FZoogX+boA\nS2oX3vY9/Z5e/+pXqdf5kR2FW2ecun57ZGyyZN7T9o7OGfW7vbCeO1OxlUhNBe97w4kFe93GaIT1\naSbtgYqyiPg6cftp/aufFfM6l/J76sVzz9RNXl4WLvjwhbrMRdLzdeIWkWDz2pI4ES/wdeL2y/pX\nvyvmdS7l99Rr556pSloxY8rUZV5eFiqJ3wmRdHyduNs2NlNbPT2/TruCFUZql2V5AbefbNvYzLLa\n0tzpLfU611aXu3buH/vSr9IuyYrUVBQ9praNzbMqqo1PxLjx9oc1zi0lydeJG2DD8w8BnBmuugMv\nnMT2k+EQM/bHLoR/3nA44GwjWmrvaWtLE5EaZ7Z2pslZxfDQti7XXjud8YnZbX+Nc0up8n3iHorv\nX7x100kl0SpzS2L7yfXrVjAwNM7gcN7KzM+SWO7T+rrFFdrwo8ZohPZ3n0p5WYiuHu/VhS8vc+cj\nI30Fc5HS5PvEvWf/IBXlYVYsW3QdF8lBNL6Jy54DgwV7jSee7SMcCrEumnmrxyCrKA9zxOoIO/cO\nMDo24UoMtWlq/rs53p5u/B+gvk47iknp8XXinozF2H3gINEVNYRDuicvhjUrnep0uwtQQa29o5ML\nrrqbbbt6qSwPU1XgLnkv6+kfYWIyxsXX3pdxLXWhtHd0MjA0NuNroRCLLjW6GJmWhj25u09ruqXk\n+Dpx9/SPMDo2yRpt5Vk0a1YUpsWdWnhleGyiZD+Q2zs6OeBiIZZ0a7djMVwfT87U2tdYt5QaXyfu\n3fud5BFdocRdLImbpMS1zxcvFh9xi65Feo3RiMa6RfB94na6axPdt1J4S2srWVJVXpCucnGfF9Zu\nZ5NurFtruqXU+Dtxx7tr1VVePKFQiDUra9jbPcTEZP52sPJa8RE3uXUtMm3f6cba7Uy0plvE54l7\nT7y7drW6yotqzYoaJiZj7MvjcqVSLrySyq1CLJnqknuN1nRLqSvqtp751N7RyaM7nA+az93+sCe2\nPywVj+/qBeAjX/lNXreefOXJR/Dtu7ZRXYKFV1K1tjRx7Xf+xMDQGE1Hr3I1FrfWbmcSIvNWo36Q\nqWfDK9u4ivd5639kjmZtM+mB7Q9LRXtHJ3t7hqYe5/PaDww5RV3e9Zq/K8mWdrLGaISrL34xoRDs\n7y1OIRa/DFf4Jc5k7R2dnH/V3Zx/1d1pkzY4/5cSxxR7CaD4iy8Tt2bduqeQ1/7JZ52W/PPWlGbh\nlVRLqso5dFUt23f35XU+Qa68OlyRbk13T/8It967zaWIsrv0+vszJutMHtnezYWfuUeNEUnLl4lb\ngiVReOWv27upLA9Tt2R21a5SNTA0xuj4JBd+5t6CtsLSdd+OT0x6NnG0tjTNmKQWw3s9b4lW9sEF\nlgeemIzxiZsf9Mz5iHf4MnH7sassKPJ97VMLr4yOT3rqw9dN7R2d9AyMTj0uZGJK15PSPzjm2V6s\nxmiECQ9PUss0jr0QV9yi5C0z+TJxt21spqJ8OnSvdukFUWo35fK6ykVdew17ZKZr41/5StrgVK27\n8pu/z9vzif/5MnEDrIpvKlJfp5Z2sbW2NFFV4dQRf/3ZR7kcjeSDH3uxvBrzpdffP6/jQyHnTzbj\nEzEuukZj3uLwZeKOxWL0DIyyZmUN125RS7vYGqMRXnvmkQCEQ4v7FfLqh68XFOvatHd0zmrdr1xW\n7flerHST1NasrHE15vaOzjnHtCM1FVy+eQNf+/BL+NqHX8JNH3oJWzdtmNqHPZPxiZi6zQXwaeLu\nHxpjaGSc1fUqvOKWRH3457oXV7O8bWPzjK0ZNewxLTUxFaKCWeocA3Baf5tetT5vr1FIqdt6uj1B\nLVsXeSgEl2/ewA2tp896DxujEW5oPZ3LN2/I2vr2wmYv4j5fJu69B5x1xKtXLHE5ktK1ut659s8d\nGJrjyLm96Z+OAaCyPKyWdorWliZqqp06SaefsDbvz59pJ7BbfvJI3l+rEJ7a3Tfra27NA5hr1v/W\nTRvmvOlqjEbYumnDrLKuyXoGRtTqLnG+TNyJVp5Knbpn5bJqysIh9i6yxQ0wNuGsUX7dWUeppZ2i\nMRrhQ29+IQADg2NzHC1umWsW+eWb507aCY3RCF/5wNkZk7cmq4m/E7e6yl1TFg6zavkSnutefIs7\n0XpQ0k5vzcoaysvC7Hgu/62sTOPol53/ory/ViF4YY7EXEk7UlOxoN/tj771pIzfG5+IadlkCfNn\n4k50lderq9xNq+uXMDA0xsDQwluC7R2d/OzBnQB87/4n8xVaoJSXhSkvC7FjTz8XFLgcZmKOwdGH\nLS/Ya+STF6qozZW03/eGExf0vI3RCEdmqSKopYGly6eJe5DK8jDLU/7DSnElejwWOkEttaXyt6d7\n1IpIo72jk+HRCSC/FcL8Vi0tEzerqGW7iQqFSDsRbT4u23TSrBuTZBrvLk2+S9yxWIznuoc4pH4J\n4bkWP0pBJSYH7l3gBDUVGMlNoa6T36qlZeJmFbVsW6FeeE5+Zuan3pgk0yzz0uS7xN17cJSRsQmN\nb3vA6jwtCRPxq0zbi9ZHqjj5BdG8vEZisppIgq8Sd3tHJ+/7/AMAbC/ARB2Znx/+8inn7we2L2jc\n1QsTi/ygUNcpSNffjXPJ9DtfU11ekNfNNN7tx+ENWRzfJO7U8bj9vcMaD3VRe0cnj+/qnXq8kDHF\nto3NM7oAVXwlvXzXh0943xtPnFHsw8/XP/Ua1VSVF/xcMk1Kq6ooK8jrXrYp/SxzPw5vyOL4JnFr\nPNRb8vF+xGIxKsrLCIf829IrltaWJirjG+u86R+PWfTztXd0cuHV9xCLOZOognD9W1uaKAs7dyKD\nI+MF3wbVSzRJrbT4JnFL8BzoG2FoZJwXHtvg25ZesTRGI7z+7KOB6YI1C5Va5jSWaaDWZ269dxsT\nk9MnU+xtUMG5CSrkDdD6NEMCoElqpcY3iTtI43FBkI/3I1FQRAk7N42rneu0Y8/Aop4nqL1XxTqv\n9o7OjJPSltdVFfT3uW1jc8bv9Q+OZvyeBItvErc2o/CWWWOK1fMfU5yqmLZa72EuDj+kjhAUpIKa\n5CZblbRITUVRGhKZJ6k51dS27eopeAziLtcStzHmRcaYe+bzM5teYQCo0GYUntDa0kTdEmcrwhce\ns2peP9ve0cmPfrUdgB//eke+QwukqsoyKirCPLazZ1EV1ILae1WM88rWRb7YYiu5ylaUpbt/hE99\n7bcFj2Eu7R2dnH/V3bP+eG1ugF+5kriNMR8EvgrMq/RZRZkT7sv+4XC1tD2gMRrhE+f/AwDDY7mP\nu6a2Wh7bqYppuWjv6GQ0fp0XUx2sbWMz1ZVlU4+D0nuVrvzpVe88Oa/nlamLPHEDWyxevMlq7+jk\ngniCztQr8cj2bs6/6m4+dYs2SVkMt1rc24DXAvMqfZbY0ELFV7xjeV0llRVh9h7IvQhLUMdYCy0f\n1y3x4Zooobq8rtKTSWChWluaqI9UTS1ze2f7fXlr5WV6nsXUI1+oxmgk40S1Yq/rTrSuU/d1z+bJ\n3X1K4IvgSuK21t4BjM/357QrmPeEQiEOWV7Dc91DxIIyPTmgUmeTg/P+BUljNMKalTUzZsrna3Z5\npm7y8rKwK70VmSaq9Q6MFu0m+NLr78+6ycpcntzdx4WfuUe9bfNU7nYA2TQ0zPzP0HPQ2YVq/TEN\nLKvz/wYjqefnV0esibCra4Dy6kpWLK2e+nqm8zvhmAb+9HjXjK+tXFbNZee/yFfXpNixLva6Pboj\nfYv989/7Mzdvfdms7/npvUiWy3ku6NxCpO0rD4dDrl2rDCEVJaY3XfY/HByed/trlonJGJ+4+UE+\n+29n5rwrnV9/N/PF04m7q2vmXdjTe/pYUlXOyOAIXUP+XvrQ0BCZdX5+tbymEoBHHt+LOcLpvst2\nfq0tx3Nx+72MjjvjtfWRKq551ynA7Pfcq9x4/1pbjuf9X3iA7v4RYAHXLUOHyORkbNbP+/r3c47z\nXOi51VSVz0pU9ZEqtpx3vGvX6rh19bNavBXl4YLHdOn19+claSf7t8/ex+WbN8zZe+Hr380c5HJT\n4vZysJz7VicnY3T1DBFdsSRw3Xt+l9glLDEHIRcr4pOI6uv8P5u5mJJ3irro3PntPhXU2eSpCnGe\n7R2dsxJVotiKm5P6UssGA4yNT3Lj7Q8XrPs53bXIlytueVDd5jlwLXFba7dba0/J9fj9fcOMT8Q0\nvu1BU/ty5zhBbXxikn19w6yLRrh2i/9nMxdTYzTCP/394cD8x6fbNjazvK5y6nFQZpOnSp1dXl1Z\ntujzTDe+7ZVqZeNF3tI0lzHtSE0F9ZEqLt+8ga99+CVcvnkDkZq5Z9575Zp6nae7ypMlJqYdUr/E\n5Ugk1fT2nrm1uJ/rHmJ8IsZhh9QVMqzAOrShFoBnugY49vDcxgTBaSn1DDhDTOECl+Z0W2tLEzfc\n9hA9A6MMj05wwVV3c9y6+qyVxzLJVinNCzKNcxfCpdffn/X7tdXltG1snnWT1BiNcEPr6ezY0891\n3/0T/YNjGZ+ju9+pux60G8p8crurPGfPHYgvBVuhFrfXLK2poLqyLOd9uXftdUp2HtagxL0Qieu2\ns+tgzj+TunZ+Mt6yCWq3ZGM0wtpVtVOPk9e9z6eyWLZKaV4ZZkg3NAD5XxY2Vxf5Reeu53PvPSNr\nwk0k8Ms3b8j6Wuoyz84Xibu9o5P//r/HAPj573e6HI2kuvY7f2J4dIJnug5yzbfnXjO7qyuRuGvn\nOFLSWbuqhnAoNHUdc1GKa+cznfN8Kotlq5TmlWGGTL0I+d7uM1sXeaSmgpNfEM35uRqjkazJW13m\n2Xk+cafe8T61u19Vtjwk9f15dEf2Vk17Ryc/iZc4/eED24sRYuDccNvDTMZibNvVS3sON0qSf8Wu\nlOa2uYrYLKQATWM0krHuOmir0mw8n7hLsaXgJ/Np1ajU6eKlXsNHduRWXKRUZpQny3TOl53/opyf\no6Z69jSg+khV0SulzSVTFbX6PNW7yNbazmUJVyaXbTpp1qz4BLW6M/N84pbg0E3Y4i30GrZtbGZJ\nAOuTZ5M6u7y+zjnnXIt8eHUJWDrp6rSDU5lssTfH2VrbkZqKRV+Lj771pIzfU6s7Pc8n7lJsKfhJ\nPlo1UhyHxmfxL6sNVn3ybFpbmqgsdz7m3vCSo+f1s15eApZOpvd0sTfH2Vrb+eh5yNZl7uXr7SbP\nJ+62jc0zxpNKoaXgJ6l3+hXl4YytGt2ELd5CrmFiY5Ftu3qpKA/z2UtPK5n/P43RCCuXOWV4v/zD\nvwZ6W8nGaGR+uzblINv1qo9U5e336LJNanXPh+cTN8CZJ64FnPEmfch7T2tL09RY2qpl1RmPa9vY\nTFXF9K+cbsLmL/VGKRwOZb2GqRuLjI1PltS8gvaOTnbvn16m+Mj2bjZfcWdO559pfNvLn0HpbuzK\ny0ILjjlbazvf10Gt7tz5InFPTjofO14cWxLnTv/aLaeyZmUNfQez15BPVFkL2naSxZTYurIsHIJY\njLHxzHuhl/q8gnTnv793eM7z99P4drK2jc1UlM/8WB+fiC1ozX6xWtsJanXnzheJu6vHKb7SsFxV\n07ysYfkSDg6PMzicvipSLBajq3eY6IoarttSOt21+dYYjXDtJadyetMaJmOwe3/uhVgkN34b3042\nnuZGbiE3a8VsbSeo1Z0bXyTuvT1DVJSHZ9RZFu9pWObcWHX1DKf9fnf/CEMj4yp1mieHxiuoPZOl\nglqpzytId/4rl1UH+/zzMNBd7NZ2glrdufF84o7FnF3BGpZrVzCva1jujG8nekhS7dyrimn5dPgh\nidKnmSuotW1sZllt8DcWySR1TkBVRRk3b33ZnOfvx/HthBOObpj1tfmOc7vR2k5Qq3tunk/cA0Nj\nDI1McIi6yT0vMZTR1Zs+cU+XOlWLOx8Sm43MVfr0lScfATi7ZPkh8eRba0vTVG9d4uYyG7+Obyd8\n8uJTZhU1mc84t1ut7YS5Wt3zqTUfVJ5P3IluV41ve99U4k7TVd7e0cnt9z0JwE9/+3RR4wqqL37/\nLwD85ckDGT9s2zs6+fZd2wA4ZPkSXySefGuMRrhuy2lUV5axq+sgr277Qdbk5Ofx7YTFbPWZqT47\nFG9HuWyt7vnUmg8qzyfuvT3aztMvVmXoKk8t07ntmd6SWpJUCLNKn26fXfo09Zin9w6U7HVv7+hk\neHQCcD78012vIFnMoGKmLUKL0dpOyNbqFh8k7q7uxIzyubu4xF3VleUsralgX0riLvUlSYWQyzXV\ndZ82n2sRhAl9Cz2HTD0RbtTQyNTqzvd2pX7k+cS9V0vBfKVh+RL29Q4zMZnpvl3Eu9o7OmcleT9O\n6EtXu7ynf4Rb792W9ecydZNXVZQV/fwztbp7B0ZL8uYzmecTd1fPMCFg1TIlbj9oWL6EickY+5Mm\nqAWhBeM1uVxTXfdpuVyL1Cpz4ExKe/1ZRxUhwvxrbWmaMUktxtxDBLrd9gdPJ+72jk4e29lDDLjh\ntofcDkdysO2ZXgDe8an/m+p2a9vYTHWJ7UxVaKktqvKy2aVP2zY2U6kSs8Ds67WstnLWtcg0Ke3W\ne58oSoz51hiNMDGPSWqZuskjNRWu3exl2q601LvLPZu4P/alX805+Ua8pb2jk329zozy1Lv7ow9d\nBsDSEtqZqtASpU/DIWbcGCVbEa8hrxKzzvVKXKdXvfgIl6Pxnkzd5OVlYddu9to2Nqf9ev/gWEl3\nl3s2cT+0rWvW10p1Yo1fZJsA1HdwlMryMNdtKc0WXyEkSp+uX7eCgaFxBpPWHid2BNvTPcSSqnKV\nmMW5Xom5Mt/6+bZZLcwgDi3M55zUTe4fnk3cEiAx2H1gkOjKGsKqfpd3a1c5hVgSNctTx2qHRsbV\nW4VzXRLV+2DuXrwgDC2km6S2ZmXNrHPyYjd5grrLZ/Ns4k5Xts/vd79Bl+nu/l9fdixj45NTCUby\na81KZ8e1Z+OJW8vA0st2XVLXvENwEkNiy92EdDcsXuwmT1B3+WyeTdyfvPgUqio0oclPUu/uE+9Z\nosb8mpVK3IUw1eLeNzjHkZJJusQVlMTw1O6+WV9LvZFTN7m/eDZxA6yLJ+llmtDkG8lLUC46dz3t\nHZ3ceJvzAfHgo3vdDC2w7kiUkv3d07R3dAZyrDYfdF3S83I3eYK6y2fydOIeHBmnskITmvykMRrh\n9BPWAs4ymuTux11dpVtys1DaOzqxO6c3XXhkeze79w9St6Ri6mvqrXKk9ghVV5ZNXRc/7wY2l3Q3\nLMm7hXm5mzxB3eUzeTZxaztP/0rsy/3ks3N30cniZBq3TVSuK9UdwTJpbWlixVKnfHJ0hTM3wO+7\ngc2lbWNz1t3C1E3uP55N3P2DYwyPTkwlAfEPlaf1gJjzcXz+K48LRPLJl8ZohFsufxmrV9TwXPcQ\nk7FYIHYDm0um3cKu/Obv0x7vpW7yBHWXT/Ns4n7ugDNDdtUybS7iN4kNYVKXoSS+5rUPBD/L1A06\nFN8J62cP7ix2SL4wPDLO0Mg4F159T0m0ODP1WaZL6OCtbvIEdZdP83DidmbIrlLrzXcSLe7DGuo0\n1lpgqeO24dDMD2NtoTrbx770K3oPjgLZt7AM0g1mpol5QdE/OOp2CEXl3cS930nc2s7Tf5ZUlROp\nqaSrZ4hT/y4KQK0L2wKWitaWJpbVVgKQblM2zSuYKV1VxmRBvMFMvcFbUlk2tf4/lRe7yRMyd5fH\nSuoG1bOJe0+8xa0xbn+KrqxhX+/QVJftB9/8wkB9EHpJYzTCdVtOpaZq9sxomZ/k2dZB09rSRHnY\n6TQfGp2YVXAmwYvd5AltG5tZmWH4tJRuUD2buJ+LV4FapRa3L0VX1jI+EeOR7QcIhSC6QjdghRQK\nhVizKn0LKmjdvouVripjQvJs66C59d5tjKfrkvGZy85/kdshuM67ifvAIJGaCqor1Yrwo2i8G25f\n7zANy5dQUZ5+9yrJn7XxynRl4empSEHs9l2sT158Stbx3aC23DKt107m5W7yhKMPW17yM8w9m7j3\ndg+xSt3kvrV6xXR507UqdVoUiZKyiTXc9XVqaWfS2tLEkirdTKbycjd5slKfYV7U5qwxJgz8J9AE\njADvsNam3aV+fGJSE9N8LJo08SVTF67kV/ImLs8/YjkffPMLXYzG2xqjEVpbmrj6W7PLfQZ1aOG4\ndfUZx7XFX4rd4n4NUGmtPQX4MHBttoPTVd4Sf/j0zb+b+vddf9jlYiSl48s//OvUv594Rv935vK5\nO/4862tBHlpIt8VnMr/dsKTrLg/y5MJkxU7cpwI/BbDW/hY4KdvB+3qHS2qKf1Bcev39M0pIjo5N\ncsHVd/Obv+5xMapgu/T6+xkamb7mYxO65tlcev39DKaUOQU4+8S1LkRTPK0tTRmLsbz+rKN8dcMy\nVynXICt24l4KJDcFJuLd5xkFdaJIkKXWfQanhORXf/yIC9GUBl3z+Ul3vQC+98unihxJcTVGIxmL\nzvjxdyVTKdeg54xiT9nuA5Jv6cLW2sm5figcDtHQ4J87wVwF8ZyyCRGsc/bDuSzmmvvh/PItKL+j\nCzkHP517Is5QaKos/wxBzRkJxU7cDwDnArcaY04G5rwtqo9UseW84+nqClbXR0NDJHDnlFBbXZ52\nt6V3nLM+MOfstfcv39fca+eXTw0NkUD/js713vn93JPP77jG2RPu/J4zcrnhKHZX+feAYWPMAzgT\n0/4t28FBnigSZJ977xkkLSUmFIKbPvQSTn5B1L2gAu5z7z2DkK55zkr5egXp3FMn3JVKzihq4rbW\nxqy177LWnhr/81imY1cuqy6J2YFB9d43vZBQyPlQuPCc9W6HUxIuPGe9rvk8lPL1CtK5t7Y0UR+p\n8t2s+MUIxdINEHhDzK9dHbkIclck6Pz8LsjnF+RzA52f3zU0RDJN/J/i2cppIiIiMpsSt4iIiI8o\ncYuIiPiIEreIiIiPKHGLiIj4iBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGLiIj4\niBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGLiIj4iBK3iIiIjyhxi4iI+IgSt4iI\niI8ocYuIiPiIEreIiIiPKHGLiIj4iBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGL\niIj4iBK3iIiIjyhxi4iI+IgSt4iIiI8ocYuIiPiIEreIiIiPKHGLiIj4iCuJ2xhznjHmv914bRER\nET8rL/YLGmNuAF4KdBb7tUVERPzOjRb3A8C7gJALry0iIuJrBWtxG2MuAN6b8uXN1trvGmPOKtTr\nioiIBFkoFosV/UXjifud1to3Ff3FRUREfEyzykVERHzErcQdi/8RERGReXClq1xEREQWRl3lIiIi\nPqLELSIi4iNK3CIiIj5S9MppczHGhIH/BJqAEeAd1ton3I0q/4wxLwKustae7XYs+WSMqQC+BjQC\nVcCnrLU/cjeq/DDGlAFfBY7FmVx5sbX2r+5GlX/GmEOAPwD/aK19zO148skY80egN/7wSWvtBW7G\nk2/GmI8A5wIVwOettbe4HFLeGGM2AZvjD5cAJwCrrbV9rgWVJ/G89184ny2TwIXWWpvpeC+2uF8D\nVFprTwE+DFzrcjx5Z4z5IE4CqHI7lgJ4C9BlrT0DeDnweZfjyadzgElr7WnAZcCVLseTd/Ebry8D\nB92OJd+MMdUA1tqz43+ClrTPAl4c/+w8CzjS1YDyzFp7S+K9A34PXBqEpB33UqA2/tlyBXN8tngx\ncZ8K/BTAWvtb4CR3wymIbcBrCWbZ11uBrfF/h4FxF2PJK2vtD4B3xh+uA7rdi6ZgrgG+COx2O5AC\nOAGoMcbcaYy5K97rFSQvBf5sjPk+8CPghy7HUxDGmJOAF1hr/8vtWPJoCFhmjAkBy4DRbAd7MXEv\nBZLvoibi3QiBYa29gwAltGTW2oPW2gFjTAQniX/U7ZjyyVo7YYy5GbgR+JbL4eSVMWYzTm/Jz+Jf\nCtqN5UHgGmvty4CLgf8O2GdLA/D3wOuIn5+74RTMvwMfdzuIPHsAqAb+htPj9blsB3vxl7YPiCQ9\nDltrJ90KRubPGHM4cDfwDWtth9vx5Ju1djPOWNRXjTFLXA4nn94O/LMx5h7gROAWY8xql2PKp8eI\nJzNr7ePAfmCNqxHl1z7gZ9ba8fjchGFjzCq3g8onY8xy4Fhr7X1ux5JnHwQesNYapv/vVWY62IuJ\n+wHglQDGmJOBh90NR+Yj/kH/M+CD1tqbXQ4nr4wxb41P/gGna2sy/icQrLVnWmvPio8h/gl4m7X2\nObfjyqO3E58zY4xZi9O7F6QhgV/izCtJnF8tzs1JkJwB3OV2EAVQy3RPczfO5MKyTAd7blY58D2c\nu/4H4o/f7mYwBRbEsnX/jjNGs9UYkxjrfoW1dtjFmPLlNuBmY8x9OP+x3mOtHXE5JsndTcDXjTH3\nxx+/PUi9edbanxhjzjDG/A6nUfZua23QPmOOBQK3yghnbsnXjTG/wPls+Yi1dijTwSp5KiIi4iNe\n7CoXERGRDJS4RUREfESJW0RExEeUuEVERHxEiVtERMRHlLhFRER8RIlbRAAwxrzaGHPpPI6/JV7o\nQ0SKSIlbRDDGVAEfwtlSN1dXA58tTEQikokXK6eJSB4ZY1qBFmvtmcaY03D2S2+21iZv3fkW4L74\nJirrgO/jVKg6HmcLxXtx9kKuB86z1v7NWvuIMWadMeZIa+2TxTsjkdKmFrdIwFlrb8TZZe8SnH3g\nN56zgbwAAAEiSURBVKUkbYBzgfuTHh+Psy+wATYAjfF9nr8NXJR03C9x9ikXkSJRi1ukNJwP/BX4\nvLX212m+fwywK+nxHmvtQwDGmF1Mb+ywA3he0nE74j8rIkWiFrdIaVgH9OLs15zOJDP3iB9N+X7i\ne6l7dI8RoB3SRPxAiVsk4IwxdcBXcLrDB40x70pz2BM4yX2+jgQeX3h0IjJfStwiwXc18GNr7R+A\nLThbrjamHPMj4Oykx5m2DYylfO+M+M+KSJFoW08RSSwH+yXwYmvt+FzHx3/mBODfrbVvLGhwIjKD\nWtwigrV2BLgSePc8fuwDwPsLE5GIZKIWt4iIiI+oxS0iIuIjStwiIiI+osQtIiLiI0rcIiIiPqLE\nLSIi4iNK3CIiIj7y/wFyIqE9FrwToAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_trajectory_with_bounce(x_0=np.array([0, 0]),\n", " v_0=np.array([1, 10]),\n", " number_of_bounces=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the previous code, we can come up with an animation of a boucing ball:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# general variables\n", "number_of_bounces = 5\n", "frames = 100\n", "dt = 7. / frames\n", "\n", "\n", "# configure axes\n", "fig = plt.figure()\n", "ax = plt.axes(xlim=(-4, 4), ylim=(-4, 4))\n", "ax.set_xlabel('x (m)')\n", "ax.set_ylabel('y (m)')\n", "\n", "# compute trajectory\n", "t = np.linspace(0, 4.5, num=frames)\n", "x_0 = np.array([0, 0])\n", "v_0 = np.array([1, 10])\n", "\n", "x = np.zeros((2, 1))\n", "start_time = 0.\n", "for i in range(number_of_bounces):\n", " bounce_time = compute_bounce_time(v_0[1], x_0[1])\n", " if bounce_time.size == 0:\n", " continue\n", " else:\n", " # we only keep the biggest bouncing time (in case there's a near zero one)\n", " bounce_time = np.max(bounce_time)\n", "\n", " t = np.arange(start_time, bounce_time, dt)\n", " x = np.hstack((x, \n", " 1/2. * 9.81 * np.array([0, -1.])[:, np.newaxis] * t**2 + v_0[:, np.newaxis] * t + x_0[:, np.newaxis]))\n", " v1 = 9.81 * np.array([0, -1.])[:, np.newaxis] * t + v_0[:, np.newaxis] \n", " v1_prime = compute_velocity_after_collision(v1[:, -1], 1.0, x[:, -1])\n", " v_0 = v1_prime\n", " x_0 = x[:, -1]\n", "\n", "ax.set_xlim(0, 8)\n", "ax.set_ylim(0, 6)\n", "\n", "def init():\n", " ax.plot(x[0, :], x[1, :], '-o')\n", " ax.plot(x[0, 0], x[1, 0], 'or', ms=10)\n", "\n", "def animate(i):\n", " ax.plot(x[0, i], x[1, i], 'or', ms=10)\n", " ax.set_title(\"$t = {:.2f}$ seconds\".format(i * dt))\n", " return \n", "\n", "animation.FuncAnimation(fig, animate, init_func=init,\n", " frames=frames, interval=100, blit=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conclusion " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I hope you've enjoyed this blog post that shows how to animate a bouncing ball according to the laws of physics.\n", "I'm a bit sad that this post was not about explaining the physics of the bouncing, but rather just about computing trajectories.\n", "\n", "Coming back to my original impulse (which was Lindy Hop), I'll now watch the previous animation and try to hop along to it. Happy bouncing!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This post was entirely written using the IPython notebook. Its content is BSD-licensed. You can see a static view or download this notebook with the help of nbviewer at [20151001_BouncingBalls.ipynb](http://nbviewer.ipython.org/urls/raw.github.com/flothesof/posts/master/20151001_BouncingBalls.ipynb)." ] } ], "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }