{ "metadata": { "name": "", "signature": "sha256:441b1a3323ec6ef783cfa31fecfb5b9dab1665e9e352478982d946fc32a10171" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Object-Oriented Programming Example: A simple N-body code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Supposed we wanted to create a system of particles that move in some acceleration field, like a gravitational field or an electric field. This is a good test case for showing the power of classes and object-oriented programming. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The setup is like this: we have a set of $n$ particles with positions ${\\bf x}_i$:\n", "\n", "$\\{{\\bf x}_1,{\\bf x}_2,{\\bf x}_3,...,{\\bf x}_n\\}$\n", "\n", "velocities ${\\bf v}_i$:\n", "\n", "$\\{{\\bf v}_1,{\\bf v}_2,{\\bf v}_3,...,{\\bf v}_n\\}$\n", "\n", "and \"tags\" or \"IDs\", e.g., some kind of unique identifying integer, to keep track of each one:\n", "\n", "$\\{i_1,i_2,i_3,...,i_n\\}$\n", "\n", "The particles are situated in some kind of position-dependent acceleration field ${\\bf a}({\\bf r})$, which for any given moment results in accelerations ${\\bf a}_i$ on the particles:\n", "\n", "$\\{{\\bf a}_1,{\\bf a}_2,{\\bf a}_3,...,{\\bf a}_n\\}$\n", "\n", "Given the initial positions, velocities, and acceleration field, we want to solve for the evolution of the particles as a function of time. We'll do this in a discrete fashion, where the particles will be evolved over the time interval $t \\in [0,t_{\\rm max}]$ over a series of steps. The algorithm we'll use for this is called the \"leapfrog\" or \"midpoint\" method. For this example, you don't necessarily need to know exactly how this works, except that at each step it advances the position and the velocity of each particle by a single timestep $\\Delta{t}$, the value of which is determined at each step from the particle which is moving the fastest. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we'll import the modules we need, as well as define some constants. We'll just need a couple of things from `math` and `matplotlib` so we can plot the results. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "from math import sqrt, pi\n", "onethird = 1./3.\n", "onesixth = 1./6.\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll create two classes, which will interoperate with each other. The first is a class `Particle` that defines a single particle. Each `Particle` has the following attributes:\n", "\n", "* `x`: the particle's x-position, as an expanding list with time\n", "* `y`: the particle's y-position, as an expanding list with time \n", "* `z`: the particle's z-position, as an expanding list with time \n", "* `vx`: the particle's x-velocity, as an expanding list with time\n", "* `vy`: the particle's x-velocity, as an expanding list with time\n", "* `vz`: the particle's x-velocity, as an expanding list with time\n", "* `id`: the particle's ID\n", "\n", "and the following methods:\n", "\n", "* `set_id`: set the particle's ID.\n", "* `get_id`: get the particle's ID.\n", "* `get_current_position`: get the current position of the particle. \n", "* `get_current_velocity`: get the current velocity of the particle. \n", "* `get_timestep`: get the particle's current timestep.\n", "* `set_acceleration`: set the acceleration on the particle.\n", "* `advance`: advance the particle's position and velocity forward by one timestep. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Particle(object):\n", " \n", " def __init__(self, pos, vel):\n", " self.x = [pos[0]]\n", " self.y = [pos[1]]\n", " self.z = [pos[2]]\n", " self.vx = [vel[0]]\n", " self.vy = [vel[1]]\n", " self.vz = [vel[2]]\n", " \n", " self.id = None\n", " \n", " self.ax = 0.0\n", " self.ay = 0.0\n", " self.az = 0.0\n", " self.ax_old = 0.0\n", " self.ay_old = 0.0\n", " self.az_old = 0.0\n", " \n", " def set_id(self, id):\n", " \"\"\"\n", " Set the particle's *id*.\n", " \"\"\"\n", " self.id = id\n", " \n", " def get_id(self):\n", " \"\"\"\n", " Get the particle's *id*.\n", " \"\"\"\n", " return self.id\n", " \n", " def get_current_position(self):\n", " \"\"\"\n", " Get the particle's current position.\n", " \"\"\"\n", " return [self.x[-1],self.y[-1],self.z[-1]]\n", " \n", " def get_current_velocity(self):\n", " \"\"\"\n", " Get the particle's current velocity.\n", " \"\"\"\n", " return [self.vx[-1],self.vy[-1],self.vz[-1]]\n", " \n", " def get_timestep(self):\n", " \"\"\"\n", " Get the timestep for this particle.\n", " \"\"\"\n", " x, y, z = self.get_current_position()\n", " r = sqrt(x*x+y*y+z*z)\n", " a = sqrt(self.ax**2+self.ay**2+self.az**2)\n", " return 0.01*sqrt(r/a)\n", " \n", " def set_acceleration(self, a):\n", " \"\"\"\n", " Set the acceleration with magnitude *a*\n", " \"\"\"\n", " # Update the old acceleration\n", " self.ax_old = self.ax\n", " self.ay_old = self.ay\n", " self.az_old = self.az\n", " \n", " x, y, z = self.get_current_position()\n", " r = sqrt(x*x+y*y+z*z)\n", " \n", " # Set the new acceleration\n", " self.ax = a*x/r\n", " self.ay = a*y/r\n", " self.az = a*z/r\n", " \n", " def advance(self, dt, dt_old): \n", " \"\"\"\n", " Advance the particle's position and velocity using the \n", " timesteps *dt* and *dt_old*.\n", " \"\"\"\n", " # Determine the weights for the current and previous accelerations\n", " if len(self.x) == 1:\n", " wterm = 0.5*dt\n", " woldterm = 0.0\n", " else:\n", " wterm = 0.5*dt + onethird*dt_old + onesixth*dt**2/dt_old\n", " woldterm = onesixth*(dt_old**2-dt**2)/dt_old\n", "\n", " # Advance the particle's velocity\n", " vx = self.vx[-1] + wterm*self.ax + woldterm*self.ax_old\n", " vy = self.vy[-1] + wterm*self.ay + woldterm*self.ay_old\n", " vz = self.vz[-1] + wterm*self.az + woldterm*self.az_old\n", " \n", " # Advance the particle position\n", " x = self.x[-1] + vx*dt\n", " y = self.y[-1] + vy*dt\n", " z = self.z[-1] + vz*dt\n", " \n", " # Add the new position to the list\n", " self.x.append(x)\n", " self.y.append(y)\n", " self.z.append(z)\n", " \n", " # Add the new velocity to the list\n", " self.vx.append(vx)\n", " self.vy.append(vy)\n", " self.vz.append(vz)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The second class we'll create is a `Particles` class that contains a collection of particles. Each instance has the following attributes:\n", "\n", "* `num_particles`: the number of particles\n", "* `particles`: a list of `Particle` instances\n", "* `accel_func`: the function which defines the particle acceleration as a function of radius\n", "* `time`: a list of times\n", "* `dt`: the current timestep\n", "* `dt_old`: the previous timestep\n", "\n", "and the following methods:\n", "\n", "* `add_particle`: add a particle to the collection. \n", "* `set_acceleration_field`: set the acceleration field function. \n", "* `determine_timestep`: determine the timestep that the particles will be evolved over at this step. \n", "* `evolve`: evolve the system of particles.\n", "* `get_particle_from_id`: grab a particle from the collection based on its ID." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Particles(object):\n", " \n", " def __init__(self):\n", " self.num_particles = 0\n", " self.particles = []\n", " self.accel_func = None\n", " self.time = [0.0]\n", " self.dt = 0.0\n", " self.dt_old = 0.0\n", " self.ids = []\n", " \n", " def add_particle(self, p):\n", " \"\"\"\n", " Add the particle *p*. Increment the number of particles by 1. \n", " \"\"\"\n", " self.particles.append(p)\n", " self.ids.append(p.id)\n", " self.num_particles += 1\n", " \n", " def set_acceleration_field(self, accel_func):\n", " \"\"\"\n", " Set the acceleration field for these particles to *accel_func*.\n", " \"\"\"\n", " self.accel_func = accel_func\n", " \n", " def determine_timestep(self):\n", " \"\"\"\n", " Find the minimum timestep of all the particles.\n", " \"\"\"\n", " dts = [p.get_timestep() for p in self.particles]\n", " self.dt = min(dts)\n", " \n", " def evolve(self, tmax):\n", " \"\"\"\n", " Evolve the particles for a time *tmax*.\n", " \"\"\"\n", " step = 0\n", " while self.time[-1] < tmax:\n", " for p in self.particles:\n", " x, y, z = p.get_current_position()\n", " r = sqrt(x*x+y*y+z*z)\n", " a = self.accel_func(r)\n", " p.set_acceleration(a)\n", " self.determine_timestep()\n", " print \"step = %d, time = %g, dt = %g\" % (step, self.time[-1], self.dt)\n", " for p in self.particles:\n", " p.advance(self.dt, self.dt_old)\n", " self.dt_old = self.dt\n", " self.time.append(self.time[-1]+self.dt)\n", " step += 1\n", " \n", " def get_particle_from_id(self, id):\n", " \"\"\"\n", " Get the particle with matching *id*.\n", " \"\"\"\n", " idx = self.ids.index(id)\n", " return self.particles[idx] " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first thing we have to do is initialize the `Particles` instance. It doesn't take any arguments, so we just set it up like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "particles = Particles()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember, this is implicitly calling the `__init__` method of the the `Particles` class \"under the hood\". " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the acceleration field, we'll assume a Newtonian gravitational field, $a = -GM/r^2$, with convenient units such that $GM = 1$. It's simple enough that we can create it using a `lambda`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "grav_accel = lambda r: -1.0/(r*r)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can set up the particle positions and velocities. These values have been chosen so that we get circular orbits in the given acceleration:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x1 = 1.0\n", "x2 = -1.0\n", "vy1 = 1.0\n", "vy2 = -1.0" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "We can now create the two particle objects. " ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "p1 = Particle([x1,0.0,0.0],[0.0,vy1,0.0])\n", "p2 = Particle([x2,0.0,0.0],[0.0,vy2,0.0])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll use the `set_id` method to set each particle's ID:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "p1.set_id(1)\n", "p2.set_id(2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "and we can use the `get_id` method to get them back: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "print p1.get_id(), p2.get_id()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 2\n" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obviously, we could have just accessed `p1.id` and `p2.id` to set the IDs, but it's good practice to avoid accessing attributes of an object as much as possible, and instead implement \"getter\" and \"setter\" methods like `get_id` and `set_id`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now add each `Particle` object to the `particles` object:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "particles.add_particle(p1)\n", "particles.add_particle(p2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now check the number of particles again, and we should find that it is 2, since we've now added these particles. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "print particles.num_particles" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2\n" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also have to tell the `particles` object what the acceleration field is that we defined earlier:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "particles.set_acceleration_field(grav_accel)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We're finally ready to set these particles in motion! The only thing left to do is to call the `evolve` method, which needs to know how long we want to run the evolution for. For a circular orbit, the speed is constant, and in this case for each particle is $v = 1$. The period of a circular orbit is given by $T = 2\\pi/v$, so to make each particle undergo half its orbit, we'll set the evolution time `tmax` to $\\pi$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "particles.evolve(pi)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "step = 0, time = 0, dt = 0.01\n", "step = 1, time = 0.01, dt = 0.01\n", "step = 2, time = 0.02, dt = 0.01\n", "step = 3, time = 0.03, dt = 0.01\n", "step = 4, time = 0.04, dt = 0.01\n", "step = 5, time = 0.05, dt = 0.01\n", "step = 6, time = 0.06, dt = 0.01\n", "step = 7, time = 0.07, dt = 0.01\n", "step = 8, time = 0.08, dt = 0.01\n", "step = 9, time = 0.09, dt = 0.01\n", "step = 10, time = 0.1, dt = 0.01\n", "step = 11, time = 0.11, dt = 0.01\n", "step = 12, time = 0.12, dt = 0.01\n", "step = 13, time = 0.13, dt = 0.01\n", "step = 14, time = 0.14, dt = 0.01\n", "step = 15, time = 0.15, dt = 0.01\n", "step = 16, time = 0.16, dt = 0.01\n", "step = 17, time = 0.17, dt = 0.01\n", "step = 18, time = 0.18, dt = 0.01\n", "step = 19, time = 0.19, dt = 0.01\n", "step = 20, time = 0.2, dt = 0.01\n", "step = 21, time = 0.21, dt = 0.01\n", "step = 22, time = 0.22, dt = 0.01\n", "step = 23, time = 0.23, dt = 0.01\n", "step = 24, time = 0.24, dt = 0.01\n", "step = 25, time = 0.25, dt = 0.01\n", "step = 26, time = 0.26, dt = 0.01\n", "step = 27, time = 0.27, dt = 0.01\n", "step = 28, time = 0.28, dt = 0.01\n", "step = 29, time = 0.29, dt = 0.01\n", "step = 30, time = 0.3, dt = 0.01\n", "step = 31, time = 0.31, dt = 0.01\n", "step = 32, time = 0.32, dt = 0.01\n", "step = 33, time = 0.33, dt = 0.01\n", "step = 34, time = 0.34, dt = 0.01\n", "step = 35, time = 0.35, dt = 0.01\n", "step = 36, time = 0.36, dt = 0.01\n", "step = 37, time = 0.37, dt = 0.01\n", "step = 38, time = 0.38, dt = 0.01\n", "step = 39, time = 0.39, dt = 0.01\n", "step = 40, time = 0.4, dt = 0.01\n", "step = 41, time = 0.41, dt = 0.01\n", "step = 42, time = 0.42, dt = 0.01\n", "step = 43, time = 0.43, dt = 0.01\n", "step = 44, time = 0.440001, dt = 0.01\n", "step = 45, time = 0.450001, dt = 0.01\n", "step = 46, time = 0.460001, dt = 0.01\n", "step = 47, time = 0.470001, dt = 0.01\n", "step = 48, time = 0.480001, dt = 0.01\n", "step = 49, time = 0.490001, dt = 0.01\n", "step = 50, time = 0.500001, dt = 0.01\n", "step = 51, time = 0.510001, dt = 0.01\n", "step = 52, time = 0.520001, dt = 0.01\n", "step = 53, time = 0.530001, dt = 0.0100001\n", "step = 54, time = 0.540001, dt = 0.0100001\n", "step = 55, time = 0.550001, dt = 0.0100001\n", "step = 56, time = 0.560001, dt = 0.0100001\n", "step = 57, time = 0.570001, dt = 0.0100001\n", "step = 58, time = 0.580001, dt = 0.0100001\n", "step = 59, time = 0.590001, dt = 0.0100001\n", "step = 60, time = 0.600001, dt = 0.0100001\n", "step = 61, time = 0.610001, dt = 0.0100001\n", "step = 62, time = 0.620001, dt = 0.0100001\n", "step = 63, time = 0.630001, dt = 0.0100001\n", "step = 64, time = 0.640002, dt = 0.0100001\n", "step = 65, time = 0.650002, dt = 0.0100001\n", "step = 66, time = 0.660002, dt = 0.0100001\n", "step = 67, time = 0.670002, dt = 0.0100001\n", "step = 68, time = 0.680002, dt = 0.0100001\n", "step = 69, time = 0.690002, dt = 0.0100001\n", "step = 70, time = 0.700002, dt = 0.0100001\n", "step = 71, time = 0.710002, dt = 0.0100001\n", "step = 72, time = 0.720002, dt = 0.0100001\n", "step = 73, time = 0.730002, dt = 0.0100001\n", "step = 74, time = 0.740002, dt = 0.0100001\n", "step = 75, time = 0.750003, dt = 0.0100001\n", "step = 76, time = 0.760003, dt = 0.0100001\n", "step = 77, time = 0.770003, dt = 0.0100001\n", "step = 78, time = 0.780003, dt = 0.0100001\n", "step = 79, time = 0.790003, dt = 0.0100001\n", "step = 80, time = 0.800003, dt = 0.0100001\n", "step = 81, time = 0.810003, dt = 0.0100001\n", "step = 82, time = 0.820003, dt = 0.0100001\n", "step = 83, time = 0.830003, dt = 0.0100001\n", "step = 84, time = 0.840004, dt = 0.0100001\n", "step = 85, time = 0.850004, dt = 0.0100001\n", "step = 86, time = 0.860004, dt = 0.0100001\n", "step = 87, time = 0.870004, dt = 0.0100001\n", "step = 88, time = 0.880004, dt = 0.0100001\n", "step = 89, time = 0.890004, dt = 0.0100001\n", "step = 90, time = 0.900004, dt = 0.0100001\n", "step = 91, time = 0.910004, dt = 0.0100001\n", "step = 92, time = 0.920005, dt = 0.0100001\n", "step = 93, time = 0.930005, dt = 0.0100002\n", "step = 94, time = 0.940005, dt = 0.0100002\n", "step = 95, time = 0.950005, dt = 0.0100002\n", "step = 96, time = 0.960005, dt = 0.0100002\n", "step = 97, time = 0.970005, dt = 0.0100002\n", "step = 98, time = 0.980006, dt = 0.0100002\n", "step = 99, time = 0.990006, dt = 0.0100002\n", "step = 100, time = 1.00001, dt = 0.0100002\n", "step = 101, time = 1.01001, dt = 0.0100002\n", "step = 102, time = 1.02001, dt = 0.0100002\n", "step = 103, time = 1.03001, dt = 0.0100002\n", "step = 104, time = 1.04001, dt = 0.0100002\n", "step = 105, time = 1.05001, dt = 0.0100002\n", "step = 106, time = 1.06001, dt = 0.0100002\n", "step = 107, time = 1.07001, dt = 0.0100002\n", "step = 108, time = 1.08001, dt = 0.0100002\n", "step = 109, time = 1.09001, dt = 0.0100002\n", "step = 110, time = 1.10001, dt = 0.0100002\n", "step = 111, time = 1.11001, dt = 0.0100002\n", "step = 112, time = 1.12001, dt = 0.0100002\n", "step = 113, time = 1.13001, dt = 0.0100002\n", "step = 114, time = 1.14001, dt = 0.0100002\n", "step = 115, time = 1.15001, dt = 0.0100002\n", "step = 116, time = 1.16001, dt = 0.0100002\n", "step = 117, time = 1.17001, dt = 0.0100002\n", "step = 118, time = 1.18001, dt = 0.0100002\n", "step = 119, time = 1.19001, dt = 0.0100002\n", "step = 120, time = 1.20001, dt = 0.0100002\n", "step = 121, time = 1.21001, dt = 0.0100002\n", "step = 122, time = 1.22001, dt = 0.0100002\n", "step = 123, time = 1.23001, dt = 0.0100002\n", "step = 124, time = 1.24001, dt = 0.0100003\n", "step = 125, time = 1.25001, dt = 0.0100003\n", "step = 126, time = 1.26001, dt = 0.0100003\n", "step = 127, time = 1.27001, dt = 0.0100003\n", "step = 128, time = 1.28001, dt = 0.0100003\n", "step = 129, time = 1.29001, dt = 0.0100003\n", "step = 130, time = 1.30001, dt = 0.0100003\n", "step = 131, time = 1.31001, dt = 0.0100003\n", "step = 132, time = 1.32001, dt = 0.0100003\n", "step = 133, time = 1.33001, dt = 0.0100003\n", "step = 134, time = 1.34001, dt = 0.0100003\n", "step = 135, time = 1.35001, dt = 0.0100003\n", "step = 136, time = 1.36001, dt = 0.0100003\n", "step = 137, time = 1.37001, dt = 0.0100003\n", "step = 138, time = 1.38001, dt = 0.0100003\n", "step = 139, time = 1.39002, dt = 0.0100003\n", "step = 140, time = 1.40002, dt = 0.0100003\n", "step = 141, time = 1.41002, dt = 0.0100003\n", "step = 142, time = 1.42002, dt = 0.0100003\n", "step = 143, time = 1.43002, dt = 0.0100003\n", "step = 144, time = 1.44002, dt = 0.0100003\n", "step = 145, time = 1.45002, dt = 0.0100003\n", "step = 146, time = 1.46002, dt = 0.0100003\n", "step = 147, time = 1.47002, dt = 0.0100003\n", "step = 148, time = 1.48002, dt = 0.0100003\n", "step = 149, time = 1.49002, dt = 0.0100003\n", "step = 150, time = 1.50002, dt = 0.0100003\n", "step = 151, time = 1.51002, dt = 0.0100004\n", "step = 152, time = 1.52002, dt = 0.0100004\n", "step = 153, time = 1.53002, dt = 0.0100004\n", "step = 154, time = 1.54002, dt = 0.0100004\n", "step = 155, time = 1.55002, dt = 0.0100004\n", "step = 156, time = 1.56002, dt = 0.0100004\n", "step = 157, time = 1.57002, dt = 0.0100004\n", "step = 158, time = 1.58002, dt = 0.0100004\n", "step = 159, time = 1.59002, dt = 0.0100004\n", "step = 160, time = 1.60002, dt = 0.0100004\n", "step = 161, time = 1.61002, dt = 0.0100004\n", "step = 162, time = 1.62002, dt = 0.0100004\n", "step = 163, time = 1.63002, dt = 0.0100004\n", "step = 164, time = 1.64002, dt = 0.0100004\n", "step = 165, time = 1.65002, dt = 0.0100004\n", "step = 166, time = 1.66002, dt = 0.0100004\n", "step = 167, time = 1.67003, dt = 0.0100004\n", "step = 168, time = 1.68003, dt = 0.0100004\n", "step = 169, time = 1.69003, dt = 0.0100004\n", "step = 170, time = 1.70003, dt = 0.0100004\n", "step = 171, time = 1.71003, dt = 0.0100004\n", "step = 172, time = 1.72003, dt = 0.0100004\n", "step = 173, time = 1.73003, dt = 0.0100004\n", "step = 174, time = 1.74003, dt = 0.0100004\n", "step = 175, time = 1.75003, dt = 0.0100004\n", "step = 176, time = 1.76003, dt = 0.0100004\n", "step = 177, time = 1.77003, dt = 0.0100004\n", "step = 178, time = 1.78003, dt = 0.0100005\n", "step = 179, time = 1.79003, dt = 0.0100005\n", "step = 180, time = 1.80003, dt = 0.0100005\n", "step = 181, time = 1.81003, dt = 0.0100005\n", "step = 182, time = 1.82003, dt = 0.0100005\n", "step = 183, time = 1.83003, dt = 0.0100005\n", "step = 184, time = 1.84003, dt = 0.0100005\n", "step = 185, time = 1.85003, dt = 0.0100005\n", "step = 186, time = 1.86003, dt = 0.0100005\n", "step = 187, time = 1.87003, dt = 0.0100005\n", "step = 188, time = 1.88003, dt = 0.0100005\n", "step = 189, time = 1.89004, dt = 0.0100005\n", "step = 190, time = 1.90004, dt = 0.0100005\n", "step = 191, time = 1.91004, dt = 0.0100005\n", "step = 192, time = 1.92004, dt = 0.0100005\n", "step = 193, time = 1.93004, dt = 0.0100005\n", "step = 194, time = 1.94004, dt = 0.0100005\n", "step = 195, time = 1.95004, dt = 0.0100005\n", "step = 196, time = 1.96004, dt = 0.0100005\n", "step = 197, time = 1.97004, dt = 0.0100005\n", "step = 198, time = 1.98004, dt = 0.0100005\n", "step = 199, time = 1.99004, dt = 0.0100005\n", "step = 200, time = 2.00004, dt = 0.0100005\n", "step = 201, time = 2.01004, dt = 0.0100005\n", "step = 202, time = 2.02004, dt = 0.0100005\n", "step = 203, time = 2.03004, dt = 0.0100005\n", "step = 204, time = 2.04004, dt = 0.0100005\n", "step = 205, time = 2.05004, dt = 0.0100005\n", "step = 206, time = 2.06004, dt = 0.0100006\n", "step = 207, time = 2.07004, dt = 0.0100006\n", "step = 208, time = 2.08004, dt = 0.0100006\n", "step = 209, time = 2.09005, dt = 0.0100006\n", "step = 210, time = 2.10005, dt = 0.0100006\n", "step = 211, time = 2.11005, dt = 0.0100006\n", "step = 212, time = 2.12005, dt = 0.0100006\n", "step = 213, time = 2.13005, dt = 0.0100006\n", "step = 214, time = 2.14005, dt = 0.0100006\n", "step = 215, time = 2.15005, dt = 0.0100006\n", "step = 216, time = 2.16005, dt = 0.0100006\n", "step = 217, time = 2.17005, dt = 0.0100006\n", "step = 218, time = 2.18005, dt = 0.0100006\n", "step = 219, time = 2.19005, dt = 0.0100006\n", "step = 220, time = 2.20005, dt = 0.0100006\n", "step = 221, time = 2.21005, dt = 0.0100006\n", "step = 222, time = 2.22005, dt = 0.0100006\n", "step = 223, time = 2.23005, dt = 0.0100006\n", "step = 224, time = 2.24005, dt = 0.0100006\n", "step = 225, time = 2.25005, dt = 0.0100006\n", "step = 226, time = 2.26006, dt = 0.0100006\n", "step = 227, time = 2.27006, dt = 0.0100006\n", "step = 228, time = 2.28006, dt = 0.0100006\n", "step = 229, time = 2.29006, dt = 0.0100006\n", "step = 230, time = 2.30006, dt = 0.0100006\n", "step = 231, time = 2.31006, dt = 0.0100006\n", "step = 232, time = 2.32006, dt = 0.0100006\n", "step = 233, time = 2.33006, dt = 0.0100006\n", "step = 234, time = 2.34006, dt = 0.0100006\n", "step = 235, time = 2.35006, dt = 0.0100006\n", "step = 236, time = 2.36006, dt = 0.0100006\n", "step = 237, time = 2.37006, dt = 0.0100006\n", "step = 238, time = 2.38006, dt = 0.0100006\n", "step = 239, time = 2.39006, dt = 0.0100006\n", "step = 240, time = 2.40006, dt = 0.0100007\n", "step = 241, time = 2.41006, dt = 0.0100007\n", "step = 242, time = 2.42007, dt = 0.0100007\n", "step = 243, time = 2.43007, dt = 0.0100007\n", "step = 244, time = 2.44007, dt = 0.0100007\n", "step = 245, time = 2.45007, dt = 0.0100007\n", "step = 246, time = 2.46007, dt = 0.0100007\n", "step = 247, time = 2.47007, dt = 0.0100007\n", "step = 248, time = 2.48007, dt = 0.0100007\n", "step = 249, time = 2.49007, dt = 0.0100007\n", "step = 250, time = 2.50007, dt = 0.0100007\n", "step = 251, time = 2.51007, dt = 0.0100007\n", "step = 252, time = 2.52007, dt = 0.0100007\n", "step = 253, time = 2.53007, dt = 0.0100007\n", "step = 254, time = 2.54007, dt = 0.0100007\n", "step = 255, time = 2.55007, dt = 0.0100007\n", "step = 256, time = 2.56008, dt = 0.0100007\n", "step = 257, time = 2.57008, dt = 0.0100007\n", "step = 258, time = 2.58008, dt = 0.0100007\n", "step = 259, time = 2.59008, dt = 0.0100007\n", "step = 260, time = 2.60008, dt = 0.0100007\n", "step = 261, time = 2.61008, dt = 0.0100007\n", "step = 262, time = 2.62008, dt = 0.0100007\n", "step = 263, time = 2.63008, dt = 0.0100007\n", "step = 264, time = 2.64008, dt = 0.0100007\n", "step = 265, time = 2.65008, dt = 0.0100007\n", "step = 266, time = 2.66008, dt = 0.0100007\n", "step = 267, time = 2.67008, dt = 0.0100007\n", "step = 268, time = 2.68008, dt = 0.0100007\n", "step = 269, time = 2.69008, dt = 0.0100007\n", "step = 270, time = 2.70008, dt = 0.0100007\n", "step = 271, time = 2.71009, dt = 0.0100007\n", "step = 272, time = 2.72009, dt = 0.0100007\n", "step = 273, time = 2.73009, dt = 0.0100007\n", "step = 274, time = 2.74009, dt = 0.0100007\n", "step = 275, time = 2.75009, dt = 0.0100007\n", "step = 276, time = 2.76009, dt = 0.0100007\n", "step = 277, time = 2.77009, dt = 0.0100007\n", "step = 278, time = 2.78009, dt = 0.0100007\n", "step = 279, time = 2.79009, dt = 0.0100007\n", "step = 280, time = 2.80009, dt = 0.0100007\n", "step = 281, time = 2.81009, dt = 0.0100007\n", "step = 282, time = 2.82009, dt = 0.0100007\n", "step = 283, time = 2.83009, dt = 0.0100007\n", "step = 284, time = 2.84009, dt = 0.0100007\n", "step = 285, time = 2.8501, dt = 0.0100007\n", "step = 286, time = 2.8601, dt = 0.0100007\n", "step = 287, time = 2.8701, dt = 0.0100007\n", "step = 288, time = 2.8801, dt = 0.0100007\n", "step = 289, time = 2.8901, dt = 0.0100007\n", "step = 290, time = 2.9001, dt = 0.0100007\n", "step = 291, time = 2.9101, dt = 0.0100007\n", "step = 292, time = 2.9201, dt = 0.0100007\n", "step = 293, time = 2.9301, dt = 0.0100007\n", "step = 294, time = 2.9401, dt = 0.0100007\n", "step = 295, time = 2.9501, dt = 0.0100007\n", "step = 296, time = 2.9601, dt = 0.0100007\n", "step = 297, time = 2.9701, dt = 0.0100007\n", "step = 298, time = 2.98011, dt = 0.0100007\n", "step = 299, time = 2.99011, dt = 0.0100007\n", "step = 300, time = 3.00011, dt = 0.0100007\n", "step = 301, time = 3.01011, dt = 0.0100007\n", "step = 302, time = 3.02011, dt = 0.0100007\n", "step = 303, time = 3.03011, dt = 0.0100007\n", "step = 304, time = 3.04011, dt = 0.0100007\n", "step = 305, time = 3.05011, dt = 0.0100007\n", "step = 306, time = 3.06011, dt = 0.0100007\n", "step = 307, time = 3.07011, dt = 0.0100007\n", "step = 308, time = 3.08011, dt = 0.0100007\n", "step = 309, time = 3.09011, dt = 0.0100007\n", "step = 310, time = 3.10011, dt = 0.0100007\n", "step = 311, time = 3.11012, dt = 0.0100007\n", "step = 312, time = 3.12012, dt = 0.0100007\n", "step = 313, time = 3.13012, dt = 0.0100007\n", "step = 314, time = 3.14012, dt = 0.0100007\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Provided you didn't get any errors, you should now have arrays for the position and velocity of each particle over time! To see this, we'll plot up some of these quantities for each particle to make sure the answers look sane. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, the x-position vs. time for each particle:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(particles.time, p1.x)\n", "plt.plot(particles.time, p2.x)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEACAYAAAC08h1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8FHX+x/FXSAgSeghVQJAiEBBCrxJAEFBAQFBEQEVE\nFPEsd3Lg7wDF8/ROz0NUQHoRUPQ4qoDICqjUhBJK6EevgVBCSbL7++MbFLlA2mZnNvN+Ph7z2M3u\nZObDbPjMdz/zne8XRERERERERERERERERERERERERETEz00CTgLbbvN+JBAPRKcsb/kmLBERyS7N\ngQjunPjn+ywaERG5o1xe2MZq4Fwa6wR4YT8iIuIF3kj8afEATYAtwGKgug/2KSIi2aw8ty/1FABC\nUp63B3b7IiAREUldkA/2cfGm50uAz4BQIO7mlSpWrOjZt2+fD8IREclR9gGVMvILvij1lOC3Gn+D\nlOdxt660b98+PB6P3y7Dhw+3PAYnxq74rV8Uv7ULUDGjSdkbLf5ZQAsgDDgMDAdyp7w3DngMGAgk\nAQnAE17Yp4iIZJI3En/PNN7/NGUREREb8EWpxxEiIyOtDiHT/Dl2UPxWU/z+x0796z0p9SoREUmn\ngIAAyGAuV4tfRMRhlPhFRBxGiV9ExGGU+EVEHEaJX0TEYZT4RUQcRolfRMRhlPhFRBxGiV9ExGGU\n+EVEHEaJX0TEYZT4RUQcRolfRMRhlPhFRBxGiV9ExGGU+EVEHEaJX0TEYZT4RUQcRolfRMRhlPhF\nRBxGiV9ExGGU+EVEHEaJX0TEYZT4RUQcRolfRMRhlPhFRBzGG4l/EnAS2HaHdUYDe4AtQIQX9iki\nIpnkjcQ/GWh3h/c7AJWAysDzwOde2KeIiGSSNxL/auDcHd7vBExNeb4OKAyU8MJ+RUQkE3xR478b\nOHzTz0eAMj7Yr4iIpCLIR/sJuOVnT2orde8OuXObJTgYChY0S6FCZilSBEqXNkuJEmY9EZGsuHT9\nEqcun+JMwpnfLXFX4khITCAhMYErSVdISEzgevJ1PB4Pbo+bLlW70K9OP6vDzxRfJP6jQNmbfi6T\n8loqRnD1KiQkwL33RlKqVCTx8bB/P8THQ1wcHD8Ox47B6dNQtCiUKgX33ANVqkDlyuaxShUoWRIC\nbj3diIjjeDwejl48SsypGPbG7eXg+YO/WxISEyiRvwRhIWG/LsVCihGaN5TQvKHkDcpLSO4Q8ubO\nS3BgMLkCchFAABVDK1ry73G5XLhcrixtw1upsTywAKiZynsdgEEpj42Aj1Meb+XxeFL9IpCq5GQ4\ndQqOHoX//hd274Y9e357TEiAGjUgIgLq1DGPNWpAnjwZ/reJiJ+4kniFqONRRB2PIuZUDDGnY9h+\najt3Bd1FePFw7it6H+ULl//dUiykGAF+3EpMiT1D/wBv/GtnAS2AMEy3zuHAjSLMuJTHMZieP5eB\nZ4CoVLaTocSflnPnYNs2iIqC6GjzuHcv3HcfNG0KzZpB8+ZQRlcbRPySx+NhT9we1h5Zy7oj61h7\ndC07T+8kvHg4dUvVpWbxmtQoXoPw4uGEhYRZHW62sSrxe4tXE39qrlyBrVthzRpYvdo8FihgTgAt\nWsBDD+lEIGJnh+IPsWL/Cn44+AMr9q8gMFcgTco2oeHdDWlUphERJSPImzuv1WH6lBJ/hncIu3aZ\nk8DKlbB8ublm0K6dWZo1U2lIxEpXk66y8sBKFuxewPL9yzl/9TytKrSidYXWtKrQiopFKvp1mcYb\nlPizKDkZNm6E774zy/bt0KoVdOsGHTtC4cKWhifiCKcvn2bRnkXMj53PigMrqFWiFh2rdOShSg9R\no3gNcgVopJmbKfF72dmzsGgRfPON+UbQtKk5CTz6KITl3JKhiM+dvnyauTvmMnv7bLac2EKbim3o\nWKUjHSp3yNH1eW9Q4s9GFy/+dhJYtgyaNIE+faBzZwgJsTo6Ef8TfzWeebvmMXv7bH45/AsdKnfg\niRpP8FDFh8gTpBpreinx+8jly/Cf/8C0abBuHXTpYk4CDzwAufQtVOS23B43K/avYGL0RJbsXULL\n8i3pWaMnj1R5hHzB+awOzy8p8Vvg+HH48kuYOhUuXIDnnoN+/cxFYhExDsUfYnL0ZCZvnkxo3lD6\nRfTjyZpPUiRvEatD83tK/BaLioJx4+Crr6B1a3jhBXNxWN8CxImS3cks3rOYTzd8yoZjG+hZoyf9\nIvoRUUojs3uTEr9NXLgAM2fC55+bewcGDjTfAgoVsjoykex3/up5JkVPYsz6MYSFhDGowSC6V+/u\nuP71vqLEbzMeD6xdC598AkuXQt++MHgwlC9vdWQi3rfj9A5GrxvNnO1z6FC5A4MbDKZhmYZWh5Xj\nZSbxqwiRjQICoHFjcw1g82YICoK6daFHD3NCEMkJ1hxaQ8dZHWk1tRWl8pdi50s7mdl1ppK+janF\n72MXL8LkyfDxx3D33fDWW9C2rUYSFf/i9rhZuHsh7//0PicuneCPTf5I31p9Vc6xgEo9fiQpyVwE\n/utf4a67zAmgUyddCBZ7S3YnMytmFu+teY88gXkY0mwI3ap1IzBXoNWhOZYSvx9yu809Ae++C9eu\nwdChphQUqP9HYiPJ7mTmbJ/D2z++TbF8xfjLA3/hwXsfdPw4OXagxO/HPB5zAfjtt82kM++8Y24M\n0/8rsZLb4+ar7V/x9o9vU/iuwoyMHKmEbzNK/DmAxwNLlpjST2AgjBqlawDie26Pm292fMPIH0eS\nPzg/IyNH0rZiWyV8G1Liz0HcbjMu0F/+AsWLm1JQs2ZWRyVOsGL/Cv70/Z8IIIC3W75N+0rtlfBt\nTIk/B0pKghkzYMQIqF4d/v53CA+3OirJibae3Mqb37/J7rO7ea/1e3Sv3l0J3w+oH38OFBQETz8N\nsbFmhrCWLc1QECdPWh2Z5BSH4g/x9LynaTO9DR0qdWDnSzvpEd5DST8HU+L3E3nywCuvmBnDQkJM\nq/+998yQECKZceHaBYZ8P4SIcRGUKViGPS/v4eWGLxMcGGx1aJLNlPj9TGgofPSRufN340aoWtXc\nGex2Wx2Z+Au3x82UzVOoOqYqJy+fZOsLWxnVahQF8xS0OjTxETt9l1ONPxNWr4bXXjMloTFjzJAQ\nIrez7sg6Bn83mAACGN1+NA3ubmB1SJJFurjrUG43TJlibv7q0sX0AAoNtToqsZPjF48zZMUQvt//\nPe+1fo+n7n9Kc9fmELq461C5csGzz8LOnablX60ajB9vJo8XZ0tMTuQfP/+Dmp/XpFT+Uux6aRd9\navVR0nc4tfhzoM2bYdAgMwTEp59CA32bd6RfDv/CgIUDKFWgFGPaj6Fy0cpWhyTZQKUe+ZXHA9On\nw5AhZkL4v/1NE8E4xbkr5xjy/RAW7lnIR20/UtfMHE6lHvlVQICZAH7HDnMSCA83dwLr3JpzeTwe\nZmydQfXPqhOUK4jtL27n8RqPK+nL/7DTX4Ra/NlozRp4/nmoXNn0/ilb1uqIxJtiz8Ty4uIXibsS\nx7hHxqm3joOoxS+31awZREeb7p4REWY6SF389X+JyYmMWjWKppOa8kjlR9jQf4OSvqRJLX4H2rUL\nBgyAq1dN759atayOSDIj+ng0z85/lpL5SzLukXGUK1TO6pDEAla1+NsBu4A9wJupvB8JxAPRKctb\nXtinZEHVqrBypSn9tGkDw4fD9etWRyXpdTXpKsNWDOOhGQ/xh4Z/YPGTi5X0JUOy2uIPBGKBB4Gj\nwAagJ7DzpnUigdeATmlsSy1+Cxw7Zk4AR46Ym8Bq17Y6IrmTtUfW8ux/nqVqWFU+7fAppQqUsjok\nsZgVLf4GwF7gIJAIzAY6pxZbFvcj2aR0aViwwAz70LatWv92lZCYwGtLX6PLnC6MjBzJNz2+UdKX\nTMtq4r8bOHzTz0dSXruZB2gCbAEWA9WzuE/xshtdPzdvhk2bzA1fmzdbHZXc8NOhn6g1thanLp9i\n28BtdA/XOPmSNUFZ/P301GaigLJAAtAemAdUSW3FESNG/Po8MjKSyMjILIYnGXGj9T99umn9DxwI\nw4ZBsEbptcS1pGuMcI1gypYpfP7w5zxa9VGrQxIbcLlcuFyuLG0jq82GRsAIzAVegD8DbuD9O/zO\nAaAuEHfL66rx28ixY6bnz5EjZgYwzfrlW1tPbqX3v3tToXAFxnccT/F8xa0OSWzKihr/RqAyUB4I\nBh4H5t+yTombgmqQ8vzWpC82U7o0zJ9vxvyJjISPP9aY/76Q7E7m/TXv03paa15r9Br/fvzfSvri\ndd4oFLYHPsb08JkIvAcMSHlvHPASMBBIwpR7XgPWprIdtfhtat8+6N3bzPw1ZQqUKWN1RDnTvrh9\n9J3Xl+DAYCZ3nsw9he+xOiTxAxqkTbJNUpIZ6O2TT2D0aHj8casjyjk8Hg9fRH3BsB+GMaz5MAY3\nHKxhkyXdlPgl223cCE89ZYZ++PRTKFzY6oj82+nLp3l2/rMcv3icaV2mUb2YOr1JxmisHsl29epB\nVJRJ+LVqmTuAJXOW7VtG7XG1qVm8Jr/0+0VJX3xGLX7JtCVL4LnnzDeAUaMgd26rI/IP15KuMeyH\nYczZPoepj06lVYVWVockfkwtfvGp9u3NjV4xMWb0z/37rY7I/mLPxNJ4YmP2ndvH5gGblfTFEkr8\nkiXFisHChdCzJzRsCLNmWR2RPXk8HiZETaDZ5GYMqDuAb3t8S9GQolaHJQ6lUo94TVSUOQE0aWJ6\n/+TPb3VE9hB3JY7nFzzPnrg9zOo2S7V88SqVesRSdeqYsX4CAszzqCirI7Lejwd/pPbY2pQtWJZ1\nz61T0hdbUItfssWsWTB4MAwdCn/4gzkZOEmyO5lRq0YxdtNYJnaaSIfKHawOSXIo9eMXW9m/35R+\nwsJg8mQo7pCRB05cOkGvb3vh8XiY2XWmhk+WbKVSj9jKvfeaSd5r1jTz/GZxQEG/sGL/CuqMq0Pz\ncs1Z3nu5kr7Yklr84hNLl0LfvvDyy/DnP0OuHNbkSHYnM/LHkUyMnsj0LtPVTVN8RqUesbUjR0zp\nJ18+M+Z/sWJWR+Qdxy4e48lvniQoVxAzus6gZP6SVockDqJSj9hamTJmiIeICNPrZ/VqqyPKumX7\nllF3fF1aV2jN0qeWKumLX1CLXyyxZAk884zp8fOnP/lf6SfJncTwlcOZumUqM7rOILJ8pNUhiUOp\n1CN+5fBheOIJM+Db1Kmm948/OHLhCE9+8yR3Bd3FjK4zNFGKWEqlHvErZcuanj7h4ab089NPVkeU\ntu/2fke98fVoV6kd3z31nZK++CW1+MUWFi6Efv3gjTfg9dftV/pJdifz9o9vMyF6Al92/ZIW5VtY\nHZIIoFKP+LlDh8zMXmFhpvQTGmp1RMaZhDP0+rYXV5OuMuexObqAK7aiUo/4tXLl4McfoUoVM8PX\npk1WRwTrj66n7vi61C5RmxV9VijpS46gFr/Y0ty58OKL8O67ZrIXX4/14/F4+Hzj54xwjWB8x/E8\nWvVR3wYgkk4q9UiOEhsL3bqZ6R4/+wxCQnyz38vXLzNg4QC2ndrG3O5zqVy0sm92LJIJKvVIjnLf\nfbBuHSQlQePGsHdv9u8z9kwsDSc0JDBXIL/0+0VJX3IkJX6xtRvDO7zwgpngZd687NvX3B1zaTa5\nGYMbDmZK5ymE5PbRVwwRH1OpR/zGunXQo4e56evddyEoyDvbTUxOZMj3Q/h217d83f1r6pWu550N\ni/iAavyS4505A716wfXrZrKXklnsZHPs4jEen/s4BYILMKPrDELz2qQPqUg6qcYvOV5YGCxeDA88\nYC76rlmT+W25DrqoN74eD1V8iIVPLlTSF8dQi1/81uLFZqC3N9+EV19Nf5dPj8fDBz99wD/X/pPp\nXabTpmKb7A1UJBup1COOc/AgPPYYlC8PkyZBwYJ3Xv/81fM8Pe9pTlw6wdfdv6ZsobK+CFMk21hV\n6mkH7AL2AG/eZp3RKe9vASK8sE8RwCT8NWtMCah+fYiJuf26W05sod74epQrVI5Vz6xS0hfHymri\nDwTGYJJ/daAnUO2WdToAlYDKwPPA51ncp8jv3HUXjB0LQ4dCy5Ywc+b/rjNl8xQenP4g77R8h9Ht\nRxMcGOz7QEVsIqsd4hoAe4GDKT/PBjoDO29apxMwNeX5OqAwUAI4mcV9i/xO375mdq9u3cwQz//8\nJ3gCrzJ4yWBW/XcVrr4uwouHWx2miOWy2uK/Gzh8089HUl5La50yWdyvSKruvx82boTjx6FB2wPU\nH9uU+GvxbOi/QUlfJEVWW/zpvRp764WHVH9vxIgRvz6PjIwkMjIyU0GJsxUqBP3+toies58l4D9D\n+fvrgymQx079GEQyz+Vy4XK5srSNrP5vaASMwNT4Af4MuIH3b1pnLODClIHAXAhuwf+WetSrR7Is\n2Z3MCNcIpmyZwuxus0k60JSePWHAAPi//7PfBC8iWWVFr56NmIu25YFg4HFg/i3rzAf6pDxvBJxH\n9X3JBqcvn6bdzHb8dPgnNvbfSNNyTWnRwozrv2IFPPwwnD1rdZQi1stq4k8CBgFLgR3AHMyF3QEp\nC8BiYD/mIvA44MUs7lPkf6w9spa64+tSv3R9lvVeRon8JX59r1Qpk/hr1DATvGzYYGGgIjZgp8Kn\nSj2SYR6PhzHrx/DOqneY2GkiHe/reMf1v/3WlH3eecc8+nqCFxFv05274iiXrl+i/4L+7Dqzi7nd\n51IxtGK6fm/3btPlMyLC9P/31QQvItlBg7SJY+w6s4sGXzQgJCiEn5/9Od1JH8ycvmvXgscDDRua\nE4GIkyjxi9/5avtXNJ/cnNcbv87EzhPJmztvhreRLx9MmwYvvQRNm5oSkIhTqNQjfuN68nX+tPxP\nzI+dz9wec6lTqo5XtrthA3TvbgZ7e+89yJ3bK5sV8QnV+CXHOnrhKD3m9iA0byjTHp1GkbxFvLr9\ns2fhqafg8mWYM8f0BBLxB6rxS470w4EfqPdFPR6u/DD/eeI/Xk/6AEWLwqJF8OCDpsvnjz96fRci\ntqEWv9iW2+Pmg58+4F/r/sX0LtN58N4HfbLfpUvNgG+vvw5vvKEun2JvKvVIjnHuyjn6zuvLmYQz\nfNX9K8oU9O24focOmbp/6dIwZYoZ/0fEjlTqkRxh84nN1PuiHhUKV8D1tMvnSR+gXDlYtcok/nr1\nYOtWn4cgkm3U4hfb8Hg8jN80nrdWvsUn7T/hiRpPWB0SYCZ2+cMf4MMPoU+ftNcX8SWVesRvXbx2\nkQELBxBzKoavu3/NfWH3WR3S78TEmLt9IyPhX/8ys36J2IFKPeKXtp7cSv0v6hOSO4S1z621XdIH\nM8Dbhg0QFwdNmsDevVZHJJJ5SvxiGY/Hw4SoCbSe1pphzYcxodMEQnLbd+CcggXhq6+gXz9o3Nj0\n9xfxRyr1iCUuXb/EwEUDiT4ezdfdv6ZasWpWh5QhmzbB449DmzZmbl+VfsQqKvWIX4g5FUP9L+oT\nlCuIdc+t87ukD+Ymr02bTOmnUSMN9Cb+RYlffGrK5im0nNqSN5u+yeTOk8kXnM/qkDKtUCGYPRte\neMEM9DZrltURiaSPSj3iE5evX+alxS+x/uh6vu7+NeHFw60Oyas2b4YePaBlS/j4Y8ib8QFDRTJF\npR6xpe2nttNgQgPcHjfr+6/PcUkfoHZtU/q5eNGUfmJjrY5I5PaU+CXbeDwexm0cR4spLXit0WtM\nfXQq+YPzWx1WtilQwNzsNWgQNGtmnovYkUo9ki3OXTlH/wX92Ru3l9mPzaZqWFWrQ/KprVtN6adp\nUxg92kz8IpIdVOoRW1hzaA21x9WmTMEyrH1ureOSPsD998PGjZCUZHoARUdbHZHIb9TiF69Jdifz\n7up3+WzDZ0zoNIFHqjxidUi2MGsWvPIKDBlixvzJpeaWeJHG6hHLHLlwhF7f9iIwIJAZXWdQukBp\nq0OylQMHoFcvcx1g6lQoWdLqiCSnUKlHLDFv1zzqjq9Lu4rtWN57uZJ+KipUMMM8N2oEERFmti8R\nq6jFL5mWkJjAH5f9kSV7l/Blty9pVKaR1SH5hdWrzfy+nTvDBx9ouAfJGrX4xWc2HttInXF1OH/t\nPFEDopT0M6B5c3PD14kT0KABbN9udUTiNEr8kiFJ7iRGrRrFw18+zMjIkczsOpPCdxW2Oiy/U6SI\nGd3z1VfNGP9jxoDbbXVU4hQq9Ui67YvbR+9/9yYkdwhTHp1iyZSIOdHu3WZmr4IFYdIkKKPDKhng\n61JPKLAc2A0sA27X7DsIbAWigfVZ2J9Y5Ma4+Y0mNuLx8MdZ1nuZkr4XVakCa9ZAixZQp46541dt\nIMlOWWnxfwCcSXl8EygCDEllvQNAXSAuje2pxW9Dpy6fov+C/hyKP8SMLjNy5Dg7dhIVBb17Q/Xq\n8PnnEBZmdURid75u8XcCpqY8nwo8eod17VRSknSaHzuf2mNrUz2sOuueW6ek7wN16pjB3sqVg1q1\n1O1TskdWEvI5TCv/xnbibvr5ZvuBeCAZGAd8cZvtqcVvE3FX4njlu1f45fAvTO48meb3NLc6JEdy\nueDpp6FtW/jwQ3Pzl8itMtPiD0rj/eVAavcYDrvlZ0/KkpqmwHGgWMr2dgGrU1txxIgRvz6PjIwk\nMjIyjfDE2+bHzmfgooE8Vu0xtrywxa8nSvF3kZFmsLdXXzWt/4kTzXj/4mwulwuXy5WlbWSlxb8L\niAROAKWAlUBao3ENBy4BH6bynlr8Frq5lT+p8yQeuOcBq0OSmyxYAAMHQseO8P77pgeQCPi+xj8f\n6JvyvC8wL5V1QoAbX1DzAW2BbVnYp2SD+bHzqfl5TULvCmXLC1uU9G2oY0eIiYHERKhRA5YssToi\n8WdZafGHAl8B5TBdNnsA54HSmDr+w8C9wLcp6wcBM4H3brM9tfh97EzCGV5d+qpa+X5m+XJ4/nnT\n/fOjjyA01OqIxEoanVPSxePxMHPbTN5Y9gY9a/RkVKtRquX7mUuXYOhQmDsXPv0UunSxOiKxihK/\npGlf3D4GLhrIqcun+KLjF9S/u77VIUkWrF4N/fqZi7//+heU1sCojqNB2uS2EpMT+eCnD2g4oSFt\n7m3Dhv4blPRzgObNYcsWc/dvrVpmzJ/kZKujErtTi98BNhzdQP8F/SmRvwRjHx5LhSIVrA5JssGO\nHabnT0ICjBtnbgaTnE+lHvmd81fPM3zlcL7a8RX/aPMPnqz55I0/EsmhPB6YMsVM8/jEE/DOO+r6\nmdOp1CMAuD1upm6eSrVPq3El6QoxA2PodX8vJX0HCAiAZ54xY/xfumTG/Jk7V4O+ye/ZKROoxe8F\n0cejGbRkEInJiYzpMIYGdzewOiSx0KpVpvxTpgx8/DFUq2Z1ROJtavE7WNyVOF5a9BLtZrbj6VpP\ns/a5tUr6wgMPmNm+2rUzz197DeLjrY5KrKbE7+eS3EmM2ziOap9Ww4OHnS/tpH/d/uQK0EcrRu7c\nZryf7dvh4kWoWhUmTFDvHydTqcePfbf3O95Y9gZhIWF89NBH1CmlbhyStk2bYPBguHoVRo+Gpk2t\njkiyQr16HCLmVAxvLHuD/ef28/c2f6fTfZ104VYyxOOBL7+EN9+Exo3hr3+FypWtjkoyQzX+HO7k\npZMMWDCAVlNb0aFyB2JejKFz1c5K+pJhAQHQq5eZ7zciwiT/QYPg1CmrIxNfUOL3AxeuXWCEawTh\nn4WTPzg/sYNiGdxwMMGBwVaHJn4uJMSM+bNzJwQGmu6f77wDly9bHZlkJyV+G0tITOCDnz6g0uhK\nHDh/gPX91/PhQx9SJG9qE52JZF6xYmasn3XrzEXgypXN3b/Xr1sdmWQHO9UIVONPcT35OhOiJvDu\n6ndpXKYxb7d8m+rFqlsdljjIhg0wbBjs2QNvvQV9+pjeQWI/urjr5xKTE5m5bSYjfxxJ1bCqjGo5\nirql61odljjYmjUwfDgcPGhOAL17Q1BaE7aKTynx+6lrSdeYvHky7//0PhUKV2Bk5EhNcC62smqV\nOQEcPgx/+Qs8+aROAHahxO9nLl+/zBdRX/CPn/9BrZK1GNZ8GE3KNrE6LJHbcrnMCeDIEXjjDXj6\nacib1+qonE2J30+cTTjL2I1j+WT9JzQr14yhzYfq5ivxK2vWmEnfN2wwN4O9+CIULmx1VM6kfvw2\nF3smloELB1Lpk0rsO7ePFX1WMLfHXCV98TvNmsGCBfD99xAbCxUrmm8Ahw5ZHZmkhxJ/NvN4PKw8\nsJKOszrSfHJziuUrxs6XdjKp8yTCi4dbHZ5IltSoAVOnQnQ0uN3mZrBu3UxJyCFf4P2SSj3ZJP5q\nPNO3TmfsxrEke5J5tdGr9L6/N3lzqyAqOdfFizB9Onzyien++fLL5g7hkBCrI8u5VOO3gU3HNjF2\n41jm7pxL24pteaHuC0SWj9SwCuIoHo8pA33yCfz8M/TsCc89Z+YFFu9S4rfImYQzzImZw5QtUziT\ncIbn6zzPMxHPUDJ/SatDE7HcwYNmOshJk6B4cejXz5wIdDHYO5T4feha0jUW7VnEtC3TcB108XCV\nh+lzfx8evPdBAnMFWh2eiO0kJ5tvARMnwrJl8Mgj5gTQpg0Ea9ipTFPiz2aJyYm4Drr4Zuc3zN0x\nl5olatLn/j50q96Ngnk0o7VIep05A7Nnm2XXLuja1ZwEHnjADBYn6afEnw2uJV1j+f7lfLPzGxbE\nLuDeIvfSrVo3nqjxBPcUvsfq8ET83n//C3PmwKxZcPKkOQl06gQtWkCePFZHZ39K/F5y7OIxlu5d\nynf7vmPZvmXUKF6DbtW60bVaV8oVKmd1eCI51q5dMG8ezJ8PO3aYMlCnTtChAxQtanV09qTEn0lX\nk67y8+Gff032h+MP06ZiG9pVbEf7yu11kVbEAqdOwaJF5iSwYgVUqwatW0OrVma6SA0VYfg68XcH\nRgBVgfpA1G3Wawd8DAQCE4D3b7OezxL/+avn+fnwz6z+72pWH1pN9IloahSvQbuK7WhXqR31765P\nUC6NQCViF1evwi+/wA8/mJPA1q3QoIE5CTRuDPXrQ0GHXmbzdeKvCriBccDrpJ74A4FY4EHgKLAB\n6AnsTGVSwUrtAAAGw0lEQVTdbEn8F69dZMvJLUQfjyb6RDSbjm9i/7n91C9dn+blmtP8nuY0KtOI\n/MH5vb5vEckeFy7A6tWwcqWZPCY6Gu65Bxo2hEaNoF498w3BCd8KrCr1rOT2ib8xMBzT6gcYkvL4\nt1TWzXTi93g8nL1ylj1n97D77G72xO0h9mwsW09u5ciFI4QXCyeiZAR1StWhTqk61C5Zm9yBmlVC\nJKdITIRt28xJYO1a2LQJ9u6FcuXMsBLh4eaxShUoX97cQ5BT7qm0Y+J/DHgI6J/y81NAQ+DlVNb9\nXeJ3e9xcun6J+KvxxF+LJ/5qPHFX4jh+6TjHLh773XLw/EHcHjdVilahctHKVAk1j/eXuJ+qYVVV\nthFxoOvXzQxi27dDTIxZ9u41N5QFBECFCuYkcM89UKKEmX4yLOy3JTTUDDWRN6+95x7ITOJP65+z\nHEjtyuZQYEE6tp+hJnzhvxUm0Z1IYnIiSe4k8gXno1CeQhS6qxCF8hSiSN4ilM5fmtIFSlO3VF06\nVulIqQKlKFeoHMVCimlYBBH5VXCwaemHh0OPHr+97vHA+fPmBHBjOXUKDhyA06fNPQZnzsDZs3Dl\nilkCA80JIE8ec9LIlQsGDjST0vijtBJ/myxu/yhQ9qafywJHbrfygIsDCMwVSK6AXLRq2YpWLVtl\ncfciIr8XEABFipglIiLt9T0e8+3hyhW4ds387PFYN/Ccy+XC5XJlaRveKvW8AWxK5b0gzMXd1sAx\nYD0+vrgrIpKT+Xoili7AYaARsAhYkvJ66ZSfAZKAQcBSYAcwh9STvoiI+IidiuJq8YuIZJCmXhQR\nkTQp8YuIOIwSv4iIwyjxi4g4jBK/iIjDKPGLiDiMEr+IiMMo8YuIOIwSv4iIwyjxi4g4jBK/iIjD\nKPGLiDiMEr+IiMMo8YuIOIwSv4iIwyjxi4g4jBK/iIjDKPGLiDiMEr+IiMMo8YuIOIwSv4iIwyjx\ni4g4jBK/iIjDKPGLiDiMEr+IiMMo8YuIOIwSv4iIwyjxi4g4TFYSf3dgO5AM1LnDegeBrUA0sD4L\n+xMRES/ISuLfBnQBVqWxngeIBCKABlnYn625XC6rQ8g0f44dFL/VFL//yUri3wXsTue6AVnYj1/w\n5z8ef44dFL/VFL//8UWN3wN8D2wE+vtgfyIicgdBaby/HCiZyutDgQXp3EdT4DhQLGV7u4DV6Q1Q\nRES8yxslmJXA60BUOtYdDlwCPkzlvb1ARS/EIyLiJPuAShn5hbRa/Ol1uxNICBAIXATyAW2BkbdZ\nN0OBi4iI73UBDgNXgBPAkpTXSwOLUp7fC2xOWWKAP/s4RhERERER8aV2mIu7e4A3b7PO6JT3t2D6\n/ttJWvFHAvGYm9Wigbd8FlnaJgEnMfdf3I6dj31a8Udi32MPUBZzPWw75tvv4NusZ9fPID3xR2LP\nz+AuYB2m8rADeO8269n12Kcn/kjseewJxFzALQ/kxvwjqt2yTgdgccrzhsBaXwWXDumJPxKY79Oo\n0q855o/5donTzsce0o4/EvseezC942qnPM8PxOJff//piT8S+34GISmPQZjj2uyW9+187CHt+CPJ\nwLH35Vg9DTCJ8yCQCMwGOt+yTidgasrzdUBhoISP4ktLeuIH+96stho4d4f37XzsIe34wb7HHsx1\nsM0pzy8BOzHXw25m588gPfGDfT+DhJTHYEwjLu6W9+187CHt+CEDx96Xif9uzMXgG46kvJbWOmWy\nOa70Sk/8HqAJ5qviYqC6b0LzCjsf+/Twp2NfHvPtZd0tr/vLZ1Ce1OO382eQC3PiOokpWe245X27\nH/u04s/QsfdWd8708KRzvVvPWun9veyWnjiiMLXQBKA9MA+okp1BeZldj316+Muxzw/MBV7BtJxv\nZffP4E7x2/kzcGNKVYWApZjSiOuWdex87NOKP0PH3pct/qOYwG4oizmr3mmdMimv2UF64r/Ib1/J\nlmCuBYRmf2heYedjnx7+cOxzA98AMzD/MW9l988grfj94TOIx3Q3r3fL63Y/9jfcLn7bHvsgzB1m\n5TF1qrQu7jbCXhdY0hN/CX5rNTTAXA+wk/Kk7+Ku3Y79DeW5ffx2P/YBwDTgn3dYx86fQXrit+tn\nEIap2QPkxYwo3PqWdex87NMTv12PPWC+gsRiLpLeuJlrQMpyw5iU97dw53H+rZBW/C9hurptBn7G\n/AHZxSzgGHAdU8t8Fv869mnFb+djD6YXhhsT340ud+3xn88gPfHb9TOoiSmFbMbMDfLHlNf95din\nJ367HnsREREREREREREREREREREREREREREREREREWf5f6nuvku02vqvAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Second, the x-velocity vs. time for each particle:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(particles.time, p1.vx)\n", "plt.plot(particles.time, p2.vx)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEACAYAAAC08h1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4lFXe//F3EoKEXkS6UoIFAQWRJiV0SKhSQpFqe1wR\nf7qrz7pYorirqGtBEJHeQuhFCE1IqCIgiBTpIEhVI7h0kpnfHyc8YjYhfc49M5/XdeUiZZj5cM/w\nzT3n/p5zQEREREREREREREREREREREREREREvNwE4Ayw8xa3GQEcAHYAtTwRSkREck9jTDFPq/CH\nA7HJn9cDNnkilIiI5K6KpF34Pwcib/p6L1AqtwOJiEjqAj3wGOWA4zd9/RNQ3gOPKyIiqfBE4QcI\nSPG120OPKyIiKeTxwGOcACrc9HX55O/9SZUqVdyHDh3yQBwREZ9yCAjNzF/wROFfBAwGYoD6wDlM\nF9CfHDp0CLfbe98IREVFERUVZTtGljgh+5XEK2w9uZUNxzaw/vh6Nh7fSOHbClOrdC1q3FGDGqVq\nUOOOGoQWDyUoMOhPfzcn81++fpmDCQfZ/+t+dp7dydaTW9l8YjNBgUE8XPZhHqnwCC0rt+TB0g/+\nV46scsLxzw7ltysgIKBKZv9OThT+GUBT4HbMWP4bQHDyz8ZgOnrCgYPARWBgDjym+IAfz/1I7IFY\nYg/GsuboGu4ucTeN7mxEv5r9GNN+DGULlfV4ppDgEPNLplQNulbrCoDb7ebY+WNsObmFtT+upe/8\nvpy5eIbmlZrTslJLIu6OoHxhXbYS75EThb9XBm4zOAceR3zArrO7mLFzBgv2LeDsxbO0DW1Lnxp9\nmNx5MsVDituOl6qAgADuKnoXdxW9i27VugFw4vcTrDqyihWHVvCP1f8gtHgoXe/ryqP3PUpo8Uy9\n6xbxOE8M9fiFsLAw2xGyLLezH0o4RMyuGGJ2x3Duyjki749kfMfxPFz24RwZLrFx7MsVLke/B/rR\n74F+XE+6TvzReOb9MI9GExpRqmAp+tbsy2M1H6N0wdLp3pc3v3ZA+b1Rym4bm9zePMYvf3Yl8Qrz\nfpjHmG/H8MPPP9C9Wnd6Vu/JI3c+QmCAp5rJPC/JlcT6Y+uZvGMy8/fOp9GdjRj44EDa392evEF5\nbccTHxQQEACZrOUq/JKj9v2yjy++/YIp30+hVulaPPXQU3S8p6NfFr0L1y4wd89cJu2YxJ6f9/Bk\n7Sf5y8N/sXLtQnyXCr9Y4Xa7WfPjGt7f+D7fnvyWgQ8O5InaT1CleKabDXzWvl/2MXLzSKbvnE6b\n0DY8X+956pevbzuW+AAVfvGoRFcic/bM4YONH3Dh2gX+2uCv9H2gL/ny5LMdzbHOXznPhO0T+HTz\np5QqWIpXG79KeNXwG/95RTJNhV88ItGVyNQdUxm2dhjlC5fnpYYvEXF3hE+P3ee0JFcSc3+Yy9tr\n3yZPYB5ebfIqne/trGMomabCL7kqyZVE9M5o3lr7FuULl+etsLdofFdj27G8msvtYvH+xQxbO4xL\n1y8R1TSKbtW66R2AZJgKv+QKt9vNnD1zeC3uNW7PfzvDmg2jWaVmtmP5FLfbzfJDyxm6eihBAUEM\nbzlcx1gyRIVfctymnzbx4vIXuZx4meEth9OqciudjeYil9vFrN2zGLp6KFWLV+Xdlu/yYOkHbccS\nB1Phlxxz5LcjvLLqFdYfW8/bzd+mb82+ObY2jaTvWtI1xn47lrfXvU14aDj/avEvShXUNhby37JS\n+HUlSf7k0vVLvLr6VeqMrUO1ktXYN3gfAx4coKLvYXmD8vJs3WfZ++xeiuYrSvXR1fl408dcT7pu\nO5r4AJ3xy/9Zsn8Jzy19jrrl6vLv1v+mXOFytiNJsh9+/oEhy4Zw6j+nGNFuBM0rNbcdSRxCQz2S\nJcfOH+P5Zc+z6+wuRoWPonWV1rYjSSrcbjcL9i7gheUv0LRiUz5s/SEl8pewHUss01CPZIrL7eKT\nTZ9Qe0xtapeuzc5ndqroO1hAQABd7uvCrr/soni+4tz/2f1E74z26n0sxA6d8fup/b/uZ9DCQQQG\nBDK+43iqlqhqO5Jk0uYTm3li0ROUK1yOzyM+566id9mOJBbojF/SleRK4oONH9BwfEMi748kfkC8\nir6XqluuLt8+9S1N7mxCnbF1GL9tvM7+JUN0xu9HDiYcpO/8voTkCWFcx3FULlbZdiTJIbvP7qbv\n/L6ULVSWcR3HZWgfAPENOuOXVLndbiZun0iD8Q3oXb03X/X7SkXfx9x/x/1semITtcvU5sHPH2TO\nnjm2I4mD6YzfxyVcTuDpxU+z75d9RHeNpvod1W1Hkly2+cRm+s3vR91ydRkVPopCtxWyHUlykc74\n5U/ijsTx4OcPUqFwBTY/uVlF30/ULVeXbU9vI29QXuqMrcP2U9ttRxKH0Rm/D0p0JfLa6teY8v0U\nJnScQJvQNrYjiSUzds5gyLIhvN7kdQbXHax1lnyQJnAJp/5zip5ze5IvTz6mdZlGyQIlbUcSyw4m\nHKTnnJ5UKFKB8R3HUzykuO1IkoM01OPn4o7E8dAXD9GiUgtie8eq6AsAocVD2TBoA5WKVqLWmFps\n+mmT7Uhimc74fYDL7WL4+uGM2DyCKZ2n0KpKK9uRxKEW7VvEE4ueYFizYTz10FMa+vEBGurxQwmX\nE+g3vx8JlxOY1X0W5QuXtx1JHG7/r/vpMrMLDco3YGT4SO2R7OU01ONn9vy8h3rj6hFaPJQ1A9ao\n6EuG3F3ibr554ht+v/o7jSc25tj5Y7YjiYep8HupL/d9SdikMF5t/Coft/2Y4KBg25HEixTMW5CZ\n3WbSo1oP6o2rR9yRONuRxIM01ONl3G4376x/h1FbRjG3x1zql69vO5J4uVWHV9FnXh9ea/Iaz9Z9\n1nYcySSN8fu4S9cvMWjhIA7/dpj5kfO1UYrkmMO/HaZ9dHuaV2rOx20/Jk9gHtuRJIM0xu/DTvx+\ngsYTGxMcFMyaAWtU9CVHVS5Wma8f/5qDCQeJiI7g/JXztiNJLlLh9wI7Tu+gwfgGdK/WnSmdpxAS\nHGI7kvigIvmKsLj3Yu4pcQ8NxjfgUMIh25Ekl2iox+GWHlhK/wX9GRk+kh7397AdR/zEZ1s+4601\nbzGr+yya3NXEdhy5BY3x+5gxW8fwRvwbzIucR8MKDW3HET+z8tBK+szrw6ftPiWyeqTtOJIGFX4f\n4XK7eOWrV5i/dz6xfWIJLR5qO5L4qe/PfE9EdAQv1H+BFxu8aDuOpEKF3wdcTbxK3/l9OXXhFAsi\nF1AifwnbkcTPHTt/jHbT29G6cmv+3ebfBAbo0qCTqKvHy/1+9XfCo8NxuV2s7LtSRV8c4c4id7J+\n4Hq2nd5Gr7m9uJJ4xXYkySYVfoc4e/EszSY3o2rxqszsNlPrp4ijFAspxvLHlgPQZlobfrv8m+VE\nkh0q/A5w5LcjNJrQiPZV2zM6YjRBgUG2I4n8l3x58jGj6wxql65N00lNOX3htO1IkkUq/JbtPLOT\nxhMbM6TeEN5s9qaWyRVHCwwI5MM2HxJ5fySNJjTi6LmjtiNJFmhetkXrj62n66yufNL2E3pW72k7\njkiGBAQEMLTJUIrmK0rjiY1Z/thyqpWsZjuWZIIKvyVL9i9h4MKBTHt0Gq2rtLYdRyTTnq37LEXy\nFaHFlBZ82etL6pStYzuSZJCTxhX8pp1z9u7ZDF46mEU9F1GvfD3bcUSy5cauXrO6zyKsYpjtOH5H\nffxeYNr303hp5Uss67OMB0o/YDuOSI6IOxJH5JxIxnccT4d7OtiO41dU+B1u7LdjeXPNm6zou0Jj\nouJztpzYQocZHfik7Sda4sGDslL4NcbvISO+GcGHX39I/IB4LcEgPunhcg+zsu9K2kxrQ6IrkT41\n+9iOJGlQ4feA4euHM3bbWNYMWMNdRe+yHUck19QoVYOv+n1Fq6mtSHQl0v/B/rYjSSpU+HOR2+0m\nKj6KWXtmafMU8RvVSlZjVb9VtJzSkkRXIo/Xftx2JEkhJyZwtQX2AgeA/03l52HAeWB78serOfCY\njud2u3l19avM3zuf+P7xKvriV+69/V7i+sfx5po3+Xzr57bjSArZPeMPAkYCLYETwBZgEfBDitut\nATpm87G8htvt5vW41/ly/5es7r+a2/PfbjuSiMdVLVGV+AHxNJ/cnOtJ13mu3nO2I0my7Bb+usBB\n4Gjy1zFAJ/678DupeyjXvbnmTebvnU9c/zgVffFrlYtV/qP4u65rTX+HyO5QTzng+E1f/5T8vZu5\ngYbADiAW8Ok+xrfWvMXsPbNZ3X81JQuUtB1HxLqKRSuyZsAaRm0ZxYhvRtiOI2T/jD8jjffbgArA\nJaAdsAC4O7UbRkVF/d/nYWFhhIWFZTOeZ/1z7T+J2RVDXP847ihwh+04Io5RoUgFVvdbTdNJTckb\nlJf/qfM/tiN5rfj4eOLj47N1H9kdgqkPRGEu8AK8AriA4bf4O0eAh4CEFN/36glc76x7h8k7JhM/\nIJ7SBUvbjiPiSId/O0zYpDCiwqIYVGuQ7Tg+wcYErq1AVaAicBKIBHqluE0p4Czm3UHd5IApi75X\nG75+OJN2TCK+v4q+yK1ULlaZVf1W0WxyM4IDg+n7QF/bkfxSdgt/IjAYWI7p8BmPubD7dPLPxwDd\ngGeSb3sJ8Kn1hz/Y+AHjt48nfkA8ZQqVsR1HxPGqlqjKyr4raTGlBXmD8mp5Bwuc1G3jdUM9ozaP\n4sNNH7J2wFr16Ytk0s4zO2k1tRWfRXzGo/c9ajuO19JaPR40+bvJDN8wnLUDVfRFsqJGqRos7bOU\nttPbEhwYrFU9PUhbL2bB7N2zeWXVK6zou4KKRSvajiPitWqVqcXiXot5fNHjLDu4zHYcv6GhnkyK\nPRDLwIUDWfHYCq2nL5JDvj7+NR1jOjKvxzwa39XYdhyvkpWhHp3xZ0L80XgGLBjAop6LVPRFclCD\nCg2IfjSarrO6su3UNttxfJ4KfwZt+mkTPWb3YFb3WdouUSQXtKrSijHtxxARHcHeX/bajuPTdHE3\nA747/R2dYjoxqfMk7Skqkou63NeF36/+TuuprVk7cK2uoeUSFf507P1lL+HTwxkVPorwquG244j4\nvP4P9uf81fO0mtqKdQPXaVJkLtBQzy0cP3+cNtPa8K8W/6JbtW6244j4jSH1htCvZj9aT23Nb5d/\nsx3H56irJw2/XvqVRhMb8UStJ/hrw7/ajiPid9xuN39b8Tc2/rSRlX1XUjBvQduRHCkrXT0q/Km4\ncO0CLaa0oFnFZrzb8l3bcUT8ltvt5skvn+TIuSMs6b2EfHny2Y7kOCr8OeBa0jU6zOhA+ULlGddx\n3I2DKiKWJLmS6DnXLPEV0zWGoMAgy4mcRX382eRyu+g3vx8heUIY02GMir6IAwQFBjGtyzQSLicw\nZOkQnHCC6O1U+JO53W6GLB3CqQunmNF1BnkC1fAk4hS35bmN+ZHz2fjTRoatHWY7jtdT4U82bO0w\n1h9bz6KeiwgJDrEdR0RSKHxbYZb2WcrkHZMZs3WM7TheTae1wOgto5myYwrrB62nSL4ituOISBpK\nFyzN8seW02RiE0oWKKnlnLPI7wv/rN2zeHvd25ooIuIlQouHsrj3YtpOa0uJkBI0rdjUdiSv49dD\nPasOr2Jw7GBie8dSuVhl23FEJINql6nNjK4z6D67OztO77Adx+v4beHfcXoHveb2Ylb3WVppU8QL\ntajcgpHhI4mIjuDIb0dsx/EqfjnUc+z8MSKiI/i03adadE3Ei/W4vwdnLpyhzbQ2bBi0gZIFStqO\n5BX87ow/4XICbae15cUGL2qTZxEf8Fy95+hxfw/Co8O5eO2i7ThewUkzlHJ95u6VxCu0ntqah8o8\nxEdtP8rVxxIRz3G73QxaNIifL/7Mgp4L/GoejpZsuAWX20XknEgCAwKZ0XUGgQF+92ZHxKddT7pO\n+xntqVikIp+3/9xvZt5ryYY0uN1uXlz+ImcvnmVy58kq+iI+KDgomNndZ7P55GbeWf+O7TiO5hcV\n8MOvP+Srw1+xIHKBVvcT8WGFbyvMkt5L+OLbL5i6Y6rtOI7l8wNhMbti+Pibj9k4aCPFQorZjiMi\nuaxsobLE9oml2eRmlC1UlhaVW9iO5Dg+fcYfdySOIUuHsKT3EioUqWA7joh4SLWS1ZjVbRa95vbi\n+zPf247jOD5b+Hee2UnknEhiusVQs1RN23FExMOaVmzKiHYjiIiO4Pj547bjOIpPFv7j548TER3B\nJ20/oXml5rbjiIglPav35Pl6zxMeHc65K+dsx3EMJ/U75Ug75/kr52k0sRH9avbjpUdeyoFYIuLN\nbuy1sfvn3Sx7bBl5g/LajpSj/L6P/3rSdSKiIwgtHsqo8FF+08crIreW5Eqi2+xuFAguwNQuU32q\nNvh1H7/b7eYvS/5CcFAwI9qN8KknVkSyJygwiOhHozn822GGrh5qO451PlP4h28YztZTW4npGuNX\n07VFJGNCgkNY1GsRc/bM8fsdvHyiQs7cNZNRW0ax6fFNFLqtkO04IuJQt+e/ndg+sTSe2Ji7it5F\n29C2tiNZ4fVn/BuObWDw0sEs7rWYcoXL2Y4jIg4XWjyUOd3n0G9+P7/t8ffqwn8w4SBdZ3VlSucp\n2kxFRDLskTsf4dN2n9I+uj0n/3PSdhyP89rC/+ulXwmfHk5UWBTtqrazHUdEvExk9UieqfMM7aPb\nc+HaBdtxPMpJrS8Zbue8mniVVlNbUa9cPd5v/X4uxxIRX+V2u3nyyyc5feE0C3suJCgwyHakTPOL\nPn63281j8x/jauJVZnWfpSWWRSRbriddJzw6nHtL3OuVreB+0cf/etzrHEo4xNQuU1X0RSTbgoOC\nmdN9DnFH4/jkm09sx/EIr2rnnLh9ItN3TmfTE5sICQ6xHUdEfESRfEVY0nsJDSc0pGLRinS+t7Pt\nSLnKSe9pbjnUs+rwKnrP6018/3juK3mfB2OJiL/YenIr7aa3Y2mfpdQpW8d2nAzx2aGePT/vodfc\nXszsNlNFX0RyTZ2ydRjXYRydYjrx47kfbcfJNY4v/KcvnCYiOoIPWn9AWMUw23FExMd1urcTLzV8\niYjoCM5fOW87Tq5w9FDPpeuXCJsURnhV068vIuIJN5Zy3vvrXmJ7xxIcFGw7Upp8qp0zyZVE99nd\nKZi3IJM7T/a6FisR8W5JriQ6z+xMqQKlGNthrGNrkE+N8b+88mUSLic4+oCLiO8KCgxiRtcZbDu1\njXfXv2s7To5yZDvnZ1s+Y8mBJXz9+Nfcluc223FExE8VzFuQxb0XU39cfSoVq0TP6j1tR8oROXHG\n3xbYCxwA/jeN24xI/vkOoNat7mzJ/iUMWzuM2D6xFAsplgPxRESyrmyhsizuvZghS4ew4dgG23Fy\nRHYLfxAwElP8qwG9gJT9luFAKFAVeAoYndadbT+1nQELBzA/cj6Vi1XOZjQRkZxRs1RNpnaZStdZ\nXTmYcNB2nGzLbuGvCxwEjgLXgRigU4rbdAQmJ3/+DVAUKJXanXWM6cjoiNHUL18/m7FERHJWm9A2\nvBn2JuHTw/n10q+242RLdgt/OeD4TV//lPy99G5TPrU7G1J3CN2qdctmJBGR3PF0nafpdE8nGo18\nlFFjrtqOk2XZvbibsXWU/7vVKNW/d3jaBaJWRgEQFhZGWFhYloOJiOSGDiHDGbGrO7si3gGiPP74\n8fHxxMfHZ+s+stsnWR/zL7+xceUrgAsYftNtPgfiMcNAYC4ENwXOpLgv9513utm0CcqUyWYqEZFc\ncPAgNGoEYyZcokVLFwXzFrQdyUof/1bMRduKQF4gEliU4jaLgH7Jn9cHzvHfRR+AJ56ADh3g4sVs\nphIRyWG//goRERAVBZ3C8zui6GdVTsyMagd8jOnwGQ+8Azyd/LMxyX/e6Py5CAwEtqVyP26Xy82g\nQZCQAPPmQZD3bYYjIj7o6lVo1Qrq1YP3Hbbpn08s2XDtGrRrBzVqwMcf244kIv7O7YbHHjPFf9Ys\nCHTYegc+sWRD3rwwdy6sWAGffmo7jYj4u6goOHQIpk51XtHPKkcu2VC0KMTGQsOGULGiGfcXEfG0\nyZNNwd+0CUJ8aNM/xw313GzzZnMxZdkyeOghS6lExC/FxUHPnhAfD/c5eP8nnxjquVnduvDFF9Cp\nExw7ZjuNiPiLH34wRT8mxtlFP6scOdRzsy5d4MgRc+a/fj0UKWI7kYj4srNnTb157z1o1sx2mtzh\n6KGeP34AgwfDgQOwZAkEO3czHBHxYpcvm2LfujW89ZbtNBnjE+2caUlMNEM+Zcua4R/tzSIiOcnl\ngh49IF8+c0HXW2qMz43x3yxPHpg5E7ZuheHD07+9iEhm/P3vZphn/HjvKfpZ5fgx/psVLAiLF0OD\nBlCpEkRG2k4kIr5gzBhYuBA2boTb/GDTPyf9XrvlUM/Nduww06fnz4dHHsnlVCLi05Ytg4EDYd06\nCA21nSbzfHqo52YPPABTpkC3bma1PBGRrNixA/r2hTlzvLPoZ5VXFn6Atm3NVOrwcLNqnohIZpw8\naVYFGDnS/0YOvHKo52Yvv2ymU69c6R9jcyKSfRcuQJMm0L07vPKK7TTZ49PtnGlxucxF3rx5Ydo0\n378aLyLZk5RkWsNLl4axY72/ZvjNGP/NAgPNeP/hw/D667bTiIiTud3w/PNmieXRo72/6GeVV7Vz\npiUkxLRiNWgAlSubK/QiIil98AGsXWs6ePx5BQCfKPwAd9xhlnNo2hTuvBNatLCdSEScJCbG7PGx\ncaPW/HLSG50sjfGntGaNuWATFwf3358DqUTE692oC6tWmd39fIlfjvGn1LQpfPSRafM8ccJ2GhGx\nbfduswZPTIzvFf2s8pmhnpv16QM//WT27l23Tm/rRPzVyZPmJPDDD6F5c9tpnMPnhnr+uDN47jmz\nocLSpabdU0T8x++/m179yEjv79W/Fb/s47+VpCQzrhcS4lsbJYvIrV2/bjZTqVIFPvvMt9s2VfhT\ncfkytGxppmS/916O372IOIzbbVq6f/3VLOSYxycHtP+QlcLv44fEnO0vWmQKf4UKZvhHRHxXVBTs\n2WM6+3y96GeVXxyWEiXM0quPPGJ28Ora1XYiEckN48bB9OmmV79AAdtpnMvnh3putn07tGkD8+ZB\no0a5+lAi4mFLl8KgQWZmbtWqttN4jvr401GrllnIrWtX0+0jIr5h61bo39+c1PlT0c8qvyr8AK1b\nm4u87dqZHl8R8W7795t19ceONet1Sfr8Yow/pf79zQSv8HDztrBwYduJRCQrTp0ymzING2aWWpaM\n8asx/j8/GPzlL3DggFncTZu4iHiX8+f/mKD1j3/YTmOP+vgz6cYEr+BgiI6GoCCPPryIZNGVK+ZM\nv2ZN+OQT356glR4V/iy4csWM91erZvbe9OcXkIg3SEoyi67lyQMzZmhGvrp6siBfPrOJy9dfw5tv\n2k4jIrfidsOzz5phnilTVPSzyi8v7qZUuLDpAW7UCEqWNC8sEXGeN9+ELVvMrFxdl8s6Ff5kpUrB\nihXQuLGZ6duzp+1EInKz0aPNPJwNG9SJl10q/DepVAliY6FVKyhe3PT8i4h9c+eals1168xJmmSP\nky5lWrm4m5r16+HRR+HLL6FePdtpRPzbypVmc6Xly83se/kzXdzNIY0awYQJZkKIlnYQsefrr6F3\nb3PGr6Kfc1T409C+vVnaoW1bOH7cdhoR/7NjB3TubDZRatzYdhrfojH+W+jXz2zm0LKlWdpBY4si\nnnHggJlfM3KkOfmSnKXCn44XXjB7d7ZqBfHx5qKviOSe48fN/7dhw8zMesl5uribAW43vPSS6Sj4\n6isoVMh2IhHfdPasWX/nqafgxRdtp/EOWrIhF7nd8MwzsHevafnMn992IhHfcu4cNGtmllh+6y3b\nabyHCn8uc7nMuH9CAixYAHnz2k4k4hsuXTLzZmrX1qJrmaXC7wGJiWbcMSgIYmK0mbNIdl25Ah07\nQpkyMHGi1t/JLBV+D7l61bxQS5WCSZP0QhXJqqtXzWTJwoXNcgxaGj3zVPg96NIl02ZWvTqMGqW3\npiKZde2aefecJ4959xwcbDuRd/J04S8OzATuAo4CPYBzqdzuKPA7kARcB+qmcX9eVfjBtHm2bAkN\nG8JHH6n4i2RUYqJZCPHaNZgzR9fLssPTSzb8HVgJ3A2sSv46NW4gDKhF2kXfKxUubFb0XL8e/vY3\n0/kjIreWlGSaJC5ehNmzVfRtyE7h7whMTv58MtD5Frf12XPhokXNIlLx8fDyyyr+IrficsGgQaZf\nf948ralvS3YKfyngTPLnZ5K/To0b+ArYCjyZjcdzrGLFTPH/6it45RUVf5HUuFzw9NPw44+waBGE\nhNhO5L/Sa0ZcCZRO5ftDU3ztTv5IzSPAKaBk8v3tBdaldsOoqKj/+zwsLIywsLB04jlH8eKm8Ldo\nYbp8/vlPjfmL3OB2w3PPwZ49ZnllTYDMuvj4eOLj47N1H9kpTXsxY/engTJAHHBvOn/nDeAC8O9U\nfuZ1F3dT88sv0Ly5WdL5rbdU/EVcLlP0t24118SKFLGdyLd4+uLuIqB/8uf9gQWp3CY/cGNlmwJA\na2BnNh7T8W6/HVatMjN7tXm7+DuXC/7nf2D7dhV9J8luO+cs4E7+3M5ZFhgLRACVgXnJt88DTAfe\nSeP+fOKM/4azZ826I927wxtv6Mxf/E9SEjz5JBw8CEuWaHHD3KIJXA5z5ozp82/fHv71LxV/8R9J\nSTBwoFliefFiKFDAdiLfpcLvQL/8Am3amB2ENMlL/EFiounT//lnWLhQF3Jzmwq/Q507Z3YTqlkT\nRo/W2j7iu65fNxuj/+c/pk9fLZu5T5utO1TRoubC1r59MGCAOSMS8TVXr0JkpFnHav58FX0nU+H3\nkEKFzAYuZ85A797mzEjEV1y4YDZQCQyEuXMhXz7bieRWVPg9KH9+M2Px6lXo2tWsQy7i7RISzB65\nFSqYVTa1DIPzqfB72G23mdUIQ0IgIsKMhYp4q1OnoGlTs0LtuHHamMhbqPBbEBwM0dFQtarp9T97\n1nYikczO9NWWAAAK5klEQVQ7csR0q0VGwgcfqGPNm6jwWxIUZDp8IiKgUSM4etR2IpGM27MHmjSB\n//f/4NVXVfS9jd6YWRQQYJZ1KFnSnDnFxkKNGrZTidzali3mQu7770PfvrbTSFao8DvA4MFmjZ+W\nLU3v8yOP2E4kkrrYWOjfH8aPN/tOi3fSUI9D9OwJU6dC585miruI04wfbzZRWbRIRd/bOWlkzmdn\n7mbG5s1/LOn8pE9uWyPexu02r8fJk2HZMrj7btuJ5GZassFHHDgA4eFmZc+339YSD2JPYiI884xZ\nVnnJEiiV1j57Yo0Kvw/5+Wcz7FOhAkyapJmQ4nkXLphWTZfLbIpesKDtRJIardXjQ0qWNBu6uN3m\nou8vv9hOJP7k+HHTZlymjBnTV9H3LSr8DpYvH8yYYf4DNmxohoBEctvmzVC/Pjz2GIwdayYcim9R\nO6fDBQbCu+9ClSqm1z862uzpK5IbZs407cVq1/RtGuP3IqtXQ69e8Npr8Oyzmi0pOedG586ECWZo\n54EHbCeSjNLFXT9w+LA5E2vQAEaNgrx5bScSb3fpEjz+uFl7Z8ECKF3adiLJDF3c9QOVK8PXX5uL\nvc2bm/X9RbLq8GFz/ShPHoiLU9H3Fyr8XqhQIbPZRYsWULcubNtmO5F4o2XLzDvHxx+HKVO0Y5Y/\n0VCPl5szx0yweecd8x9Y4/6SHpfLvF4++8xsnNK4se1Ekh0a4/dTe/dCt25Qp475z5w/v+1E4lTn\nz5tF1s6eNScNZcvaTiTZpTF+P3XvvfDNN5CUZPqv9++3nUicaPt2ePhhMykrPl5F35+p8PuIAgXM\nOO3gwWZZ59mzbScSp3C74dNPoXVrs//D6NHqBvN3GurxQd9+axZ4a9vWbImnoR//lZBgrv0cP27G\n80NDbSeSnKahHgHgoYdMp8/582bc/7vvbCcSGzZsgFq1oGJF87mKvtygM34fN3262Rf173+HF17Q\nEs/+IDHRdO2MGmXW2unQwXYiyU3q6pFUHTli9kbNl89splGunO1Eklv27YN+/aBIEbP8QvnythNJ\nbtNQj6SqUiXTxdG0KdSubVb81O9Y3+JywYgR5sJ+//6wfLmKvqRNZ/x+ZssWGDjQjPeOHm1a+8S7\nHT1qLuBeumQ6u6pWtZ1IPEln/JKuhx82XT81apgVGCdP1tm/t0pKgo8+MhfwW7WCdetU9CVjdMbv\nx7Zvh0GDzMJco0aZBeDEO+zYAU8+aeZvjBmjDdD9mc74JVNq1TK7LTVtahZ7e/ttuHrVdiq5lUuX\n4B//MGf4Tz9t9mhQ0ZfMUuH3c8HBptXz229h61aoWRO++sp2KknJ7Tazse+7zyyl/P33WpRPss5J\nLxsN9TjAl1/Cc8+ZdwDDh5uOILFr1y4YMsTswTBiBISF2U4kTqKhHsm2Dh1gzx6oXt1cNHz5ZTh3\nznYq//Tzz6bgN2sGjz5qZmOr6EtOUOGX/5I/P7z+ujnTTEiAe+6BkSPh+nXbyfzDxYvmest995nO\nnT17zOJ7efLYTia+QoVf0lSmDIwbBytWwMKFphBNmWKWBJCcd/26mVtRtSrs3g2bNpluq5IlbScT\nX6Mxfsmw+HjzTuDsWXjjDejRA4KCbKfyfteumfkU775rrqkMH24W2hPJCK3VI7nO7YZVq+C11+D3\n301HUGSk1nfPisuXYfx4eO89qFYNhg7VNoiSeSr84jFutxkCeu89s+PX88+bCUVFithO5ny//GJW\nzfz0U9M9NXSomVEtkhXq6hGPCQiANm3M2f+CBabjpHJl+Nvf4NAh2+mc6UbvfdWqcPAgLFtmjp2K\nvniaCr9k20MPQXS0mQQGZt/fVq3MZt7XrtnNZtvly+bYhIVBeDhUqQIHDpghnpo1bacTf6WhHslx\nV67AvHnwxRewd69ZJrh3b1Po/GGmqdsN33wDEyea2bb16pkVUbt0MTOlRXKSxvjFcfbuhUmTzH6v\nISHQqxf07Ol768u43WaLy3nzTLF3u2HAALMpija+kdzk6cLfHYgC7gUeBralcbu2wMdAEDAOGJ7G\n7VT4fZjbbfrSZ8yAWbPgjjsgIsIMfzRo4J2Tk65dM/+mhQtNwQ8Kgq5dzSzbunX9492N2Ofpi7s7\ngS7A2lvcJggYiSn+1YBewH3ZeEzHio+Ptx0hyzyRPSDAFPgRI+DECfj8c1Mon3/e/BKIjDTLC+/e\nbXaTygxPHXu3G3buNGvgR0TA7bebfYwLFTLF/8AB04Nfr17mir43v3ZA+b1Rdgr/XmB/OrepCxwE\njgLXgRigUzYe07G8+cXj6exBQdCwoVmWYNs2szREmzawcSN06mQKavv2ZsPwZcvML4pbvRnMjfxu\nN5w8aQr60KHQujWUKGHG6fftM2P2R46YC9pRUdm7fuHNrx1Qfm+U22+wywHHb/r6J6BeLj+meJmy\nZc2GMIMGma9PnYING8wvgvffN2fZiYlm17D774eKFeHOO//4yOw7hBsuXoQzZ+D0afPLZf9+87Fv\nn/kzMNC0WtataxZLe/hhKFUqx/7ZItakV/hXAqVT+f4/gC8zcP8atJdMK1MGunUzHzecPWt+AezZ\nA8eOmTPtH380n586ZYZfihT54yMkxBTuwEBzJn7tmtnE5NIluHDBrHyZmGh2HytVyjzm3XdDkyZm\nIto995h3HhqnF1+UEy/rOOCvpH5xtz7mAnDb5K9fAVykfoH3IFAlB/KIiPiTQ0Copx80DkhrSak8\nmFAVgbzAd/joxV0REX/QBTN+fxk4DSxN/n5ZYMlNt2sH7MOc0b/iyYAiIiIiIuJhbTFtoAeA/03j\nNiOSf74DqOWhXBmVXv4w4DywPfnjVY8lS98E4Axm/kVanHzs08sfhnOPPUAFzLDobmAXMCSN2zn1\nOchI/jCc+RzkA77BDDXvAd5J43ZOPfYZyR+GM489QZjhnopAMKmP94cDscmf1wM2eSpcBmQkfxiw\nyKOpMq4x5sWcVuF08rGH9POH4dxjD6Y77sHkzwtihj+96fWfkfxhOPc5yJ/8Zx7McW2U4udOPvaQ\nfv4wMnHsPbk6Z0Ymc3UEJid//g1QFHBK53RGJ6M5tQFwHfDbLX7u5GMP6ecH5x57MNfBvkv+/ALw\nA+Z62M2c/BxkJD849zm4lPxnXsxJXEKKnzv52EP6+SETx96ThT+1yVwpl69K7TblczlXRmUkvxto\niHmrGItZpsJbOPnYZ4Q3HfuKmHcv36T4vrc8BxVJPb+Tn4NAzC+uM5ghqz0pfu70Y59e/kwde08u\njZXRyVwpf2s5ZRJYRnJsw4yFXsJ0My0AvGkdSqce+4zwlmNfEJgDPI85c07J6c/BrfI7+TlwYYaq\nigDLMUMj8Slu4+Rjn17+TB17T57xn8AEu6EC5rfqrW5TPvl7TpCR/P/hj7dkSzHXAornfrQc4eRj\nnxHecOyDgbnANMx/zJSc/hykl98bnoPzmHbzOim+7/Rjf0Na+R177DMymevmCyz1cdYFlozkL8Uf\nZw11MdcDnKQiGbu467Rjf0NF0s7v9GMfAEwBPrrFbZz8HGQkv1Ofg9sxY/YAIZgVhVukuI2Tj31G\n8jv12AOpT+Z6OvnjhpHJP98B1PZouvSll/9ZTKvbd8BGzAvIKWYAJ4FrmLHMQXjXsU8vv5OPPZgu\nDBcm342Wu3Z4z3OQkfxOfQ5qYIZCvgO+B15K/r63HPuM5HfqsRcRERERERERERERERERERERERER\nERERERER8S//H06yCdhXXXFQAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, the position of each particle in the x-y plane:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(p1.x, p1.y)\n", "plt.plot(p2.x, p2.y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we didn't have the individual particle objects but knew the particle's ID that we wanted, we could access it this way:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "p_new = particles.get_particle_from_id(1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check to make sure we got the right one:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print p_new.x == p1.x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "True" ] } ], "prompt_number": 21 } ], "metadata": {} } ] }