diff --git a/01_phugoid/.gitignore b/01_phugoid/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/01_phugoid/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/01_phugoid/.ipynb_checkpoints/01_01_Phugoid_Theory-checkpoint.ipynb b/01_phugoid/.ipynb_checkpoints/01_01_Phugoid_Theory-checkpoint.ipynb new file mode 100644 index 0000000..902854f --- /dev/null +++ b/01_phugoid/.ipynb_checkpoints/01_01_Phugoid_Theory-checkpoint.ipynb @@ -0,0 +1,764 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, C. Cooper, G.F. Forsyth, A. Krishnan." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Motion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome to [**\"Practical Numerical Methods with Python!\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about) This course is a collaborative, online, open education project, where we aim to give a foundation in scientific computing. The focus is on numerical solution of problems modeled by ordinary and partial differential equations.\n", + "\n", + "This IPython Notebook introduces the problem we'll be studying in the **first module** of the course: the _phugoid model of glider flight_. We'll start with some background, explaining the physics, and working out the mathematical model. \n", + "\n", + "First, we'll look at an idealized motion where there is no drag, resulting in a simple harmonic motion. We can plot some interesting trajectories that will pique your imagination. In the next notebook, you'll learn to numerically integrate the differential equation using Euler's method. But hang on ... first things first. \n", + "\n", + "The term \"phugoid\" is used in aeronautics to refer to a motion pattern where an aircraft oscillates up and down —nose-up and climb, then nose-down and descend— around an equilibrium trajectory. The aircraft oscillates in altitude, speed and pitch, with only small (neglected) variations in the angle of attack, as it repeatedly exchanges kinetic and potential energy.\n", + "\n", + "A low-amplitude phugoid motion can be just a nuisance, as the aircraft does not exceed the stall angle of attack and nothing bad happens. But the mode can also be unstable leading to a stall or even a loop!\n", + "\n", + "Look at this video showing a Cessna single-engine airplane in phugoid motion:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz\nODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj\nY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQED\nEQH/xAAaAAACAwEBAAAAAAAAAAAAAAACAwABBAUG/8QAQBAAAgIBAwEDCAgFBAIDAQEBAQIAAxEE\nEiExE0FRBRQiMmFxgZEjQlJTcpKhsRUzYsHRBkOC4SRjovDxNMIW/8QAGQEBAQEBAQEAAAAAAAAA\nAAAAAAECAwQF/8QAKBEBAAIBBAICAQQDAQAAAAAAAAERAgMSMVETIUFhBCJSgaEyYnEU/9oADAMB\nAAIRAxEAPwBlFdfYp9GnqjuEcKqvu0/KJKax2Nf4R+0PYRPpxEU8coKaj/tp8oa01/dp8oPIlhyI\nqCzeyr+6r/KJfY0/cp+UQFsEMWCZ2ra+yp+7T8oliuof7SflkyDB57o2wWaqUfdp+UQxXQf9tPyi\nZt57xJvPuk2ltfYUn/bT8ok7Cn7pPyiZO1Yd8IXtG0to7CodKk/KJDVWf9tPyiKF5MMOTJtLEtVQ\n/wBqv8olGmvORUn5RJuMm4xULYjXSRg1Jn8IgCmjPNSflEvcZecxUFgfT6furT8ok7Cnb/Lr/KIR\nJlFj4RSWUdPVn+Un5RJ2FQ/20/KIRfxEE2CWi1dnV91X+USdjT92n5RL3r3S+090UWX2NP3SflEr\nsqvu0/KI4FD1/SUwTuYy1BZRqq+6T8ogNp6T/tp+URpU9xEEhx3RUJZLaav7tPyiLOnr+7X5TTk+\nEHM0WzHTp92v5RKFNf3a/lmk+6TEIQKqe+tPkIxaqs/yk+Qh9lmEtWIqF9qFFP3afljFop+7T8ol\npXHKoHSZmlL83p7qk/KJR09XdUn5RNG2Q5EgStNXfWn5RD83p+6T8olk5lB8SUWIU1D/AGk/KIa1\n1fdJ+USltHfGKymSltBVV90n5RC7Kr7pPyiECJczRYOwp+6T8ok83q+6T8ohyRRYOwq+6T8ok7Cn\n7pPyiMzKigs0VfdJ+USjRT90n5RG5lEiKCeyo+6T8oldjV90n5RGnEA++WiwGqr7qv8AKJR09P3a\n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\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('ysdU4mnRYdM')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That doesn't look too good! What's happening? \n", + "\n", + "It can get a lot worse when an aircraft enters one of these modes that is unstable. For example, one of [NASA's Helios Solar Powered Aircraft](http://www.nasa.gov/centers/dryden/history/pastprojects/Helios/) prototype broke up in mid air due to extreme phugoid oscillations!\n", + "\n", + "Helios was a proof-of-concept solar electric-powered flying wing that broke the world altitude record for a non-rocket-powered aircraft in August 2001. But in June 26, 2003, it broke something else. The aircraft entered phugoid motion after encountering turbulence near the Hawaiian Island of Kauai. The high speed in the oscillatory movement exceeded the design limits, and it ended up wrecked in the Pacific Ocean. Luckily, the Helios was remotely operated, and nobody got hurt." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The physics of phugoids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The phugoid oscillation has the aircraft pitching up and down, as it decelerates and accelerates. The trajectory might look like a sinusoid, as in the figure below. The assumption is that the forward velocity of the aircraft, $v$, varies in such a way that the angle of attack remains (nearly) constant, which means that we can assume a constant lift coefficient." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/oscillatory_trajectory.png)\n", + "#### Figure 1. Trajectory of an aircraft in phugoid motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the descending portion of the trajectory, the aircraft's velocity increases as it proceeds from a peak to the minimum height—gaining kinetic energy at the expense of potential energy. The contrary happens in the upward segment, as its velocity decreases there.\n", + "\n", + "We measure the pitch angle (between the aircraft's longitudinal axis and the horizontal) as positive when the aircraft's nose is pointing up. In the portion of the trajectory below the center-line, where it curves upwards, the pitch angle $\\theta$ is increasing: $\\dot{\\theta}>0$. And where the trajectory curves down, the pitch angle is decreasing: $\\dot{\\theta}<0$, as shown in the figure.\n", + "\n", + "Let's remind ourselves of the forces affecting an aircraft in a downward glide. Look at the figure below: we show the flight path, the forces on the glider (no thrust), and the _glide angle_ or flight path angle, $\\gamma$, between the flight path and the horizontal." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces.png)\n", + "#### Figure 2. Forces on a glider." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The force of lift, $L$ —created by the airflow around the wings— is perpendicular to the trajectory, and the force of drag, $D$, is parallel to the trajectory. Both forces are expressed in terms of coefficients of lift and drag, $C_L$ and $C_D$, respectively, that depend on the wing design and _angle of attack_—the angle between the wing chord and the flight path.\n", + "\n", + "If you are not familiar with airplane aerodynamics, you might be getting confused with some terms here ... and all those angles! But be patient and look things up, if you need to. We're giving you a quick summary here.\n", + "\n", + "Lift and drag are proportional to a surface area, $S$, and the dynamic pressure: $1/2 \\rho v^2$, where $\\rho$ is the density of air, and $v$ the forward velocity of the aircraft. The equations for lift and drag are:\n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "If the glider were in equilibrium, the forces would balance each other. We can equate the forces in the directions perpendicular and parallel to the trajectory, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "L = W \\cos \\gamma \\quad \\text{and} \\quad D = W \\sin \\gamma\n", + "\\end{equation}$$\n", + "\n", + "where $W$ repesents the weight of the glider.\n", + "\n", + "In the figure, we've drawn the angle $\\gamma$ as the _glide angle_, formed between the direction of motion and the horizontal. We are not bothered with the _sign_ of the angle, because we draw a free-body diagram and take the direction of the forces into account in writing our balance equations. But later on, we will need to be careful with the sign of the angles. It can cause you a real headache to keep this straight, so be patient!\n", + "\n", + "It looks like we've set this up to do a little bit of mathematics. Are you ready?\n", + "\n", + "But before, a short glimpse of the history." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lanchester's Aerodonetics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Phugoid theory\" was first described by the British engineer Frederick W. Lanchester in _\"Aerodonetics\"_ (1909). This book is so old that it is now in the public domain, so you can actually download [from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&dq=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&pg=PA37#v=onepage&q=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&f=false) a PDF file of a scan, or read it online. \n", + "\n", + "Lanchester defines phugoid theory as the study of longitudinal stability of a flying machine (aerodone). He first considered the simplification where drag and moment of inertia are neglected. Then he included these effects, obtaining an equation of stability. In addition to describing many experiments by himself and others, Lanchester also reports on _\"numerical work ... done by the aid of an ordinary 25-cm slide rule.\"_ Go figure!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ideal case of zero drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we follow the derivation given by Milne-Thompson (1966), which we find a little bit easier than that of the original in \"Aerodonetics\"!\n", + "\n", + "An aircraft flying in a steady, straight horizontal flight has a lift equal to its weight. The velocity in this condition is sometimes called _trim velocity_ (\"trim\" is what pilots do to set the controls to just stay in a steady flight). Let's use $v_t$ for the trim velocity, and from $L=W$ deduce that:\n", + "\n", + "$$\\begin{equation}\n", + "W = C_L S \\times\\frac{1}{2} \\rho v_t^2\n", + "\\end{equation}$$\n", + "\n", + "The weight $W$ is constant for the aircraft, but the lift at any other flight condition depends on the flight speed, $v$. We can use the expression for the weight in terms of $v_t$ to obtain the ratio $L/W$ at any other flight velocity, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}= \\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "Imagine that the aircraft experienced a little upset, a wind gust, and it finds itself off the \"trim\" level, in a curved path with an instantaneous angle $\\theta$. In the sketch below, we exaggerate the curved trajectory of flight to help you visualize what we'll do next. The angle $\\theta$ (using the same name as Milne-Thompson) is between the _trajectory_ and the horizontal, positive up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "#### Figure 3. Curved trajectory of the aircraft going up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can form a free body diagram to determine the balance of forces. \n", + "\n", + "\n", + "\n", + "#### Figure 4. Free body diagram of the aircraft trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the free body diagram, we can see that\n", + "\n", + "\\begin{equation}\n", + "\\vec{L} + \\vec{W} = m\\vec{a} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "where $\\frac{v^2}{R}$ is the centripetal acceleration and $R$ is the radius of curvature of the trajectory.\n", + "If we decompose the lift and weight into their normal and tangential components we get\n", + "\n", + "\\begin{equation}\n", + "L\\hat{n} + W_n\\hat{n} + W_t\\hat{t} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "The component of the weight in the normal direction ($W_n$) is\n", + "\n", + "\\begin{equation}\n", + "W_n = -W \\cos \\theta\n", + "\\end{equation}\n", + "\n", + "If we then consider that all of the components in $\\hat{n}$ must balance out, we arrive at\n", + "\n", + "\\begin{equation}\n", + "L - W \\cos \\theta = \\frac{mv^2}{R}\n", + "\\end{equation}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can rewrite this as\n", + "\n", + "$$\\begin{equation}\n", + "L- W \\cos \\theta = \\frac{W}{g} \\frac{v^2}{R}\n", + "\\end{equation}$$\n", + "\n", + "where $g$ is the acceleration due to gravity. Rearrange this by dividing the equation by the weight, and use the expression we found for $L/W$, above. The following equation results:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{v^2}{v_t^2}-\\cos \\theta = \\frac{v^2}{g R}\n", + "\\end{equation}$$\n", + "\n", + "Recall that we simplified the problem assuming that there is no friction, which means that the total energy is constant (the lift does no work). If $z$ represents the depth below a reference horizontal line, the energy per unit mass is (kinetic plus potential energy):\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{2}v^2-g z = \\text{constant}\n", + "\\end{equation}$$\n", + "\n", + "To get rid of that pesky constant, we can choose the reference horizontal line at the level that makes the constant energy equal to zero, so $v^2 = 2 g z$. That helps us re-write the phugoid equation in terms of $z$ as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z}{z_t}-\\cos \\theta = \\frac{2z}{R}\n", + "\\end{equation}$$\n", + "\n", + "Let $ds$ represent a small arc-length of the trajectory. We can write \n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} \\quad \\text{and}\\quad \\sin\\theta = -\\frac{dz}{ds}\n", + "\\end{equation}$$\n", + "\n", + "Employing the chain rule of calculus,\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} = \\frac{dz}{ds}\\frac{d\\theta}{dz} = -\\sin \\theta\\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "Multiply the phugoid equation by $\\frac{1}{2\\sqrt{z}}$ to get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} - \\frac{\\cos\\theta}{2\\sqrt{z}} = \\frac{\\sqrt{z}}{R}\n", + "\\end{equation}$$\n", + "\n", + "Substituting for $1/R$ on the right hand side and bringing the cosine term over to the right, we get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} = \\frac{\\cos \\theta}{2 \\sqrt{z}} - \\sqrt{z} \\sin \\theta \\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "The right-hand-side is an exact derivative! We can rewrite it as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d}{dz} \\left(\\sqrt{z}\\cos\\theta \\right) = \\frac{\\sqrt{z}}{2z_t}\n", + "\\end{equation}$$\n", + "\n", + "Integrating this equation, we add an arbitrary constant, chosen as $C\\sqrt{z_t}$ which (after dividing through by $\\sqrt{z}$) gives:\n", + "\n", + "$$\\begin{equation}\n", + "\\cos \\theta = \\frac{1}{3}\\frac{z}{z_t} + C\\sqrt{\\frac{z_t}{z}}\n", + "\\end{equation}$$\n", + "\n", + "Taking the derivative of both sides of equation (15) and applying the relations from equation (10) yields:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z_t}{R} = \\frac{1}{3} - \\frac{C}{2}\\sqrt{\\frac{z_t^3}{z^3}}\n", + "\\end{equation}$$\n", + "\n", + "Make sure you have followed the derivation, and perhaps write it out on paper!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Phugoid Curves" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Equation (15) is non-linear, which usually means we are hard-pressed to write a clean expression for the variable of interest, $z$. In fact, Lanchester himself said that he was unable to _\"reduce this expression to a form suitable for co-ordinate plotting.\"_ If the great polymath couldn't do it, we can't either!\n", + "\n", + "But Lanchester _was_ able to plot a suitable approximation of the phugoid flight path using what he called the \"trammel\" method. If you're interested in seeing how he did it, his explanation begins on page [48 of Aerodonetics](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PA49&lpg=PA48&dq=aerodonetics+the+use+of+the+trammel&source=bl&ots=lB6EVKYQuT&sig=aVE2kiDWZoWftaWczMIrcYftMOs&hl=en&sa=X&ei=gTD_U82fGYjzgwT3moGwCQ&ved=0CCAQ6AEwAA#v=onepage&q=aerodonetics%20the%20use%20of%20the%20trammel&f=false). It's a trip.\n", + "\n", + "Lanchester used Equations (15) and (16) to solve for the constant $C$ and the radius of curvature $R$ and then iteratively plotted small arcs of the phugoid path. By hand.\n", + "\n", + "We wrote a neat little code that duplicates the manual trammel method, but it might be a bit much for you to absorb in the first lesson. If you want to look it over, you are more than welcome to. If you are just starting with Python, skip it for the moment and we'll return to it at the end of this module. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting the flight path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we mentioned, we wrote a Python code to reproduce programmatically what Lanchester did graphically. Here's a neat feature of IPython Notebooks: you can run external programs with the magical keyword ... wait for it ... `run`. And the jargon of IPython _is_ to call this \"magic.\" In fact, there are a bunch of [magic functions](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) that you will learn about. They will make you a happy camper.\n", + "\n", + "Let's do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%run phugoid.py\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This code cell loaded our simulated-trammel code, `phugoid.py`. The code defined a function for you in the background, called `plot_flight_path`, taking three inputs: $z_t$, $z$ and $\\theta$. \n", + "\n", + "Look again at Equation (15), where we take the positive square root. There are several possibilities, depending on the value that the constant $C$ takes. \n", + "\n", + "* There are no physical solutions for $C>2/3$, because it would result in $\\cos\\theta>1$. \n", + "\n", + "* If $C=2/3$, then the solution is a horizontal straight line, because $\\cos\\theta=1$, $\\theta=0$ and $R=\\infty$.\n", + "\n", + "* Any value of $C$ for which $0 < C < \\frac{2}{3}$ will produce \"trochoidal\"-like paths. What does this look like? Let's use our custom function `plot_flight_path` to find out!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n5MgRihQpQt++fQE4fPgw+fLlo1SpUpw8eTLV19+1axfFihULPC5WrBixsbFZ10G/zPQzNefrf0oy\n2tfBgwczdOhQALZu3UpERESq22amn+mtL7XtixcvniM/0wtR4BMRkWxlluFzxf7JuT/a6bV69WqG\nDx9OxYoVyZcvH506daJHjx5/2q5atWqMGDEiQ6+xf/9+Nm7cyJQpUwBo27Ytbdq0oXr16syYMYP7\n77+fCRMmnHcfR44c4aKLLgo8joyM5Pfff0/T66e1j5C5fqbmfP1PSUb6unfvXr799lu+++471qxZ\nw6RJk3j++edT3T4z/UxvfefbPqM/06ykKV0REfG8Zs2a8dVXX9GoUSMKFChAjx49eP3119m/f3+W\nvUaRIkVo0KBB4HHlypWJjo7m22+/5aqrrkrzPoJD7R9//EGJEiXS9L3J+xgVFcXIkSMZP3483333\nXfo6kwGp9f9826e3r4sWLaJr16488MAD3HXXXezZs4cOHTpkSz/TW19q22fmZ5qVNMInIiLZKqOj\nclnt5ZdfZv/+/bz99tuAbzqwbNmySbYJngIMlpYpwHr16rFs2bLA43z58pGQkMC3337LqVOnmDt3\nLsuXL+f06dPMnj07xf1cccUVrFmzJvD48OHDNGnSJEN9fP3112nfvj1NmjShT58+fPrpp1nSz9Sk\n1v/UZKSvO3fupE6dOoBv5Wvnzp355JNPsqWf6a0vte2LFSuWqZ9plsnMio/cfEMrykREsky4/059\n+eWX3bPPPuucc27jxo1u6dKl7oYbbnArVqzIstc4ffq0a9GiReBxq1at3LZt25JsM3z48CSrdH/6\n6SeXmJgYeHzy5EnXoEGDwOOGDRu6/fv3O+eci42NTbJtcsn7+PDDD7tff/3VOefcDTfckImepWz8\n+PGub9++gcfn63/yfjqXsb6OHTvWjR071jnnXOfOnd2OHTvcI488ki39PF996enP+faTktT+L5HJ\nVbrmwuSTV04zM5dX+y4iktVSu+B7OPjPf/7Db7/9RtGiRRk2bBjXXHMNd911F59//jmDBg3K0tea\nP38+y5cvxzlH7dq1ueOOOwLPTZs2jREjRmBmDB06lJtvvpkmTZowbtw4GjduHNhu0qRJbN++Hecc\n1apVC+yjTp06vPXWW1x//fVp6uO+fft45plnqFChAp07d2bOnDlZ1s933nmHqVOnsnPnTvr27cuT\nTz5JkSJFUu1/Sv3MSF+PHz/O888/T4MGDahfvz4tWrTg4Ycf5tlnn82WfqZWX3r7k1p7SlL7v+Rv\nz/ABsQp8IiKSaeEc+FIyefJkqlSpQuXKlbnssstCXU6aJCYm8s0331zw1C7nvP3227Rt25Y6derQ\nt29fPvvss2yuMOukp6+5uZ8pUeDLYgp8IiJZJ7cFvlmzZhEXF0ezZs3Oe664cDJ16lS6devGxRdf\nnKbtDx8+zMcff0yxYsWoX78+LVu2zOYKs056+pqb+5kSBb4spsAnIpJ1clvgy41OnjzJJZdcEuoy\nckRe6mtyCnxZTIFPRCTrKPCJZI3sCnw6D5+IiIiIxynwiYiIiHicAp+IiIiIxynwiYiIiHicAp+I\niIiIx+lauiIikmlVqlT50/VKRST9suu8kDoti4iIiEiY02lZREREROS8FPhEREREPE6BT0RERMTj\nFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RE\nRMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6B\nT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjwj7wmdk4\nM9tvZhuC2oqbWbSZbTGz+WZWNOi5oWYWa2abzKxDaKoWERERCR9hH/iAfwIdk7UNARY652oBi4Ch\nAGZWF+gF1AFuAN4zM8vBWkVERETCTtgHPufcMuBIsubuwAT//QlAD//9G4Epzrl459x2IBZonhN1\nioiIiISrsA98qSjjnNsP4JzbB5Txt1cEdgZtt9vfJiIiIpJn5dbAl5wLdQEiIiIi4Sp/qAvIoP1m\nVtY5t9/MygEH/O27gcuCtqvkb0vR8OHDA/ejoqKIiorK+kpFRERE0ikmJoaYmJgs2585F/6DY2ZW\nFfjSOdfA/3gk8JtzbqSZDQaKO+eG+BdtfApchW8qdwFQw6XQSTNLqVlEREQk7JgZzrkML0QN+xE+\nM5sMRAElzexXYBjwCjDNzO4FduBbmYtz7kczmwr8CMQBDynViYiISF6XK0b4soNG+ERERCS3yOwI\nn1cWbYiIiIhIKhT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9E\nRETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxO\ngU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERE\nRDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4zwZ+Mysk5ltNrOtZjY41PWIiIiIhJI550JdQ5Yys3zAVuBaYA+wGrjVObc52XbOa30XERERbzIz\nnHOW0e/34ghfcyDWObfDORcHTAG6h7gmERERkZDxYuCrCOwMerzL3yYiIiKSJ3kx8ImIiIhIkPyh\nLiAb7AYqBz2u5G/7k+HDhwfuR0VFERUVlZ11iYiIiKRJTEwMMTExWbY/Ly7aiAC24Fu0sRf4FrjN\nObcp2XZatCEiIiK5QmYXbXhuhM85l2BmjwDR+KasxyUPeyIiIiJ5iedG+NJKI3wiIiKSW+i0LCIi\nIiJyXgp8IiIiIh6nwCciIiLicQp8IiIiIh7nuVW66ZGYmEi+fMq8IuI9Z86c4ddff2Xnzp3s27eP\ns2fPEh8fT6FChShdujTly5enZs2aREZGhrpUEckBeTrwRUREUKJECa644gqqV69O06ZNadWqFU2b\nNtUvQRHJVU6dOsXXX3/N/PnzWbVqFevXrycuLu6835M/f37q1KlDy5Yt6dixI9dccw3FihXLoYpF\nJCfl6dOypPZc4cKF6dy5Mz179qR79+5cfPHFOVmaiEiaJCQksGDBAsaOHctXX33F6dOnA8+ZGZUr\nV6Zy5cpUqFCBiy66iIiICE6ePMmBAwfYtWsX27ZtI/hvQIECBejSpQt33nknN954IwUKFAhFt0Qk\nBZk9LUueDnzx8fEcOnSIn376ic2bN7Ny5UqWLVvGpk3/O09z8eLFufvuu3nwwQepU6dOCCsWEfE5\nfvw477//Pu+++y47d+4MtDdr1oyuXbvStm1bmjZtyqWXXnre/Zw8eZINGzawePFi5s+fz7Jly0hM\nTASgUqVKDBgwgPvvv5+iRYtma39E5MIU+DLofCde/uWXX5g1axaffvopa9asCbR3796d559/nqZN\nm+ZUmSIiAceOHeP111/nzTff5OjRowBUq1aNfv360adPHypWrJip/e/du5fPPvuMsWPHBj74FilS\nhIEDB/LEE09QuHDhTPdBRDJGgS+D0nqljbVr1/LBBx8wceLEwHRJ165defXVVzXiJyI5Ij4+nrFj\nx/K3v/2NgwcPAtC2bVueeeYZOnTokOWLzxITE5k3bx6vvfZa4OLtZcuW5cUXX6Rfv35ERERk6euJ\nyIUp8GVQei+ttm/fPkaPHs17773HqVOniIiI4OGHH2bYsGGUKFEiGysVkbxs8eLFPProo2zcuBHw\nBb2///3vtG3bNkdePyYmhkGDBrF69WoAmjdvzgcffECjRo1y5PVFxEeBL4Myei3dAwcO8PzzzzN2\n7FgSExMpUaIE//jHP7j77rsxy/DPQUQkiaNHjzJo0CA++ugjAC6//HJee+01brrpphz/XeOcY+rU\nqTz55JPs2bOHiIgInnjiCV588UUtahPJIQp8GZTRwHfO+vXreeKJJ1i8eDEAHTt25IMPPqBKlSpZ\nVaKI5FGzZ8+mf//+7Nmzh8jISJ577jkGDhzIRRddFNK6jh8/zvPPP88777xDYmIidevWZdKkSTRu\n3DikdYnkBQp8GZTZwAe+T70TJ07kiSee4MiRIxQuXJhXX32Vv/71rxrtE5F0+/3333n00UcZP348\nAC1atGDcuHHUrVs3tIUls3r1au6++242b95MgQIFePHFFxk4cKCO7RPJRgp8GZQVge+cffv28cgj\njzB9+nQAunXrxscff0ypUqWyZP8i4n1r1qzh9ttvJzY2losuuogRI0bw6KOPhm2IOnXqFIMHD+ad\nd94BICoqis8++4xy5cqFuDIRb1Lgy6CsDHznTJ06lQcffJCjR49Svnx5Jk6cyHXXXZelryEi3pKY\nmMjo0aN59tlniYuLo379+nz22WfUr18/1KWlybx58+jbty/79++nfPnyfP755zm2oEQkL8ls4NOF\nZLNQr169WL9+PW3btmXv3r1cf/31DB48mPj4+FCXJiJh6Pjx49x0000MGjSIuLg4Hn30Ub799ttc\n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\n9dVXqf4eVOBT4Atrq1atcj179nRmluSP++zZs11CQkKoy5MckpiY6ObOnZvkQ4CZuW7durmlS5eG\nujyRTImPj3eTJ092derUCby/K1eu7N566y134sSJUJcnYeTIkSPu73//uytdunTgvVK/fn03c+bM\nC37gVeBT4MsVfvrpJzdgwABXuHDhJFfuGDVqlM5m72GHDx92r7/+epIrYxQqVMg99NBDujqGeE58\nfLybMmWKq1u3buD9Xrx4cffMM8+4PXv2hLo8CaHdu3e7gQMHBhZjAK5p06Zu2rRpaR78UOBT4MtV\njh496kaNGuUqV66cZLr31ltv1ZSeRyQmJrqlS5e6O++8M8m0bYUKFdyIESO0kEc8LyEhwU2fPt21\natUqye+5e+65x/3www+hLk9y0MqVK92dd97pIiMjA++Fa6+91i1YsCDdf+8yG/jC/jx82cXMXF7t\neziIj49nzpw5fPjhh8yZM+dcCKdGjRr069eP22+/ncsuuyzEVUp67NmzhylTpjBu3Dh+/PFHAMyM\nDh068MADD9CtWzcKFCgQ4ipFctZ//vMfRo8ezcyZMwO/59q1a0f//v3p2bMnkZGRIa5QstqZM2f4\n/PPPeeedd1i92ne113z58tGzZ0+GDBnClVdemaH9mhkuE+fhU+CTkPv1118ZN24c48aNC1yqzcxo\n164dd9xxBzfffDPFihULcZWSkuPHjzNjxgw+/fRTvv7668AftHLlynHvvfdy3333cfnll4e4SpHQ\n27ZtG2+88Qbjx4/n5MmTAJQpU4Z+/frxwAMPULVq1dAWKJkWGxvLP//5T8aOHcvBgwcBKFGiBPfd\ndx/9+/fP9M9YgS+DFPjCT3x8PHPnzuWTTz5h9uzZnDlzBoDIyEi6du1K7969ueGGGyhSpEiIK83b\nTp48ybx585g6dSqzZ88OXPYnMjKSLl26cOedd2o0TyQVx48f59NPP+X999/nhx9+AP43Et6nTx+6\nd+9OoUKFQlylpNXvv//OtGnT+Pjjj1m2bFmgvVGjRjz66KPcdtttXHzxxVnyWgp8GaTAF96OHTsW\nGDlatGhRYOQoMjKS6667jp49e9KtWzfKli0b4krzhkOHDvHll1/yxRdfEB0dneTajldffTV33nkn\nN998M8WLFw9hlSK5h3OO//znP4wZM4apU6dy9uxZAIoUKcLNN9/MXXfdRbt27ciXL6SXvJcUJCQk\n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\nKVasGMWKFaNo0aIUK1aMMmXKUL58eSpUqEDx4sU9H+guRIEvgxT4REREJLfIbODTsj0RERERj1Pg\nExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERER\nj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4R\nERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4\nBT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExER\nEfE4BT4RERERjwvbwGdmr5rZJjP73symm9mlQc8NNbNY//MdgtqbmNkGM9tqZm+EpnIRERGR8BK2\ngQ+IBuo55xoBscBQADOrC/QC6gA3AO+Zmfm/532gn3OuJlDTzDrmfNkiIiIi4SVsA59zbqFzLtH/\ncCVQyX//RmCKcy7eObcdXxhsbmblgCLOudX+7SYCPXKyZhEREZFwFLaBL5l7gTn++xWBnUHP7fa3\nVQR2BbXv8reJiIiI5Gn5Q/niZrYAKBvcBDjgWefcl/5tngXinHOfhaBEERERkVwvpIHPOXf9+Z43\ns75AZ+CaoObdwGVBjyv521JrT9Xw4cMD96OiooiKirpw0SIiIiLZLCYmhpiYmCzbnznnsmxnWcnM\nOgGjgaudc4eD2usCnwJX4ZuyXQDUcM45M1sJPAasBr4C3nLOzUtl/y5c+y4iIiISzMxwztmFt0xZ\nSEf4LuBtIBJY4F+Eu9I595Bz7kczmwr8CMQBDwUlt4eB8cBFwJzUwp6IiIhIXhK2I3zZTSN8IiIi\nkltkdoQvt6zSFREREZEMUuATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER\n8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+AT\nERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGP\nU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPC9vAZ2Yvmtl6M1tnZvPMrFzQc0PNLNbMNplZh6D2Jma2wcy2mtkboalcREREJLyYcy7U\nNaTIzAo75373338UqOuc629mdYFPgWZAJWAhUMM558xsFfCIc261mc0B3nTOzU9l/y5c+y4iIiIS\nzMxwzllGvz9sR/jOhT2/S4BE//0bgSnOuXjn3HYgFmjuHwEs4pxb7d9uItAjp+oVERERCVf5Q13A\n+ZjZS8DdwFGgvb+5IrAiaLPd/rZ4YFdQ+y5/u4iIiEieFtIRPjNb4D/m7tztB//XbgDOueecc5Xx\nTeE+GspaRURERHKrkI7wOeeuT+Omk4GvgOH4RvQuC3qukr8ttfZUDR8+PHA/KiqKqKioNJYjIiIi\nkn1iYmKIiYnJsv2F86KN6s65bf77jwJtnXO9ghZtXIVvynYB/1u0sRJ4DFiNLyC+5Zybl8r+tWhD\nREREcoXMLtoI52P4XjGzmvgWa+wA/grgnPvRzKYCPwJxwENBye1hYDxwETAntbAnIiIikpeE7Qhf\ndtMIn4iIiOQWnj0ti4iIiIhkDQU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T\n4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+ERER\nEY9T4BMRERHxOAU+EREREY9T4BMRERHxOAW+PCYmJibUJYSE+p23qN95i/qdt+TVfmeWAl8ek1f/\no6jfeYv6nbeo33lLXu13ZinwiYiIiHicAp+IiIiIx5lzLtQ1hISZ5c2Oi4iISK7knLOMfm+eDXwi\nIiIieYWmdEVEREQ8ToFPRERExOPyXOAzs05mttnMtprZ4FDXk5XMbJyZ7TezDUFtxc0s2sy2mNl8\nMysa9NxQM4s1s01m1iE0VWeemVUys0VmttHMfjCzx/ztnu67mRU0s1Vmts7f72H+dk/3+xwzy2dm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#zt = 64, z = 16, theta=0\n", + "plot_flight_path(64, 16, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool! Note that the plot title tells us what the calculated value of $C$ was for our input conditions. We have a value of $C$ between $0$ and $\\frac{2}{3}$ and our path is trochoidal, like we announced it would be.\n", + "\n", + "* For negative values of $C$, the resultant flight path consists of a series of loops. Let's try it out!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUqZMGcLCwrjpppvo0KHDX9arWLEigwYNytZ77Nu3j/Xr1zNlyhQAWrRoQfPmzalcuTKffvop999/\nP2PHjj3nNo4cOUKBAgWSP4+KiiI2NjZT75/ZfYTz28/0nGv/05Kdfd2zZw/Lli1j5cqVrFixggkT\nJvD888+nu34w9nPy5MnMmDGDN998M9vbyOz3Pzs0tSoiInleo0aN+O9//0u9evWIjIykQ4cOvPXW\nW+zbty9o7xEdHU3t2rWTPy9XrhxfffUVy5Yto3HjxpneRsqyGhcXR4kSJTL12tT72LJlS4YMGcKY\nMWOSj0PLSent/7nWz+q+zps3j/bt29OrVy+6du3K7t27adWqVY7uZ6dOnfjggw+46aabsnUbuqx8\n/7NDI3IiIpKjQuXWXa+99hr79u1j2LBhgG9a7pJLLvnTOimn4lLKzFRczZo1+e6775I/DwsLIzEx\nkWXLlnHq1CnmzJnD4sWLOX36NJ9//nma26lUqRIrVqxI/vzQoUM0aNAgW/v41ltvcd1119GgQQO6\nd+/OxIkTg7Kf6Ulv/9OTnX3dtWsX1atXB3xnvLZt25bx48fnyH5+8cUXvPrqqyxevJjo6GguueQS\nPvnkkwzPxE1t6dKlxMXFZer7ny3W2nz58O26iIgEQ6j/m/raa6/Z5557zlpr7fr16+2iRYtsmzZt\n7Pfffx+09zh9+rRt0qRJ8ufNmjWzv/7665/WGThwoH3ppZeSP9+yZYtNSkpK/vzkyZO2du3ayZ/X\nrVvX7tu3z1pr7ebNm/+0bmqp97FPnz52586d1lpr27Rpcx57lrYxY8bYHj16JH9+rv1PvZ/WZm9f\nR48ebUePHm2ttbZt27Z2x44dtm/fvjmyn3PmzEn+eiYlJdmyZcvar776Kt39CUj9dUkp9fc/Len9\nXfIv/0ufMTZEflPKbcYYm1/3PSNnz55l8+bN7Nixg507d7J3715OnDjBmTNnKF26dPJBpiIiAend\n6DsULFmyhMOHD1OsWDFefPFFrr/+erp27crUqVN56qmngvpeX375JYsXL8ZaS7Vq1ejSpUvyc9Om\nTWPQoEEYY+jfvz8dO3akQYMGfPDBB9SvXz95vQkTJrB9+3astVSsWDF5G9WrV+edd97hxhtvzNQ+\n7t27l2effZbLLruMtm3b8sUXXwRtP999910+/vhjdu3aRY8ePejXrx/R0dHp7n9a+5mdfT1+/DjP\nP/88tWvXplatWjRp0oQ+ffrw3HPP5ch+jhw5koSEBHbs2EGVKlV44IEHzrk/6X1dIO3vf1rS+7vk\nX/6XA05V5ITjx4/z7bffMnfuXJYtW8batWuJj49Pc93atWuzdu3aXE4oIqEulItcWiZNmkT58uUp\nV64cZcuWdR0nU5KSkliwYEGmL2ExbNgwWrRoQfXq1enRoweTJ0/O4YTBk5V99fJ+pkVFLpPye5E7\nfvw4M2bMYNKkScybN4+EhIQ/PV+hQgUqVapEuXLlKF26NEWLFuWCCy6gVKlSdOrUyVFqEQlVXity\nn332GWfPnqVRo0bnvNZZKPn444+5+eabKViwYKbWP3ToEB9++CHFixenVq1aNG3aNIcTBk9W9tXL\n+5kWFblMyq9FbsOGDbzzzjuMGzeOuLg4AMLDw2nSpAmtWrWiRYsW1K9fP0euki0ieZfXipwXnTx5\nksKFC7uOkSvy076mpiKXSfmtyK1evZoXXniB2bNnJy9r0aIFXbp0oWPHjiF3+xcR8RYVOZHgyGqR\n0+VH8rjt27fz5JNPJt/CpFChQnTv3p2+fftSo0YNx+lERETkfKjI5VHx8fEMHjyYwYMHc/r0aQoU\nKECfPn146qmnKFWqlOt4IiIiEgQqcnnQmjVr6Nq1K+vWrQOgc+fOvP7665QpU8ZxMhEREQkm3aIr\nD0lMTGTIkCE0atSIdevWUblyZRYsWMDEiRNV4kRERPIgjcjlEYcOHeKuu+7i66+/BuDBBx/kjTfe\nyLdn/YiIiOQHKnJ5wPr167nlllvYunUrpUqVYuzYsdx0002uY4lIPlK+fPm/3M9SRLIuq9c11NSq\nx82ePZsmTZqwdetWGjRowIoVK1TiRCTXBW6z5IXH8OHDk0vnI488wtmzZ51nyu7j+PHjtG/fHoCI\niAjGjx/vPJMe5/fYvn17lv7uqch52Pjx4+nQoQOxsbF06tSJRYsWeeZWMyIiLgwaNIg+ffpgreX1\n11/n7bffJiLCu5NT0dHRzJw5k8cff5yEhAS6devG6NGjXceSXKQi51EjRoygW7duJCYmMmDAACZO\nnEihQoVcxxIRCVmvvfYazz77LMYY/vOf//Dkk0+6jhQU4eHhDB06lNdeew1rLffffz/Dhw93HUty\nie7s4EFDhw5N/gfojTfe4IknnnCcSEQktI0cOZKHHnoIYwwTJkygc+fOriPliLfffpvHHnsM8O1z\n7969HSeSYNEtulLxapH7z3/+Q+/evTHG8N5779GrVy/XkUREQtqkSZO4++67sdby/vvvc//997uO\nlKNSltaPP/6Yjh07uo4kQaAil4oXi9yUKVPo3Lkz1lpGjBjBgw8+6DqSiEhIW7BgAX/7299ISEhg\nyJAhPPXUU64j5YpXX32VAQMGEBUVxZw5c7j++utdR5LzpCKXiteK3Ny5c2nbti0JCQm8+uqrPPvs\ns64jiYiEtG3bttGoUSMOHTrEY489xptvvuk6Uq6x1vLII48wbNgwoqOjWbp0KdWrV3cdS86Dilwq\nXipyv/zyC40bN+bYsWM8/vjjvPHGG7pek4jIOcTGxtKsWTPWrVvHTTfdxOzZswkPD3cdK1clJSVx\n1113MW3aNKpUqcLSpUu58MILXceSbFKRS8UrRe7IkSM0adKETZs2cdttt/HJJ58QFqaTjUVE0mOt\n5a677uLjjz+matWq/PDDDxQvXtx1LCdOnjxJ8+bN+fHHH2ndujX//e9/812hzSvSK3JqBCEsMTGR\nTp06sWnTJurUqcO4ceNU4kREMjB69Gg+/vhjihQpwueff55vSxxA4cKFmTlzJiVLluTLL7/k+eef\ndx1JgkytIIQNGjSIL7/8kosvvpjPP/+cIkWKuI4kIhLSNmzYwCOPPALAe++9R0xMjONE7pUvXz55\nNmfw4MF88803riNJEKnIhahFixbx4osvAjBhwoQs33tNRCS/iY+P56677iIuLo7u3bvTpUsX15FC\nxrXXXssLL7yAtZauXbty4MAB15EkSFTkQtChQ4fo3LkzSUlJPPPMM7Rq1cp1JBGRkPfqq6+ybt06\nKleuzLBhw1zHCTnPPfccLVq0YM+ePdx777144ThxyZhOdghBnTp1YsqUKTRt2pQFCxYQGRnpOpKI\nSEhbs2YNDRs2JCEhgYULF9KiRQvXkULSzp07qVu3LkePHmXcuHF07drVdSTJJJ3s4BGffvopU6ZM\noXDhwkyYMEElTkQkAwkJCdx7770kJCTQp08flbhzKFeuHG+99RYAjzzyCHv37nWcSM6XilwIOXTo\nUPLdGoYMGULFihUdJxIRCX0jRoxg1apVlC9fnkGDBrmOE/K6d+9O69atOXLkCH379nUdR86TplZD\nSPfu3Rk3bhzXXnst8+bN06VGREQycODAAapUqcKxY8f47LPPuOWWW1xH8oQdO3ZQq1YtYmNjmT17\n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\nli5dyh133MG0adNCqiilnFIdNWoU9913n+tIkgs0tZoPXHnllTzxxBNYa+nevbtu3yUikg0RERFM\nmjSJ6Ohopk+fzujRo11HSpZ6SrVnz56uI4ljGpHLY06fPs2VV17Jhg0bPHGwrohIqJo4cSJ33303\nBQsWZOXKlVSvXt11JCZNmkSXLl2Ijo7mp59+oly5cq4jSS5Jb0RORS4PWr16NY0bN+bs2bPMmTOH\nm266yXUkERFP6tatG+PHj6du3br88MMPFChQwFmWnTt3UrduXY4ePaop1XxIU6v5SP369Xn55ZcB\nuPfeezl06JDjRCIi3jR8+HAqVarEmjVreOqpp5zlSExMpFu3bhw9epT27dtrSlWSqcjlUU8++STN\nmzdnz5499O7dW/diFRHJhujoaCZPnkxkZCTDhg3j448/dpLj9ddfZ8GCBVxyySV88MEHIXXyhbil\nqdU8bNu2bdSpU4fY2FjGjBlD9+7dXUcSEfGkYcOG8fDDD1OkSBGWL19OtWrVcu29ly9fTrNmzUhI\nSNDhMvmYplbzoQoVKjBs2DAAHnroIX7++WfHiUREvKlv377cddddxMbG0rFjx1y78HpsbCxdunQh\nISGBRx55RCVO/kIjcnmctZZu3boxYcIEateuzdKlSylYsKDrWCIinhMbG0ujRo34+eef6dKlC+PH\nj8/xKc577rmHMWPGULt2bZYtW+b0ZAtxSyNy+ZQxhhEjRhATE8O6det47LHHXEcSEfGkIkWKMH36\ndAoXLszEiRMZOXJkjr7fRx99xJgxYyhQoACTJk1SiZM0aUQun/jxxx9p0qQJ8fHxTJkyhX/84x+u\nI4mIeNLkyZPp3LkzERERfPPNN1xzzTVBf4+1a9fSuHFjTp8+zYcffsg999wT9PcQb9GIXD5Xr149\n3nrrLQDuv/9+fv31V8eJRES8qVOnTvTr14+EhATuuOMOduzYEdTtHz9+nL///e+cPn2ae+65RyVO\nzkkjcvmItZY777yTTz75hNq1a/P9999TuHBh17FERDwnISGB9u3b8+WXX1KnTh0WL15MkSJFznu7\n1lo6derE1KlTqV27Nj/88AOFChUKQmLxOo3ICcYYPvjgg+Tj5e6//35dX05EJBsiIiKYMmUKMTEx\nrF27lh49epCUlHTe2x0xYgRTp06lSJEiTJs2TSVOMqQil88ULVqUmTNnUqRIESZPnszbb7/tOpKI\niCcVL16czz//nGLFijF9+vTkO+pk18KFC3n00UcBGD16NFWrVg1GTMnjNLWaT3366afccccdhIeH\n8yGE+i0AACAASURBVPXXX9OyZUvXkUREPGnOnDm0a9cOay0TJ06kc+fOWd7Gzp07adiwIQcOHODx\nxx9n6NChOZBUvExTq/Int99+O8888wyJiYnceeed7Nq1y3UkERFPatOmDW+++Sbgu+7bggULsvT6\nU6dO0aFDBw4cOMCNN97I4MGDcyKm5FEakcvHEhMTadOmDXPnzqV+/fosWrRIJz+IiGTTI488wjvv\nvEPx4sVZsmQJ1atXz/A11lq6dOnC5MmTqVixIsuXL6dEiRK5kFa8RiNy8hfh4eFMnjyZypUrs3r1\narp16xaUg3VFRPKjN998kw4dOnD06FHatGnD3r17M3zN0KFDmTx5MkWKFOHzzz9XiZMsU5HL5y66\n6CJmzZpFsWLF+PTTTxkwYIDrSCIinhQeHs7EiRNp3LgxO3bsoF27dsTGxqa7/syZM3n66acBGD9+\nPDVr1sytqJKHqMgJ1apV45NPPiE8PJxBgwYxduxY15FERDypUKFCfP7551SsWJFVq1Zxxx13cObM\nmb+st3z5cjp37oy1lldeeYUOHTo4SCt5gY6Rk2TvvfceDz74IJGRkXzzzTe0aNHCdSQREU/atGkT\nzZs358CBA9x5551MmjSJ8PBwAHbs2EHjxo3Zt28f99xzDx988AHG/OXQJ5E/Se8YORU5+ZPAwbol\nSpRg8eLFVKtWzXUkERFPWrVqFddddx3Hjx+nV69evPfeexw/fpyrr76a9evXc/311zNnzhyioqJc\nRxUPUJFLRUUubQkJCdx2223Mnj2b8uXLs2TJEi677DLXsUREPGnhwoW0bt2a06dP8/jjj7NmzRq+\n/vprqlevzpIlSyhevLjriOIRKnKpqMil7+TJk9xwww0sXbqUunXrsmDBAooVK+Y6loiIJ82ePZtb\nb701+aoApUqVYunSpVxxxRVug4mn6PIjkmmFCxdm9uzZxMTEsGbNGm6//Xbi4+NdxxIR8aR27dpx\n0UUXJX9+0003qcRJ0KjISZpKlizJ//73Py699FLmzZsXtBtCi4jkN4MHD+bAgQPJn48bN46RI0c6\nTCR5iYqcpKtChQrMmTOH6OhopkyZwsMPP4ymo0VEMm/UqFE8++yzGGOYOnUqw4YNA+Chhx7i/fff\n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\nnfuBvr+KXDIqcpLRXL9+nY0bN7J69Wo2btzIkSNH7nm8YMGCNGrUiKeffhofHx9q1qypk9zTIZfL\nxaFDh9zF7bvvvuPcuXP3PKdYsWL4+vri6+tL8+bNdUhdJB2LiooiIiKCyMhI+vbt+8DfR0UuGRU5\nyehOnz7Nt99+y8aNG9m4cSMnT5685/Hs2bNTu3ZtfHx88PHxoW7duhQvXlwzYtPYxYsXCQ8Pd99+\n+OEH9yXd7nrooYdo2LAhDRs2pEmTJjzxxBP6dxLJZFTkklGRk8zEWsvx48cJDQ1l27ZthIWF3XMt\nwruKFClCzZo177mVKVNGpSEFWGs5e/Yse/bsYe/evezdu5ft27ffc57jXcWLF6dBgwY0atSIRo0a\nUalSJf0biGRyKnLJqMhJZnf58mXCw8MJCwsjLCyMnTt3Eh0d/ZvneXt7U6VKFapUqULlypXdH4sV\nK6ZycR9RUVEcPnyYQ4cOsX//fndxu3Tp0m+emydPHmrXrk29evWoV68edevWpWTJkg6kFpH0TEUu\nGRU5kXtZa4mMjGTXrl3u286dO7l48eLvPt/b25uKFSvy2GOP8eijj/LYY4+5b0WLFs3QJc9aS1RU\nFJGRkURGRnL8+HGOHDnCoUOHOHTo0O8WNoACBQpQrVo1qlevTrVq1ahZsyaVK1fW7GIR+UMqcsmo\nyIn8MWst58+fZ//+/Rw4cOCej5cvX77v1+XKlYtSpUpRokQJSpYsSYkSJdz3ixcvTuHChSlcuDD5\n8uVLd4UvNjaW8+fPc+7cud98PH36tLu8xcTE3Pd75M2bl4oVK7pvTz75JNWrV6dkyZLp7r9XRDyD\nilwyKnIiD+5uwTt69Cg///wzP//8M8eOHXPfv98eqeSyZcvmLnWFCxfG29ubvHnzki9fvns+5s2b\nlxw5cpAtWzb3LXv27GTLlo2sWbPicrlwuVzcuXPHfd/lchEbG0tMTAwxMTHcvHnTfT8mJobo6Ggu\nX77M5cuX+fXXX933r1+//qeye3t7U6ZMGcqUKUPp0qUpX748FStWpEKFCpo0IiIpTkUuGRU5kdRz\n9epVTp8+zenTpzlz5gxnzpxx3z979iyXLl0iKiqKGzduOB31N7y8vHj44YcpVqwYxYoVo2jRou77\nxYsXp2zZspQuXRpvb2+no4pIJqIil4yKnIjzbt68yaVLl7h06RIXL17kypUrXL9+nWvXrnHt2jX3\n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\n8zlOaAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,numpy.pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can play around with the input values and see what kind of behavior results. Just note that any value of $C > \\frac{2}{3}$ will result in $\\cos \\theta > 1$, which doesn't exist. Python will probably throw a few errors if you hit that condition, but just try again!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* The last case is $C = 0$. Take another look at Equation (16) and plug in $C = 0$, what should happen? It looks like it will just reduce to \n", + "\n", + "$$R = 3z_t$$\n", + "\n", + "It's a constant radius of curvature! In fact, this solution is a series of semi-circles, with a cusp between them. One way to force $C = 0$ that we can figure out from Equation (15), is to make:\n", + "\n", + "\n", + "$$z = 3z_t\\ \\ \\ ,\\ \\ \\ \\theta = 0$$" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\npZeYNm0a1atXp1mzZpx11lkVUfZWef/99xk5ciQ33ngjAMOHD+eLL75g7dq1tGjRgpNOOmmz70/7\nsZa2vuL6l+txJv29WeX8nVxRklQ2/H/q/9x3332xT58+sX///t9pP++88+LcuXNjjDG2a9cuzpkz\np8j3r1ixInbs2HHT88MOOywuXbq0/AreBvn5+fH444+Pv/rVr2KMMc6fPz/ec889m14///zz4zff\nfFPs+7flWCdMmBAff/zxeO+998avv/56K49g80pbX3H9S7Of4n6Xsu1FZhqnRCVJKqVrrrmGE088\n8Ttts2fPZuHChbRo0QKAUaNG0bJlyyLf/+abb9KuXbtNzzt06MA///nP8it4GwwbNoxu3bptev7l\nl18yZswY1q9fD0C9evXYbrvtin3/1h7r559/zpNPPsl5551HixYteP7557fhKIpX2vqK61/e59Qp\nUUlSlTNr1iz+/Oc/f2c9rI2PQwgcdthh9OrVq1T7fOONN2jYsCGDBg3i66+/pn79+px77rlF9v3i\niy9o1KjRpueNGjVi5syZW308xdnW41y2bBnVqlVjxx13ZNWqVQAceOCB5Ofn88Mf/pALLriAY445\nhpo1axa7j6091p///OfcdNNNAHz66adUr169XI6ztPUV13+HHXYo13NqYJMklYkQilzvs9Q2/oW7\nNSZNmsSAAQNo3rw51apV4yc/+Qm9e/f+Xr899tiDu+66a1vK/J7Fixczbdo0hgwZAsCRRx7Jj370\nI9q0afO9vl9//TXbb7/9pufbbbcd33zzTYk+p6THCNt+nH//+9/52c9+xlNPPfWd9htvvJGBAwdy\n/fXX87vf/W6z+9iaY/3Pf/7DO++8w7vvvsvkyZMZNGgQt956a7H9t+U4S1vf5vpv7TktCadEJUmV\nxsEHH8yrr77KD37wA2rWrEnv3r154IEHWLx4cbl/dv369TnggAM2PW/RogWjRo0qtm/BYLpmzRoa\nN25cos8pfIxdu3blt7/9LU8++STvvvvuth1EAe+88w6HHnro99pnzpzJuHHjGDVqFC+//DK33347\nb7/9drH72ZpjfeONNzjhhBO44IILOOuss1i4cCHHHHNMuRxnaesrrv+2nNOScIRNklQmtmVkrCzd\neeedLF68mIcffhjITKc1bdr0O30KTqEVtC1Tou3atWP8+PGbnlerVo28vLwi++65555Mnjx50/Nl\n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\nSZISMm/ePPr160d+fj633norJ5xwQtIlSZVKoiNsIYTRIYQpBbap2Z89AWKMv4gxtiAzBXp5krVK\nkor27bffcsopp7B06VKOPfZYbrvttqRLkiqdREfYYoxHl7DrYOBVYACZEbXdC7y2W7atSAMGDNj0\nuGvXrnTt2rWUVUqSihNj5IILLmDSpEm0atWKwYMHU7169aTLknLC2LFjGTt2bIn6pvmmgzYxxs+y\njy8Hjowx9i1w08GhZKZCR+NNB5KUiPvuu4/rrruOunXrMnHiRNq3b590SVLO2txNB2m+hm1gCGFv\nMjcbzAUuAogxfhxCGAp8DKwHLjGVSVLFe+2117jhhhsA+Otf/2pYk8pRakfYyoIjbJJUPj755BMO\nPfRQVqxYwW233fady08kbZ3NjbAZ2CRJpbJs2TIOO+wwPvvsM/r06cPzzz9PtWqpXSVKyhkGNklS\nmVi7di1HH300b731FgceeCBvvvkm9erVS7osqVLIyYVzJUnpEmPkZz/7GW+99RbNmjVj+PDhhjWp\nghjYJEklcscdd/D0009Tt25dXnnlFZo3d81yqaI4JSpJ2qJBgwZx1llnEULgpZdeomfPnkmXJFU6\nTolKkrba6NGj6d+/PwAPPPCAYU1KgCNskqRivf/++3Tu3JlvvvmG6667jnvuuSfpkqRKy7tEJUml\nNmfOHDp16sSiRYvo168fgwYNcvkOqRwZ2CRJpfLll19y5JFH8sknn3DUUUcxYsQIatWqlXRZUqVm\nYJMkldjKlSvp1q0b7733Hu3bt+fNN9+kYcOGSZclVXredCBJKpE1a9bQq1cv3nvvPfbcc09Gjhxp\nWJNSwMAmSQJgw4YNnH766YwbN45mzZoxevRodtlll6TLkoSBTZIE5OXl0b9/f15++WUaN27MqFGj\naN26ddJlScoysElSFZefn89FF13EoEGDqFu3LiNGjKBdu3ZJlyWpAAObJFVhMUauvPJKHnvsMWrX\nrs2rr77KoYcemnRZkgoxsElSFRVj5Prrr+eRRx5hu+2248UXX6RLly5JlyWpCAY2SaqCYozccsst\n3HfffdSoUYNhw4ZxzDHHJF2WpGLUSLoASVLFijFy8803M3DgQKpXr86QIUM44YQTki5L0mYY2CSp\nCokxcuONN3L33XdvCmsnn3xy0mVJ2gIDmyRVETFGbrjhBu69915q1KhhWJNyiIFNkqqAGCNXX301\nDz74IDVq1GDo0KH06dMn6bIklZCBTZIquby8PC688EIef/xxatasydChQ+ndu3fSZUkqBQObJFVi\n69ev5+yzz2bIkCFsv/32vPDCC/zkJz9JuixJpWRgk6RK6ttvv+W0007j5Zdfpn79+rzyyit07tw5\n6bIkbQUDmyRVQitXrqRPnz688cYb7LDDDowcOZKDDz446bIkbSUDmyRVMosXL6ZHjx6899577LLL\nLowcOZL27dsnXZakbWBgk6RKZPbs2RxzzDF89tlntGnThpEjR7LHHnskXZakbeRXU0lSJfHhhx9y\n+OGH89lnn3HggQcyfvx4w5pUSRjYJKkSGD16NEceeSSLFi2iW7dujB07lqZNmyZdlqQyYmCTpBz3\n5JNP0qNHD/773//St29fRowYQYMGDZIuS1IZMrBJUo6KMfKrX/2K/v37s2HDBm644QaeffZZtt9+\n+6RLk1TGvOlAknLQunXruOCCC3jqqaeoVq0aDz/8MJdccknSZUkqJwY2ScoxS5cu5aSTTuKtt96i\nTp06DBkyhJ49eyZdlqRyZGCTpBzy8ccf07NnT2bNmkWzZs0YPnw4HTt2TLosSeXMa9gkKUeMHDmS\nTp06MWvWLA466CAmTZpkWJOqCAObJKVcjJH777+fHj16sHLlSk455RTefPNNmjVrlnRpkiqIgU2S\nUmz16tWcddZZXHvtteTn5/OLX/yC5557jjp16iRdmqQK5DVskpRSc+fOpU+fPrz//vvUrVuXp556\nipNPPjnpsiQlwMAmSSn0z3/+k759+7J06VL23HNPXnzxRfbff/+ky5KUEKdEJSlF8vPzueuuu+je\nvTtLly7l2GOPZdKkSYY1qYozsElSSnz99deceOKJ3HzzzZuuV3v11VfZYYcdki5NUsKcEpWkFHjv\nvfc45ZRTmD17NjvssANPP/00xx9/fNJlSUoJR9gkKUExRh5++GE6derE7NmzOeigg3jvvfcMa5K+\nw8AmSQn56quvOOmkk7jiiitYt24dF110EePHj6dVq1ZJlyYpZZwSlaQETJw4kX79+jFv3jwaNmzI\nn//8Z0499dSky5KUUo6wSVIF2rBhA7fffjudO3dm3rx5HHroobz//vuGNUmb5QibJFWQ2bNnc9ZZ\nZzFhwgQArr/+eu644w5q1qyZcGWS0i71I2whhGtDCPkhhMYF2m4KIcwMIUwPIRyTZH2StCUxRp56\n6ik6dOjAhAkTaNasGaNHj+buu+82rEkqkVSPsIUQdgOOBuYWaNsX6AvsC+wGjAkh7BVjjMlUKUnF\nW7p0KRdffDHPP/88ACeffDJ/+tOfaNKkScKVScolaR9hewC4vlDbicCQGOOGGOMcYCZwSEUXJklb\n8uKLL9KuXTuef/556tWrxxNPPMHf/vY3w5qkUkttYAsh9ALmxxinFnqpOTC/wPMF2TZJSoWvv/6a\ns846iz59+rBkyRK6dOnChx9+yLnnnksIIenyJOWgRKdEQwijgaYFm4AI/AK4mcx0qCTljFdeeYUL\nL7yQhQsXUrt2bQYOHMhll11GtWqp/fexpByQaGCLMRYZyEII+wOtgA9D5p+juwHvhRAOITOi1qJA\n992ybUUaMGDApsddu3ala9eu21q2JH3PkiVLuPLKKxkyZAgAnTp14sknn2TvvfdOuDJJaTV27FjG\njh1bor4hF67VDyHMBjrGGL8OIewHPAMcSmYqdDRQ5E0HIQTvRZBUrmKMPPPMM1x11VUsW7aM2rVr\nc/vtt3PllVdSvXr1pMuTlENCCMQYi7xuItV3iRYQyUyXEmP8OIQwFPgYWA9cYiqTlITZs2dz6aWX\n8o9//AOA7t2786c//Yk99tgj4cokVTY5McK2tRxhk1Qe1q1bx3333cdvfvMb1qxZQ6NGjbj//vu9\nqUDSNqkMI2ySlArjxo3j4osvZvr06QD069eP+++/n1122SXhyiRVZt62JEklsGjRIs455xy6du3K\n9OnT2WuvvRg9ejSDBw82rEkqdwY2SdqMjdOfe++9N3/961+pVasWAwYMYMqUKXTv3j3p8iRVEU6J\nSlIxRo0axZVXXsmMGTMAOOGEE3jggQdo06ZNwpVJqmocYZOkQj799FN69+7Nsccey4wZM9hrr714\n9dVXGT58uGFNUiIMbJKUtWzZMq644gratWvHSy+9RN26dRk4cCBTp06lR48eSZcnqQpzSlRSlbd2\n7VoeeeQRbr/9dpYvX04IgfPPP5/f/OY37LrrrkmXJ0kGNklVV15eHoMHD+aXv/wlc+bMATKL3953\n3320b98+2eIkqQADm6QqJ8bIq6++ys0338zUqVMB2G+//bjnnns47rjjXPxWUup4DZukKuWtt96i\nc+fO9OzZk6lTp7L77rvzxBNPMGXKFHr06GFYk5RKjrBJqhImTpzIbbfdxpgxYwBo0qQJv/jFL7jo\noovYfvvtE65OkjbPwCapUvv3v//NbbfdxsiRIwFo0KABV199Nddccw0NGjRIuDpJKhkDm6RKafz4\n8dxxxx289tprANSvX58rr7ySa665hh122CHh6iSpdAxskiqNGCOjRo3ijjvu4K233gKgbt26XHHF\nFVx77bU0adIk4QolaesY2CTlvLy8PF588UUGDhzI5MmTAWjUqBFXXHEFV1xxhUFNUs4zsEnKWatX\nr+bJJ5/k/vvv5/PPPwdgp5124pprruGSSy7xGjVJlYaBTVLOWbJkCY8++iiPPvooy5YtA6B169Zc\nc801nHfeedSpUyfhCiWpbBnYJOWM9957j4ceeohnn32WdevWAXDwwQdz/fXXc9JJJ1G9evWEK5Sk\n8mFgk5Rq69ev54UXXuChhx5iwoQJAIQQ6NmzJ9dddx1HHnmki91KqvQMbJJSaf78+Tz22GM89thj\nLFy4EMisoXb++edz2WWXscceeyRcoSRVHAObpNTIy8tj1KhR/PGPf+SVV14hPz8fgLZt23L55Zdz\n9tlnU69evYSrlKSKZ2CTlLg5c+bw5JNP8uSTTzJ37lwAatasyamnnspFF11Ely5dnPaUVKUZ2CQl\nYvXq1bzwwgv85S9/4Y033tjU3rp1ay688EL69+/PzjvvnGCFkpQeBjZJFSY/P59x48YxaNAgnn/+\neVauXAnA9ttvz8knn8x5551H165dqVatWsKVSlK6GNgklasYI1OnTmXQoEEMHjyYBQsWbHrt4IMP\n5vzzz+e0006jUaNGCVYpSelmYJNULqZNm8bQoUMZOnQoM2bM2NTeqlUrzjzzTM444wzatm2bYIWS\nlDsMbJLKRIyRjz76iGHDhjF06FCmT5++6bXGjRtz2mmnceaZZ9KpUydvIJCkUjKwSdpqeXl5TJw4\nkRdffJEXX3yRWbNmbXqtcePG9OnTh759+9KtWzdq1qyZYKWSlNsMbJJKZcWKFYwePZoRI0YwfPhw\nli5duum1nXbaiZ49e9K3b1+OOuooQ5oklREDm6TNijEybdo0RowYwYgRI5gwYQIbNmzY9Pqee+5J\n79696d27N506dfL7PCWpHBjYJH3PggULeP311xkzZgxjxozhP//5z6bXqlevTufOnenRowfHH388\n7dq185o0SSpnBjZJLF68mDfffJM333yTN954g48//vg7rzdt2pTjjjuOHj16cPTRR7sEhyRVMAOb\nVMXEGJkzZw4TJ07kzTffZNy4cXzyySff6VO3bl26du1K9+7d6d69u6NokpQwA5tUya1atYp3332X\nt99+m7fffpt//etfLF68+Dt96tSpw+GHH06XLl3o0qULhx56KNttt11CFUuSCjOwSZXI6tWr+eCD\nD3j33XeZPHky7777LtOnTyc/P/87/Zo0aUKnTp340Y9+RJcuXTjooIO8o1OSUszAJuWg/Px85syZ\nw5QpU5gyZQpTp05lypQpzJw5kxjjd/pWr16dDh060KlTp01bmzZtnOKUpBxiYJNS7JtvvuHzzz/n\nk08+YcaMGUyfPp0ZM2bwySefsGbNmu/1r169Ou3ateOggw7ihz/8IQcddBDt27endu3aCVQvSSor\nBjYpQWvWrOGLL75g3rx5zJ8/nzlz5vD5559v2pYsWVLse3fddVcOOOAA2rdvv2lr27YttWrVqsAj\nkCRVBAObVMa+/fZbli1bxldffcWyZcv48ssvWbRo0Xe2//znP3zxxRd8+eWXm91XrVq1aN26Nfvs\nsw9t27albdu27Lvvvuyzzz4urSFJVYiBTVXe119/zauvvkp+fj55eXmbtvz8fDZs2MDatWv59ttv\nv7OtWrWKlStX8t///nfTzxUrVvDVV18VOVVZnBo1arDbbrvRokULdt99d1q0aMGee+65aWvevDnV\nqlUrx6OXJOWCUPgC5cokhBAr8/GpbEyZMoUOHTqU2f5q1qxJkyZNaNKkCY0bN2bHHXdk1113ZZdd\ndtm0NW3alN13352mTZsayCRJAIQQiDEWeUeYI2yq8ho3bswZZ5xB9erVqVat2nd+Vq9ene233/57\nW506dWjQoAH169f/zs/GjRtTt25d78CUJJUpR9gkSZJSYHMjbM7FSJIkpZyBTZIkKeUMbJIkSSln\nYJMkSUq51Aa2EMJtIYQvQgjvZbefFHjtphDCzBDC9BDCMUnWKUmSVN5SG9iy7o8xdsxurwGEEPYF\n+gL7AscBvw8pWUNh7NixSZegbeD5y12eu9zm+cttnr+KkfbAVlQQOxEYEmPcEGOcA8wEDqnQqorh\nH9rc5vnLXZ673Ob5y22ev4qR9sB2WQjhgxDCYyGEhtm25sD8An0WZNskSZIqpUQDWwhhdAhhSoFt\navZnT+D3wB4xxh8Ai4D7kqxVkiQpKTnxTQchhJbA8Bhj+xDCjUCMMf42+9prwG0xxn8X8b70H5wk\nSVJWzn2XaAhhlxjjouzTk4CPso9fBp4JITxAZiq0DfBOUfso7qAlSZJySWoDG3B3COEHQD4wB7gQ\nIMb4cQhhKPAxsB64xC8MlSRJlVlOTIlKkiRVZWm/SzQnhBDuzi7i+0EIYVgIoUGB11zkN+VCCD8J\nIcwIIXwaQvh50vVo80IIu4UQ3gghTMveqHRFtn2HEMKoEMInIYSRBe4sV8qEEKplF0R/Ofvcc5cj\nQggNQwh/y/6dNi2EcKjnr2IY2MrGKKBd9o7WmcBNACGE/UjpIr/KCCFUAx4BjgXaAf1CCG2TrUpb\nsAG4JsbYDugEXJo9ZzcCY2KM+wBvkP09VCpdSeaylo08d7njQWBEjHFfoAMwA89fhTCwlYEY45gY\nY3726b+A3bKPe5HSRX61ySHAzBjj3BjjemAImcWZlVIxxkUxxg+yj78BppP5nTsReCrb7SmgdzIV\nanNCCLsBPYDHCjR77nJAdvboyBjjEwDZv9tW4PmrEAa2snceMCL72EV+06/wOfoCz1HOCCG0An5A\n5h9KTWOMiyET6oCdk6tMm/EAcD1Q8AJqz11uaA0sDSE8kZ3S/n8hhDp4/iqEga2EtrDI78Y+twDr\nY4zPJliqVCWEEOoBzwNXZkfaCt9B5R1VKRNCOB5YnB0h3dzlIZ67dKoBdAQejTF2BFaRmQ71d68C\npHlZj1SJMR69uddDCOeSGeY/qkDzAmD3As93y7YpPRYALQo89xzlgBBCDTJh7ekY40vZ5sUhhKYx\nxsUhhF2AJclVqGIcAfQKIfQAagP1QwhPA4s8dznhC2B+jHFy9vkwMoHN370K4AhbGQgh/ITMEH+v\nGOPaAi+9DJweQtguhNCazSzyq8RMAtqEEFqGELYDTidz3pRufwE+jjE+WKDtZeDc7ONzgJcKv0nJ\nijHeHGNsEWPcg8zv2hsxxrOA4XjuUi877Tk/hLB3tunHwDT83asQrsNWBkIIM4HtgGXZpn/FGC/J\nvnYTcD6ZRX6vjDGOSqZKFScbuB8k8w+Yx2OMAxMuSZsRQjgCeBOYSmbqJQI3k/nH0FAyo9pzgb4x\nxuVJ1anNCyF0Aa6NMfYKITTGc5cTQggdyNwwUhOYBfQHquP5K3cGNkmSpJRzSlSSJCnlDGySJEkp\nZ2CTJElKOQObJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElK\nOQObJElSytVIugBJyhUhhAuAHYF9gKeBlsDOwP7ADTHGBQmWJ6kSCzHGpGuQpNQLIfwMmBJj/HcI\n4WBgNHAusAp4DegRYxyZYImSKjFH2CSpZJrEGP+dfdwCyIsxvhhCqA10jTG+lWBtkio5R9gkqZRC\nCA8Bu8cY+yRdi6SqwZsOJKn0ugFjky5CUtVhYJOkLQghVAshdA8ZOwPtKBDYQgg3JFacpCrBwCZJ\nW3YhMArYC+gLrAa+AAgh9AI+Sq40SVWB17BJ0haEEDoA1wMzgA+BBsBRwBxgdoxxUHLVSaoKDGyS\nJEkp55SoJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElKOQOb\nJElSyhnYJEmSUu7/A9i2e0jPCtaoAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(16,48,0.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks an awful lot like a quarter circle. And what's the radius of the arc? It's $$r = 48 = 3z_t.$$\n", + "\n", + "We can also get a semi-circle out of our simulated trammel by changing to another configuration where $C$ is (near) zero. Here's one example:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nvS8Z0/tyPr0nGdP7kjG9LznDb4/STXNNdhERERGvZozBXsZBG357lK6IiJyvQoUKxMTEOB1DxG+V\nL1+e/fv3e3y9GuETEZFU7lEEp2OI+K3M/g1e7gif9uETERER8XEqfCIiIiI+ToVPRERExMep8ImI\niIj4OBU+ERERkcu0du1aEhISOHv2LOvWrXM6znl0WhYREZF0Tp06xbhx4wgLC+PPP//k2Wef/dfj\nW7duJTIyksGDB2e6jsWLF7Nz504CAwO56qqr6Ny5c07HzpZt27Yxc+ZMJkyYkLrsYtufXl7Z1uzI\n6P3JSEREBDExMZQuXZp33nkHAGstxYsXJyAgIPXI22bNmjF37twcz52eCp+IiEg6Tz75JCNHjiQs\nLIyqVavywAMPUL58ecD1S3z48OHUrl07068/efIkL730Eps3bwagbt263HvvvZQoUSJX8mfV//3f\n/7F+/XqKFSv2r+UX2v70LmdbN2zYwI8//siJEyfo2rXreTmcltn7k5GhQ4fSokULypYtS2BgIAD7\n9+/nrbfe4o477iAgIIBFixZx991353TsDGlKV0REJI1ffvmFw4cPExYWBsDKlSv/VXYWLFhA48aN\nL7iOtWvXUqVKldT7t956K6tXr86ZwJfhmWeeoXXr1v9adrHtTy+727pv3z7ef/99nnjiCcLCwpg/\nf342tyLnZPT+ZCY4OJirr746tewB5M+fn7Zt21KhQgWKFi1KcHAwlStXzqm4F6QRPhER8Tk///wz\n77777r9OYpvyuTGG22+/nVatWmX4tV9++SWhoaF8+OGHnDhxgiJFitClSxcA4uLiCAgIoGTJkpw6\ndSrT1//111//NSpUrFgx9uzZ47kNdLuc7czMhbY/I9nd1ueff54XXngBgN27d/+rKKWXE9vpadHR\n0VhriYuL44YbbqBVq1aULVs29fHJkyfz9NNPO5ZPhU9ERLLEmGyf5P882b2ax8aNGxk1ahTlypUj\nICCAFi1a0KZNm/OeV7FiRcaMGZOt14iNjWXnzp3MmTMHgPr163PnnXdy/fXXs3DhQrp3784HH3xw\nwXWcOHGC/Pnzp97Ply8f8fHxWXr9rG4jXN52ZuZC25+R7Gzrb7/9RnR0NJs3b2bTpk18+OGHDB8+\nPNPn58R2elq3bt2oUaMGANWrV6dhw4aEhoYCrvcoLi6OkJAQx/Kp8ImISJ5x2223sWzZMt566y12\n7dpFmzZteO211+jUqRNXXnmlR16jSJEiVKtWLfV+WFgYK1eu5Pjx49SpUyfL6zh+/Hjq/TNnzlCm\nTJksfW36bWzUqBHjxo3jyiuvpFq1atSsWfPSNugSZbb9mRW+7Gzrl19+yf3330+PHj04ffo0gwYN\nolmzZjm+na+++ioJCQn/WpYyShgREXHBqeuLufXWW1M/L168OFFRUanTwXPnznVsKjeFCp+IiGSJ\nt1xjd/To0cTGxvLGG28ArunA9GUv7RRgWlmZAqxSpQrr169PvR8QEEBSUhLR0dGcPn2a5cuX89VX\nX5GQkMCnn36a4Xquu+46Nm3alHo/Li6O8PDwbG3ja6+9RuPGjQkPDyciIoJZs2Z5ZDszk9n2ZyY7\n23rw4MHUArR48WLuvfdeZs6cmePbOWjQoIs+JztmzZrFZ599lpo5Pj7+X1PUX375JY899liOvHaW\nWWv98ubadBERScvb/28cPXq0HTp0qLXW2p07d9p169bZe+65x3799dcee42EhAR7++23p96/4447\n7N69e//1nFGjRtkXX3wx9f6+fftscnJy6v1Tp07ZatWqpd6/9dZbbWxsrLXW2j179vzrueml38a+\nffvaAwcOWGutveeeey5jyzL2/vvv2y5duqTev9D2p99Oa7O3rVOnTrVTp0611lp777332piYGNuv\nX78c3c7sSv/+WHv++7B+/Xq7Zs0aa6218fHxtkKFCvbUqVOpj1evXt2uWrUqS6+X2b9B9/Js9x4d\npSsiInnChg0bqFatGs2bN6dJkyYsXLiQa665hkaNGnH77bd77HVCQkIYNWoUI0aMYPjw4fTp04fr\nrrsu9fGPP/6YxYsXs3jx4tQjSx944AG+++671OcULFiQQYMG8Z///IeXX36ZgQMHUrp0aQBatmzJ\nqlWrsryNwAUPaLgcb775JtOmTSMqKooXX3yRv/7664Lbn347s7utDz74INu3b2fq1KkMHz6csLAw\nkpOTc2w7syuj9wfOfx/q1avHwYMHmThxIkOHDmXOnDkULFgw9fESJUpQrly5XM+flrFeMkSf24wx\n1l+3XUQkM2mPgswLZs+eTfny5QkLC+Oaa65xOk6WJCcns2bNmoue2iXFG2+8Qf369alcuTJdunTh\no48+yuGEnnMp25qXt9OTMvs36F6e7SOnVPhERCRVXit8ixcvJjExkdtuu+2ydrjPTfPmzaNly5YU\n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\npozTkbyGRvjysB49elC9enUOHDjA2LFjnY4jIiLimISEhNRrz7/44osqex6mET6HffXVV9x5552E\nhITwww8/ULFiRacjiYiI5LqXX36ZESNGULVqVbZu3UpQkKNnjvM6GuHL4+rVq0fnzp05e/Ys/fv3\nxxtKqIiISG7av38/o0ePBuDNN99U2csBKnxe4NVXXyU0NJTPPvuM+fPnOx1HREQk11hr6d27NwkJ\nCXTs2JGGDRs6HcknaUrXS7zzzjv06tWLMmXKsGvXLooVK+Z0JBERkRw3Z84cOnbsSLFixdi1a5f2\n3cuEpnR9RPfu3alXrx6///47gwcPdjqOiIhIjjtx4kTqgRrjx49X2ctBGuHzIjt37qRGjRokJiay\nfv166tWr53QkERGRHNO9e3emTp1KgwYNWL16NQEBGofKjEb4fEiVKlUYNGgQ4Dply99//+1wIhER\nkZyxZs0apk6dSr58+XjnnXdU9nKY3l0vM3ToUK6//np++OEHxowZ43QcERERj0tISKBnz54ADBky\nhJtuusnhRL5PU7peaM2aNTRq1IigoCA2btxI9erVnY4kIiLiMYMGDWL8+PHcdNNNfPfdd4SEhDgd\nyetpStcHNWzYkH79+nHu3Dm6dOlCYmKi05FEREQ8YsOGDUyYMIGAgADef/99lb1cosLnpcaMGcO1\n117Ltm3bUk9GKSIikpedPn2aLl26YK1l0KBB1KlTx+lIfkNTul4sKiqKxo0ba2pXRER8wjPPPMNr\nr71GlSpV2Lx5s0b3LoGmdH1Yo0aN/jW1q6N2RUQkr1q/fj0TJ04kMDBQU7kOUOHzcmPGjKFixYps\n27aNUaNGOR1HRETkksXHx6dO5b7wwgvUqlXL6Uh+R1O6ecD69etp2LAh1lqioqJo0KCB05FERESy\nrFu3bkybNo1bbrmFjRs3ki9fPqcj5Tma0vUDd955Jy+88ALWWjp37swff/zhdCQREZEsWbBgAdOm\nTSN//vzMnj1bZc8hKnx5xMiRI7nttts4cOAAffv2dTqOiIjIRR06dIju3bsDrmvlVqlSxeFE/ktT\nunnI7t27qVGjBqdPn2bWrFl06tTJ6UgiIiIZSk5OplmzZnzxxRfce++9LF26FGOyPSPp9zSl60cq\nVarE66+/DkDv3r3Zv3+/s4FEREQy8dprr/HFF19QqlQppk+frrLnMI3w5THWWtq3b88nn3xC7dq1\nWbdunfaHEBERr7Jx40bq1atHYmIiS5Ys4f7773c6Up6nET4/Y4xh6tSphIWFER0dzeDBg52OJCIi\nkuqPP/6gQ4cOJCYm0q9fP5U9L6ERvjzqm2++oX79+pw7d47FixfTqlUrpyOJiIifSzsLVbNmTb76\n6iudYNlDNMLnp26//XbGjh0LQJcuXYiJiXE4kYiI+LtJkybxySefULRoUebNm6ey50U0wpeHWWtp\n1aoVS5cu5fbbb2ft2rUEBwc7HUtERPxQdHQ0d955J4mJicyfP5/27ds7HcmnaITPjxljeP/997nm\nmmv45ptvGDhwoNORRETEDx0/fpyHHnqIxMREnnzySZU9L6QRPh/w9ddf07BhQxITE3V+PhERyVVJ\nSUncd999REZGUqtWLdavX6+p3BygET6hbt26qefn69atG9u3b3c4kYiI+IsRI0YQGRlJyZIlmT9/\nvsqel9IIn4+w1vLEE0/w/vvvU7FiRTZt2kTx4sWdjiUiIj7sk08+oV27dgQEBPD555/TpEkTpyP5\nLI3wCeD6QXjrrbcIDw/n559/5pFHHiEpKcnpWCIi4qN27drFY489BsCrr76qsuflVPh8SIECBVi4\ncCElSpRg+fLljBw50ulIIiLig/7880/atm1LfHw8Dz/8MM8884zTkeQiNKXrg1atWkXz5s1JTk7m\no48+4uGHH3Y6koiI+IikpCRat27NsmXLuOWWW9iwYQOFChVyOpbP05SunKdp06a89tprADz++ONE\nR0c7nEhERHzFoEGDWLZsGSVKlOCTTz5R2csjNMLno6y19OrViylTplCmTBk2btzI1Vdf7XQsERHJ\nw6ZOnUr37t0JDg5m1apVNGjQwOlIfuNyR/hU+HxYYmIizZo1IyoqivDwcNauXau/xEREJFtWr15N\ns2bNOHfuHNOmTeOJJ55wOpJf0ZSuZCo4OJj58+dz3XXXsWXLFiIiIkhOTnY6loiI5DF79uyhffv2\nnDt3jueee05lLw9S4fNxJUqUYOnSpYSGhrJgwQIGDx7sdCQREclD4uLiuP/++zlx4gQtW7Zk7Nix\nTkeSbFDh8wM33XQT8+fPJygoiPHjx/Pmm286HUlERPKAM2fO0KpVK3bv3s0tt9zCrFmzCAwMdDqW\nZIMKn59o2rQpU6dOBeDJJ59k0aJFDicSERFvlpSUxKOPPsqGDRu4+uqr+eyzzyhSpIjTsSSbVPj8\nSEREBC+99BLWWjp27MjXX3/tdCQREfFC1lqefvppFi5cSGhoKCtWrKBcuXJOx5LLoKN0/Yy1lh49\nejB16lRKlCjB119/zQ033OB0LBER8SITJkxg4MCB5MuXj8jISBo1auR0JL+n07Jkk78WPoBz587R\nqlUrli9fzrXXXsv69eu56qqrnI4lIiJeYPbs2TzyyCMAulqTF9FpWeSSBQUFMW/ePGrVqsUvv/xC\n8+bNOX78uNOxRETEYcuWLSMiIgKA8ePHq+z5EBU+P1W4cGGWL1/OTTfdxI4dO7jvvvs4deqU07FE\nRMQh69at44EHHuDcuXMMHDiQZ5991ulI4kGa0vVzv/76K/Xq1ePAgQM0a9aMTz/9lJCQEKdjiYhI\nLtqyZQuNGzfm5MmTdO/enXfeeQdjsj17KDlAU7pyWa6++mo+//xzSpUqxcqVK+ncuTNJSUlOxxIR\nkVzy008/0aJFC06ePEmHDh14++23VfZ8kAqfUKlSJSIjIylatCgff/wx3bt31yXYRET8QExMDHff\nfTdHjx6lRYsWzJw5UydW9lEqfAJAjRo1WLp0KQUKFOC9996jV69eKn0iIj7swIEDNG7cmIMHD1Kv\nXj0WLFhAvnz5nI4lOUSFT1LVr1+fpUuXkj9/ft5991369euH9nMUEfE9v/76K40bN+aXX36hdu3a\nLFu2jIIFCzodS3KQCp/8S5MmTVIP3Hj77bcZMGCASp+IiA85dOgQjRs35ueff6ZWrVpERkYSGhrq\ndCzJYSp8cp67776bRYsWkS9fPt544w2eeeYZlT4RER9w+PBhmjRpwt69ewkPD2flypUUK1bM6ViS\nC1T4JEMtWrRg4cKFBAcHM3HiRAYNGqTSJyKSh/322280adKE3bt3U716dT7//HOKFy/udCzJJSp8\nkqn77ruP+fPnExQUxIQJE3juuedU+kRE8qDffvuNu+66i59++olbbrmFVatWccUVVzgdS3KRCp9c\nUKtWrZg3bx7BwcH83//9H3369NHRuyIieUhMTAwNGjRg165dVKtWjS+++IISJUo4HUtyma60IVny\n2Wef0b59exISEujcuTPTp08nKCjI6VgiInIBu3fvpmnTphw8eJDw8HAiIyMpWbKk07EkGy73Shsq\nfJJlq1evpmXLlpw6dYr27dsze/ZsnbNJRMRLbd++nWbNmhEbG0u9evVYtmyZjsbNw3RpNck1jRs3\n5vPPPyc0NJQFCxbQpk0bzpw543QsERFJJzo6mkaNGhEbG0vTpk116hVR4ZNLU7duXVavXk3JkiVZ\nvnw59957L3/99ZfTsURExG3NmjXcddddnDhxgtatW7NkyRIKFSrkdCxxmAqfXLIaNWqwdu1aypYt\nS1RUFI0bNyY2NtbpWCIifm/JkiW0aNGC+Ph4OnXqxMcff0z+/PmdjiVewGsLnzHmAWPMDmNMkjEm\nPM3y8saY08aYLe7bW2keCzfGbDfG7DbGTHQmuX+oXLky69ev57rrrmPz5s3ccccd7Nmzx+lYIiJ+\n65133qFNmzYkJCTQo0cPZsyYQXBwsNOxxEt4beEDvgfaAmsyeGyvtTbcfeuTZvnbQFdrbSWgkjGm\neW4E9VcVK1Zkw4YN1KpVi59//pk77riD6Ohop2OJiPgVay0jRoygV69eJCcnM2LECCZPnkxgYKDT\n0cSLeG3hs9b+ZK3dA2R0RMp5y4wxZYAi1tqN7kUzgDY5GFGA0qVLs3r1alq0aMGxY8do3Lgxy5cv\ndzqWiIhfSExMpGvXrrz88ssEBAQwZcoUXnzxRYzJ9sGc4qO8tvBdRAX3dO5qY8yd7mXlgF/TPOdX\n9zLJYYULF+bTTz8lIiKC06dP07JlS95//32nY4mI+LT4+Hhat27Ne++9R4ECBVi8eDHdu3d3OpZ4\nKUfPnGuM+Ry4Mu0iwAJDrbVLMvmyw0CYtfaEe9++RcaYm3M4qlxEcHAw7733HuXKlWP06NE8/vjj\nHDx4kGHDhukvTRERDzty5Aj33XcfmzZtomTJkixdupQ6deo4HUu8mKOFz1p7dza+JhE44f58izFm\nH1AJOARck+apV7uXZWrUqFGpnzdq1IhGjRpdahxJwxjDK6+8wlVXXUX//v0ZMWIEP/74I9OmTdNR\nYiIiHrJ9+3ZatWpFTEwMFStWZMWKFdxwww1OxxIPi4qKIioqymPr8/orbRhjVgPPWWs3u++XBI5b\na5ONMRVxHdRRzVr7hzHmG+BJYCOwDJhkrV2RyXp1pY0ctGTJEjp16kR8fDx16tRh0aJFlClTxulY\nIiJ5Wvr/WxcvXsyVV1558S+UPM9nr7RhjGljjDkI3A4sNcakHAnQANhujNkCzAN6Wmv/cD/WF5gG\n7Ab2ZFb2JOe1bNmSr776irCwML799ltq167Ntm3bnI4lIpInWWsZP348rVu3Tj3HXlRUlMqeZJnX\nj/DlFI3w5Y7Y2Fjatm3L119/TaFChZg9ezatWrVyOpaISJ5x9uxZevXqlXow3H/+8x+GDBmi/aP9\nzOWO8KnwSY5LSEigW7duzJo1C2MM48aN47nnntN/ViIiF3H06FHatWvH+vXrKViwIDNmzKB9+/ZO\nxxIHqPBlkwpf7rLWMnr0aIYNGwbAQw89xNSpUylcuLDDyUREvNOWLVto164dMTExlCtXjk8//ZTw\n8PCLf6H4JBW+bFLhc8bChQuJiIggPj6eKlWq8Mknn+joMhGRdN577z169+7N2bNnqV27NosWLaJs\n2bJOxxIH+exBG+Kb2rVrR3R0NDfeeCM7d+6kVq1aLFmS2SkXRUT8y9mzZ+nZsydPPPFE6udr165V\n2ZPLpsInua5y5cpER0fTtm1bTp48SatWrRg+fDhJSUlORxMRccyBAweoX78+U6ZMISQkhOnTpzN5\n8mRCQkKcjiY+QFO64hhrLa+++ipDhgwhOTmZ5s2bM3v2bK644gqno4mI5KpVq1bx8MMPExcXR4UK\nFViwYIH215N/0ZSu5FnGGJ5//nkiIyMpUaIEkZGR1KhRgw0bNjgdTUQkVyQlJfHyyy/TvHlz4uLi\naN68OZs2bVLZE49T4RPHNW3alC1btlC7dm0OHDhAgwYNGDNmDMnJyU5HExHJMYcOHaJp06aMGDGC\n5ORkhg8fzrJlyyhRooTT0cQHaUpXvMbff//NsGHDGD9+POAqgjNnztQl2UTE5yxbtoyIiAji4uIo\nXbo0M2fOpFmzZk7HEi+m07Jkkwqf91qxYgWPPfYYR48e1X+EIuJTzp49y+DBg5k4cSIAzZo1Y8aM\nGbpEmlyU9uETn9OiRQu+++47mjRpwpEjR2jevDmDBw8mMTHR6WgiItm2Z88e7rjjDiZOnEhQUBDj\nxo1j+fLlKnuSKzTCJ14rKSmJsWPHpu7fEh4ezsyZM7n55pudjiYikmXWWqZPn85TTz1FfHw8FSpU\nYM6cOdSpU8fpaJKHaEo3m1T48o7169fz6KOPEhMTQ0hICGPGjGHAgAEEBGiAWkS822+//UaPHj1Y\nunQpAB06dGDKlCmEhoY6nEzyGk3pis+788472b59O127duXs2bM888wz3HXXXcTExDgdTUQkU/Pm\nzaNq1aosXbqU0NBQZs6cyZw5c1T2xBEa4ZM85dNPP6V79+4cOXKEIkWKMGnSJCIiIjAm23/0iIh4\n1PHjx+nbty9z5swB4O6772b69OlcffXVDieTvEwjfOJXWrVqxY4dO2jbti1//fUXjz/+OG3btuX3\n3393OpqICMuXL6dq1arMmTOHggUL8tZbbxEZGamyJ45T4ZM8p1SpUixYsIAZM2ZQtGhRFi9eTOXK\nlZk2bRoatRURJ8TFxREREcG9997Lb7/9xh133MG2bdvo3bu3ZiDEK6jwSZ5kjKFz5858//333HPP\nPfzxxx9069aNpk2bsnfvXqfjiYifsNYye/ZsKleuzIwZMwgJCWHs2LGsXbuW66+/3ul4Iqm0D5/k\nedZaPvroIwYMGMCxY8fInz8/L730Ek8//TRBQUFOxxMRHxUTE0Pv3r1Zvnw5AA0bNmTKlClUqlTJ\n4WTii7QPn/g9YwydOnVi165dPProoyQkJDBo0CBq167N1q1bnY4nIj4mKSmJ119/nSpVqrB8+XKK\nFSvGu+++y5dffqmyJ15LI3zic1asWEGvXr2IiYkhMDCQ/v37M2rUKJ0KQUQu25YtW+jduzfR0dEA\nPPjgg0yaNEnX/JYcpxE+kXRatGjBjh07GDBgANZaJk6cyI033siHH36ogzpEJFuOHz9O7969qVWr\nFtHR0ZQrV47Fixczb948lT3JEzTCJz5t69at9O3bl6+//hqA+vXr8+abb3LLLbc4nExE8oKkpCSm\nTZvGkCFDiIuLIzAwkAEDBjBy5EiKFi3qdDzxI7q0Wjap8PmP5ORkZsyYwaBBgzh69CiBgYH07duX\nF198kWLFijkdT0S81Lfffku/fv3YtGkTAI0bN+aNN96gSpUqDicTf6QpXZGLCAgIoEuXLuzevZv+\n/ftjrWXSpEnceOONTJs2jaSkJKcjiogXOXLkCN26deP2229n06ZNlCtXjrlz5/LFF1+o7EmepRE+\n8Tvbtm2jX79+rF+/HoBq1aoxYcIEmjVr5nAyEXHS6dOnee211xg7dizx8fEEBwfz7LPPMnToUAoX\nLux0PPFzmtLNJhU+/2atZc6cObzwwgvExMQA0Lx5cyZMmEDVqlUdTiciuSkpKYkZM2YwfPhwDh06\nBMD999/PhAkTuPHGGx1OJ+KiwpdNKnwCkJCQwKRJk3jllVc4efIkAQEBPPHEE7z00kuULVvW6Xgi\nksNWrlzJwIED2b59OwDh4eFMmDCBxo0bO5xM5N9U+LJJhU/SOnbsGC+99BJvv/02586do1ChQjz7\n7LM888wzOn+fiA/atm0bzz//PJGRkQCEhYUxevRoOnbsSECAdm8X76PCl00qfJKR3bt38/zzz7No\n0SIArrjiCgYOHEj//v0pVKiQw+lE5HLt2rWLUaNGMW/ePABCQ0MZMmQITz75JPnz53c4nUjmVPiy\nSYVPLmTdunUMHTqUdevWAVC6dGleeOEFevXqpV8KInnQ3r17efHFF5k9ezbJycmEhITQq1cvhg0b\nRsmSJZ2OJ3JRKnzZpMInF2OtZdWqVQwbNiz1MkrlypVj2LBhPPHEE+TLl8/hhCJyMfv37+fll1/m\ngw8+ICkpieDgYLp168aQIUO4+uqrnY4nkmUqfNmkwidZZa1l6dKlDB8+nG3btgFQoUIFBg8eTERE\nhEb8RLzQ/v37GTduHNOmTSMxMZHAwEAiIiIYPnw4FSpUcDqeyCVT4csmFT65VMnJySxYsIARI0bw\n448/AlC2bFmeffZZevbsqfN0iXiBnTt3Mm7cOGbPnk1SUhLGGB555BFGjBjBDTfc4HQ8kWxT4csm\nFT7JrqSkJObPn8+YMWNSR/yKFy/Ok08+Sf/+/SlRooTDCUX8z7fffsuYMWNYvHgxAIGBgXTs2JEX\nXniBm2++2eF0IpdPhS+bVPjkcllrWb58Oa+88gobNmwAoFChQvTq1Yunn36acuXKOZxQxLel7Gc7\nZswYVq9eDUBISAhdu3blueee49prr3U4oYjnqPBlkwqfeIq1lnXr1jF69OjUc3oFBQXx0EMP8dRT\nT1GrVi2HE4r4lrNnzzJ37lxef/11tmzZAkCRIkXo06cPTz31FGXKlHE4oYjnqfBlkwqf5IQtW7Yw\nduxYFixYQHJyMgD16tXjqaeeok2bNgQFBTmcUCTv+v3335k8eTKTJ08mNjYWgFKlSvHUU0/Rp08f\nihUr5nBCkZyjwpdNKnySk2JiYnjzzTd59913+fPPPwHXmfz79+9P165dKV68uMMJRfKOzZs38/rr\nrzNnzhwSExMBuOWWWxgwYACdOnXSkfLiF1T4skmFT3JDfHw8H3zwAa+//jp79uwBoGDBgjzyyCP0\n7NmTmjVrOpxQxDudPXuWhQsX8tZbb7F+/XrA9QuvdevWDBgwgIYNG2JMtn/3ieQ5KnzZpMInuSk5\nOZnly5czceJEVq1albo8PDycnj170rFjR4oUKeJgQhHv8OOPP/Luu+/ywQcfEBcXB0DRokXp2rUr\n/fr1o2LFig4nFHGGCl82qfCJU3bt2sWUKVP44IMPOHHiBACFCxemU6dO9OzZk/DwcIcTiuSuM2fO\nsOlBxAsAAAxrSURBVGDBAqZMmZJ6OUOA6tWr06NHDx599FH9QSR+T4Uvm1T4xGkJCQnMnz//vF9y\nNWvWJCIigocffphSpUo5mFAk51hr2bp1Kx988AEzZ85M/eOnUKFCdOrUiR49elCzZk1N24q4qfBl\nkwqfeJMffvghdRor5RdfUFAQLVq04LHHHqNly5baMV18QkxMDLNnz+bDDz/khx9+SF1es2ZNevTo\nod0bRDKhwpdNKnzijRISEli8eDEzZ85kxYoVJCUlARAaGsqDDz5I586dufPOOwkICHA4qUjW/fHH\nH8yfP58PP/yQNWvWpC4vWbIkHTt2pEuXLtqVQeQiVPiySYVPvF1sbCxz5szh/9u7+5i66juO4+9v\nkdbWpmKtbekTtrcqpSYCZrTQTgtsVUtitaAxW8jMsodkj9mSabZ/9B8T98eybH/snz0kDp1OaGar\nND6BpCpUGVz6BFSXPkyqZbW1jq6KU777457eQuF2G1JOOefzSm44nHvbfO8333vvh9+55966ujo6\nOjrS+/Py8qipqaGmpoY1a9bokJdckgYGBtixYwf19fU899xzDA4OAnD55ZezefNmamtr2bhxI9nZ\n2SFXKjI1KPCNkwKfTCXd3d3U1dXxxBNP8M4776T3L126lOrqampqaigtLdXKn4Tq1KlTPPvss2zd\nupXnn38+HfLMjPLycmpra9myZQtz5swJuVKRqUeBb5wU+GQqGhoaoq2tjYaGBhoaGujr60tfl5ub\nS3V1NVu2bGH9+vVaOZFJ8f7777Nt2za2bt3Kyy+/nP5gZEh9y0x1dTX33HMPS5YsCbFKkalPgW+c\nFPhkqhsaGqK9vZ36+noaGho4cuRI+rorr7yS2267jaqqKu644w6d7SsTxt3ZvXs3jY2N7Nixg127\ndqW/RnDatGnccsst1NTUcPfdd7No0aKQqxWJDgW+cVLgkyhxdzo6Oqivr2f79u309vamrzMz1qxZ\nQ1VVFVVVVRQWFup9f/J/GRgYoKmpKR3y3n333fR12dnZlJeXU11dzV133cX8+fNDrFQkuhT4xkmB\nT6Ls4MGDNDY20tjYyCuvvMInn3ySvi43N5fKykoqKiqoqKggLy8vxErlUvTpp5/S0dFBc3MzTU1N\n7Ny5c8Sh2tzcXDZt2kRVVRWVlZV6T57IJFDgGycFPomL06dPp1dnGhsbR6zOACQSCSoqKqisrKS8\nvFwrNDE0NDTEnj17aG5uprm5mZ07dzIwMJC+3sxYu3YtVVVVbNq0SavEIiFQ4BsnBT6JI3enu7ub\npqYmmpubaWlp4cMPPxxxm9WrV7N+/XrKysooKysjkUjoxT1iBgcH6ezspLW1ldbWVlpaWjh58uSI\n21x33XXpVeCKigrmzZsXUrUiAgp846bAJ5I6dJdMJtMB8LXXXuOjjz4acZtrrrkmHf7Kysq4+eab\nmTlzZkgVy3gcPXqUtrY2WltbaWtro7Ozc8Rhfkh9xM/ZQ/3l5eU6q1bkEqPAN04KfCKjDQ4O0t7e\nng4Hr7/+OsePHx9xm+zsbFavXk1RURHFxcUUFRVx0003MXv27JCqlrPcnb6+PpLJJF1dXSSTSTo6\nOkZ8diOkXjgKCgooLS2ltLSUW2+9lRUrVmglV+QSpsA3Tgp8o7W0tLBhw4awy7jkxLkv7s7BgwfT\nh/5aW1vZu3cv5z92zIzrr78+HQBvvPFGVq1axbJly2L3YdCTNS8ff/wxb731Fvv37yeZTKYvJ06c\nGHXbOXPmsHbtWkpLSykrK6OkpIScnJyLXuNZcX4MXYj6Mjb1ZWyfN/BdNpHFyNSmB9nY4twXMyOR\nSJBIJKitrQVSJ4Hs3r2bRx55hIULF5JMJtm3bx8HDhzgwIEDPPnkk+l/P2vWLG644QYKCgpYtWpV\n+pJIJJg+fXpYd+uimuh5OXHiBL29vfT29tLT05P+eejQoVHBG2Du3LkUFRWlL4WFheTn54cavOP8\nGLoQ9WVs6svFocAnIv+X2bNns27dOkpKSnj44YeB1KHg/fv309nZSVdXF93d3XR3d9Pf359eeRrO\nzFi8eDHLly8f87Jo0SKysrJCuHeT7/Tp0xw+fHjE5dChQ+nt80+mOCsrK4tEIkFBQQGFhYUUFhZS\nVFTE0qVLdWhWREZR4BORz23GjBkUFxdTXFw8Yv8HH3xAT0/PqMuRI0fo6+ujr6+PV199ddT/l5WV\nxYIFC8jNzSU3N5eFCxeO2p47dy45OTnk5ORcUquF7s6ZM2c4deoUJ0+epL+/n2PHjqUv77333ojt\nTIHurCuuuIL8/Hzy8/PTK6T5+fmsXLnykrrfInJpi/V7+MKuQUREROR/pZM2RERERCSjeJ0+JyIi\nIhJDCnwiIiIiERe7wGdmt5tZr5m9ZWYPhl1PmMzssJntNrOkmb0Z7LvKzF40swNm9oKZXRl2nReb\nmf3ezPrNbM+wfRn7YGY/NbO3zazHzDaGU/XFl6EvD5lZn5l1Bpfbh10X+b6Y2RIzazaz/Wa218x+\nEOyP9byM0ZfvB/tjOy9mNsPM3gieX/ea2UPB/rjPSqa+xHZWhjOzacH93x78PnHz4u6xuZAKuH8D\n8oBsoAvID7uuEPtxELjqvH0/Bx4Ith8EHg27zknow3qgENjz3/oAFABJUme4XxvMk4V9HyaxLw8B\nPx7jtqvi0BdgIVAYbM8GDgD5cZ+XC/Ql7vMyK/iZBewCSuI+KxfoS6xnZdj9/RHwOLA9+H3C5iVu\nK3wlwNvufsTd/w08BWwOuaYwGaNXeTcDjwXbjwF3TWpFIXD314APztudqQ93Ak+5+6fufhh4m9Rc\nRU6GvkBqbs63mRj0xd2PuXtXsH0a6AGWEPN5ydCXxcHVcZ6XM8HmDFIvzE7MZwUy9gViPCuQWikH\nNgG/G7Z7wuYlboFvMTD8SyX7OPekFEcOvGRm7Wb2jWDfAnfvh9STODA/tOrCNT9DH86foaPEb4a+\nZ2ZdZva7YYcXYtcXM7uW1AroLjI/buLclzeCXbGdl+DwXBI4Brzk7u1oVjL1BWI8K4FfAj/hXACG\nCZyXuAU+GWmduxeT+oviu2b2RUYOGmP8HlfqQ8pvgBXuXkjqyfoXIdcTCjObDTQAPwxWtPS4Ycy+\nxHpe3H3I3YtIrQKXmNlqNCtj9aWAmM+KmVUB/cFK+YU+a2/c8xK3wHcUWDbs9yXBvlhy9/eCn8eB\nZ0gtB/eb2QIAM1sI/CO8CkOVqQ9HgaXDbherGXL34x68gQT4LecOIcSmL2Z2GalQU+fu24LdsZ+X\nsfqieUlx938CLcDtaFbShvdFs8I64E4zOwg8CVSYWR1wbKLmJW6Brx1YaWZ5ZjYduA/YHnJNoTCz\nWcFf45jZFcBGYC+pftwf3OxrwLYx/4PoMUb+VZWpD9uB+8xsupktB1YCb05WkSEY0ZfgCeesLcC+\nYDtOffkD0O3uvxq2T/MyRl/iPC9mNu/sYUkzmwl8mdR7G2M9Kxn60hvnWQFw95+5+zJ3X0EqmzS7\ney3wLBM0L7H6Ll13/8zMvge8SCrs/t7de0IuKywLgL9Y6ivmLgOecPcXzeyvwNNm9nXgCHBvmEVO\nBjP7E7ABuNrM/k7qbLFHgfrz++Du3Wb2NNAN/Bv4zrC/SiMlQ1/KzawQGAIOA9+G+PTFzNYBXwX2\nBu9BcuBnpM6kG/W4UV/4SoznJRd4zMymkXq9+bO77zCzXcR4Vsjclz/GeFYu5FEmaF701WoiIiIi\nERe3Q7oiIiIisaPAJyIiIhJxCnwiIiIiEafAJyIiIhJxCnwiIiIiEafAJyIiIhJxCnwiIiIiEafA\nJyIiIhJxCnwiIiIiEafAJyIiIhJxCnwiIiIiEafAJyIiIhJxl4VdgIjIVGdm3wLmATcAdUAeMB+4\nEXjA3Y+GWJ6ICObuYdcgIjJlmdk3gT3u/oaZfQF4Cbgf+BfwPLDJ3V8IsUQREa3wiYh8Tle7+xvB\n9jLgM3d/xsxmAhvc/dUQaxMRAbTCJyIyYczs18BSd7877FpERIbTSRsiIhOnHGgJuwgRkfMp8ImI\njJOZTTOzL1nKfGA1wwKfmT0QWnEiIsMo8ImIjN+3gReB64B7gTNAH4CZ3QnsC680EZFz9B4+EZFx\nMrObgJ8AvcBuYA5QARwGDrn74+FVJyJyjgKfiIiISMTpkK6IiIhIxCnwiYiIiEScAp+IiIhIxCnw\niYiIiEScAp+IiIhIxCnwiYiIiEScAp+IiIhIxCnwiYiIiEScAp+IiIhIxCnwiYiIiETcfwDSVBrB\nvMsjiwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,-numpy.pi/2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is so nice. We have reproduced the trajectories that Lanchester found more than a hundred years ago, painstakingly drawing them by hand with a contraption called a \"trammel.\" It must have taken him days!\n", + "\n", + "Here is how the different phugoid curves are drawn in von Kármán's book, _Aerodynamics_ (1957). He never says _how_ he drew them, but we're guessing by hand, also. We did pretty good!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/vonKarman-phugoids.png)\n", + "\n", + "#### Figure 4. Phugoid curves in von Kármán (1957)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the next notebook of this series, we'll look at the differential equation that arises when you consider small perturbations on the horizontal phugoid, and we'll learn to numerically integrate that to get the flight paths." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Lanchester, F. W. _Aerodonetics_, D. van Nostrand Company: New York, 1909. On the public domain. [Get it from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PP1#v=onepage&q&f=false).\n", + "\n", + "2. Milne-Thompson, L. M. _Theoretical Aerodynamics_, Dover 2012 reprint of the revised 1966 edition. [Read on Google Books](http://books.google.com/books?id=EMfCAgAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see section 18.5)\n", + "\n", + "3. Sinha, N. K. and Ananthkrishnan, N. _Elementary Flight Dynamics with an introduction to Bifurcation and Continuation Methods_, CRC Press, 2013. [Read on Google Books](http://books.google.com/books?id=yXL6AQAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see chapter 5)\n", + "\n", + "4. von Kármán, T. _Aerodynamics_, Dover 2004 reprint of the 1957 2nd edition. (see pages 149–151)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Execute this cell to load the notebook's style sheet, then ignore it\n", + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/.ipynb_checkpoints/01_02_Phugoid_Oscillation-checkpoint.ipynb b/01_phugoid/.ipynb_checkpoints/01_02_Phugoid_Oscillation-checkpoint.ipynb new file mode 100644 index 0000000..eb6283b --- /dev/null +++ b/01_phugoid/.ipynb_checkpoints/01_02_Phugoid_Oscillation-checkpoint.ipynb @@ -0,0 +1,949 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth. Partly based on David Ketcheson's pendulum lesson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Oscillation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome back! This is the second IPython Notebook of the series _\"The phugoid model of glider flight\"_, the first learning module of the course [**\"Practical Numerical Methods with Python.\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about)\n", + "\n", + "In the first notebook, _\"Phugoid Motion\"_, we described the physics of an aircraft's oscillatory trajectory, seen as an exchange of kinetic and potential energy. This analysis goes back to Frederick Lanchester, who published his book _\"Aerodonetics\"_ on aircraft stability in 1909. We concluded that first exposure to our problem of interest by plotting the flight paths predicted by Lanchester's analysis, known as _phugoids_.\n", + "\n", + "Here, we will look at the situation when an aircraft is initially moving on the straight-line phugoid (obtained with the parameters $C=2/3$, $\\cos\\theta=1$, and $z=z_t$ in the previous analysis), and experiences a small upset, a wind gust that slightly perturbs its path. It will then enter into a gentle oscillation around the previous straight-line path: a _phugoid oscillation_.\n", + "\n", + "If the aircraft experiences an upward acceleration of $-d^2z/dt^2$, and we assume that the perturbation is small, then $\\cos\\theta=1$ is a good approximation and Newton's second law in the vertical direction is:\n", + "\n", + "$$\\begin{equation}\n", + "L - W = - \\frac{W}{g}\\frac{d^2 z}{dt^2}\n", + "\\end{equation}$$\n", + "\n", + "In the previous notebook, we saw that the following relation holds for the ratio of lift to weight, in terms of the trim velocity $v_t$:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}=\\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "This will be useful: we can divide Equation (1) by the weight and use Equation (2) to replace $L/W$. Another useful relation from the previous notebook expressed the conservation of energy (per unit mass) as $v^2 = 2 gz$. With this, Equation (1) is rearranged as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d^2z}{dt^2} + \\frac{gz}{z_t} = g\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look at Equation (3) for a moment. Does it ring a bell? Do you recognize it?\n", + "\n", + "If you remember from your physics courses the equation for _simple harmonic motion_, you should see the similarity! \n", + "\n", + "Take the case of a simple spring. Hooke's law is $F=-kx$, where $F$ is a restoring force, $x$ the displacement from a position of equilibrium and $k$ the spring constant. This results in the following ordinary differential equation for the displacement:\n", + "\n", + "$$\\begin{equation}\n", + " \\frac{d^2 x}{dt^2}= -\\frac{k}{m}x\n", + "\\end{equation}$$\n", + "\n", + "which has the solution $x(t) = A \\cos(\\omega t- \\phi)$, representing simple harmonic motion with an angular frequency $\\omega=\\sqrt{k/m}=2\\pi f$ and phase angle $\\phi$.\n", + "\n", + "Now look back at Equation (3): it has nearly the same form and it represents simple harmonic motion with angular frequency $\\omega=\\sqrt{g/z_t}$ around mean height $z_t$. \n", + "\n", + "Think about this for a moment ... we can immediately say what the period of the oscillation is: exactly $2 \\pi \\sqrt{z_t/g}$ — or, in terms of the trim velocity, $\\pi \\sqrt{2} v_t/g$.\n", + "\n", + "_This is a remarkable result!_ Think about it: we know nothing about the aircraft, or the flight altitude, yet we can obtain the period of the phugoid oscillation simply as a function of the trim velocity. For example, if trim velocity is 200 knots, we get a phugoid period of about 47 seconds—over that time, you really would not notice anything if you were flying in that aircraft.\n", + "\n", + "Next, we want to be able to compute the trajectory of the aircraft for a given initial perturbance. We will do this by numerically integrating the equation of motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare to integrate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to integrate the differential equation and plot the trajectory of the aircraft. Are you ready?\n", + "\n", + "The equation for the phugoid oscillation is a second-order, ordinary differential equation (ODE). Let's represent the time derivative with a prime, and write it like this:\n", + "\n", + "$$\\begin{equation}\n", + "z(t)'' + \\frac{g \\,z(t)}{z_t}=g\n", + "\\end{equation}$$\n", + "\n", + "There's a convenient trick when we work with ODEs: we can turn this 2nd-order equation into a system of two 1st-order equations. Like this:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z'(t) &=& b(t)\\\\\n", + "b'(t) &=& g\\left(1-\\frac{z(t)}{z_t}\\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Are you following? Make sure you are following the derivations, even if it means writing the equations down in your own notes! (Yes, the old-fashioned paper way.)\n", + "\n", + "Another way to look at a system of two 1st-order ODEs is by using vectors. You can make a vector with your two independent variables, \n", + "\n", + "$$\\begin{equation}\n", + "\\vec{u} = \\begin{pmatrix} z \\\\ b \\end{pmatrix}\n", + "\\end{equation}$$\n", + "\n", + "and write the differential system as a single vector equation:\n", + "\n", + "\\begin{equation}\n", + "\\vec{u}'(t) = \\begin{pmatrix} b\\\\ g-g\\frac{z(t)}{z_t} \\end{pmatrix}\n", + "\\end{equation}\n", + "\n", + "If you call the right-hand-side $\\vec{f}(\\vec{u})$, then the equation is very short: $\\vec{u}'(t) = \\vec{f}(\\vec{u})$—but let's drop those arrows to denote vectors from now on, as they are a bit cumbersome: just remember that $u$ and $f$ are vectors in the phugoid equation of motion.\n", + "\n", + "Next, we'll prepare to solve this problem numerically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initial value problems" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's step back for a moment. Suppose we have a first-order ODE $u'=f(u)$. You know that if we were to integrate this, there would be an arbitrary constant of integration. To find its value, we do need to know one point on the curve $(t, u)$. When the derivative in the ODE is with respect to time, we call that point the _initial value_ and write something like this:\n", + "\n", + "$$u(t=0)=u_0$$\n", + "\n", + "In the case of a second-order ODE, we already saw how to write it as a system of first-order ODEs, and we would need an initial value for each equation: two conditions are needed to determine our constants of integration. The same applies for higher-order ODEs: if it is of order $n$, we can write it as $n$ first-order equations, and we need $n$ known values. If we have that data, we call the problem an _initial value problem_.\n", + "\n", + "Remember the definition of a derivative? The derivative represents the slope of the tangent at a point of the curve $u=u(t)$, and the definition of the derivative $u'$ for a function is:\n", + "\n", + "$$u'(t) = \\lim_{\\Delta t\\rightarrow 0} \\frac{u(t+\\Delta t)-u(t)}{\\Delta t}$$\n", + "\n", + "If the step $\\Delta t$ is already very small, we can _approximate_ the derivative by dropping the limit. We can write:\n", + "\n", + "$$\\begin{equation}\n", + "u(t+\\Delta t) \\approx u(t) + u'(t) \\Delta t\n", + "\\end{equation}$$\n", + "\n", + "With this equation, and because we know $u'(t)=f(u)$, if we have an initial value, we can step by $\\Delta t$ and find the value of $u(t+\\Delta t)$, then we can take this value, and find $u(t+2\\Delta t)$, and so on: we say that we _step in time_, numerically finding the solution $u(t)$ for a range of values: $t_1, t_2, t_3 \\cdots$, each separated by $\\Delta t$. The numerical solution of the ODE is simply the table of values $t_i, u_i$ that results from this process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to execute the process described above and find the numerical solution of the ODE, we start by choosing the values $t_1,t_2,t_3 \\cdots t_n$—we call these values our *grid* in time. The first point of the grid is given by our _initial value_, and the small difference between two consecutive times is called the _time step_, denoted by $\\Delta t$. The solution value at time $t_n$ is denoted by $u_n$.\n", + "\n", + "Let's build a time grid for our problem. We first choose a final time $T$ and the time step $\\Delta t$. In code, we'll use readily identifiable variable names: `T` and `dt`, respectively. With those values set, we can calculate the number of time steps that will be needed to reach the final time; we call that variable `N`. \n", + "\n", + "Let's write some code. The first thing we do in Python is load our favorite libraries: NumPy for array operations, and the Pyplot module in Matplotlib, to later on be able to plot the numerical solution. The line `%matplotlib inline` tells IPython Notebook to show the plots inline." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy \n", + "from matplotlib import pyplot\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, initialize `T` and `dt`, calculate `N` and build a NumPy array with all the values of time that make up the grid." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100.0\n", + "dt = 0.02\n", + "N = int(T/dt)+1\n", + "t = numpy.linspace(0.0, T, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have our grid! Now it's time to apply the numerical time stepping represented by Equation (10)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Write the code above using the NumPy function `arange()` instead of `linspace()`. If you need to, read the documentation for these functions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Enter a question mark followed by any function, e.g., `?numpy.linspace`, into a code cell and execute it, to get a help pane on the notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The approximate solution at time $t_n$ is $u_n$, and the numerical solution of the differential equation consists of computing a sequence of approximate solutions by the following formula, based on Equation (10):\n", + "\n", + "$$u_{n+1} = u_n + \\Delta t \\,f(u_n).$$\n", + "\n", + "This formula is called **Euler's method**.\n", + "\n", + "For the equations of the phugoid oscillation, Euler's method gives the following algorithm that we need to implement in code:\n", + "\n", + "\\begin{align}\n", + "z_{n+1} & = z_n + \\Delta t \\, b_n \\\\\n", + "b_{n+1} & = b_n + \\Delta t \\left(g - \\frac{g}{z_t} \\, z_n \\right).\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To apply the numerical solution method, we need to set things up in code: define the parameter values needed in the model, initialize a NumPy array to hold the discrete solution values, and initialize another array for the elevation values." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# initial conditions\n", + "z0 = 100. #altitude\n", + "b0 = 10. #upward velocity resulting from gust\n", + "zt = 100.\n", + "g = 9.81\n", + "\n", + "u = numpy.array([z0, b0])\n", + "\n", + "# initialize an array to hold the changing elevation values\n", + "z = numpy.zeros(N)\n", + "z[0] = z0 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should pay attention to a couple of things: (1) See how there is a dot after the numbers used to define our parameters? We just want to be explicit (as a good habit) that these variables are real numbers, called \"floats.\" (2) We both _created_ and _initialized_ with zeros everywhere the solution vector `z`. Look up the documentation for the handy NumPy function `zeros()`, if you need to. (3) In the last line above, we assign the _initial value_ to the first element of the solution vector: `z[0]`.\n", + "\n", + "Now we can step in time using Euler's method. Notice how we are time stepping the two independent variables at once in the time iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-loop using Euler's method\n", + "for n in range(1,N):\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make sure you understand what this code is doing. This is a basic pattern in numerical methods: iterations in a time variable that apply a numerical scheme at each step." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the code is correct, we have stored in the array `z` the position of the glider at each time. Let's use Matplotlib to examine the flight path of the aircraft.\n", + "\n", + "You should explore the [Matplotlib tutorial](http://matplotlib.org/users/pyplot_tutorial.html) (if you need to) and familiarize yourself with the command-style functions that control the size, labels, line style, and so on. Creating good plots is a useful skill: it is about communicating your results effectively. \n", + "\n", + "Here, we set the figure size, the limits of the vertical axis, the format of tick-marks, and axis labels. The final line actually produces the plot, with our chosen line style (continuous black line)." + ] + }, + { + "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": [ + "pyplot.figure(figsize=(10,4)) #set plot size\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z, 'k-');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Explore and think" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try changing the value of `v` in the initial conditions. \n", + "\n", + "* What happens when you have a larger gust? \n", + "* What about a smaller gust? \n", + "* What happens if there isn't a gust (`v = 0`)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The equation for phugoid oscillations is a 2nd-order, linear ODE and it has an exact solution of the following form:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "z(t) = A \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + B \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $A$ and $B$ are constants that we solve for using initial conditions. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our numerical solution used the initial conditions:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z(0) = z_0 \\\\\n", + "b(0) = b_0\n", + "\\end{eqnarray}$$\n", + "\n", + "Applying these to the exact solution and solving for $A$ and $B$, we get:\n", + "\n", + "$$\\begin{equation}\n", + "z(t) = b_0 \\sqrt{\\frac{z_t}{g}} \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + (z_0-z_t) \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We already defined all of these variables for our numerical solution, so we can immediately compute the exact solution. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The expression is a bit long —if you don't feel like scrolling left and right, you can insert a line break in the code using a backslash '\\' _(without any trailing spaces)_ and Python will treat the next line as a continuation of the first." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot our exact solution! Even better, we can plot _both_ the numerical solution *and* the exact solution to see how well Euler's method approximated the phugoid oscillations.\n", + "\n", + "To add another curve to a plot, simply type a second `pyplot.plot()` statement. We also added a legend using the format\n", + "\n", + "```Python\n", + "pyplot.legend([\"line 1\",\"line 2\"])\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nXZ3JngAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10,4))\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z)\n", + "pyplot.plot(t, z_exact)\n", + "pyplot.legend(['Numerical Solution','Analytical Solution']);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks like pretty good agreement, but what's happening towards the end? We'll come back to this. For now, re-run the previous steps with a different timestep, say $dt=0.01$ and pay attention to the difference.\n", + "\n", + "Euler's method, like all numerical methods, introduces some errors. If the method is *convergent*, the approximation will get closer and closer to the exact solution as we reduce the size of the step, $\\Delta t$. The error in the numerical method should tend to zero, in fact, when $\\Delta t\\rightarrow 0$—when this happens, we call the method _consistent_. We'll define these terms more carefully in the theory components of this course. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compare the two solutions, we need to use a **norm** of the difference, like the $L_1$ norm, for example.\n", + "\n", + "$$ E = \\Delta t \\sum_{n=0}^N \\left|z(t_n) - z_n\\right|$$\n", + "\n", + "The $L_1$ norm is the sum of the individual differences between the exact and the numerical solutions, at each mesh point. In other words, $E$ is the discrete representation of the integral over the interval $T$ of the (absolute) difference between the computed $z$ and $z_{\\rm exact}$:\n", + "\n", + "$$ E = \\int \\vert z-z_\\rm{exact}\\vert dt $$\n", + "\n", + "We check for convergence by calculating the numerical solution using progressively smaller values of `dt`. We already have most of the code that we need. We just need to add an extra loop and an array of different $\\Delta t$ values to iterate through. \n", + "\n", + "You should read the documentation for the function [enumerate](https://docs.python.org/2/library/functions.html#enumerate) and make sure you understand how we're using it below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Warning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The cell below can take a little while to finish (the last $\\Delta t$ value alone requires 1 million iterations!). If the cell is still running, the input label will say `In [*]`. When it finishes, the `*` will be replaced by a number." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-increment array\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001, 0.0001])\n", + "\n", + "# array that will contain solution of each grid\n", + "z_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " N = int(T/dt)+1 # number of time-steps\n", + " ### discretize the time using numpy.linspace() ###\n", + " t = numpy.linspace(0.0, T, N)\n", + "\n", + " # initial conditions\n", + " u = numpy.array([z0, b0])\n", + " z = numpy.empty_like(t)\n", + " z[0] = z0\n", + " \n", + " # time loop - Euler method\n", + " for n in range(1,N):\n", + " ### compute next solution using Euler method ###\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0] # store the elevation at time-step n+1\n", + " \n", + " z_values[i] = z.copy() # store the total elevation calculation grid i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculate the error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical solutions for each $\\Delta t$ in the array `z_values`. To calculate the error corresponding to each $\\Delta t$, we can write a function! " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_error(z, dt):\n", + " \"\"\"Returns the error relative to analytical solution using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " z : array of float\n", + " numerical solution.\n", + " dt : float\n", + " time increment.\n", + " \n", + " Returns\n", + " -------\n", + " err : float\n", + " L_{1} norm of the error with respect to the exact solution.\n", + " \"\"\"\n", + " N = len(z)\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt\n", + " \n", + " return dt * numpy.sum(numpy.abs(z-z_exact))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: in the last line of the function, we perform an 'array operation': \n", + "\n", + "`z - z_exact`\n", + "\n", + "We are *not* subtracting one value from another. Instead, we are taking the difference between elements at each corresponding index in both arrays. Here is a quick example:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 2, 1])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = numpy.array([1, 2, 3])\n", + "b = numpy.array([4, 4, 4])\n", + "\n", + "b - a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we iterate through each $\\Delta t$ value and calculate the corresponding error. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "error_values = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " ### call the function get_error() ###\n", + " error_values[i] = get_error(z_values[i], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remember, *if* the method is convergent then the error should get smaller as $\\Delta t$ gets smaller. To visualize this, let's plot $\\Delta t$ vs. error. If you use `pyplot.plot` you won't get a very useful result. Instead, use `pyplot.loglog` to create the same plot with a log-log scale. This is what we do almost always to assess the errors of a numerical scheme graphically." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nWtIESavUofkys59KukjSFElDJT0gaaGZbStJ7n6pu+/s7ru4e3Pbl4Yssi9f7eb72p626+75rp7r\nuL6z7aL42rq3P7OQ14XOM591Scqy0Nf2Ns9C1pdLnqX4Xe9sHXnm91xf1hVbnP/uZN/s3XaF5tmV\nSJo4d1/o7pPd/XZJ6zvZ5AxJ17n7Ne7+vLuPl/S6pJO7ek8zu1vSrZJGm9krZrZnX+uMw//ZpWri\nVqxY0W0dIcT5L6KunuvNX0RxzrLQ18bhL/a05BmXJo48wzVxpciyqzpCv47f9XCvLWUTF/klRsxs\npaRT3X1mbrm/pI8lHZlr8lq3u1jSTu6e6ePP45ArAABIjK4uMdKv1IXkYUtJG0t6s8P6tyRt3dc3\n7yoIAACAJOHsVAAAgASKYxP3jqR1kgZ3WD9YLXNxAAAAZS92TZy7r5H0uKQDOjy1v1rOUgUAACh7\nkczEmdlASTvkFjeS9BUzGyrpXXd/RdL/SLrezB5RS+N2klrm4S6Pol4AAIC4ieTsVDPLSGrKLbr+\ndX236e7+s9w2J0s6U9IQSX+SdLq731fiUgEAAGIp8kuMIBnMbIWkD9RyXb/33H2/aCtKPjPbRNKz\nkm51919GXU9SmdkgSYvVcmShv6TL3P3iaKtKptwF1a+X9AVJn0j6jbvfFm1VyWZmsyUNl9To7kdE\nXU8SmdlBki5Uy5G789z9mohLig2aOOTFzF6S9C13/39R15IWZvZbSZWSXnb3M6OuJ6nMbCNJ/d29\nOdcYPyNpD3d/O+LSEsfMtpa0lbs/bWaD1TKfvIO7r4q4tMQys+GSNpV0HE1c4cysn1p+pzOSVkp6\nQtL33P29KOuKi9id2IBY4xp7gZjZDpK+LmmhyLVP3H19m9vvfVbSaknN3bwEXXD3N9z96dyf31TL\n1QK2iLaqZHP3pZI+irqOBNtD0jPu/rq7fyRpgTY88bFs0cQhXy7pXjN7xMyOirqYFLhA0llRF5EW\nZraZmT0l6WVJU919ZdQ1JZ2Z7SppI3d/LepaUNa2kdR2H3xV0hcjqiV24njHBsTTD9z99dzhlrvN\n7E/u/qeoi0oiMztE0gvu/lcz2zvqetLA3T+Q9F0z20rSEjNrcPe/Rl1XUpnZFpJmSBoXdS0oe8x8\ndYNv4lLIzIaZ2Vwze9XM1pvZcZ1sc4qZvWRmq8zssbbNRO65ZWb2hJlVSJK7v5773zfU8nX2LqX6\nPFErQp57SjoyN2d4gaQTzGxy6T5RtIqxf7Zy97ckZSUNLfoHiYFiZGlmAyTNlnSuuz9Uuk8TvSLu\nm2XbiPQ1U0n/UPtv3r6k9t/MlTWauHQaKOlpSRMkrVKHv0DM7KeSLpI0RS3/sXtA0sLcmWly90vd\nfWd336V1WNzMNs299nOSfijpzyX7NNELmqe7n+3uX3b3r0r6v5KucvcpJfw8UQu9f27VZv/cTNI+\nufcvB6GzNEnTJTW5+42l+xixETTPti8tRfEx1adMJT0qaScz2yb3358DJd1Votrjz915pPihlrN5\nju2w7mFJV3RY94Kk33XxHl+V9GTu8SdJ1VF/riTn2WG74ySdH/XnSnKeknaXtCy3fy7r+H7l8giU\n5d5que3hE7ksl6nlrPTIP18S88w9f7ektyR9LOkVSXtG/dmSlqmkgyU9L+lFSeOi/hxxejATV2bM\nrL9aDoWe3+GpBkl7dfYad39JZXJ4qlC9ybMtd59RjLqSqpf756OSdi5yaYnTyyzvk7RxkUtLpN7+\nrrv7iGLWlWT5Zuru8yTNK2FpicHh1PKzpVr+kn6zw/q31HJrMxSGPMMiz3DIMizyDI9M+4gmDgAA\nIIFo4srPO2qZeRncYf1gSa+XvpzEI8+wyDMcsgyLPMMj0z6iiSsz7r5GLbfS6XjF6/3VclYQCkCe\nYZFnOGQZFnmGR6Z9x4kNKWRmAyXtkFvcSNJXzGyopHfd/RVJ/yPpejN7RC2/KCepZf7g8ijqjTvy\nDIs8wyHLsMgzPDItsqhPj+UR/qGWGwWvzz3WtfnztW22OVnSS2q5x+SjkvaOuu64PsiTPOP6IEvy\njPuDTIv7sFyAAAAASBBm4gAAABKIJg4AACCBaOIAAAASiCYOAAAggWjiAAAAEogmDgAAIIFo4gAA\nABKIJg4AACCBaOIAAAASiCYOAApkZgPM7AUz+0HUtQAoXzRxAFC4EyVtLmlKdxuZ2cZm9pyZbVOa\nsgCUE5o4ACiAmW0i6euSzpY03MxGdLP5rpK2cPd/lKQ4AGWFJg4ACnOKpEskXStpuaTfdLPtvpKa\nSlEUgPJDEwcAeTKz/yPpi+7+rLuvk1QnaU8zO6jDdj82s/+VdLqkz5nZ/5rZ1yMoGUCKmbtHXQMA\nJIKZ/UrSLe7+t9yySfqTpDXuvkuHbftLek/SLu7+QsmLBZB6fBMHAHkwsy0kbd7awEmSt/wr+BxJ\nQ81sTIeX/EDShzRwAIqFJg4A8lMt6Q8dV7r7HZKekFSX+2au1f6SsqUpDUA5ookDgB6Y2WBJ/d39\ntS42+S9J35R0VJt1I5Rr4sxsbzMbUNQiAZQdZuIAoAe5kxQelPRWN5tNl7RG0o7uvs7MPpa0l6Tn\nJE109/OKXiiAskITBwDdMLOtJb0kKZ9v0lzSz9x9hpldKGmtpLclXeHuHxexTABliCYOAAAggZiJ\nAwAASCCaOAAAgASiiQMAAEggmjgAAIAEookDAABIIJo4AACABKKJAwAASCCaOAAAgAT6/wsNBajn\noDeVAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10, 6))\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase tick font size\n", + "pyplot.grid(True) #turn on grid lines\n", + "pyplot.xlabel('$\\Delta t$', fontsize=16) #x label\n", + "pyplot.ylabel('Error', fontsize=16) #y label\n", + "pyplot.loglog(dt_values, error_values, 'ko-') #log-log plot\n", + "pyplot.axis('equal') #make axes scale equally;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the kind of result we like to see! As $\\Delta t$ shrinks (towards the left), the error gets smaller and smaller, like it should." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We calculated the error for several different timestep sizes using two nested `for` loops. That worked, but whenever possible, we like to re-use code (and not just copy and paste it!). \n", + "\n", + "Create a function that implements Euler's method and re-write the error analysis cell to use your function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/.ipynb_checkpoints/01_03_PhugoidFullModel-checkpoint.ipynb b/01_phugoid/.ipynb_checkpoints/01_03_PhugoidFullModel-checkpoint.ipynb new file mode 100644 index 0000000..742302d --- /dev/null +++ b/01_phugoid/.ipynb_checkpoints/01_03_PhugoidFullModel-checkpoint.ipynb @@ -0,0 +1,929 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, I. Hawke. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Full phugoid model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the third IPython Notebook of the series on the _phugoid model of glider flight_, our first learning module of the course [\"Practical Numerical Methods with Python\"](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about). In the first notebook, we described the physics of the trajectories known as phugoids obtained from an exchange of potential and kinetic energy in an idealized motion with no drag. We gave you a neat little code to play with and plot various phugoid curves.\n", + "\n", + "In the second notebook, we looked at the equation representing small perturbations on the straight-line phugoid, resulting in simple harmonic motion. This is a second-order ordinary differential equation, and we solved it numerically using **Euler's method**: the simplest numerical method of all. We learned about convergence and calculated the error of the numerical solution, comparing with an analytical solution. That is a good foundation!\n", + "\n", + "Now, let's go back to the dynamical model, and take away the idealization of no-drag. Let's remind ourselves of the forces affecting an aircraft, considering now that it may be accelerating, with an instantaneous upward trajectory. We use the designation $\\theta$ for the angle, and consider it positive upwards." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces-lesson3.png)\n", + "#### Figure 1. Forces with a positive trajectory angle." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Figure 1, $L$ is the lift, $W$ is the weight, $D$ is the drag, and $\\theta$ the positive angle of the trajectory, instantaneously. \n", + "\n", + "In lesson 1, we wrote the force balance in the directions perpendicular and parallel to the trajectory for a glider in _equilibrium_. What if the forces are _not_ in balance? Well, there will be acceleration terms in the equations of motion, and we would have in that case:\n", + "\n", + "\\begin{align}\n", + "m \\frac{dv}{dt} & = - W \\sin\\theta - D \\\\\n", + "m v \\, \\frac{d\\theta}{dt} & = - W \\cos\\theta + L\n", + "\\end{align}\n", + "\n", + "We can use a few little tricks to make these equations more pleasing. First, use primes to denote the time derivatives and divide through by the weight:\n", + "\n", + "\\begin{align}\n", + " \\frac{v'}{g} & = - \\sin\\theta - D/W \\\\\n", + "\\frac{v}{g} \\, \\theta' & = - \\cos\\theta + L/W\n", + "\\end{align}\n", + "\n", + "\n", + "Recall, from our first lesson, that the ratio of lift to weight is known from the trim conditions—$L/W=v^2/v_t^2$— and also from the definitions of lift and drag, \n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "we see that $L/D=C_L/C_D$. The system of equations can be re-written:\n", + "\n", + "\\begin{align}\n", + " v' & = - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\\n", + " \\theta' & = - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v\n", + "\\end{align}\n", + "\n", + "It is very interesting that the first equation has the factor $C_D/C_L$, which is the inverse of a measure of the aerodynamic efficiency of the aircraft. It turns out, this is the term that contributes damping to the phugoid model: if drag is zero, there is no damping. Drag is never zero in real life, but as engineers design more aerodynam-ically efficient aircraft, they make the phugoid mode more weakly damped. At altitude, this is nothing but a slight bother, but vertical oscillations are unsafe during final approach to land, so this is something to watch out for!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The initial value problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to visualize the flight trajectories predicted by this model, we are going to need to integrate the spatial coordinates, which depend on both the forward velocity (tangential to the trajectory) and the trajectory angle. The position of the glider on a vertical plane will be designated by coordinates $(x, y)$ with respect to an inertial frame of reference, and are obtained from:\n", + "\n", + "\\begin{align}\n", + "x'(t) & = v \\cos(\\theta) \\\\\n", + "y'(t) & = v \\sin(\\theta).\n", + "\\end{align}\n", + "\n", + "Augmenting our original two differential equations by the two equations above, we have a system of four first-order differential equations to solve. We will use a time-stepping approach, like in the previous lesson. To do so, we do need *initial values* for every unknown:\n", + "\n", + "$$\n", + "v(0) = v_0 \\quad \\text{and} \\quad \\theta(0) = \\theta_0\\\\\n", + "x(0) = x_0 \\quad \\text{and} \\quad y(0) = y_0\n", + "$$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solve with Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We know how to apply Euler's method from the previous lesson. We replace each of the time derivatives by an approximation of the form:\n", + "\n", + "$$v'(t) \\approx \\frac{v^{n+1} - v^n}{\\Delta t},$$\n", + "\n", + "where we are now using a superscript $n$ to indicate the $n$-th value in the time iterations. The first differential equation, for example, gives:\n", + "\n", + "$$\\frac{v^{n+1} - v^n}{\\Delta t} = - g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2$$\n", + "\n", + "Alright, we know where this is going. At each time iteration $t^n$, we want to evaluate all the known data of our system to obtain the state at $t^{n+1}$—the next time step. We say that we are _stepping in time_ or _time marching_.\n", + "\n", + "The full system of equations discretized with Euler's method is:\n", + "\n", + "\\begin{align}\n", + "v^{n+1} & = v^n + \\Delta t \\left(- g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2 \\right) \\\\\n", + "\\theta^{n+1} & = \\theta^n + \\Delta t \\left(- \\frac{g}{v^n}\\,\\cos\\theta^n + \\frac{g}{v_t^2}\\, v^n \\right) \\\\\n", + "x^{n+1} & = x^n + \\Delta t \\, v^n \\cos\\theta^n \\\\\n", + "y^{n+1} & = y^n + \\Delta t \\, v^n \\sin\\theta^n.\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we've learned before, the system of differential equations can also be written as a vector equation:\n", + "\n", + "$$u'(t) = f(u)$$\n", + "\n", + "where\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix}.\n", + "\\end{align}\n", + "\n", + "It's a bit tricky to code the solution using a NumPy array holding all your independent variables. But if you do, a function for the Euler step can be written that takes any number of simultaneous equations. It simply steps in time using the same line of code:\n", + "\n", + "```Python\n", + "def euler_step(u, f, dt):\n", + " return u + dt * f(u)\n", + "```\n", + "\n", + "This function can take a NumPy array `u` with any number of components. All we need to do is create an appropriate function `f(u)` describing our system of differential equations. Notice how we are passing a _function_ as part of the arguments list to `euler_step()`. Neat!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we start by loading the modules and libraries that we need for this problem. We'll need a few transcendental functions, including the $\\log$ for a convergence study later on. And remember: the line `%matplotlib inline` is a magic function that tells Matplotlib to give us the plots in the notebook (the default behavior of Matplotlib is to open a pop-up window). In addition, we are importing the module `rcParams` to define notebook-wide plotting parameters: font family and size. Here we go!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log, ceil\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to set things up to start our numerical solution: the parameter \n", + "values and the _initial values_. You know what the acceleration of gravity is: 9.8 m/s$^2$, but what are good values for $C_D/C_L$, the inverse of the aerodynamic efficiency? Some possible values are given on a table in the Wikipedia entry for [lift-to-drag ratio](http://en.wikipedia.org/wiki/Lift-to-drag_ratio): a modern sailplane can have $L/D$ of 40 to 60, depending on span (and, in case you're interested, a flying squirrel has $L/D$ close to 2).\n", + "\n", + "For the _trim velocity_, the speed range for typical sailplanes is between 65 and 280 km/hr, according to Wikipedia (it must be right!). Let's convert that to meters per second: 18 to 78 m/s. We'll pick a value somewhere in the middle of this range.\n", + "\n", + "Here's a possible set of parameters for the simulation, but be sure to come back and change some of these, and see what happens!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 30.0 # trim velocity in m s^{-1} \n", + "C_D = 1/40 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = v_t # start at the trim velocity (or add a delta)\n", + "theta0 = 0 # initial angle of trajectory\n", + "x0 = 0 # horizotal position is arbitrary\n", + "y0 = 1000 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll define a function `f()` to match the right-hand side of Equation (15), the full differential system in vector form. This function assumes that we have available the parameters defined above. If you re-execute the cell above with different parameter values, you can just run the solution without re-executing the function definition." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the code defining function `f(u)` with the differential equations, and convince yourself that it's right!\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix} \\nonumber\n", + "\\end{align}\n", + "\n", + "Now, Euler's method is implemented in a simple function `euler_step()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equations.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After defining a final time for the solution, and the time step $\\Delta t$, we can construct the grid in time using the NumPy function [`linspace()`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html). Make sure you study the decisions we made here to build the time grid: why do we add 1 to the definition of `N`, for example?\n", + "\n", + "Look at the code below, and make sure you understand the following aspects of it.\n", + "\n", + "* The NumPy array `u` contains the solution at every time-step, consisting of the velocity, angle and location of the glider. \n", + "* The first element of the array `u` is set to contain the initial conditions. \n", + "* In the `for`-loop, the function `euler_step()` is called to get the solution at time-step $n+1$. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100 # final time\n", + "dt = 0.1 # time increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u = numpy.empty((N, 4))\n", + "u[0] = numpy.array([v0, theta0, x0, y0])# fill 1st element with initial values\n", + "\n", + "# time loop - Euler method\n", + "for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to plot the path of the glider, we need the location (`x`, `y`) with respect to time. That information is already contained in our NumPy array containing the solution; we just need to pluck it out. \n", + "\n", + "Make sure you understand the indices to `u`, below, and the use of the colon notation. If any of it is confusing, read the Python documentation on [Indexing](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the glider's position with respect to the time\n", + "x = u[:,2]\n", + "y = u[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to plot the path of the glider and get the distance travelled!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nnMGDB7Np0ybGjx9PcXExr7zyStwh5h0dAamBjoCIiNRPs2fPZvTo0VRUVNCgQQPGjh3LuHHjaNAg\nv3831xRMQqgAERGpv7Zu3cq4ceO4+eabcXeGDBnC5MmT83pKRlMwUqfo/PpolKfolKtolKfoMuVq\nr7324i9/+QszZ86kRYsWPPHEE/Ts2ZOPP/449wHmGRUgIiKS9372s59RXl5Ohw4dWLBgAb1792bd\nunVxh1WvaQqmBpqCERHJHx999BF9+vRhyZIldOzYkbKysrw7VVdTMCIiIjl24IEHUlpaSnFxMcuX\nL2fAgAF8+eWXcYdVL6kAkazQPHQ0ylN0ylU0ylN0UXPVunVrXnzxRTp27MjixYs588wz2bJlS+0G\nl4dUgIiIiKRp1aoVM2fOpE2bNpSVlTFixIgab3Ynu0drQGqgNSAiIvmroqKCnj178uWXXzJ27Fiu\nu+66uEOqdboOSEKoABERyW+zZs1iwIABVFZW8thjj3H22WfHHVKt0iJUqVM0Dx2N8hSdchWN8hTd\nnuaqX79+3HzzzQCMHDmSRYsWZTGq/KUCREREpAa//e1vufDCC9m8eTNnnnkmn376adwh1XmagqmB\npmBERARgy5Yt9OrVi1dffZX+/fszY8aMennfGE3BiIiIJMjee+/N1KlT2X///Xnuuee44YYb4g6p\nTlMBIlmheeholKfolKtolKfospGrdu3a8eCDD2JmjB8/nhdeeOGHB5anVICIiIjshv79+zN27Fjc\nnfPPP58PPvgg7pDqJK0BqYHWgIiISLrt27czYMAAnn/+eXr06EFZWRkFBQVxh5UVWgMiIiKSUA0b\nNmTKlCkccsghzJ8/nyuvvDLukOocFSCSFZqHjkZ5ik65ikZ5ii7buWrdujWPPfYYjRo1YsKECUyf\nPj2r+6/vVICIiIjsoR49enzvImXLly+POaK6Q2tAaqA1ICIisivuzjnnnMPjjz9Oly5dKC8vp1mz\nZnGHtce0BkRERKQOMDMmTZpE586dWbp0KSNHjkS/uNZMBYhkheaho1GeolOuolGeoqvNXDVr1own\nn3ySFi1aMH36dP785z/X2mfVFypAREREsqBjx45MmTIFM+MPf/gDzz77bNwhJZrWgNRAa0BERGR3\nXH/99YwbN47mzZszb948jjrqqLhD2i25WgOiAqQGKkBERGR3VFZWcs455zBt2jTatm1LeXk5Bx98\ncNxhRaZFqCEz62lmpWb2jpmtMrMZZtY5rc8BZnadmZWb2etm9paZvWZmF2bYX4GZXR/2edPM5pnZ\nSbn7RvWT5qGjUZ6iU66iUZ6iy1WuGjRowOTJk+nRowdr1qzh9NNPZ+PGjTn57Lok0QWImfUCXgRm\nuPsR7t4eWAXMMbNDU7oeD/wn8Gt37+bunYF7gfvN7IK03U4EzgZOdvejgUnALDM7pna/jYiI5Ism\nTZrwz3/+kyOOOIJFixYxePBgNm/eHHdYiZLoKRgzmwO0d/d2KW3NgI+AB9z9V2Fbd+Cn7n5j2vvX\nAy+6+7Bw+0hgKTDK3e9P6fcvYJW7D8wQg6ZgRERkj7z33nucfPLJrFu3jr59+/LUU0/RpEmTuMPa\nJU3BBLoBb6c2uPtGYDVwRkpbeYbiowBoAnyS0jwEMKA07XNKgX5m1jR7oYuISL7r0KEDpaWlHHjg\ngbzwwgsMHjyYr7/+Ou6wEiHpBchXZI6xEjjIzPbJ9CYz2w+4A1gD3JDyUjGwHXg/7S0rgUZAlx8a\ncL7SPHQ0ylN0ylU0ylN0ceWqU6dOvPTSSxxwwAE8//zz9OnTh08++aTmN9ZzSS9AFgJHmVmjqgYz\nawEUhZvNUzubWRMzewv4mKCYGOzuH6R0aQVszjCnsiF83j+bwYuIiAB06dKF0tJS2rVrxyuvvEKP\nHj1YtmxZ3GHFKulrQI4D5gO3AtcQHKW4DRgGFAKt3H19hvc1JliUei0wwt2nh+2zgBPcvUVa/0uA\nu4EB7j4z7TWtARERkaxYu3YtAwcOZMGCBRQWFnLHHXcwYsSIuMP6nlytAWlUc5f4uPtrZtYXuApY\nAnwBPARsAYZnKj7C930D3GxmfYC/m9mT7l4JfAoU2s5VRdWRlM8y7W/kyJG0b98egJYtW9K1a1dO\nPfVU4LtDetrWtra1rW1tR9mePXs2l156KY888ggXXnghJSUlTJgwYccRkVzHU/XnVatWkVPuXuce\nQAkwK2W7MdAgQ7+/EqwX6RBuXxlut0vrNxHYCjTNsA+XmpWWlsYdQp2gPEWnXEWjPEWXpFxVVlb6\nvffe602bNnXAmzVr5n/961/9q6++ijs0D//fq/X/yxO9BsTM2plZcVpbC+Bk4O8pzXcD52TYRXuC\nguPzcHs64EDvtH69CQoanaQtIiK1zsy4+OKLefPNNxk0aBAbN25kzJgxtGvXjvHjx+f+aEQMkr4G\nZCQwBjjJ3debWSFwH9DQ3c9K6Xcf0BUY5OGiUzMbCjwKTHH3kSl97yAoOE5y98/M7CLgb8CJ7l6R\nIQZPco5ERKTue/bZZ7nuuusoLy/f0da9e3dOO+00TjnlFI477jgKCwtzEovuBQOY2bHATcARwHqC\nU2inAre4+/aUfkcB/w70JDjisRewieAqp3en9W0EjCe4Guo2gjNgxrj7vGpiUAEiIiK1zt2ZO3cu\nt99+O0899dROV05t164dnTt3pkOHDhQVFXH44YdTVFREUVERLVu2zFocKkASQgVINGVlZTsWNkn1\nlKfolKtolKfo6lKuNm3axMyZM5k9ezZz5sxhyZIlbNu2rdr+++67745ipKioiOLiYvr27UubNm12\n+7N1FoyIiEieKiwsZOjQoQwdOhSAb7/9lhUrVvD222+zYsUKVq5cueN55cqVrF+/nvXr17NgwYLv\n7adr165ceOGFDB8+nNatW8fxVaqlIyA10BEQERFJMnfnk08++V5hMn/+fMrKynZM4xQUFDBq1Ciu\nueYaDj300F3uT1MwCaECRERE6qKtW7dSUlLCvffeS0lJCe5O48aNueKKKxg7dix77713xvfpZnRS\np6Re0EaqpzxFp1xFozxFl2+52muvvRgyZAjPPPMMS5Ys4bzzzmPbtm3ceOONdO3alVdeeSXW+FSA\niIiI1HOdO3fm4YcfZu7cuXTq1Illy5bRs2dPJk6cSFxH+TUFUwNNwYiISH2yZcsWrr76am699VYA\nRowYwT333EPjxo0BrQFJDBUgIiJSHz366KOMGjWKTZs28fOf/5xp06ZRWFioNSBSt+Tb3OqeUp6i\nU66iUZ6iU66+79xzz2XOnDm0bt2amTNn0rdvX7788sucfb4KEBERkTz1k5/8hLlz53LYYYdRXl5O\n//79c/bZmoKpgaZgRESkvlu9ejW9evVi9erVAJqCERERkdp32GGHUVpayoknnpizz1QBIlmhudVo\nlKfolKtolKfolKtdKyoqYt68jPdlrRUqQERERAQITsHN2WdpfcOuaQ2IiIjkE52GKyIiIvWWChDJ\nCs2tRqM8RadcRaM8RadcJYsKEBEREck5rQGpgdaAiIhIPtEaEBEREam3VIBIVmhuNRrlKTrlKhrl\nKTrlKllUgIiIiEjOaQ1IDbQGRERE8onWgIiIiEi9pQJEskJzq9EoT9EpV9EoT9EpV8miAkRERERy\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualization of the path\n", + "pyplot.figure(figsize=(8,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'x', fontsize=18)\n", + "pyplot.ylabel(r'y', fontsize=18)\n", + "pyplot.title('Glider trajectory, flight time = %.2f' % T, fontsize=18)\n", + "pyplot.plot(x,y, 'k-', lw=2);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grid convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's study the convergence of Euler's method for the phugoid model. In the previous lesson, when we studied the straight-line phugoid under a small perturbation, we looked at convergence by comparing the numerical solution with the exact solution. Unfortunately, most problems don't have an exact solution (that's why we compute in the first place!). But here's a neat thing: we can use numerical solutions computed on different grids to study the convergence of the method, even without an analytical solution.\n", + "\n", + "We need to be careful, though, and make sure that the fine-grid solution is resolving all of the features in the mathematical model. How can we know this? We'll have a look at that in a bit. Let's see how this works first.\n", + "\n", + "You need a sequence of numerical solutions of the same problem, each with a different number of time grid points.\n", + "\n", + "Let's create a NumPy array called `dt_values` that contains the time-increment of each grid to be solved on. For each element `dt_values[i]`, we will compute the solution `u_values[i]` of the glider model using Euler's method. If we want to use five different values of $\\Delta t$, we'll have five solutions: we put them in an array ... but each one is also an array! We'll have an array of arrays. How meta is that?\n", + "\n", + "We have one more trick up our sleeve: `enumerate()`. To get all the numerical solutions—each with its value of $\\Delta t$—done in one fell swoop, we will loop over the elements of the array `dt_values`. Within the loop, we need to access both `dt_values[i]` and the index `i`. It turns out, `enumerate()` is a built-in Python function that will give us consecutive `index, value` pairs just like we need. \n", + "\n", + "Read the code below carefully, and remember: you can get a help pane on any function by entering a question mark followed by the function name. For example, add a new code cell below and type: `?numpy.empty_like`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), we compared our numerical result to an analytical solution, but now we will instead compare numerical results from different grids. \n", + "\n", + "For each solution, we'll compute the difference relative to the finest grid. You will be tempted to call this an _\"error\"_, but be careful: the solution at the finest grid is _not the exact_ solution, it is just a reference value that we can use to estimate grid convergence.\n", + "\n", + "To calculate the difference between one solution `u_current` and the solution at the finest grid, `u_finest`, we'll use the $L_1$-norm, but any norm will do.\n", + "\n", + "There is a small problem with this, though. The coarsest grid, where $\\Delta t = 0.1$, has 1001 grid points, while the finest grid, with $\\Delta t = 0.001$ has 100001 grid points. How do we know which grid points correspond to the same location in two numerical solutions, in order to compare them? \n", + "\n", + "If we had time grids of 10 and 100 steps, respectively, this would be relatively simple to calculate. Each element in our 10-step grid would span ten elements in our 100-step grid. \n", + "\n", + "Calculating the _ratio_ of the two grid sizes will tell us how many elements in our fine-grid will span over one element in our coarser grid.\n", + "\n", + "Recall that we can _slice_ a NumPy array and grab a subset of values from it. The syntax for that is\n", + "\n", + "```Python\n", + "my_array[3:8]\n", + "```\n", + "\n", + "An additional slicing trick that we can take advantage of is the \"slice step size.\" We add an additional `:` to the slice range and then specify how many steps to take between elements. For example, this code\n", + "\n", + "```Python\n", + "my_array[3:8:2]\n", + "```\n", + "\n", + "will return the values of `my_array[3]`, `my_array[5]` and `my_array[7]`\n", + "\n", + "With that, we can write a function to obtain the differences between coarser and finest grids. Here we go ..." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = ceil(N_fine/N_current)\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the function has been defined, let's compute the grid differences for each solution, relative to the fine-grid solution. Call the function `get_diffgrid()` with two solutions, one of which is always the one at the finest grid. Here's a neat Python trick: you can use negative indexing in Python! If you have an array called `my_array` you access the _first_ element with\n", + "\n", + "`my_array[0]`\n", + "\n", + "But you can also access the _last_ element with \n", + "\n", + "`my_array[-1]`\n", + "\n", + "and the next to last element with\n", + "\n", + "`my_array[-2]`\n", + "\n", + "and so on. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.1\n", + "dt = 0.05\n", + "dt = 0.01\n", + "dt = 0.005\n", + "dt = 0.001\n" + ] + } + ], + "source": [ + "# compute difference between one grid solution and the finest one\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " print('dt = {}'.format(dt))\n", + "\n", + " ### call the function get_diffgrid() ###\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to create a plot of the results! We'll create a *log-log* plot with the Matplotlib function [`loglog()`](http://matplotlib.org/api/pyplot_api.html?highlight=loglog#matplotlib.pyplot.loglog). Remember to skip the difference of the finest-grid solution with itself, which is zero." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIh\nZGatzGyLmZ1Sibanm9nPkhGXSLIpSYmE0/1AE+APlWj7Z6BHYsMRCYaSlEjImNmPgM3ANKCnmZ1X\nTtss4GLgv5IUnkhSaasOkZAxs/HAEOAYIhsdvu3u/1ZG27bAB8Cx7r41eVGKJId6UiIhYmYXA/90\n9x3uvgp4DuhoZpeXaJdjZi8CfwO2AE+Y2ejkRyySWOpJiYSImU0C/t3d90RfHwusAv7H3Q8b9jOz\nmcB6dx+U3EhFkkM9KZGQMLNuwJv7ExSAu39FZHvuc8zsmhLtawA/BRYkNVCRJFJPSiQEohMgXnT3\n60s51xBYDWwHznD3oujxC4D3gObuvjmZ8Yoki3pSIuFwAzCptBPu/i2RqehtgJsOOtWRyDCgEpSk\nLSUpkYCZWW2go7u/UU6zMcAaYLiZ1Y0e60h0qM/MapvZgwkNVCQANYMOQES4DXAzu7OCdp8CXYhM\nTx8BNAdmRc/dCbyYsAhFAqKalEiAor2itUCzSr7Fga+BVkA3oDewFHjL3RcmJEiRAClJiYhIaKkm\nJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIi\nofX/ARE7ZqFnKYAXAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# log-log plot of the grid differences\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel('$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='-', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Order of convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The order of convergence is the rate at which the numerical solution approaches the exact one as the mesh is refined. Considering that we're not comparing with an exact solution, we use 3 grid resolutions that are refined at a constant ratio $r$ to find the *observed order of convergence* ($p$), which is given by:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "p = \\frac{\\log \\left(\\frac{f_3-f_2}{f_2-f_1} \\right) }{\\log(r)}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $f_1$ is the finest mesh solution, and $f_3$ the coarsest. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is p = 1.014\n" + ] + } + ], + "source": [ + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values2 = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values2 = numpy.empty_like(dt_values2, dtype=numpy.ndarray)\n", + "\n", + "diffgrid2 = numpy.empty(2)\n", + "\n", + "for i, dt in enumerate(dt_values2):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + "\n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values2[i] = u\n", + " \n", + "\n", + "#calculate f2 - f1\n", + "diffgrid2[0] = get_diffgrid(u_values2[1], u_values2[0], dt_values2[1])\n", + "\n", + "#calculate f3 - f2\n", + "diffgrid2[1] = get_diffgrid(u_values2[2], u_values2[1], dt_values2[2])\n", + "\n", + "# calculate the order of convergence\n", + "p = (log(diffgrid2[1]) - log(diffgrid2[0])) / log(r)\n", + "\n", + "print('The order of convergence is p = {:.3f}'.format(p));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See how the observed order of convergence is close to 1? This means that the rate at which the grid differences decrease match the mesh-refinement ratio. We say that Euler's method is of *first order*, and this result is a consequence of that." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Paper airplane challenge" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose you wanted to participate in a paper-airplane competition, and you want to use what you know about the phugoid model to improve your chances. For a given value of $L/D$ that you can obtain in your design, you want to know what is the best initial velocity and launch angle to fly the longest distance from a given height.\n", + "\n", + "Using the phugoid model, write a new code to analyze the flight of a paper airplane, with the following conditions:\n", + "\n", + "* Assume $L/D$ of 5.0 (a value close to measurements in Feng et al. 2009)\n", + "* For the trim velocity, let's take an average value of 4.9 m/s.\n", + "* Find a combination of launch angle and velocity that gives the best distance.\n", + "* Think about how you will know when the flight needs to stop ... this will influence how you organize the code.\n", + "* How can you check if your answer is realistic?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Feng, N. B. et al. _\"On the aerodynamics of paper airplanes\"_, AIAA paper 2009-3958, 27th AIAA Applied Aerodynamics Conference, San Antonio, TX. [PDF](http://arc.aiaa.org/doi/abs/10.2514/6.2009-3958)\n", + "\n", + "* Simanca, S. R. and Sutherland, S. _\"Mathematical problem-solving with computers,\"_ 2002 course notes, Stony Brook University, chapter 3: [The Art of Phugoid](https://www.math.sunysb.edu/~scott/Book331/Art_Phugoid.html). (Note that there is an error in the figure: sine and cosine are switched.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/.ipynb_checkpoints/01_04_Second_Order_Methods-checkpoint.ipynb b/01_phugoid/.ipynb_checkpoints/01_04_Second_Order_Methods-checkpoint.ipynb new file mode 100644 index 0000000..dfe6da7 --- /dev/null +++ b/01_phugoid/.ipynb_checkpoints/01_04_Second_Order_Methods-checkpoint.ipynb @@ -0,0 +1,1187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, C.D. Cooper. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid model: bonus!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_The phugoid model of glider flight_ has been such a fun problem to showcase the power of numerical solution of differential equations, we thought you'd enjoy a bonus notebook. The previous lessons were:\n", + "\n", + "* [Phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_01_Phugoid_Theory.ipynb) —Lays the groundwork for our fun problem, with some context, a little history and a description of the physics of phugoids: curves representing the trajectory of a glider exchanging potential and kinetic energy, with no drag.\n", + "* [Phugoid oscillation](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb) —Develops the simple harmonic motion of an aircraft experiencing a small perturbation from the horizontal trajectory: our opportunity to introduce Euler's method, and study its convergence via an exact solution.\n", + "* [Full phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb) —The full model takes into account the force of drag and results in a system of two nonlinear equations. We obtain the trajectories using Euler's method in vectorized form, introduce grid-convergence analysis and finish with the paper-airplane challenge!\n", + "\n", + "That is a fantastic foundation for numerical methods. It's a good time to complement it with some theory: the first screencast of the course uses Taylor series to show that _Euler's method is a first-order method_, and we also show you graphical interpretations. Many problems require a more accurate method, though: second order or higher. Among the most popular higher-order methods that we can mention are the _Runge-Kutta methods_, developed around 1900: more than 100 years after Euler published his book containing the method now named after him!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Euler's method is a first-order method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this screencast, we use a Taylor series expansion to analyze Euler's method and show that it incurs a truncation error of first order. We also use a graphical interpretation to motivate the _modified_ Euler method, which achieves second order." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('6i6qhqDCViA')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Second-order methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The notebook on phugoid oscillation (lesson 2) included a study of the accuracy obtained with Euler's method, using the exact solution for the simple harmonic motion. We made a _convergence plot_ and saw that as $\\Delta t$ gets smaller, the error also gets smaller. \n", + "\n", + "We could have drawn a line with a slope equal to 1 on that log-log plot, and you would have seen that it was parallel to the convergence line. A slope equal to 1 on a log-log convergence plot is an indication that we have a first-order method: the error scales as ${\\mathcal O}(\\Delta t)$. \n", + "\n", + "In lesson 3, using the full phugoid model (which is nonlinear and does not have an exact solution), we did a _grid-convergence study_ with three different grids, and obtained the _observed_ order of convergence—it was very close to 1, indicating a slope of 1 on a log-log plot.\n", + "\n", + "Another way to look at an ${\\mathcal O}(\\Delta t)$ method is to say that the error scales _linearly_ with the step size, or that they are proportional:\n", + "\n", + "$$ e \\propto \\Delta t.$$\n", + "\n", + "where $e$ stands for the error. To get more accuracy, we could use a _second-order_ method, in which the error is ${\\mathcal O}(\\Delta t^2)$. In general, we say that a method is of order $p$ when the error is proportional to $(\\Delta t)^p$.\n", + "\n", + "In the screencast titled \"Euler's method is a first-order method,\" we used a graphical interpretation to get an idea for improving it: by estimating an intermediate point, like the **midpoint**, we can get a better approximation of the area under the curve of $u^\\prime$. The scheme has two steps and is written as:\n", + "\n", + "\\begin{align}\n", + "u_{n+1/2} & = u_n + \\frac{\\Delta t}{2} f(u_n) \\\\\n", + "u_{n+1} & = u_n + \\Delta t \\,\\, f(u_{n+1/2}).\n", + "\\end{align}\n", + "\n", + "This method is known as the *explicit midpoint method* or the *modified Euler method*, and it is a second-order method. Notice that we had to apply the right-hand side, $~f(u)$, twice. This idea can be extended: we could imagine estimating additional points between $u_{n}$ and $u_{n+1}$ and evaulating $~f(u)$ at the intermediate points to get higher accuracy—that's the idea behind Runge-Kutta methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge-Kutta methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the modified Euler method, we improve the accuracy over Euler's method by evaluating the right-hand side of the differential equation at an intermediate point: the midpoint. The same idea can be applied again, and the function $f(u)$ can be evaluated at more intermediate points, improving the accuracy even more. This is the basis of the famous *Runge-Kutta (RK) methods*, going back to Carl Runge and Martin Kutta. The modified Euler method corresponds to _second-order_ Runge-Kutta.\n", + "\n", + "Here's a bit of historical coincidence that will blow your mind: Carl Runge's daughter Iris—an accomplished applied mathematician in her own right—worked assiduously over the summer of 1909 to translate Lanchester's _\"Aerodonetics.\"_ She also reproduced his graphical method to draw the phugoid curves (Tobies, 2012)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Phugoid model with 2nd-order RK" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's compute the motion of a glider under the full phugoid model using the second-order Runge-Kutta method. We'll build on the _paper airplane challenge_ of lesson 3 now, and look for the horizontal distance that the plane travels until the moment it touches the ground. \n", + "\n", + "As usual, let's start by importing the libraries and modules that we need, and setting up the model parameters. We also set some default plotting formats using the [`rcParams`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.rcParams) module. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the paper-airplane challenge of lesson 3, we suggested an $L/D=5.0$ as a realistic value for paper airplanes, according to experiments, and a trim velocity of 4.9 m/s. Let's start with those values, but you could experiment changing these a bit. _What do you think will happen if you make $L/D$ higher?_" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Among the initial parameters that we suggest for your first experiment, we are starting with a velocity a little higher than the trim velocity, launch the paper airplane with a negative initial angle, and take the initial height to be 2 meters—all sound like reasonable choices.\n", + "\n", + "Now, we can define a few functions to carry out the computation:\n", + "* The right-hand side of the phugoid model from [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb),\n", + "* One step of the Euler's method that we learned in [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), and\n", + "* Differences with respect to a fine grid, as in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])\n", + "\n", + "\n", + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)\n", + "\n", + "\n", + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = int(numpy.ceil(N_fine/N_current))\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we also need to define the function `rk2_step()` that computes the next time step using the *modified Euler* method of equations $(1)$ and $(2)$, above, otherwise known as 2nd-order Runge-Kutta or RK2. This function will be called over and over again within the time loop." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def rk2_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using 2nd-order Runge-Kutta.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at the next time step.\n", + " \"\"\"\n", + " u_star = u + 0.5*dt*f(u)\n", + " return u + dt*f(u_star)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we first need to set up the time discretization, then initialize arrays to save the solution and we are set to go! The only difference this time is that we are using _both_ Euler's method and 2nd-order Runge-Kutta to get a solution, to compare the two. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "\n", + "# set initial conditions\n", + "u_euler = numpy.empty((N, 4))\n", + "u_rk2 = numpy.empty((N, 4))\n", + "\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_euler[0] = numpy.array([v0, theta0, x0, y0])\n", + "u_rk2[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "\n", + "# use a for loop to call the function rk2_step()\n", + "for n in range(N-1):\n", + " \n", + " u_euler[n+1] = euler_step(u_euler[n], f, dt)\n", + " u_rk2[n+1] = rk2_step(u_rk2[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get the position of the glider in time, according to both Euler's method and the 2nd-order Runge-Kutta method, by extracting the appropriate portions of the solution arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x_euler = u_euler[:,2]\n", + "y_euler = u_euler[:,3]\n", + "x_rk2 = u_rk2[:,2]\n", + "y_rk2 = u_rk2[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### How far will it fly before touching the ground?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As the $y$-axis measures the vertical coordinate with respect to the ground, negative values of $y$ don't have any physical meaning: the glider would have hit the ground by then! To find out if there are any negative $y$ values we can use the handy function [`numpy.where`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html). This function returns the **indices** of the elements in an array that match a given condition. For example, `numpy.where(y_euler<0)[0]` gives an array of the indices `i` where `y_euler[i]<0` (the `[0]` is necessary as `numpy.where` returns an array, which in this case contains a single line). If no elements of the array match the condition, the array of indices comes out empty. \n", + "\n", + "From the physical problem, we know that once there is one negative value, the glider has hit the ground and all the remaining time-steps are unphysical. Therefore, we are interested in finding the _first_ index where the condition applies, given by `numpy.where(y_euler<0)[0][0]`—do read the documentation of the function if you need to! " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_euler = numpy.where(y_euler<0.0)[0]\n", + "if len(idx_negative_euler)==0:\n", + " idx_ground_euler = N-1\n", + " print ('Euler integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_euler = idx_negative_euler[0]\n", + " \n", + "idx_negative_rk2 = numpy.where(y_rk2<0.0)[0]\n", + "if len(idx_negative_rk2)==0:\n", + " idx_ground_rk2 = N-1\n", + " print ('Runge-Kutta integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_rk2 = idx_negative_rk2[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Do Euler and RK2 produce the same solution?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An easy way to compare the numerical results obtained with the Euler and 2nd-order Runge-Kutta methods is using [`numpy.allclose`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html). This function compares each element of two arrays and returns `True` if each comparison is within some relative tolerance. Here, we use the default tolerance: $10^{-5}$." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Are the x-values close? False\n", + "Are the y-values close? False\n" + ] + } + ], + "source": [ + "# check to see if the paths match\n", + "print('Are the x-values close? {}'.format(numpy.allclose(x_euler, x_rk2)))\n", + "print('Are the y-values close? {}'.format(numpy.allclose(y_euler, y_rk2)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hmmm, they do differ. Maybe $10^{-5}$ is too tight a tolerance, considering we're using a somewhat coarse grid with first- and second-order methods. Perhaps we can assess this visually, by plotting the glider's path? Study the code below, where we are plotting the path twice, taking a closer look in the second plot by \"zooming in\" to the beginning of the flight." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n+eWXL1nerVu3i92pp06dMq1atTKNGzc2x9PpOsjI4cOHjYiY0qVLZysHb3mznwlAdyrQBfgFKOFF\n2RbAH8BB3IdmAAAgAElEQVT6VK/tWN2pu+z3T6Szbo6+L6WC3d69e02FChXMlClT/lm4caMxVata\nP4PF6tXGtGqVbpfuuHHjzI033mhOnTqV46q8PYdpd6qfrVixgh07djB69GhmzJgR8KcbBGIOoHr1\n6rF79252797tSP0qYxcuXCA+Ph4R4ZZbbvFY5tChQzRu3JiCBQuyaNEiChYsmOV6VtkDgDt06JCj\neEOBiNwLDAXijDGH7GWtRaRXqjIlxZ57xxiz0BhT1hhzY8oLSLml7Ul72bOBziPQ3HI+cEse4Hwu\nf/31Fy1atOC+++7jgQce+OeDqlXh55+tn17yey5168KXX6bbpTtkyBCqVatG79690x2q4mvaiPOz\npC1bWNysGU888USOHswbzHLlykXr5s2Z/9lnToei0ti/fz99+vRh7969DBo0iFq1anks16NHDzZs\n2MDIkSMvn0jTC8YYXnzxRWJiYhgxYkROww5qItIZmAG8CTQXkXvtRl0boLRdpgGwD5ia0abS/FQq\nrJw5c4a2bdvSpEkThg8ffnmBXKE14ktEeO2119iwYQMzZswITKXeXK4L9RdOdUecPGmOFi9uRleu\n7Mpu1NT233CDeaJ2bUdjyPZ+HjXKGOtm8ktfo0b5tnx6n/tASndqVFSUKVWqlClVqpTJly+fERFT\nu3Zt88MPP3hcL6U7tU6dOkZETJkyZcz27duzXP/kyZNNdHS0+fbbb3OaSqa82c/4sTsVOAokYXWF\npn4lASPtMjWAI3joIgVKATuB/fY6h+33ddKpL+dfmlJBJikpydx1112mY8eOrvv9uHnzZlOsWDGz\nfv36bG/D23OY4w2sQLycOgkeu+su80FUlNmxY4cj9QfS6aefNq/nzm3+/vtvx2II5192nsbEnT59\n2owYMcKIiGnVqpXHaWBSGnErVqwwvXv3NiJirr76avPbb795XffHH39soqOjzWeffeaTXDLjdCMu\n0K9wPq6Vew0fPtw0aNDAnDlzxhprtnix0yFlz4ULxniY2uTtt982VapUMadPn87WZr09h2l3qp8k\nfvghJz//nB969qRixYqOxRGo8Q55O3TgvyIsWbTIkfrV5fLmzcuzzz5LXFwcCxYs4PXXX0+3rIgw\n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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(10,6))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler[:idx_ground_euler], y_euler[:idx_ground_euler], 'k-', label='Euler')\n", + "pyplot.plot(x_rk2[:idx_ground_rk2], y_rk2[:idx_ground_rk2], 'r--', label='RK2')\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_rk2[idx_ground_rk2-1]))\n", + "pyplot.legend();\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler, y_euler, 'k-', label='Euler')\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From far away, the Euler and RK2 methods seem to be producing similar answers. However, if we take a closer look, small differences become evident. Keep in mind that we are solving the same equation and both methods will converge to the same solution as we refine the grid. However, they converge to that solution at different rates: RK2 gets more accurate faster, as you make $\\Delta t$ smaller." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Grid-convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we want to do a grid-convergence study with RK2, to see if we indeed observe the expected rate of convergence. It is always an important step in a numerical solution to investigate whether the method is behaving the way we expect it to: this needs to be confirmed experimentally for every new problem we solve and for every new method we apply!\n", + "\n", + "In the code below, a `for`-loop computes the solution on different time grids, with the coarsest and finest grid differing by 100x. We can use the difference between solutions to investigate convergence, as before." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for-loop to compute the solution on different grids\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once those runs are done, we compute the difference between each numerical solution and the fine-grid solution." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# compute diffgrid\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "for i, dt in enumerate(dt_values):\n", + "\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now we plot!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nicaKFSu44YYbWLVqFR9//HHU4UgBmUymza7Dqqy9lhRJb+kkfdpm0qUpfxdffDGTJk3iuOOO449/\n/GPU4VQs6bkLe/aaiEjNNDc3M2XKFMyMa665JupwpEJq6RSR9JaOSByMGDGCX/3qV5x++un86le/\nijocKYFaOiISW4cffji9e/fm6quvjjoUCYGKToql+VmBJEhL/i666CKam5vp27dv1KGEJi25y6cq\nRcfMZlfjviKSTttsU9FEW6kjpeynE2QTt0nu3rWSwOqBmfn48eM1ZVpEpAQtU6YnTJgQfMFPbeKm\niQQiIuWodCLB+8BRwODcayjwMnAHMILspm1H5/77DmAx2U3fpM6luV85CZKav08++YR7772XjRsT\ntcDJpyQ1d6UopaP0L+7+RMsbM5tEdhO3+/NcO93MTia7idvvQopRRFLkrrvu4vzzz+f444/noYce\nijocCZk2cStC3WsitbVmzRoGDhzIkiVLuOeee/j2t78ddUgSQNjP6ewCFJsk0BXYKcB9RSTlbrnl\nFpYsWcLBBx/Mt771rajDkSrQJm4pluZ+5SRIWv7ef/99Jk6cCMA111xDu3axn4tUUNJyV44gk98v\nAR4nu4nbUmAp2WnSPYCewCqgIawARSQdpk6dygcffMBRRx3FMcccE3U4UiWB1l4zs32AnwDHAZ1z\nh1cDTcA4d58bWoQR0piOSO1s2rSJe+65h/32249DDjkk6nCkAsXGdLSJWxF6OFREpHShPBwahJmd\n4e6xXw426S2dpO/pkXTKX3wlPXdRrDJ9Q5XuKyIiMVbKMjiNwM7uPir3vpnia7EZ0NvdO4QVZFSS\n3tIREamGisZ0zOxtYEdgF3dfa2brgafb+MzD3b1ToGjriIqOSPW4O8OHD+dLX/oSF154IZ06xf5X\nhuRUWnR6AB3d/c3c+6Xu3rONr2nzmjhIetFJer9y0sU9fzNnzuS4445jp512YuHChXTtGvuF6UsW\n99y1paIxHXdf1lJwcjqa2VQz+1qRL/t+uUGKSHps2rSJyy+/HIAxY8akquCkXZC11zYB04Hr3P2V\nqkRVJ5Le0hGJyvTp0znjjDPo3bs38+bNU9dawoT6nI6ZLXP3HqFEVudUdETCt379evbdd1+am5u5\n4447OPfcc6MOSUIW9pTpV8ysVxsfeFeA+0qNpXn9pySIa/5WrFhB79692X///TnzzDOjDicScc1d\n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\nzP8H50NbGbioopAAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot using the matplotlib function loglog()\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel(r'$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.xlim(1e-4,1)\n", + "pyplot.ylim(1e-4,1)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='--', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is looking good! The difference relative to our fine-grid solution is decreasing with the mesh size at a faster rate than in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), but *how much faster?* When we computed the observed order of convergence with Euler's method, we got a value close to 1—it's a first-order method. Can you guess what we'll get now with RK2?\n", + "\n", + "To compute the observed order of convergence, we use three grid resolutions that are refined at a constant rate, in this case $r=2$. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 1.983\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " ### call rk2_step() ###\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probably you're not too surprised to see that the observed order of convergence is close to $2$. Because we used a second-order method! This means that the numerical solution is converging with the grid resolution twice as fast compared with Euler's method in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), or in other words, the error scales as ${\\mathcal O}(\\Delta t^2)$. That is a lot faster! However, we are paying a price here: second-order Runge-Kutta requires more computations per iteration." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge task" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How much longer does it take to get the solution with RK2, compared to Euler's method? Run the same solution (same time grid, same parameters), but find a way to *time* the calculation with Python, and compare the runtimes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multi-step methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The screencast *\"Euler's method is a first-order method\"* motivated graphically an idea to get increased accuracy: using intermediate points between $u_{n}$ and $u_{n+1}$ and evaluating the right-hand side of the differential equation at those intermediate points. The idea is to somehow get a better approximation using more data from the function $f(u)$.\n", + "\n", + "Another way to bring more information about $f(u)$ into the numerical solution is to look at time data $t\\lt t_{n}$. For example, we can involve in the calculation of the solution $u_{n+1}$ the known solution at $u_{n-1}$, in addition to $u_{n}$. Schemes that use this idea are called _multi-step methods_.\n", + "\n", + "\n", + "A classical multi-step method achieves second order by applying a _centered difference_ approximation of the derivative $u'$:\n", + "\n", + "$$ u'(t) \\approx \\frac{u_{n+1} - u_{n-1}}{2\\Delta t}.$$\n", + "\n", + "Isolate the future value of the solution $u_{n+1}$ and apply the differential equation $u'=f(u)$, to get the following formula for this method:\n", + "\n", + "$$ u_{n+1} = u_{n-1} + 2\\Delta t \\, f(u_n),$$\n", + "\n", + "This scheme is known as the **leapfrog method**. Notice that it is using the right-hand side of the differential equation, $f(u)$, evaluated at the _midpoint_ between $u_{n-1}$ and $u_{n+1}$, where the time interval between these two solutions is $2\\Delta t$. Why is it called \"leapfrog\"? If you imagine for a moment all of the _even_ indices $n$ of the numerical solution, you notice that these solution values are computed using the slope estimated from _odd_ values $n$, and vice-versa.\n", + "\n", + "Let's define a function that computes the numerical solution using the leapfrog method:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def leapfrog_step(unm1, u, f, dt):\n", + " \"\"\"Returns the solution time-step n+1) using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " unm1 : array of float\n", + " solution at time-step n-1.\n", + " u : array of float\n", + " solution at time-step n.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at time-step n+1.\n", + " \"\"\"\n", + " return unm1 + 2.0*dt*f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But wait ... what will we do at the _initial_ time step, when we don't have information for $u_{n-1}$? This is an issue with all multi-step methods: we say that they are _not self-starting_. In the first time step, we need to use another method to get the first \"kick\"—either Euler's method or 2nd-order Runge Kutta could do: let's use RK2, since it's also second order.\n", + "\n", + "For this calculation, we are going to re-enter the model parameters in the code cell below, so that later on we can experiment here using the leapfrog method and different starting values. At the end of this notebook, we'll give you some other model parameters to try that will create a very interesting situation!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude\n", + "\n", + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# set initial conditions\n", + "u_leapfrog = numpy.empty((N, 4))\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_leapfrog[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "# first step using RK2\n", + "u_leapfrog[1] = rk2_step(u_leapfrog[0], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we have all the required information to loop in time using the leapfrog method. The code cell below calls the leapfrog function for each time step." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for loop to call the function leapfrog_step()\n", + "for n in range(1,N-1):\n", + " \n", + " u_leapfrog[n+1] = leapfrog_step(u_leapfrog[n-1], u_leapfrog[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like before, we extract from the solution array the information about the glider's position in time and find where it reaches the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the glider position in time\n", + "x_leapfrog = u_leapfrog[:,2]\n", + "y_leapfrog = u_leapfrog[:,3]\n", + "\n", + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_leapfrog = numpy.where(y_leapfrog<0.0)[0]\n", + "\n", + "if len(idx_negative_leapfrog)==0:\n", + " idx_ground_leapfrog = N-1\n", + " print ('The glider has not reached the ground yet!')\n", + "else:\n", + " idx_ground_leapfrog = idx_negative_leapfrog[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the glider's trajectory with both the leapfrog and RK2 methods, we find that the solutions are very close to each other now: we don't see the differences that were apparent when we compared Euler's method and RK2." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nz6bl5ZdTu3btDKbcO/nLlrHoxBMpW7069WbMgAMO8B1JpMTQiVMhFaYeE2WJLxNZKlasmNAJVCXt\ndUlUmLKUZGaGVaoEL7/MotataTtoEPuMHOk71i7t2LGDhfPmwQMPkHPyyaw85xzm3XtvZAvUqP+e\naHwlg4pUEQ8uv/xyAF544QU2bNjgOY1IMZix/003sWr0aCrVqQPAokWLWLp0qedg/2vx55+z9YQT\n2DJhAsycSaUePbjgwgt9xxKR3dDhfhFPmjdvzowZM3jyySd3Fq2SXUry4f5dcc7RqlUrunfvzmWX\nXZaGZImbN28eBx10ENWqVQNg+LXXctTFF3NSs2Zec4mUZDrcL5IFrrzySgAee+wx9EeURMXmzZtp\n06YNPXv2BMDl5/P4gw+yZcuWjGd58sknue+++3Y+7vHooypQRbKIitQMClOPibLEl8ksF1xwAbVr\n12bBggW8//77XrPsibJIoipUqMDdd99NqVKlAPho6FC63HorZQcNgm+/Zfv27Wn7o2zJ4sW82LMn\nDBoEwB133LHL651GfR5pfNkt6uNLlIpUEU/Kli3LFVdcAcCjjz7qOY1IelRq2ZIlw4Zha9bAUUex\nqmlThrVtC+vXF/tr79ixg1defhlmzYKbbuKIM87guJEjWVe5MgC1a9fm3nvvLfb3ERE/1JMq4tH3\n33/PwQcfzLZt21i2bBmHH36470iSBPWkJumnn3iyQwfO3rqVOtdeC927c+ONN9KoUSO6desGwKxZ\nszjooIOoWbMmACtWrKBGjRpUjhWegwcP5oorrqBy5co455hdrhyN69ShTJcucOGFvL9mDc1btKBc\nuXKpzS4iKaGeVJEsccABB9ClSxecczz22GO+44ik13770WfGDA749FPo3h2AadOmkZubu/Mpq889\nFzvrLOjaFS6+mJUnncSmDh3giy8AePPNN/n000+B4M3us1tuYdGbb8K990KTJrQ5/XQVqCIRoSI1\ng8LUY6Is8fnIcs011wDw3HPPsb7QIdCS/rrsSpiySPJycnIoXbr0zscTJkygWaGTmb5o3ZqtffpA\nhw7QqROLjz6anzp02Hk90xtuuGHnXlaAy+++m8Z7cUOMqM8jjS+7RX18iSq956eISDodd9xxtGzZ\nkmnTpjF8+HCuvvpq35FEMqborUhvKXJDgCu6dPmfx+eee27aM4lIOKgnVSQExowZwwUXXMARRxzB\n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\nB0lEQVTo/D9EAVodDt65OwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(11,8))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls='-', lw=2)\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_leapfrog[idx_ground_leapfrog-1]), fontsize=18);\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls=':', lw=2)\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about the observed order of convergence? We'll repeat the process we have used before, with a grid-refinement ratio $r=2$ ... here we go:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 2.186\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " u[1] = rk2_step(u[0], f, dt)\n", + " for n in range(1, N-1):\n", + " u[n+1] = leapfrog_step(u[n-1], u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical evidence that our calculation with the leapfrog method indeed exhibits second-order convergence, i.e., the method is ${\\mathcal O}(\\Delta t^2)$. _The leapfrog method is a second-order method_. Good job!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### But chew on this ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Go back to the cell that re-enters the model parameters, just above the leapfrog-method time loop, and change the following: the initial height `y0` to 25, and the final time `T` to 36. Now re-run the leapfrog calculation and the two code cells below that, which extract the glider's position and plot it.\n", + "\n", + "_What is going on?_\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tobies, R. \"Iris Runge: A life at the crossroads of mathematics, science and industry,\" Springer Basel, 1st ed. (2012). [Read on Google books, page 73](http://books.google.com/books?id=EDm0eQqFUQ4C&lpg=PA73&dq=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&pg=PA73#v=onepage&q=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&f=false)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/01_01_Phugoid_Theory.ipynb b/01_phugoid/01_01_Phugoid_Theory.ipynb new file mode 100644 index 0000000..902854f --- /dev/null +++ b/01_phugoid/01_01_Phugoid_Theory.ipynb @@ -0,0 +1,764 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, C. Cooper, G.F. Forsyth, A. Krishnan." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Motion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome to [**\"Practical Numerical Methods with Python!\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about) This course is a collaborative, online, open education project, where we aim to give a foundation in scientific computing. The focus is on numerical solution of problems modeled by ordinary and partial differential equations.\n", + "\n", + "This IPython Notebook introduces the problem we'll be studying in the **first module** of the course: the _phugoid model of glider flight_. We'll start with some background, explaining the physics, and working out the mathematical model. \n", + "\n", + "First, we'll look at an idealized motion where there is no drag, resulting in a simple harmonic motion. We can plot some interesting trajectories that will pique your imagination. In the next notebook, you'll learn to numerically integrate the differential equation using Euler's method. But hang on ... first things first. \n", + "\n", + "The term \"phugoid\" is used in aeronautics to refer to a motion pattern where an aircraft oscillates up and down —nose-up and climb, then nose-down and descend— around an equilibrium trajectory. The aircraft oscillates in altitude, speed and pitch, with only small (neglected) variations in the angle of attack, as it repeatedly exchanges kinetic and potential energy.\n", + "\n", + "A low-amplitude phugoid motion can be just a nuisance, as the aircraft does not exceed the stall angle of attack and nothing bad happens. But the mode can also be unstable leading to a stall or even a loop!\n", + "\n", + "Look at this video showing a Cessna single-engine airplane in phugoid motion:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz\nODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj\nY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQED\nEQH/xAAaAAACAwEBAAAAAAAAAAAAAAACAwABBAUG/8QAQBAAAgIBAwEDCAgFBAIDAQEBAQIAAxEE\nEiExE0FRBRQiMmFxgZEjQlJTcpKhsRUzYsHRBkOC4SRjovDxNMIW/8QAGQEBAQEBAQEAAAAAAAAA\nAAAAAAECAwQF/8QAKBEBAAIBBAICAQQDAQAAAAAAAAERAgMSMVETIUFhBCJSgaEyYnEU/9oADAMB\nAAIRAxEAPwBlFdfYp9GnqjuEcKqvu0/KJKax2Nf4R+0PYRPpxEU8coKaj/tp8oa01/dp8oPIlhyI\nqCzeyr+6r/KJfY0/cp+UQFsEMWCZ2ra+yp+7T8oliuof7SflkyDB57o2wWaqUfdp+UQxXQf9tPyi\nZt57xJvPuk2ltfYUn/bT8ok7Cn7pPyiZO1Yd8IXtG0to7CodKk/KJDVWf9tPyiKF5MMOTJtLEtVQ\n/wBqv8olGmvORUn5RJuMm4xULYjXSRg1Jn8IgCmjPNSflEvcZecxUFgfT6furT8ok7Cnb/Lr/KIR\nJlFj4RSWUdPVn+Un5RJ2FQ/20/KIRfxEE2CWi1dnV91X+USdjT92n5RL3r3S+090UWX2NP3SflEr\nsqvu0/KI4FD1/SUwTuYy1BZRqq+6T8ogNp6T/tp+URpU9xEEhx3RUJZLaav7tPyiLOnr+7X5TTk+\nEHM0WzHTp92v5RKFNf3a/lmk+6TEIQKqe+tPkIxaqs/yk+Qh9lmEtWIqF9qFFP3afljFop+7T8ol\npXHKoHSZmlL83p7qk/KJR09XdUn5RNG2Q5EgStNXfWn5RD83p+6T8olk5lB8SUWIU1D/AGk/KIa1\n1fdJ+USltHfGKymSltBVV90n5RC7Kr7pPyiECJczRYOwp+6T8ok83q+6T8ohyRRYOwq+6T8ok7Cn\n7pPyiMzKigs0VfdJ+USjRT90n5RG5lEiKCeyo+6T8oldjV90n5RGnEA++WiwGqr7qv8AKJR09P3a\nflELMmT4S0gOwo+5T8olnTUEfy6x/wARLJlFhLQW2mqHStPyiCaKvuk/KIzMm7MUWzmir7pPyiKv\npq7Cz6NPVP1RNbCI1A+gs/Cf2l+CyaR9DX+EftCiKd3Yp+ERgYzccMyLmWIO+QtKD4liKzL3SB4f\nHhC3CZtxg7jFFtRIgNtiCxgkmKDyJURuPjLDmWkaFMchmRbDGLZJMLbWrHxhZJ8JmFkMOPGZpbPz\njrBLCAHl7pKUWZROJW6UWB6wiExbMO+Edp74DLnvE1AHIlEyFJNhHfKitxErtJe0yikCdrCFkDs/\nbBIxAbuzIYnMm+UN4lQM5l5gMDEQu09kWphYHWQMW0juhiwmZ5N4EUNXaGUbJn7QSBxJS2aXlhgY\nvIMNVHjAMYjVEWq4jF4mVNWGIsMJe4TIOTEDePGTcYoHKzALwDaRFBpMWxPjAN0HtZaBFmEm4yt2\nZWZRe72Qd0hOIOT4yoYLD7JRYHrFHMHMUGnHdKzA3SbooHkxV5PYWfhP7Sy8VfYOws5+qf2iY9EK\nodDTXyPVH7RnomYqT9CnH1RC3Dwmoj0ky0lEMo1jxiO098LtMd8tJY+zk2kd0Htj4ydrAuTMrtR4\nSt6+ECy48IJeQskr0PGBRMrMvA7jKwfZKClgxeSO6XuPhAcGMIPM+8yb5KGkWe2UbiIjtJC+YoNb\nUGB5wYskeEHIloO7b2yG72xBIlcRQf2n9Rl9q46NM/EmTFDULz3rmWL1mTJk3GKG3tQZN4Mx7pN8\nUNZAMEqJn3++TtG8YoOwRKLGK7VpO0MUGGwiV2reMDtPZJvHhKC7U+Mm/MDgywBAYG9sMNFACHkS\nBytGq0yhhCFklDYrww8xC2WbfbM0ttvae2UbR4zCXPjBLHxjaW3dqJO2mHcfGTe3jLtLbe39krzg\nd4mPeZO0MUW2duh6y9yHoZi3SbvAxtLbQR4wt0xCw+MvtGii2veIJcTN20naiKLPNgMHcPGILgyu\nD3xRbRkeMFiPGZyPbBOR3mWks8uo6xV9q9i/4TF5MC3+U/4TEx6IXUD2KfhEPElQ+hT8Ih4iOCS8\nSYjMSYlQvEmIwKWOAMxnYN7PnFjPiTEa1bL1EHEAMSYh4kxACTmHiTEAcyZhYkxKB48JOIWJMSAZ\nMwsSYgBJiHiTEoXiTEZiTEBeJMQ8SYgBiTEPEmIAYkxDxJiAGJMQ8SYgBiTEPEmIAYkxDxJiAGJe\nIWJMQKxJCxJiQViViFiXiAOD4y8QsSdIVUmJeZeYA4kl5kzAqVC+EnwgDiVDxJiAMkLEmIQMmIWJ\nMQBxJiXJArEmJckCsRd38l/wmNgXD6F/wmSeFgdI+hT8Ih4l0j6Cv8Ih4kjhJLxJiMxJiUQMFGBK\n3mXiTECb8jB6RZXBh7ZeIC8SYh7ZNsAMSYh7ZeICsSYjcSsQF7ZNsZtk2wF7ZMRm2XtEBW2TbG7R\nK2wF7ZNsZtk2wF7ZNsZiTEBe2TbGYkxAXiTEZiTEWF4kxGYkxFheJMRmJMRYXiTEZiTEWF4kxGYk\nxFhe2XiHtk2xYDEmIe2TbFgMSYh7ZNsAMSYh7ZMRYDEmIe2TbFgMSYh7ZNsWAxJiHtk2wAxJiMxJ\niAvEmIzEmIC8SYjMSYgLxJiMxJiLC8QLh9C/4TH4gXD6Cz8JknggdA+gr/CP2jMQaR9BX+EftDxJ\nHCyHEmIWJMSoHEmIWJMQBxJthYl4gBtkxCxJAHEmIUkAdsm2FJAHbJthSYgDtjEpLdBM+p1I0qq7\nVlgTjg4j6fLWlordwjs4QsFI6nuE456sY+nfS093K3qK9RF4ms6qvWaau5ABuXkDuPeJnI5m8Mpm\nLZ1MYxn0DbJthYkxNuQdsm2FJAHbJthSQB2ybYUkAdsm2FJAHbJthSQB2ybYUkAdsm2FJAHbJthS\nQB2ybYUkAdsm2FJAHbJthSQB2ybYUkAdsm2FJAHEmIUkAdsm2FJiAO2TEPErEAcSYhYkxAHEvEvE\nmIFYi7x9BZ+E/tG4gXD6Cz8J/aSeFgdH8iv8I/aHBoH0Ff4R+0ZiSOCQ4kxCxJiVA4kxCxJiLA4k\nxCxJiAOJMQsSRYHEmIUkWBxJiFJFgcSYl4kgYPK4zo/cwM4tfqsPEmd3ysP/AAW94nBBCsc9OJ5N\nb/J6tL/F1PId/FunJ6HcP7zqzzWlt8219VnRSdre4z02J20srxcdSKlWJMS5J1c1YkxLkgViTEuS\nBWJMS5IFYkxLkgViTEuSBWJMS5IFYkxLkgViTEuSBWJMS5IFYkxLkgViTEuSBWJMS5MQKxJiFJFg\ncSYhSRYHEmIUmIsDiTELEmIA4kxCxJiLA4kxCxJiAMC/+RZ+E/tG4i7x9BZ+E/tJPCwOj+RX+Eft\nDg0D6Cv8I/aMxJBPIZIWJMQBkhYkxAHEmIWJMQBxJiFiTEAcSYhYkxAHEmIWJMQBxJiFiVAxeVeP\nJ1vw/cTzdnRvwz03lQA+Tr93cuflPNjkrPNrcu+lwq8bqlYd4zPS+TrvOdDVZ34wfeJ5+1B2eB3T\nf/py/Ha6dj37hLpT7o1Y9O3iTEuSehwViTEvEmIFYkxLxJiBWJMS8SYgViTEvEmIFYkxLxJiBWJM\nS8SYgViTEvEmIFYkxLxJiBWJMS8SQKxJiXJArEmJckCsSYly8QBxJiFiTEAcSYhYkxAHEmIWJMQB\nxJiFiTEAZIWJMQBkhYkxAGBf/Is/Cf2jcRd4+gs/Cf2iSORUf/z1/hH7RmJNOmdPX+EftGbJmGpg\nvEmIzZK2GW0oGJMQ9smw+EAMSYh7SO6ViAOJMQsSmetTh3A95gViTEYArD0efdJsPhJcFSlVIsyd\n2AOoxHeZoRy5z7pn9Jc7Dtac5dbc+tQW6TUnYSPRZlQ+/jB985ak5RPp0wiJj27I0y59XPvaMGnT\n7C/mMyHVKeH0F/Het/8A3CHlDTKvpaLVD/5H95ynf9ukRiLV6FNVob6gMFlOAvUGeGurs0hCXDGG\nADfH957geUvJ/wBanUIfajTJrLPIWtUrbY9bdCdpB+PEz7+WoiPh5gHMuupq7e1pYq/7zbZ5PoqJ\nOj8o0WJ9h8qf1laRtHYxqvsaq0HquGWWJmOCffLVpPKDDC6lSP6p2K6hdXvpsRx7DzOcvky7buoZ\nL1/oPPyMLTp2NmGL6V/EggfETpGrbnOm3NW6Y3jEGPXfXQRq99inkWqNw/SZkvptI7I2OD3msqPm\nZ1xzvlznGuBSQsSYnRkMkLErocH4SCpIWJMSgZJYHOJeJAMkLEmJQMkPErEgGSGBkwxWMRZRMmI7\naAeRxKZB3RZRWJMQ8eyViAOJMQ9vslYgDiTELEmIQOJMQ8CViVQ4kxDAzJt5xIAxJiMKcQcQBxJi\nFiTEqBxJiFiTEAcSYhYkxAHEXf8AyLPwn9o7EXqB/wCPZ+E/tJKwOj/+ev8ACP2hwaB/49f4R+0O\nSFVLyZMSSiSZMmJMQJkypckCoq/TpcOeG7mHUR0kg5NyazSHcE7VB9avgj4R+l8s/RlmwQDgh1wR\nN8zaryfptX/OqBPiOD85icLbjJt0vlbQ38NtQ+3pN+NM3Q1n4ieX/gGmVNlVtyL4bsiUPIYHTV3C\ncp0p+HSNTt6rstOegSTzag/UE8mPI2oHTyg/5T/mX/C9cp9Hyg2PjM+PNd+L1XmlB+r+sF9Bp3Uq\nyZUjBBM8sdD5WU+hrgR7WI/tL7Dy2nTVq3ub/qNuZeDqt/pTya1hcC5M9y2HEW/+j/Jzg4e9W+0G\n/wCpz8+XkGRcG9gYSec/6hUZ6/Ff8ybcl3Yutpv9O16Ujs9ZqeOmSP8AE6Sadwuy2wXJ4Os8ld5c\n8saUjtxtz0yvWAP9V64dWq+UzMStw9immWo/RegveoPB+ETboFZi1YCMfA8GeXH+rNaOq1mGP9W6\nr7quSLjgmp5eh8ws+0so6G3+n5zgj/V2p79OnzhD/WF3fpk+c6eTNnZi7nmNv9PziNTorx2RrXcR\nYM47l7zOYP8AWD9+lX80If6wPfpB+aPJmbMXa8ws+0srzGzxE4J/1PUbxedEwsAxkWEce6OH+sk7\n9IfzR5MzZi6Gq0moUVGpCxFgzg9B3maPMbMdROOn+p9VcS1Onq2d27Of3gD/AFVqScCmjPx/zG/N\nNuLtjQv9oS/MG+2PlOH/AP8AVarOOwq/X/MB/wDUbXV51WhJCsNuwshBjfqdrtweg8wb7Yljyee9\n/wBJxx/qm9gCnk6wjx5/xKP+p9X3eTX+IP8AiTfqG3B2v4f/AF/pJ5h/WflOGn+p9baAa/J+4HoQ\nCcyrP9R+Uq1y2g2DxIMbs+1rF3vMf6jLOhXHUzzy/wCoPK9oBr0XB6HacSj5W/1E9hC6RFXx4H7m\nP1n6HoxolA9YyeYp4mcHzzy+4/2U9hxK3eXWxnV1L447v0jbml4O8dAvc5EBvJ5+q4PvE4nm/lRz\n6XlIgexZQ0GrI9PyleT7OJuI1IZmcJdWzT3J1XI9kTMP8L3Y36zVN4+nNVFC6eoVoWIHexyZ2x3f\nLnlXwZJLxJNsqklyYgVJLxJiBUkuSBUkvEmIFSS8SYgVF3/yLPwn9o3EC/8AkWfhP7SSQxU+UQKK\nx2R9Ud8P+Ij7o/OZKdRpOxTKfVEM6nReB+c4b57a/iWj+I+FR+cn8Q/9RmbzrRe35yvOdEfrN85N\n89n8S1fxA/dH5yefn7o/OZPONH9tvmJO30h+u8b8u19dS1+fn7o/OT+IH7r9Zk7XSfbshb9KfrvG\n/Ls9dNH8QP3P6yfxA/dfrEBtN9poQOm8Wjfl2XHUnfxA/dfrJ5+fuv1id2m+00LdpftH9Y3Zdpcd\nSZ5+fux85PPz92PnAB0mPW/eEBpfFfiZq8u034x8Sn8QP3Y/NL/iB+7/AFlivTnoF+cLzen7Al/X\n2z5cOgfxA/d/rL8/P3f6wvN6fsCX2NX2RFZ9p5sOi/4j/R+sr+I/0RnZVfYWTsqfu1+UtZdp5sei\nbdWlyFLKQynuInD1nk9clq1JXw7xPSbE+wPlKKDuVR8JmcZnmVjXiPh4tqnTp6Q8IKNhsrwe8Geo\n1fkxb8shCWe7gzh6rSNU+y5MHuPjMTExy74Z45cE9qQMnlf2gPWLPSrYe6Q1unqncPAwdo9ZMqR1\nEzToNa18TkeMtEHrc5gi1h64z7RDRw3qn4GSlsduq/8ACrrIBY/W7xiL09hUq7c7WBizWwZcj0RH\nNyDjpICoY2o7ZO5W3Rnk3BsbocCYaLuzuAPRvRM0Bmou3L1msUl0rkUAFVwczs0ahvN09EEhQefd\nPMmy6x9+T8Ok6Gk8oWoypfu2dMgdJuJYmPTr+ev92JPPX+7ESKXYZW0keOZHqKLua0zV5OO7G6Wl\n506gLVsQcBcnEBrLLrhZbXlB0XnEX1AJYnwhiw/bMz7lqcojho89s+6/eUfKDDrXBUbhkWCXkDvE\n3c9sTl9L/iDfdSfxE/dQdy+Ik3jxEtz2m/6F/EW+6Mn8S/8ASYO4eyCXx3iS57Xd9D/iX/pMn8S/\n9J+cDtPaso2e1fnFz2u76OHlD/1H5y/Px92Zla5UGSyD4yu2Qru3JiLns3fTZ5+v2G+Unny/YMxd\nun20ldtXn10i57N303HXKPqGQa4HohmHzhAfXWV50o6OB8Zbnsv6dDz3/wBZk89/oM541Y+9HzhD\nUZ6WD5xc9l/Td56PsSefD7P7zB2+fr/rKN39Ub/s99OgNcD3D5yefD7I+c5+/Mresb47Knp0fPh9\nn9Yu7Wg0Wej9U9/smHevhAudexf8JjfHaxGXRFVadknoD1R3Q+yT7C/KdKjTUCivIPqj9owU0Dun\nGNHIn8rCPhyuyr+yPyydnX4H8s63Z0fZEILUOij5S+Ce2Z/Ljpx+zT7LfllCoHpW5/4zsH+gD5RL\nHVfVVJfDXyn/AKZn4YFpbupf5QxRaelB+Ue38Q7tgHsglPKR+sPnJ44+1809wEUX/cwuwv8AuR84\nBq8pn64/NB818onk2r+Yx446k8v+0HjT3Ecool+bWd+wTKdBriebV/MZP4XqG9a1f1jZ9Hk/2hq7\nAjq1cm2tettQmYeSbO+1PlCHknxtX8suyemZzxnnL+msXUL/ALtX/wB+MvzzTj/eWZB5JX77/wCM\nMeSqh1sf5TcRn05zOn20ee6f70QTr6B0JPwih5Mo+8shjydpR13n3tFZpejHaHyhX3KZXn4PSon4\nwxodKPqn8xjF0mnHSsfONup21v0epKGsY/7J/NIdYe+s/OP83pHRBL7KsdFEmzU7TyaP7WNtUD9R\n/wA0Va1dq4ep2H4p0ti/ZEm1fAR48p5lY18I4x/t523SsCTWjFfA9RMxHiOZ6zA8Jk1fk+nUZYeh\nZ9of3idKfh0x/KiZqYeZeolsoR7u6LZcH0lKnxE36nT2aZ9to9xHQxPBE5cPVFTFwQtjgdQ4hraj\nHHQ+BltSp5HB8RFtU47g4hRPpq2OcYPXM1afVX6fuDL4gTCGKnCsV9jRo1BUYdcc9RzLE0k+3Zp1\n1VgxnaT8o8HPOcjxnEzXZyp58RG0320nCtuHhO0Z4zy5ThMcOwrMpyrERdt3aWemeB3TOurVl59F\nvCDvB6mJhzpqI3QTWPb84CuyjJzt90aXGAQc5kqJc53YpSoFgGTgzSdKftGZFb0xz3zpEgLnkxGn\njLOWrnHEs/mx+2ZPNx9syW6yqrqGz7ohvKf2VHxmZx04bxy18uGjsAB1zB7ETG3lK0ngqBFNrbT1\ns4nOfH8O+Pm+W/YgPIk7Kv7InO86J62fpINSScdqPlOUx07438uj2Nf2RJ2Nf2ROf2/jaILWqf8A\nd/WSmnQOnQwTpUPef0mFbD3Wf/KMW+zuszj2y1I0+aL9o/pJ5qv2jMx1VmMbpY1ln9Mez01DTV9/\nMvzev7My+e2fZWWNc3eg+cns9NHm9f2ZfY1+Ez+fAdVHzgHyj/6ifjJ7PTX2NfhJ2FZ7plHlDPWo\niH58nepEez0adLSeqwbdNSKXwv1TA8+XuQn4wLdepqcdm3qnwl9np1aB9BXwPVH7Rm0eAiqCPN6+\nfqjv9kZkDvn0ofDnlTOidYltdQnUN8o/cJRZT1H6STfwuMx8wyt5X0y9zQD5bo7q7D8JpYUnqg+U\nHsdMetS/KYrPt13af7Wc+Wq/u2+MA+W17qSfj/1NnmumP+wvyleaaf7qStTtYy0fmJYz5b/9B/N/\n1K/jf/pA/wCZ/wATZ5jpj/tiCfJ+m+6itTtqMtDqWU+WT92v5j/iC3lpx0qU/Gaz5L0rcmo/OCfJ\nGkP1CPjJt1O13/j9Mf8AG7j/ALK/rL/jFx/21/KZp/g+l8GHxkPkmgdGcfGTbqdrv/H6Z/4vd4Jn\n3GUfK2p7hX8od/k+hAcXHPtInPt0xGSjMQO/MxlOccy64eHLjFs/i1/ivwSCfK2oI4P/AMJhWq1h\nlFdh4iX2dvg494nPfl27RpYftaj5U1RHrD8o/wASv4jqic7/ANBMwDD1g0gs59FSfjG/LtfFh01j\nW6o/7jc+6UdVqehvb5xC2ljgKPzSyxz05k3Zdr48Ojm1Gs7rX+BEHt9Yetlv5oolwcnb84LudhJO\nAOSQe6N09r48emkW6nvss/PIbtR983znHbyuQc9jhD0JPWdryY2mOmHlG5coDiuonO9h/YRcm3Ho\nsXblPaOXYdFMS1QxlSc+3EO64X2tZb6LMcnHA/aDuUcISfdJbVFEEEBpXOZbWleqNiWXLV7QcDrg\nnpLZQSA3UAxT1AY2kj2RhLAjgEewymPpL75pCDWwPK/FZA5zg4b38GaO+QqrdQDCFNqdqhSCPfzM\ni67U2azb2hWsZ4E0W1jfxkRYTHQ9evAhR6HU9vfYb7GCjgYbEdWl1ZKV6iy1Oqndzj2zPTpV3nHU\n9ZqCmseiij4xM+kqzkGoDjNj4982C+0HBvtHxxMCtnnKD3iPArboyKfYJm5NmPTQCLCd1pPxgMiD\n64+Jmc7qjz6fzlNWxG7ssD2NJaxjEcGNXX32fIxTVJu4Y4jOztA6L8CJW1u8fpIoOyX7f6SdmBzn\nI90q0HjCg46GJxbnw+Eo0BR4LCx4AfOLWnUOOgx7SJMPUMOV+JBkBZ64XMtW6Hb+suq5wMBlx/Sg\nhdozplQR8MQLXceiEwgjsMhGx7MxDOwbkn3GX2oxycfGAza2eePexhiv2r+aZWcn1WJ98ido3B3Y\n9kDS1YJHoq364gldo9UceEigAYNhB8CIDbwcgK3zEonQ9GhKQevEQ17qf5X6w6DYwCgY9pYSBhKd\nN4+UCwJ2bHcPVMd5ra3Is/SJu0lwrfLA8HugNTyhdtQB8LtHIUS/P7+S1xUY+yP8RCaVnqGaigAH\nJbrx1gGh1wNueM7lm9+XbHiw6abNbaOV1O4+6ANZqT1tx7hFGsgYyPfAWps+s/J5wJN2XZ48Omm3\nWOFXNhBJxnmV55Yucahx7miWqpUZdLT74sbM4WrJ8M8xuldmPRv8RvyQ1zkeO6Q6+zI+mcZ/qMEV\nLuAKFSffBtpQgqOvuPEm6TbHR/nd+P57/BjCGu1W84vcj+oxLPhdvZZHTpBzswqqB7ARLuk2Y9Ny\narUn1tWFA9sJtZd36kn2gmYSFYZcIceJz/eTgKNrAY8GEbsu02YdNNl9jAHtmOf6iYvKYzZazf0j\nrMwvUksGAA9biS22scM5BPfiLtYxxj4b8aJRuGT7G5lBkf0hWFHdjPPwmJ02plkP/EQldgPRQ/vI\n0abHJOSoH9IhgoCGFh9hiDbfn0VUStjWHLvg+6BsNqEesfeRAbaTtY/pElK1wBcCd2CAvT3xzV1L\ngC+pmHIyp/zADFaHKlVPTjjMApvfO1vfmVZawP8AMX/iDAxY3pBvmYGjoQAo+cVqaWtqdEOCVIxm\nCu5cnOCesNcuOSc+Of8AqB5+2wdmEwQwPII6TreS62TRZY4DNuHPdHnR1s25uzLe1Mn9pS17uBYC\nB4YEWGYBbO6WCp3DcTjwghCCfSQ+9hBCKpLGxQe/GID1VGGSrSmUH1QxHyiHvReO0LGCNQPqiQPC\nL3r8zF6jT2Pg0siEePQyxq+MFWJ/SDktnAKg9e+FCocDDsm7vweImy9gVStMux4B4jbNiVO9jMAv\nhM6X0nW7X3IOgb2zUSlGWpZgZAB98Cqu4k7lG32dZrYrjhi3PBMpbSBh2OPYYsICPvAHEep1AIU5\nx48GNV6QPWfPujxZpccbyfaZBk+kUnO4n2KJeCeGX47TNgaouFVQQe/OQIRq29GTJ6ekIGFlwueR\n44Bi+c87vlOiqMccBj7OYTlguGpA+GIGFK7NpIbj2gSl3rwrDA/omtVU9VHzMs1U7SRYVI6wMrMu\nRnY5PguJQYhsBT8pSaiosoXO5vEAYmgV2MMoR8oCskZznn2ZiSN1u0kjjOdvEtmbeec4PU8Aw2uZ\nhtG0e3EUF7CPrL8VkTGee/wh/wA30VxnxxiX2LZ5FeIoU25ejfI5lh7cd5HujFqAOcAe4QW1wHAX\n44xFAqyT6yMT7obIGHRh/wAsRPnaMMFH+f8A1A7dfq5+MUGmkAeux8BuMsLWOvafmP8AiZu3O7HH\nPsjEscHuhT+yqOCS/s9KFsqUj0X9+YrtWP1FPwMhLd9BA9hgP3oB6LkfH/uKubNbfSMeD0Y/5ggr\nn1XH/KS7b2THB6GEBXbbYqYILAAcDke+aOQdrkZx0EXTquzpVKq1UbRjuH6wDqrdzsdgAHI//IUD\n3ODhlUQUZM7nc+icrjmUtzMC+8AHvHGJQDk5BZv/AL7YtD21h49ZgfYIpr8nP6RR25Odo+OJW4cq\nQn5QYDqW7Vh6JGO8tibWpwcsK1HiTzOaGOcAqvwGJdZyzE4w3PTGJBrfUVlhWGOT0wYtqx3Nj24E\nz5HosFUE5A9HOI01WZwK63I6lWzmA36PZkL8SR+0WbFFmOOnwkSrUqi/RsVHgpwZtp1KpT2diKGI\n4BB/xG4ZU1I3tnawOMAd0l7U2Dc9eMDvGZNQwXlNufxdJkaw/WJJPXngRY1nXhelSOVHugr5QBDV\nsvJOQVOMeyZjv8eI2u1UxlfiBJaCqsNjFuuFxk9YZ07sNxKsPDtF5iC679wBJ9sUSdxIJEqnJYar\nCoJDZ5ksu5OWbPTGZmdl3bnYsSc8nmHsVyDtye6SwSMob0s7f6esIIzNmvhfaRKesKRlSPhIFK8s\nq49uJbBcucG0nae6SwsoBVjkHOM4iWPPAx7pana2frHrA0V3K5xghm5yOINpKDhjg8+MnatUwJUe\nl055hK/aHaEY4HIHMAHavHov7srByT0249wjtlVgIY7APCEmn0+M9rnHgJBlPrHOPj3S1GD6Ocew\ndY41UDlbAx9ohIezcMCB4YAiwyqzb6K4Gf6eRKft7LMBnPdgDEofR2F8sDYfscZks1Co4PZLvz4c\nywMmuptFedjHawYgDmc60+cXItQJJ44E9KfLOtShqqqlRiPW2CA2o7YAmlFsI9JsYzLYz12VLg9O\nMZkd6e02EA88n2Qr0ryHbaMDGAYGnZVdkQgq3rKw/bmQPrq0zn115yArDB9nWONGnAepGxZjghMi\nYWAN+1lKADjHGZtW2gVAM7qfeTJSsqozBgbByTgc5IjVpRVHaHLY9XbmZ2Ia84VrEHTJx85FFt6f\nRMV8QW6/PumkON2zha69o6Y/6i82sdy0ke0MQJa9tWoR6t4znIA/xKasvWyn0CemecQq7X1GwB32\njwz/AIidru4LsQvjg4mqt6URQ6DPTPIyfGXZZps/y3J8Q+f3ktGU9ihOFD89cmaUusHq8Ljoxgjk\nYrYrnqWrBEMWtVgMC48VyAJVF2Vbrk8+IXJEjabTkfXU+wmQ7LMejj2xVmp7MsnYkjOAwJ+cC7NJ\ntHo6gE9wK/3iCl6HFmceKqTINZzkcfExqal35UXN3+iM/wBoCw1ZPrtnw5/tGLata/y7MeOWm8qV\nXcduPEkiKvocetU3wWRbYjfXnIsb3ZkBVv5dvJIBB9sd2dYxurz8AQIu4UuR2YWrHX0MZlQyqkMz\nL2jei23ivOTKNOPVtA9hGIFWnLNk2VEe/E1LpcJgWBc+BJ/vJZ7VdXSwApsK+JyIC6Cx+RcD78Sr\nltqRnZ1ZV54HMlN9dgWx2Cr9k9T8cy2GJ5Otz6V4X8PMbdpazQ6vqV9U8ZPPzExPql7QryK/xdY8\nU0W6dzTUzDBzmEc1LX7NBauV4Iz0llkIyR7yJpsW6jSIz0oFYAKSO+LG8V9s9KlG9vfIqCtWGErI\nGOvJi3Vw2X38cZwYym64ZDoh56gw2ZkBIfjwPP8AeWkJJrYHNfsBgdju8AJoTVKB6TKD7pG1S7si\n1ceGCcyBaV1gb62duOMdT8I5FtbJVWIPcywk1ue6vHd3Ql1e4jisA8DugZhobTZuzg93PSaK6aUc\nLa4NnXAziaBqAq82J8GEQ+qDW+gU2gZyRnMinix6xil2RR4RRW7UXLZ2jl04DFsYk87rZSApBHiu\nP3mZmS23KIikd7HiA/UVXbhvZmJ4zvzMnmjuQM8HPU8TRsY9Uqb3PIUszwK1A7twgZWqatsBlIHt\nzK3Nt64Mc711sSzqwx6q+MNEpeoNtOSO4wjGQx6sMeyCTxyZuNS7fo+W9plHTjvU/AwMQIOM8++P\n3qFB9D4CE1CDlvR9pMnZ0DlXOfw5/eAdGoVerKR4HMtFquzuYBvYuIjs6y49MqOpyIRSrAYXcE4O\nZARqKIzjFm04IAziM2ZVgNh/4/tFL6DbhepU84B5jFcMA/akHnKYBJlEptRTtKqPeAM/OOZ6WT1K\nh7hz+kzfRsch8N7TJTU1mVZ62bwDZxKGOa9wdMHHcWl9qpBU1ooYdQ0p9PatZ7QLtzjKjMUNNYh7\nRlJTEAnRSvFi59+JFZFVSTkgSIzIDhBgnqccRuBYu7GD8vlCj7XeoZV3AfDEz2O2846eJlOgCHaS\nSO7MZVonZNzOit7TzCEGxycEH4GEm/wwh7zmbV0CikszYA9kxMyjLBnIXgEnn4RQciVsDlHOOSQO\nP1mdw4tHZqApONwwY9SpUixnLHgjx9kCsNVWQzDax6E9IAv9GTtc7u/oJBrMn0kDY784jDWCQwVT\nnwB5/SKsOOgXkeGZasNOuIX1Rj35lDUCwAgfLmZ6hnA8TN+kfTI4rtqZieQSOYqiCld2y6DkDBLf\n/saupUrtKL795H95sC6dyB6CbuQvBOIVddFle6r0hnHAA5+MWOSy2m0OteVBzgtxH023q5K6ZefC\nHrdNqNPa7qjdmcYKnrx4RVBsVjZZW+3bwWl+BqbW6sY/8WwD+lusi6jU9m3aaMt4HbFNq61YKBuJ\n+ywOIztDn0bCfYoMwAvvSus5pZW+10mHz1ui24nVNgQEsN+PHEGuzS6nIdKBgZ5I/tKrmpqSfW2k\nwxrWRuGYe0EzbdpNEl9NXohrvVIyAPfmVf5FCNgMP+LgwhA1L7gxsZj7RKv8o2bCqN2ZP1gcQ+xO\nnGGDFOnKf3kRKXONrYxxlDgfpKpZ1tdmN4JbxBzLFzIGIBxnHK5/eaK9AOWDs6A9FXEzXUsHbD93\nQgwCVmzuTDDxAEM6hmr5yPcZjG+voawPa2P3jNttqDYATnnA7pkGn0ir9K3PcYnaUDFzgg42+I8Z\nbblGN5Bz0zjj4ysg+kzup9waUVsDE/W9mekIkVq3pKno9AYlrSrFkYsR04xG26izs22h3OPrd0IG\n/V6jU6ULbvNY5B+ELS1vbp2VFOSc7mbEpKqgKzXvLY5C85+MspUenrN0B65hWurT20gF9jezcOYF\nuSrejWnOT6RP6TMUFfWsqw7yTALVjBNW727jAJqkrDMzbcjpjGYKFduN4AMalSXgZAQeLf8A7F+b\nKbCK2LEdM4Hy5gQ2YU1Ic59ggbVZgCAGjl0rhtrLhj4CBbSos25O4HDDGMSIWDWl2GAK4564h2OC\nylU47sSdjhyCGx9oiMampSQS58NuMSgEuB3K4znvGMiOREeo9lUzDxxFrpvT2mw57sd8ZUjJ6AYp\nn7LAGFdHTV13aYhadrgd4nPuo1FaHdRxnJO2INKF22XksOceMcHIXY+4g9zsR+0DKrBmI9AeAIjq\n3Ttdtu1UK87CRDq0/aNkIVwM8j/uZlH0hDqMZ6fGEab+wrO2rUAjxUQ6tdXUrYRnJ+10gXJUdjFm\nDHjkZyPEGKauvgK2c9+YE1F63uDtNY7wOhig6L9UMB1l2LsOA4Y+Ijk0tpHhu6ZOM/OBdd2nYelW\nAfwmX9FjIpck+HH94VVTI+w1M57yuDj5QrCtLH6JjjqfCQLNDlQVo2/ieKCsrFio+YkOpXUHZX6P\n4jDallA9KvkcHOYiBLGyRuFfPcqgGPqsFI409gbvO3iKVFKBSqDP1iT/AIhUqOQQxXpxkj+0tK0P\nq9u3bVYee8YzFW3E2f8Ak766jyNh5zJcpZFwAq/0gCIspV7M4Kg90RCScmuo3YRcDpvtYn9BAfco\n3bvH0SMRNgFa7UPrdZYppHovYQSOCV6Shu1ryMElcfV7oyoad0G4hyOp5iUqUABbmGR9n/uD2Fig\nBLQOee4ftJStRpodsKQW7gDAXTJuydVWhB9WxsfpMj6cg72srYDwJ5/SEh5BKoR056RwWdau24hG\n3+Lo3H6RfYgHPAA6kPNCuqof5IJ8CBiJ7fYSLFDg/ZHT9Y5CkvsKYO3YD7Y+qxCoDBTg8kDMt7VC\neoTnwwIFNhNoQqNp6bsZltDAVDHYgI7vVB/WNqpNljMUDKo6kYjFp1NrBVowP6RtB/tG+bafTvh3\nG89wHP6QrEAxdjW4BAwQMcCaNHdSan84foeN2Rx8BF3ImnsdmVDU2BuB5+UzppkvduxsJUc4/wDp\ngo2xDbZsR6mVvV9IiFqKatOAWJOcAwEoYsAtPZ/1EHj4wrdYWqNbLz0JzIM9yorehjx6Sl1IBH0d\nfxWNNtRoChsbeOmYhqtq9p6OAcnEhLWLDZUD2KH+nGBMrhFsAFQ59hAE6LuX06kgg9OuJjRe0Zq2\nbnpjJMoXY+1VLkHHTiRb2IOXPpeHWaDo1Ws/Tj3bhMyGpAu13544MgabHK7O2YIBwGEfTfYqFcjg\ncYbrMrEDcTY+3HGeSZfZpjC2knGeDiUPY02P6RKP3+jmRkVULedOAB0GYgVbAxf1m9XLf4/vKVlQ\n7C6YJ544EgFkTUZ7PJ/qOM9YSA0v2aWN0+r/AHwYypqVAZlABOPRzKJrLN2S8txkJyc+yEDUyM3N\ni+PpiMzkeg1KHuwwixprqV3NUx/q3f26wCLGA53DrzKHsoySDkjrhusFLSyMqVbjtJy2eJl3DcRw\nfYOZZJFbbX28faiw1iCFCgL6IyOf8RZuWkdCW9vhNDoa0Rdg3FRt7v8AMQe2Z9psGfDIEKDtFtb0\nWA9hMdvoqI9Ase/PjCXRWMOWUn2An+0L+HHHJBkuERbgzbUQL/UxAEyXFhecuG/DyJpbRWBQqlcZ\n8TKXSoWKlyWXryYuAJay0AYxnociOtoXT0i1tSth6bdsEaVUG42EN45PEz3gbs+ky9+T1i4V0Uzs\n7VK1IIHUTPqLWNgVqlr3DhcTNUdhBJOe4HPH6ze7VrUpsZCwHOcHP6yjG5NvoFE44BhbF2g2uVI/\np4mp9MuosXs3UL3bRM2t0bqQjXBj78SUUm57FJrGMd45zF2Le7KxJ3dMk4jadOXRq6yinGcs2IX8\nhuzJDEdSPSEooHsqMajls5Uhhx/mRHRnDNZWFI6ZETqHa3KbcL3AgD4xbM1ahEVQMeOZBqpcLUVs\ns9M5AIOePjFNsVcIr7v6uMxSnewHO7nAEYbDTZk7X7iCeJREFYwzjB9pOJsYip0bYjv0zu4Exsza\nhgyqFA6BeZr02l+23on6pSSQJ1C53WUjk4PpRVxYYFamtD44/adDzfToMZAidQmnYjLE48AIuEtj\n7Blq3hdw72l01M49KwKMdd3OPdND2I1QqVMJ75Sdig+txLagqROzYW5cfVOc/tB7fs/QrReeOG2/\nvHFxgbXbryCOIW6o8lM/CLFVWnAXa5YZ6WiOtpYLlbbMH2DEzm3T5wace4SltVV2otjfjbA+Ql5E\nd6Wfb6du3rtEOvTBibFXqO/BxAVrSu1CEXrisYl7SqDLYX+oxQavmyDLozN9kDbj45imL6g/+NQp\nAyp9MZHzlrsJwSWP9AziVSEBZltVST0KnMoA1GgEW19RgZOcfKUHCW7UBZQOAccx+8nCBG3A+tvz\nn4R4pRs9rhGIwWY5bEkwjPUpuT0tlQ6+oef1h2aJym5GS1eo2qR+8Zpk0+m3Kqh8n1n5mp9Qli7b\nHOPYJmZacymhmJU1kN0nQp0BVRjfZ/SDAOqooswxbpxleJaeVzUfo70UexD/AIgXZXq1BCaaxF8Q\nDMrai3TVtldntI/zG6jX+dei2p4645A/WZ7FS+rY7Ar7MQhO83kDtXHGc8EfoTDsuenT9ml4Of8A\n1jPzkrorqQpW2AevtjVU1ncjYOMcS3Awq9gPIeaq66mX6QAnw3YP6xosux1EpbLFJ31q4PgBn9Yo\nRkrrx2SK3/ID+8TYlrdFUd/rj/Mfv7QArWoz4hcw7FAX0dmfAkCKgJoR1qPaFefBhmZs1O+GUbcn\nnvm/sz2QD1gH7QaJ7BCcKcH2vn+0oQ9iKEWtywA5zmJOc4AsI9mSJ1tPp6qVKgp2jdMn9hM5N3aM\nuGyOoWBk0+4WE5Y9xBHSaLbNQ9ZrViOc8AH9zM2oru39pWp5PJ25nRo11LlV1gfj7tQDIMK2OSWu\nLsy8cKAPlHmklDmlix6HAGIWt8xN4uoe0qSPQsXvHcT4GOHlXR4Q2o9ZwN4QcE+zMIxupSkixGPP\nHBECh27RQV9EDB2nnE3XeUaLX7JKHNTAclhmKXza42NbW6EdNi90kC7HFo2gWKvjxmKupBQtgW47\n92MfpF7WVgaGJG7A3YBktsIYi0tu7xwRLYSaLgMDAGMjkS+xsKEnYMrkEuJKrLQpVV4bvxnHuguz\n+mDgY+EBraixqwGuUDA6RaNWhLdorH3dYpOxasHeOnhBa0KcJj2nEitw8okDHZjA9sr+IufVQD2z\nO9qNX6IJI68Shsbq5Q46FZKhLOOtuc8Y+CxdVlvbOysQzcniGlaMMl9x7j2eRKVK1cqwbP8ASMSg\n6tUzld5yD3marNhp9IVIPEggzLo+xfU9mRjHe3GI6yitmJrtVz3DJBP6QtMlOm7VjtG4HoBLWpA4\nFiDI455AjajdkpwnjtyT+mYsVWu7deueeCZSTyWyQRhQOvdEteM4poRh47f+op31HfnHgYxX24bq\ncdIsNWxyh3aRWPcc4xAra2ty5VF/pZpfpl2cqezA5IMSSWOEUceMiCs1DOMt4eMScMQWswfdDNj7\n/Sq4AwcnAj6SFcZGxW6nqBAWtda17+0Vz3L3wg7AetWE+znmbzZSiE173HGSpCk+7iIp7VyxO6us\nfWIBzCotrpWy0kMijrsGTE+cX4BZnUHoD1mmiyktgq7nr3f4gtvsb06Vq8MENLR6Zt4Y8tmXv9s1\nV6JLh6TKjf1Db/eHR5OTtCO0LY/oOJKKYwx7gZDYw+rNOobSjUFabbN4GGAQgH490yWO75rclh14\nEUILndyuw48QIYVg3Xv4xzDqqSpd9mqCr3JWdx/wIxNdVVW3ZVAH6pPJPtlooSUM67tgQDvbOZFs\n01f1TZx44i7dUtlO92UHI+jQnn39wgA2Xoy0VpTVggkEZP8AcwejWuRzlNy9OFIMc2mDoCxKeBPf\nFaXyeWQNSjlem9+FHxmzUaemqpd9hLIOQM4PuEDJ2VanlnfPUb8Rdq0I247kJ6DeCB8JNVe+AOw7\nJSeG75l24BbYWAPBEBj6y1R2QBK9xAw2JG1ysCSpDxe9mVgckHxMMDdxtrx3DGT+khyuvWHZuZQe\nehhWaxF2AIwJ5PhiLTSizC7WDtwoAPJhWpdSGotIBXggnkf3ikNGp0juDaljHpkkSreyKq2nqZue\nfRz+0zdg4G5gGHiG5jK1sQgotg9m0zStBFKKGtDkHorIy7fZkdYfAVSXXay8YQ8eERel2w7r2cdQ\nhJwPZyYCtq2qDCywc9N/UfOAa1WEK7AYB9LjrH1cOMmoZ7mYwKX1CUvgqWYcdpnIhCmu9EttRQ6Y\nDNhv2yO+BHsrNbEV2j3txM9DUuT2ttqr3YOc/pNHb10h2e0Mz5worPHszniWld1le/sa9mMqQTn9\n4QDkqD2NYtHcOh+MJKWZQzJ35JHcIFtlJrDLpw1h+qwyP3m3s2NOwdnWD3AgYkaIZ1aroSo4wZla\n1ah6JNWePHIm0UHsggK8dTuxMWv0zBFOVwfbmRKRntu7MBvS3Z3Cae0t0+pALMVbp6U54LVKgyAP\nDEs3vwdoz4mLlG7V6u6t2Sp7NuOdrEATPpzdeu4Iu5T1YnmI34Uhsc+3kTZprT2Z2CvJ6kjmANun\nLYJrIbPQEkGL7O7YTZUAoPU9MzUpZWCbVx4BRz+ku13IC7aNuejCW4Vn7epBuCZI6YPfDqvexy5Z\niz8c/wBsSrajaD9BWv4f/wBlU031N6WCntGZLDmuKIxLqcDpnmZLwLkFxU8cH0s4MeaKc5XT4Ydf\nRi7alKHns93XA/7lmYQgXlmUD0nXGBLVirO71KSQfRY8e+StNlm1AhYjGQeZbMQrE2FV6ZkE04rb\nTk4xjGMZ5+MLdWqEdmobxMbfQnmiMgAIA4AiLFDoMOGY87e8e4iWlNqRb0O5V2r1YECA1mnFgqRC\nR4g5I/tM5dUt+kFyL4Z6zfoloJ84ClEHjzn4QM9qr4OFPQgjA/SXVrq66+zBCn7RYn9hNOvv7VAK\naS9fezDHsmF7+0ZFXTrXUvrbRyTFh/0Do1jqjN9ohj/eI7RWBCVhR9UheTOkdT5PWsBNI7tjnNxU\nRL6jSlB2eiVGQ55sL59/EDFVZaHy7Mq9+0An5QnYNapNZtUePok/KFbZZqSQOw06k/VGOJprqSvT\nmsOLmI+oDmRZYGZ0tOyoJ/SSZZbc5Pj3YzNw8m2X1m0p2Yz0L8maRpKkXLIK9o6esD8ZUcqrzxx2\na1kqe8EmMr30EopFdnVg65PwE09tuUqXAx3ezwwJltsC+kMDPeW5+UDQ9x9Zq8so5ZjATVV2hk2b\nnwSByB+hmLfaScAEe7EqhLbLcKuPw9RINmitXcVIVieFU9Jp1hzUoSsuuMnacYmc0WI2z1SO7JbM\nzanKWCtmYk8jcP7SjfpdIrU9ti1B1JTDACAwrZirvcT0Ax1/SaFt0zaOtDpXFq9WXCA+/rmZG04B\n3VM1bHkjO6LGlRj1je57ge6Ka+usGxRZvPGWP94b11tXtAIPiXJ/SXToNPZSxssrVl+0xBPuxFwM\nj2IpKhHO7BHI+UfRqbK0NaaZUC9CDg/GabdF5NFK9nXY9veXsyP2zKr0mhNZNlLG36u2wgfHjmLg\nc9dNayF8eiOc5meljcSgXnxzOmNKwsLVhUTuGcwAWotJqt2P3nk/3ktGcmuio/Rdoc43E5Huh0Fx\nWGq2ts6oy8GDqNRfrAiOzMN3HoMBLFVlQYVoGtTjk/HPtlHU85vsQdnV2R7x4TK1pYE15e49C3SZ\nn1t91PZeipP2AcmDYt9anT3C5gvUITiVab1atbM6rddYo9VT6A/zMTOtlpU/RKevHAEUd61gYAUn\nPJJMlO1HDWOWXPOOf3klHVTS6UVotT9s1nAAXDfPMRZo9NVYaxkOOp5JH6zVT5KYaprjXelKji5X\nP6ATonydpn05FenF7H/ctcgj9YtXnm8oJSxVarcr6O4Xf5EGrstc7ttdCmCS1m7PPuE6Q8i11H6W\n/Tge30v2i2opqYrVsKnvAxn9ImYSxXWCjSGxO0sA9EKSGXPiRmc2jX3WHlU69cYm41q64cAjwxFp\n5O3EnTh0zwdvAPykuCwPS9zXk3BU4wxbr8I6jSX7STrXAIyrEECYbKbtOGTssDwJJzGnyhqrq1qu\n7NFAwNucfKaVttS69lUalacNkE49L5Q37RcLcqsD4JOclb6lwS9akHAYnGJ1NXpdRVpgWZQAPWHI\nPxksIU1V7kIRwOSTwRLtqosqLKprfHGPSB+HExI+xcud3u6/rNFFrV207fRRsgng/wBv0kDKbalq\nxdpq3f7WMfpLa6pwQNPWPcsbc+nessKr9w6soVR8iZnWs55dMHkelkn5CSpBWEFQuwEHuxOfdU+4\n4qJX+k5xN2pKoAcnPuicpn1hnrL7SXMuS0EFAfj1jaqiuDYuT064mmzUIfRO75QuyrJQtfYd/QZ4\nkBU3oiMDSrAHGcy6tZVXeqpQqZ4JXrBTTVM/0eocc7toxiMt0S2WC032I694AxJ6GbVk12BktLK3\nIzM1jXWcFwVByAZ0W0iXU5NpYno7cTIdOO3Zcn+5EsSD011rWqLAGXPTOJ0rV3IOyDHx3HInMOmR\njtUtnpnEPTmyjC4yvsMvKtIQKPTGPgZYCOCvaV48cQe0rsYq5BbwziCT2ZBLcDuBzIBehDkMGYfa\nUCJIrrRsox4PJGJprvVGLZYEnwk1Fi2VN/5K52k4IEBdev8AoualHojqeszO7XD+WgUeCzpB6Bp0\nsWit/RHLCZTrmcHs6Kh714MtyjHwwKqE57+f8zSmk1Loqh/RHQbhgRV2rt9HtdJp1A71UyLauptV\nWuVARnHQSDcnkvCDtdUufADOI0aHRIOWtsPvA/aLFekVMNaD7d0XY/k6v13dvZkyKbdpNM1Z2VAD\nxOZlq0wU8q237OTgwq7qHZkrodFXoAf3iSlSFms5OeALDn9JRo1FmmStFGlVm7zubP6GLTVWgOUO\n0jA9AAYErzYWJuFQB7i1hwPhmUuiur9Msq5+ypOZRtFmjagM7O7DrvfqZmfXUhHC6VASMKcDj4wL\nlRkya33gYAC4zA0+HsxtSv8AqYShW644OFAB+rFbg7sFIJ6njpOrbZ0yCcfWHAmWvSjUOzdh6Pe2\nD/iQovShHYixWb2jGI6/UGnNakouPqkDPvxN9aWVVZRqAnTJXmc7zV9RcXOHH2SQCfdC001XugD1\n7a2YY9UHPxgdi915ZsFvtkyrO2FgSpU06KOQB/8AsfpabtRnsq0cd7l+IQsq1YAtKjPQ5lsVUZzn\n3R1nZAN1RumUO7+0yulB53Wn2uQJKU0L6O6WAoG484icbWXs2Jrzwc5mprgW7KvL5+uoHHzigqmz\nfnlQT0HhBpsBLbm55K+BE2VeTdIoc3WXEleMY6xI0ulrCu/aEDjG7H7QgPO9Oq+nbg46AZmXUNZq\nlxSrGs9SVAnVpp07afs69JVWxGTYWJY/OD2qKVQN2jezmWIGKnTmmscKCP0h6NApe+9i6dfSOP2M\n7F9Y02n7Sy/T7iOFGS3wBE4uq1112yk3PXpx0QcTQf52z3qQ6qpIO3cMn3986XlbV3qv0K0ojJwy\nqAw+M49JWio71U1cgHGSx9s2MBrfJ6VLYisp6HvHh0kGPTB0LW7lsdhwVGdvjEraEtyxVx15HSNF\nPmzKWuCqD6h5JHwgWrXa+5FYZHrWN/aJG+vUOF+hubn6q8GRblYZs1BDfZIJM511bdkqi6sPnu/z\nBoemy1zfcd/1WJmaHVNmnzns7GH4sRdmorxhUVR7Tkzmrqay+x3tBP2SP8RllabfRtcHxJiMEaHv\nRFLMDj2CJOuotpbbuPiuMfvEHSo7BbbC4HTnEiaamsegxHv5l2A9PqrWrCVaY8dN7yhTqtU7Baa8\ng4IV4xVpBDWJ2h8MkAfARfZ9hqS62C0MdzKv1fZLVBT0tS5R3ZLV+oBmOs1V2n22vtZX4xkc/wB5\nq8823MtFa7TX1FeCD4+MGnykadOaa66hbuPpMMn/ABIpg01Ny9tVsrJH8u0459kxW6ezTMrdsrZO\ncA9D7BJdq/Oa/wDyHdiD6q45Hy4i7Lm2nzWplUDqWBhDXvBKgeg3ewUkn/qbtLQa6STeCSc4AmDS\ni/etig/8QMzqMQwBNJqY9Qz5PylUi9qAApaxrT3A90QdO7kstGF/rbBM3LUKGNj4weY19TQE9F05\n90gx1V+SrKwdRbtsHBGSMS9R5nXpidFqS7jhVyMftEtpdPaxKk5Jzw0i6StDgbs/ilmYQB1FqKPo\njx37II11m7ik48cTdTWqJ6JYt4ZmUXWduwsr2bzhc85mRBqWVCXGR34H/UzEqACu1T7ZpusCbVI9\ndtvEWNAN7Dc/E1FAEevjfgn2GFafVwSPjDGgrXl3ZfAkjEa1aOmWIIXIyT3S3Ay16bznLh8FMc78\nRj21IMAFieMl84jq6BUcrYBX9YZzB1GqNzdlWSoz6w8JJlWZSlrgVmzc3qjIOTFV1hXbtcggEYK5\nJmvROKdQwI7VM9T4eM1eUUo1Q3FmQgEAjEDmoLtRp6vRCAAeiRGV1F3KbgdvrY6/CO0N/b18DlQI\n2x66jliiE9+OTJQyGu4EnaNniesZv07cdgWPgZqps9IAHeD1yYwLcWYU1oEXv4liBydRRuYPVQKs\nD6qzJssd8nUMvs75320+otBJdDjrg5I+U5WrXs3HasWPtODFEsjNUGx2jl89ck5mpKNU6r9Hawzw\nc4h6a1a7N9dJZu7b3Tauote5UfhWIDYt5X5REQnsvVadqqV24Q9+TyYmnT6mzlrHCH6qcmde2/SU\nVgJduCd7Nkmc3VeUnsytPoL4/WMf8artl1CsrlVBRAcHe3pfIRVtTIygXKWPJ2jpNlWlFujsa0EN\n6yE8Z/SL02mazGEAT7XjHCBTUupCdmTngcTp1rYas5yfb3frJTVXSOFyfGGX3TM5FLbfYhW5g4+y\nRkfrF06daSWSpWbxbmWupq5G8ZBxzDS5WP8AMX3AyXJZGo0NGqu3YtWxuuCMfLEuzTvTV2WncV4G\nBvHt5htqKa2yL0DfimjX+VKfJ+n0pWjT6qy3LOXOcAd2B0zLEjkWV6o/zbKuPbia10lddQserccc\nhX4+U6Fuu8lazybTe+iqqd/WRXx0Mzlq9anZivaD09LM1Zbnomj1J3l7KucHC7xJbSpVxTqUcIM8\nV7eI1fJw0ZzaAechoCBqlufTZO8bW5GMeEWImrNC7A7pkZ9FsAxQ1i17LEXc5ySxOZnu07dnna6u\nD85ndNiYJOM8yQjoJ5S1HRlqKHruEmrtt1Qq7GobaxwEGAP1mFTvUDPTvIhq9icKSBEyW32au61F\nNyqWQYzsyfnMbWbsNu5zwcRle6zbluhyY2xeMYxnwksDRqdOhHnCWWAdWBwceE3VHT6xSaKrgxY8\n7xwM8DHHdiYWOAPRJA6kShtbPaIRzgYiw/VPUrdiG23IOAVMQ1r9l2dxAGcjk4izodPY7NuIKnnJ\ngmisAKrFs8+79Zbhbaq9StbKKxWB7h1h72W3tK889RWgyfecTPRpqFI7U78HJxNSqpsJrDVKeigZ\ni4LZztt1JtWhwxOcHrNTNRwFrvwfW4PHuMdpKQ94rttRVJ5dmxgfOei/gWhs06FLLNxHG11OfaJR\n5Ky21iEqqOwHjcOfjCuRjhq6rMjk8z0F/wDp5qKy62Et3K1Z/tmch6tSCygV5Hf2mP0OIuThjWnV\nWphVK44wQv7xyVasv2KtzjnJUCWNBfZlgQWz0XDfsYZRqK27RbLmU8jBAHvgJt0Wr0/FqAg8gK+f\n1ia9DbexNYVEx4/3ib9a72nKttXjjoPYIS+VLAMdswHtUGWIDz5MvQcBD7Q3OJKsBXCdiHUelvGQ\nflFNr7r/AKNGLs3AVF5MVSaUdl1KNY3cEbAWKRsVTU9RrIc9N1Qxj485mvdgEvuPtJzOLYyK4Nas\nox03Zm3Tn/xCVU4PTiFhNfr03VqiApzuz7vCDoUFmR6RUjoPGBXozcQy1qCpyc8GNuvv0ifQKq46\n7gTMrFfLbSnYE50b2KftgwtQanq40gqfxWc6ny55RTBIrZfAkidBvKvndQW6s1HHdzJRUOc+mGoP\npmxcdMGENKtZBBbcO+wzdRraKk2bFCj65HfDW6q5sBlY9ZJmimKvSJaSbL8H2MeJhrzSXYWu4zjD\nMZ2LXoV9pUY7zgYETbRprF+jSts9Sv8A1LE2jmdq5Ibd04HJ5kIvuT0lPHTwI5/zNjOqMKalwPtY\nyYntFqY9r2hI6MF/zKUCzTlauuSe7OBNNdDLQyGl3DdWX9odGv0uoGxnBOPrLjH6RguuK7a9wXoC\nPSilYgSjoClhAHORG2tXbWQEdcL9maatRcr9mym497N3fCN8oVhtI+w7H256QjjaLU1omfRUkAEA\n/rOgbKTWHdlHgMcmXJKuLTQdOQxrtRyR0JwZl1/ZindXbtY9wOB8R3ySSwTyyhU7WsNqVP4gMZ7p\npp0YvYlrg1ntcAYkkgl0Hu0Nel7PzZGtH+4r+jOVR2qXNZS9WSeuF492TJJAT5te7n6M9fWPT5xq\n+b6OvfZssszwGYYHwkkhGfU6uy+zDgHPeTxNFOuOnrG7YF8Q4Mkkk+w2zU6e9EZrGQA54PWO890x\nrba6k+B4kkmdpbhO+18F0G48CHXvZ9uUHvPSSSaQ21dMOWGPaJdT6UkFw91aHBUNgCXJEQGh1wa1\nZFV8nYzcr8Zr8mamh3VTaQ68YAGPnJJFEOpqzRWgZrK3fOQDyT8ohrUp0j22WZU5K1j/ABJJFNOO\n2+1iVPo9x7/2ibdIETD2P2h+qccS5IpDNBpGrUXMcZ5XdwD85H7IOS1q7j7sSSRRSglbMEVqjaee\nTjAjX0iMy/8AkJWB63pnHzzLkikX5vVXZ9Hq0fjgBgR85pXYK1cncD4Y49vWSSJgY9R2gcmsIqk9\nT1Ptg06W6y3a3ZtuBPoESSRQYBWlmwOofGTMo1WxDtcnBxgn9ZJJKG0+UPJ1ejauytr7SQWBO39Y\n/S+WfJ1a1KunccexivukkhD18pUnVL5ra1IPA5wWPie6Nd0B9KxSfHcDJJJMKDfWT/MXHvi9LdXW\nXrZk3ZznPUSSRQryhrXQ0bNQwVrAHIfPHunfan/T1pybazxjBC/3EkkvAztpvIukB1Ndio6cggqS\nfgCJz9ZTpH3AqnZv6W9jtOT18ZJJpWCw6PydWXorF9nducnH6CO0tgvCH1iRkqOf0kklAaqrQpYh\nDebt3iwOoJ+IiNXZpNOuxbQXPI2uApEkkzQQjiwstdlZHcu8TseTPJmmeuu2687s5NYZD/8A6zLk\nihs1ujpuJC3Gte7dSTj4zjX6elLzixbPwvtzLkihi1FSk5NRQD7T7s/GMayvToq6dQc+vgZkklBu\nUuZEDmhm43MD6Pt4mjU6WtKqqDq6ryM7rVbOeZJIGB6KVQt26BA2Aw5J94B4mYAs5KMrjPecZ90k\nklENN2osFX0dNilfWxZn9jNOi1iLUxsJyVPrPn95JJaWZt//2Q==\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('ysdU4mnRYdM')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That doesn't look too good! What's happening? \n", + "\n", + "It can get a lot worse when an aircraft enters one of these modes that is unstable. For example, one of [NASA's Helios Solar Powered Aircraft](http://www.nasa.gov/centers/dryden/history/pastprojects/Helios/) prototype broke up in mid air due to extreme phugoid oscillations!\n", + "\n", + "Helios was a proof-of-concept solar electric-powered flying wing that broke the world altitude record for a non-rocket-powered aircraft in August 2001. But in June 26, 2003, it broke something else. The aircraft entered phugoid motion after encountering turbulence near the Hawaiian Island of Kauai. The high speed in the oscillatory movement exceeded the design limits, and it ended up wrecked in the Pacific Ocean. Luckily, the Helios was remotely operated, and nobody got hurt." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The physics of phugoids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The phugoid oscillation has the aircraft pitching up and down, as it decelerates and accelerates. The trajectory might look like a sinusoid, as in the figure below. The assumption is that the forward velocity of the aircraft, $v$, varies in such a way that the angle of attack remains (nearly) constant, which means that we can assume a constant lift coefficient." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/oscillatory_trajectory.png)\n", + "#### Figure 1. Trajectory of an aircraft in phugoid motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the descending portion of the trajectory, the aircraft's velocity increases as it proceeds from a peak to the minimum height—gaining kinetic energy at the expense of potential energy. The contrary happens in the upward segment, as its velocity decreases there.\n", + "\n", + "We measure the pitch angle (between the aircraft's longitudinal axis and the horizontal) as positive when the aircraft's nose is pointing up. In the portion of the trajectory below the center-line, where it curves upwards, the pitch angle $\\theta$ is increasing: $\\dot{\\theta}>0$. And where the trajectory curves down, the pitch angle is decreasing: $\\dot{\\theta}<0$, as shown in the figure.\n", + "\n", + "Let's remind ourselves of the forces affecting an aircraft in a downward glide. Look at the figure below: we show the flight path, the forces on the glider (no thrust), and the _glide angle_ or flight path angle, $\\gamma$, between the flight path and the horizontal." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces.png)\n", + "#### Figure 2. Forces on a glider." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The force of lift, $L$ —created by the airflow around the wings— is perpendicular to the trajectory, and the force of drag, $D$, is parallel to the trajectory. Both forces are expressed in terms of coefficients of lift and drag, $C_L$ and $C_D$, respectively, that depend on the wing design and _angle of attack_—the angle between the wing chord and the flight path.\n", + "\n", + "If you are not familiar with airplane aerodynamics, you might be getting confused with some terms here ... and all those angles! But be patient and look things up, if you need to. We're giving you a quick summary here.\n", + "\n", + "Lift and drag are proportional to a surface area, $S$, and the dynamic pressure: $1/2 \\rho v^2$, where $\\rho$ is the density of air, and $v$ the forward velocity of the aircraft. The equations for lift and drag are:\n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "If the glider were in equilibrium, the forces would balance each other. We can equate the forces in the directions perpendicular and parallel to the trajectory, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "L = W \\cos \\gamma \\quad \\text{and} \\quad D = W \\sin \\gamma\n", + "\\end{equation}$$\n", + "\n", + "where $W$ repesents the weight of the glider.\n", + "\n", + "In the figure, we've drawn the angle $\\gamma$ as the _glide angle_, formed between the direction of motion and the horizontal. We are not bothered with the _sign_ of the angle, because we draw a free-body diagram and take the direction of the forces into account in writing our balance equations. But later on, we will need to be careful with the sign of the angles. It can cause you a real headache to keep this straight, so be patient!\n", + "\n", + "It looks like we've set this up to do a little bit of mathematics. Are you ready?\n", + "\n", + "But before, a short glimpse of the history." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lanchester's Aerodonetics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Phugoid theory\" was first described by the British engineer Frederick W. Lanchester in _\"Aerodonetics\"_ (1909). This book is so old that it is now in the public domain, so you can actually download [from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&dq=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&pg=PA37#v=onepage&q=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&f=false) a PDF file of a scan, or read it online. \n", + "\n", + "Lanchester defines phugoid theory as the study of longitudinal stability of a flying machine (aerodone). He first considered the simplification where drag and moment of inertia are neglected. Then he included these effects, obtaining an equation of stability. In addition to describing many experiments by himself and others, Lanchester also reports on _\"numerical work ... done by the aid of an ordinary 25-cm slide rule.\"_ Go figure!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ideal case of zero drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we follow the derivation given by Milne-Thompson (1966), which we find a little bit easier than that of the original in \"Aerodonetics\"!\n", + "\n", + "An aircraft flying in a steady, straight horizontal flight has a lift equal to its weight. The velocity in this condition is sometimes called _trim velocity_ (\"trim\" is what pilots do to set the controls to just stay in a steady flight). Let's use $v_t$ for the trim velocity, and from $L=W$ deduce that:\n", + "\n", + "$$\\begin{equation}\n", + "W = C_L S \\times\\frac{1}{2} \\rho v_t^2\n", + "\\end{equation}$$\n", + "\n", + "The weight $W$ is constant for the aircraft, but the lift at any other flight condition depends on the flight speed, $v$. We can use the expression for the weight in terms of $v_t$ to obtain the ratio $L/W$ at any other flight velocity, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}= \\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "Imagine that the aircraft experienced a little upset, a wind gust, and it finds itself off the \"trim\" level, in a curved path with an instantaneous angle $\\theta$. In the sketch below, we exaggerate the curved trajectory of flight to help you visualize what we'll do next. The angle $\\theta$ (using the same name as Milne-Thompson) is between the _trajectory_ and the horizontal, positive up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "#### Figure 3. Curved trajectory of the aircraft going up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can form a free body diagram to determine the balance of forces. \n", + "\n", + "\n", + "\n", + "#### Figure 4. Free body diagram of the aircraft trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the free body diagram, we can see that\n", + "\n", + "\\begin{equation}\n", + "\\vec{L} + \\vec{W} = m\\vec{a} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "where $\\frac{v^2}{R}$ is the centripetal acceleration and $R$ is the radius of curvature of the trajectory.\n", + "If we decompose the lift and weight into their normal and tangential components we get\n", + "\n", + "\\begin{equation}\n", + "L\\hat{n} + W_n\\hat{n} + W_t\\hat{t} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "The component of the weight in the normal direction ($W_n$) is\n", + "\n", + "\\begin{equation}\n", + "W_n = -W \\cos \\theta\n", + "\\end{equation}\n", + "\n", + "If we then consider that all of the components in $\\hat{n}$ must balance out, we arrive at\n", + "\n", + "\\begin{equation}\n", + "L - W \\cos \\theta = \\frac{mv^2}{R}\n", + "\\end{equation}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can rewrite this as\n", + "\n", + "$$\\begin{equation}\n", + "L- W \\cos \\theta = \\frac{W}{g} \\frac{v^2}{R}\n", + "\\end{equation}$$\n", + "\n", + "where $g$ is the acceleration due to gravity. Rearrange this by dividing the equation by the weight, and use the expression we found for $L/W$, above. The following equation results:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{v^2}{v_t^2}-\\cos \\theta = \\frac{v^2}{g R}\n", + "\\end{equation}$$\n", + "\n", + "Recall that we simplified the problem assuming that there is no friction, which means that the total energy is constant (the lift does no work). If $z$ represents the depth below a reference horizontal line, the energy per unit mass is (kinetic plus potential energy):\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{2}v^2-g z = \\text{constant}\n", + "\\end{equation}$$\n", + "\n", + "To get rid of that pesky constant, we can choose the reference horizontal line at the level that makes the constant energy equal to zero, so $v^2 = 2 g z$. That helps us re-write the phugoid equation in terms of $z$ as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z}{z_t}-\\cos \\theta = \\frac{2z}{R}\n", + "\\end{equation}$$\n", + "\n", + "Let $ds$ represent a small arc-length of the trajectory. We can write \n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} \\quad \\text{and}\\quad \\sin\\theta = -\\frac{dz}{ds}\n", + "\\end{equation}$$\n", + "\n", + "Employing the chain rule of calculus,\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} = \\frac{dz}{ds}\\frac{d\\theta}{dz} = -\\sin \\theta\\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "Multiply the phugoid equation by $\\frac{1}{2\\sqrt{z}}$ to get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} - \\frac{\\cos\\theta}{2\\sqrt{z}} = \\frac{\\sqrt{z}}{R}\n", + "\\end{equation}$$\n", + "\n", + "Substituting for $1/R$ on the right hand side and bringing the cosine term over to the right, we get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} = \\frac{\\cos \\theta}{2 \\sqrt{z}} - \\sqrt{z} \\sin \\theta \\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "The right-hand-side is an exact derivative! We can rewrite it as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d}{dz} \\left(\\sqrt{z}\\cos\\theta \\right) = \\frac{\\sqrt{z}}{2z_t}\n", + "\\end{equation}$$\n", + "\n", + "Integrating this equation, we add an arbitrary constant, chosen as $C\\sqrt{z_t}$ which (after dividing through by $\\sqrt{z}$) gives:\n", + "\n", + "$$\\begin{equation}\n", + "\\cos \\theta = \\frac{1}{3}\\frac{z}{z_t} + C\\sqrt{\\frac{z_t}{z}}\n", + "\\end{equation}$$\n", + "\n", + "Taking the derivative of both sides of equation (15) and applying the relations from equation (10) yields:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z_t}{R} = \\frac{1}{3} - \\frac{C}{2}\\sqrt{\\frac{z_t^3}{z^3}}\n", + "\\end{equation}$$\n", + "\n", + "Make sure you have followed the derivation, and perhaps write it out on paper!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Phugoid Curves" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Equation (15) is non-linear, which usually means we are hard-pressed to write a clean expression for the variable of interest, $z$. In fact, Lanchester himself said that he was unable to _\"reduce this expression to a form suitable for co-ordinate plotting.\"_ If the great polymath couldn't do it, we can't either!\n", + "\n", + "But Lanchester _was_ able to plot a suitable approximation of the phugoid flight path using what he called the \"trammel\" method. If you're interested in seeing how he did it, his explanation begins on page [48 of Aerodonetics](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PA49&lpg=PA48&dq=aerodonetics+the+use+of+the+trammel&source=bl&ots=lB6EVKYQuT&sig=aVE2kiDWZoWftaWczMIrcYftMOs&hl=en&sa=X&ei=gTD_U82fGYjzgwT3moGwCQ&ved=0CCAQ6AEwAA#v=onepage&q=aerodonetics%20the%20use%20of%20the%20trammel&f=false). It's a trip.\n", + "\n", + "Lanchester used Equations (15) and (16) to solve for the constant $C$ and the radius of curvature $R$ and then iteratively plotted small arcs of the phugoid path. By hand.\n", + "\n", + "We wrote a neat little code that duplicates the manual trammel method, but it might be a bit much for you to absorb in the first lesson. If you want to look it over, you are more than welcome to. If you are just starting with Python, skip it for the moment and we'll return to it at the end of this module. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting the flight path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we mentioned, we wrote a Python code to reproduce programmatically what Lanchester did graphically. Here's a neat feature of IPython Notebooks: you can run external programs with the magical keyword ... wait for it ... `run`. And the jargon of IPython _is_ to call this \"magic.\" In fact, there are a bunch of [magic functions](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) that you will learn about. They will make you a happy camper.\n", + "\n", + "Let's do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%run phugoid.py\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This code cell loaded our simulated-trammel code, `phugoid.py`. The code defined a function for you in the background, called `plot_flight_path`, taking three inputs: $z_t$, $z$ and $\\theta$. \n", + "\n", + "Look again at Equation (15), where we take the positive square root. There are several possibilities, depending on the value that the constant $C$ takes. \n", + "\n", + "* There are no physical solutions for $C>2/3$, because it would result in $\\cos\\theta>1$. \n", + "\n", + "* If $C=2/3$, then the solution is a horizontal straight line, because $\\cos\\theta=1$, $\\theta=0$ and $R=\\infty$.\n", + "\n", + "* Any value of $C$ for which $0 < C < \\frac{2}{3}$ will produce \"trochoidal\"-like paths. What does this look like? Let's use our custom function `plot_flight_path` to find out!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n5MgRihQpQt++fQE4fPgw+fLlo1SpUpw8eTLV19+1axfFihULPC5WrBixsbFZ10G/zPQzNefrf0oy\n2tfBgwczdOhQALZu3UpERESq22amn+mtL7XtixcvniM/0wtR4BMRkWxlluFzxf7JuT/a6bV69WqG\nDx9OxYoVyZcvH506daJHjx5/2q5atWqMGDEiQ6+xf/9+Nm7cyJQpUwBo27Ytbdq0oXr16syYMYP7\n77+fCRMmnHcfR44c4aKLLgo8joyM5Pfff0/T66e1j5C5fqbmfP1PSUb6unfvXr799lu+++471qxZ\nw6RJk3j++edT3T4z/UxvfefbPqM/06ykKV0REfG8Zs2a8dVXX9GoUSMKFChAjx49eP3119m/f3+W\nvUaRIkVo0KBB4HHlypWJjo7m22+/5aqrrkrzPoJD7R9//EGJEiXS9L3J+xgVFcXIkSMZP3483333\nXfo6kwGp9f9826e3r4sWLaJr16488MAD3HXXXezZs4cOHTpkSz/TW19q22fmZ5qVNMInIiLZKqOj\nclnt5ZdfZv/+/bz99tuAbzqwbNmySbYJngIMlpYpwHr16rFs2bLA43z58pGQkMC3337LqVOnmDt3\nLsuXL+f06dPMnj07xf1cccUVrFmzJvD48OHDNGnSJEN9fP3112nfvj1NmjShT58+fPrpp1nSz9Sk\n1v/UZKSvO3fupE6dOoBv5Wvnzp355JNPsqWf6a0vte2LFSuWqZ9plsnMio/cfEMrykREsky4/059\n+eWX3bPPPuucc27jxo1u6dKl7oYbbnArVqzIstc4ffq0a9GiReBxq1at3LZt25JsM3z48CSrdH/6\n6SeXmJgYeHzy5EnXoEGDwOOGDRu6/fv3O+eci42NTbJtcsn7+PDDD7tff/3VOefcDTfckImepWz8\n+PGub9++gcfn63/yfjqXsb6OHTvWjR071jnnXOfOnd2OHTvcI488ki39PF996enP+faTktT+L5HJ\nVbrmwuSTV04zM5dX+y4iktVSu+B7OPjPf/7Db7/9RtGiRRk2bBjXXHMNd911F59//jmDBg3K0tea\nP38+y5cvxzlH7dq1ueOOOwLPTZs2jREjRmBmDB06lJtvvpkmTZowbtw4GjduHNhu0qRJbN++Hecc\n1apVC+yjTp06vPXWW1x//fVp6uO+fft45plnqFChAp07d2bOnDlZ1s933nmHqVOnsnPnTvr27cuT\nTz5JkSJFUu1/Sv3MSF+PHz/O888/T4MGDahfvz4tWrTg4Ycf5tlnn82WfqZWX3r7k1p7SlL7v+Rv\nz/ABsQp8IiKSaeEc+FIyefJkqlSpQuXKlbnssstCXU6aJCYm8s0331zw1C7nvP3227Rt25Y6derQ\nt29fPvvss2yuMOukp6+5uZ8pUeDLYgp8IiJZJ7cFvlmzZhEXF0ezZs3Oe664cDJ16lS6devGxRdf\nnKbtDx8+zMcff0yxYsWoX78+LVu2zOYKs056+pqb+5kSBb4spsAnIpJ1clvgy41OnjzJJZdcEuoy\nckRe6mtyCnxZTIFPRCTrKPCJZI3sCnw6D5+IiIiIxynwiYiIiHicAp+IiIiIxynwiYiIiHicAp+I\niIiIx+lauiIikmlVqlT50/VKRST9suu8kDoti4iIiEiY02lZREREROS8FPhEREREPE6BT0RERMTj\nFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RE\nRMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6B\nT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjwj7wmdk4\nM9tvZhuC2oqbWbSZbTGz+WZWNOi5oWYWa2abzKxDaKoWERERCR9hH/iAfwIdk7UNARY652oBi4Ch\nAGZWF+gF1AFuAN4zM8vBWkVERETCTtgHPufcMuBIsubuwAT//QlAD//9G4Epzrl459x2IBZonhN1\nioiIiISrsA98qSjjnNsP4JzbB5Txt1cEdgZtt9vfJiIiIpJn5dbAl5wLdQEiIiIi4Sp/qAvIoP1m\nVtY5t9/MygEH/O27gcuCtqvkb0vR8OHDA/ejoqKIiorK+kpFRERE0ikmJoaYmJgs2585F/6DY2ZW\nFfjSOdfA/3gk8JtzbqSZDQaKO+eG+BdtfApchW8qdwFQw6XQSTNLqVlEREQk7JgZzrkML0QN+xE+\nM5sMRAElzexXYBjwCjDNzO4FduBbmYtz7kczmwr8CMQBDynViYiISF6XK0b4soNG+ERERCS3yOwI\nn1cWbYiIiIhIKhT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9E\nRETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxO\ngU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERE\nRDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4zwZ+Mysk5ltNrOtZjY41PWIiIiIhJI550JdQ5Yys3zAVuBaYA+wGrjVObc52XbOa30XERERbzIz\nnHOW0e/34ghfcyDWObfDORcHTAG6h7gmERERkZDxYuCrCOwMerzL3yYiIiKSJ3kx8ImIiIhIkPyh\nLiAb7AYqBz2u5G/7k+HDhwfuR0VFERUVlZ11iYiIiKRJTEwMMTExWbY/Ly7aiAC24Fu0sRf4FrjN\nObcp2XZatCEiIiK5QmYXbXhuhM85l2BmjwDR+KasxyUPeyIiIiJ5iedG+NJKI3wiIiKSW+i0LCIi\nIiJyXgp8IiIiIh6nwCciIiLicQp8IiIiIh7nuVW66ZGYmEi+fMq8IuI9Z86c4ddff2Xnzp3s27eP\ns2fPEh8fT6FChShdujTly5enZs2aREZGhrpUEckBeTrwRUREUKJECa644gqqV69O06ZNadWqFU2b\nNtUvQRHJVU6dOsXXX3/N/PnzWbVqFevXrycuLu6835M/f37q1KlDy5Yt6dixI9dccw3FihXLoYpF\nJCfl6dOypPZc4cKF6dy5Mz179qR79+5cfPHFOVmaiEiaJCQksGDBAsaOHctXX33F6dOnA8+ZGZUr\nV6Zy5cpUqFCBiy66iIiICE6ePMmBAwfYtWsX27ZtI/hvQIECBejSpQt33nknN954IwUKFAhFt0Qk\nBZk9LUueDnzx8fEcOnSIn376ic2bN7Ny5UqWLVvGpk3/O09z8eLFufvuu3nwwQepU6dOCCsWEfE5\nfvw477//Pu+++y47d+4MtDdr1oyuXbvStm1bmjZtyqWXXnre/Zw8eZINGzawePFi5s+fz7Jly0hM\nTASgUqVKDBgwgPvvv5+iRYtma39E5MIU+DLofCde/uWXX5g1axaffvopa9asCbR3796d559/nqZN\nm+ZUmSIiAceOHeP111/nzTff5OjRowBUq1aNfv360adPHypWrJip/e/du5fPPvuMsWPHBj74FilS\nhIEDB/LEE09QuHDhTPdBRDJGgS+D0nqljbVr1/LBBx8wceLEwHRJ165defXVVzXiJyI5Ij4+nrFj\nx/K3v/2NgwcPAtC2bVueeeYZOnTokOWLzxITE5k3bx6vvfZa4OLtZcuW5cUXX6Rfv35ERERk6euJ\nyIUp8GVQei+ttm/fPkaPHs17773HqVOniIiI4OGHH2bYsGGUKFEiGysVkbxs8eLFPProo2zcuBHw\nBb2///3vtG3bNkdePyYmhkGDBrF69WoAmjdvzgcffECjRo1y5PVFxEeBL4Myei3dAwcO8PzzzzN2\n7FgSExMpUaIE//jHP7j77rsxy/DPQUQkiaNHjzJo0CA++ugjAC6//HJee+01brrpphz/XeOcY+rU\nqTz55JPs2bOHiIgInnjiCV588UUtahPJIQp8GZTRwHfO+vXreeKJJ1i8eDEAHTt25IMPPqBKlSpZ\nVaKI5FGzZ8+mf//+7Nmzh8jISJ577jkGDhzIRRddFNK6jh8/zvPPP88777xDYmIidevWZdKkSTRu\n3DikdYnkBQp8GZTZwAe+T70TJ07kiSee4MiRIxQuXJhXX32Vv/71rxrtE5F0+/3333n00UcZP348\nAC1atGDcuHHUrVs3tIUls3r1au6++242b95MgQIFePHFFxk4cKCO7RPJRgp8GZQVge+cffv28cgj\njzB9+nQAunXrxscff0ypUqWyZP8i4n1r1qzh9ttvJzY2losuuogRI0bw6KOPhm2IOnXqFIMHD+ad\nd94BICoqis8++4xy5cqFuDIRb1Lgy6CsDHznTJ06lQcffJCjR49Svnx5Jk6cyHXXXZelryEi3pKY\nmMjo0aN59tlniYuLo379+nz22WfUr18/1KWlybx58+jbty/79++nfPnyfP755zm2oEQkL8ls4NOF\nZLNQr169WL9+PW3btmXv3r1cf/31DB48mPj4+FCXJiJh6Pjx49x0000MGjSIuLg4Hn30Ub799ttc\n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\n9dVXqf4eVOBT4Atrq1atcj179nRmluSP++zZs11CQkKoy5MckpiY6ObOnZvkQ4CZuW7durmlS5eG\nujyRTImPj3eTJ092derUCby/K1eu7N566y134sSJUJcnYeTIkSPu73//uytdunTgvVK/fn03c+bM\nC37gVeBT4MsVfvrpJzdgwABXuHDhJFfuGDVqlM5m72GHDx92r7/+epIrYxQqVMg99NBDujqGeE58\nfLybMmWKq1u3buD9Xrx4cffMM8+4PXv2hLo8CaHdu3e7gQMHBhZjAK5p06Zu2rRpaR78UOBT4MtV\njh496kaNGuUqV66cZLr31ltv1ZSeRyQmJrqlS5e6O++8M8m0bYUKFdyIESO0kEc8LyEhwU2fPt21\natUqye+5e+65x/3www+hLk9y0MqVK92dd97pIiMjA++Fa6+91i1YsCDdf+8yG/jC/jx82cXMXF7t\neziIj49nzpw5fPjhh8yZM+dcCKdGjRr069eP22+/ncsuuyzEVUp67NmzhylTpjBu3Dh+/PFHAMyM\nDh068MADD9CtWzcKFCgQ4ipFctZ//vMfRo8ezcyZMwO/59q1a0f//v3p2bMnkZGRIa5QstqZM2f4\n/PPPeeedd1i92ne113z58tGzZ0+GDBnClVdemaH9mhkuE+fhU+CTkPv1118ZN24c48aNC1yqzcxo\n164dd9xxBzfffDPFihULcZWSkuPHjzNjxgw+/fRTvv7668AftHLlynHvvfdy3333cfnll4e4SpHQ\n27ZtG2+88Qbjx4/n5MmTAJQpU4Z+/frxwAMPULVq1dAWKJkWGxvLP//5T8aOHcvBgwcBKFGiBPfd\ndx/9+/fP9M9YgS+DFPjCT3x8PHPnzuWTTz5h9uzZnDlzBoDIyEi6du1K7969ueGGGyhSpEiIK83b\nTp48ybx585g6dSqzZ88OXPYnMjKSLl26cOedd2o0TyQVx48f59NPP+X999/nhx9+AP43Et6nTx+6\nd+9OoUKFQlylpNXvv//OtGnT+Pjjj1m2bFmgvVGjRjz66KPcdtttXHzxxVnyWgp8GaTAF96OHTsW\nGDlatGhRYOQoMjKS6667jp49e9KtWzfKli0b4krzhkOHDvHll1/yxRdfEB0dneTajldffTV33nkn\nN998M8WLFw9hlSK5h3OO//znP4wZM4apU6dy9uxZAIoUKcLNN9/MXXfdRbt27ciXL6SXvJcUJCQk\n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\nKVasGMWKFaNo0aIUK1aMMmXKUL58eSpUqEDx4sU9H+guRIEvgxT4REREJLfIbODTsj0RERERj1Pg\nExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERER\nj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4R\nERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4\nBT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExER\nEfE4BT4RERERjwvbwGdmr5rZJjP73symm9mlQc8NNbNY//MdgtqbmNkGM9tqZm+EpnIRERGR8BK2\ngQ+IBuo55xoBscBQADOrC/QC6gA3AO+Zmfm/532gn3OuJlDTzDrmfNkiIiIi4SVsA59zbqFzLtH/\ncCVQyX//RmCKcy7eObcdXxhsbmblgCLOudX+7SYCPXKyZhEREZFwFLaBL5l7gTn++xWBnUHP7fa3\nVQR2BbXv8reJiIiI5Gn5Q/niZrYAKBvcBDjgWefcl/5tngXinHOfhaBEERERkVwvpIHPOXf9+Z43\ns75AZ+CaoObdwGVBjyv521JrT9Xw4cMD96OiooiKirpw0SIiIiLZLCYmhpiYmCzbnznnsmxnWcnM\nOgGjgaudc4eD2usCnwJX4ZuyXQDUcM45M1sJPAasBr4C3nLOzUtl/y5c+y4iIiISzMxwztmFt0xZ\nSEf4LuBtIBJY4F+Eu9I595Bz7kczmwr8CMQBDwUlt4eB8cBFwJzUwp6IiIhIXhK2I3zZTSN8IiIi\nkltkdoQvt6zSFREREZEMUuATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER\n8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+AT\nERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGP\nU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPC9vAZ2Yvmtl6M1tnZvPMrFzQc0PNLNbMNplZh6D2Jma2wcy2mtkboalcREREJLyYcy7U\nNaTIzAo75373338UqOuc629mdYFPgWZAJWAhUMM558xsFfCIc261mc0B3nTOzU9l/y5c+y4iIiIS\nzMxwzllGvz9sR/jOhT2/S4BE//0bgSnOuXjn3HYgFmjuHwEs4pxb7d9uItAjp+oVERERCVf5Q13A\n+ZjZS8DdwFGgvb+5IrAiaLPd/rZ4YFdQ+y5/u4iIiEieFtIRPjNb4D/m7tztB//XbgDOueecc5Xx\nTeE+GspaRURERHKrkI7wOeeuT+Omk4GvgOH4RvQuC3qukr8ttfZUDR8+PHA/KiqKqKioNJYjIiIi\nkn1iYmKIiYnJsv2F86KN6s65bf77jwJtnXO9ghZtXIVvynYB/1u0sRJ4DFiNLyC+5Zybl8r+tWhD\nREREcoXMLtoI52P4XjGzmvgWa+wA/grgnPvRzKYCPwJxwENBye1hYDxwETAntbAnIiIikpeE7Qhf\ndtMIn4iIiOQWnj0ti4iIiIhkDQU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T\n4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+ERER\nEY9T4BMRERHxOAU+EREREY9T4BMRERHxOAW+PCYmJibUJYSE+p23qN95i/qdt+TVfmeWAl8ek1f/\no6jfeYv6nbeo33lLXu13ZinwiYiIiHicAp+IiIiIx5lzLtQ1hISZ5c2Oi4iISK7knLOMfm+eDXwi\nIiIieYWmdEVEREQ8ToFPRERExOPyXOAzs05mttnMtprZ4FDXk5XMbJyZ7TezDUFtxc0s2sy2mNl8\nMysa9NxQM4s1s01m1iE0VWeemVUys0VmttHMfjCzx/ztnu67mRU0s1Vmts7f72H+dk/3+xwzy2dm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#zt = 64, z = 16, theta=0\n", + "plot_flight_path(64, 16, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool! Note that the plot title tells us what the calculated value of $C$ was for our input conditions. We have a value of $C$ between $0$ and $\\frac{2}{3}$ and our path is trochoidal, like we announced it would be.\n", + "\n", + "* For negative values of $C$, the resultant flight path consists of a series of loops. Let's try it out!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUqZMGcLCwrjpppvo0KHDX9arWLEigwYNytZ77Nu3j/Xr1zNlyhQAWrRoQfPmzalcuTKffvop999/\nP2PHjj3nNo4cOUKBAgWSP4+KiiI2NjZT75/ZfYTz28/0nGv/05Kdfd2zZw/Lli1j5cqVrFixggkT\nJvD888+nu34w9nPy5MnMmDGDN998M9vbyOz3Pzs0tSoiInleo0aN+O9//0u9evWIjIykQ4cOvPXW\nW+zbty9o7xEdHU3t2rWTPy9XrhxfffUVy5Yto3HjxpneRsqyGhcXR4kSJTL12tT72LJlS4YMGcKY\nMWOSj0PLSent/7nWz+q+zps3j/bt29OrVy+6du3K7t27adWqVY7uZ6dOnfjggw+46aabsnUbuqx8\n/7NDI3IiIpKjQuXWXa+99hr79u1j2LBhgG9a7pJLLvnTOimn4lLKzFRczZo1+e6775I/DwsLIzEx\nkWXLlnHq1CnmzJnD4sWLOX36NJ9//nma26lUqRIrVqxI/vzQoUM0aNAgW/v41ltvcd1119GgQQO6\nd+/OxIkTg7Kf6Ulv/9OTnX3dtWsX1atXB3xnvLZt25bx48fnyH5+8cUXvPrqqyxevJjo6GguueQS\nPvnkkwzPxE1t6dKlxMXFZer7ny3W2nz58O26iIgEQ6j/m/raa6/Z5557zlpr7fr16+2iRYtsmzZt\n7Pfffx+09zh9+rRt0qRJ8ufNmjWzv/7665/WGThwoH3ppZeSP9+yZYtNSkpK/vzkyZO2du3ayZ/X\nrVvX7tu3z1pr7ebNm/+0bmqp97FPnz52586d1lpr27Rpcx57lrYxY8bYHj16JH9+rv1PvZ/WZm9f\nR48ebUePHm2ttbZt27Z2x44dtm/fvjmyn3PmzEn+eiYlJdmyZcvar776Kt39CUj9dUkp9fc/Len9\nXfIv/0ufMTZEflPKbcYYm1/3PSNnz55l8+bN7Nixg507d7J3715OnDjBmTNnKF26dPJBpiIiAend\n6DsULFmyhMOHD1OsWDFefPFFrr/+erp27crUqVN56qmngvpeX375JYsXL8ZaS7Vq1ejSpUvyc9Om\nTWPQoEEYY+jfvz8dO3akQYMGfPDBB9SvXz95vQkTJrB9+3astVSsWDF5G9WrV+edd97hxhtvzNQ+\n7t27l2effZbLLruMtm3b8sUXXwRtP999910+/vhjdu3aRY8ePejXrx/R0dHp7n9a+5mdfT1+/DjP\nP/88tWvXplatWjRp0oQ+ffrw3HPP5ch+jhw5koSEBHbs2EGVKlV44IEHzrk/6X1dIO3vf1rS+7vk\nX/6XA05V5ITjx4/z7bffMnfuXJYtW8batWuJj49Pc93atWuzdu3aXE4oIqEulItcWiZNmkT58uUp\nV64cZcuWdR0nU5KSkliwYEGmL2ExbNgwWrRoQfXq1enRoweTJ0/O4YTBk5V99fJ+pkVFLpPye5E7\nfvw4M2bMYNKkScybN4+EhIQ/PV+hQgUqVapEuXLlKF26NEWLFuWCCy6gVKlSdOrUyVFqEQlVXity\nn332GWfPnqVRo0bnvNZZKPn444+5+eabKViwYKbWP3ToEB9++CHFixenVq1aNG3aNIcTBk9W9tXL\n+5kWFblMyq9FbsOGDbzzzjuMGzeOuLg4AMLDw2nSpAmtWrWiRYsW1K9fP0euki0ieZfXipwXnTx5\nksKFC7uOkSvy076mpiKXSfmtyK1evZoXXniB2bNnJy9r0aIFXbp0oWPHjiF3+xcR8RYVOZHgyGqR\n0+VH8rjt27fz5JNPJt/CpFChQnTv3p2+fftSo0YNx+lERETkfKjI5VHx8fEMHjyYwYMHc/r0aQoU\nKECfPn146qmnKFWqlOt4IiIiEgQqcnnQmjVr6Nq1K+vWrQOgc+fOvP7665QpU8ZxMhEREQkm3aIr\nD0lMTGTIkCE0atSIdevWUblyZRYsWMDEiRNV4kRERPIgjcjlEYcOHeKuu+7i66+/BuDBBx/kjTfe\nyLdn/YiIiOQHKnJ5wPr167nlllvYunUrpUqVYuzYsdx0002uY4lIPlK+fPm/3M9SRLIuq9c11NSq\nx82ePZsmTZqwdetWGjRowIoVK1TiRCTXBW6z5IXH8OHDk0vnI488wtmzZ51nyu7j+PHjtG/fHoCI\niAjGjx/vPJMe5/fYvn17lv7uqch52Pjx4+nQoQOxsbF06tSJRYsWeeZWMyIiLgwaNIg+ffpgreX1\n11/n7bffJiLCu5NT0dHRzJw5k8cff5yEhAS6devG6NGjXceSXKQi51EjRoygW7duJCYmMmDAACZO\nnEihQoVcxxIRCVmvvfYazz77LMYY/vOf//Dkk0+6jhQU4eHhDB06lNdeew1rLffffz/Dhw93HUty\nie7s4EFDhw5N/gfojTfe4IknnnCcSEQktI0cOZKHHnoIYwwTJkygc+fOriPliLfffpvHHnsM8O1z\n7969HSeSYNEtulLxapH7z3/+Q+/evTHG8N5779GrVy/XkUREQtqkSZO4++67sdby/vvvc//997uO\nlKNSltaPP/6Yjh07uo4kQaAil4oXi9yUKVPo3Lkz1lpGjBjBgw8+6DqSiEhIW7BgAX/7299ISEhg\nyJAhPPXUU64j5YpXX32VAQMGEBUVxZw5c7j++utdR5LzpCKXiteK3Ny5c2nbti0JCQm8+uqrPPvs\ns64jiYiEtG3bttGoUSMOHTrEY489xptvvuk6Uq6x1vLII48wbNgwoqOjWbp0KdWrV3cdS86Dilwq\nXipyv/zyC40bN+bYsWM8/vjjvPHGG7pek4jIOcTGxtKsWTPWrVvHTTfdxOzZswkPD3cdK1clJSVx\n1113MW3aNKpUqcLSpUu58MILXceSbFKRS8UrRe7IkSM0adKETZs2cdttt/HJJ58QFqaTjUVE0mOt\n5a677uLjjz+matWq/PDDDxQvXtx1LCdOnjxJ8+bN+fHHH2ndujX//e9/812hzSvSK3JqBCEsMTGR\nTp06sWnTJurUqcO4ceNU4kREMjB69Gg+/vhjihQpwueff55vSxxA4cKFmTlzJiVLluTLL7/k+eef\ndx1JgkytIIQNGjSIL7/8kosvvpjPP/+cIkWKuI4kIhLSNmzYwCOPPALAe++9R0xMjONE7pUvXz55\nNmfw4MF88803riNJEKnIhahFixbx4osvAjBhwoQs33tNRCS/iY+P56677iIuLo7u3bvTpUsX15FC\nxrXXXssLL7yAtZauXbty4MAB15EkSFTkQtChQ4fo3LkzSUlJPPPMM7Rq1cp1JBGRkPfqq6+ybt06\nKleuzLBhw1zHCTnPPfccLVq0YM+ePdx777144ThxyZhOdghBnTp1YsqUKTRt2pQFCxYQGRnpOpKI\nSEhbs2YNDRs2JCEhgYULF9KiRQvXkULSzp07qVu3LkePHmXcuHF07drVdSTJJJ3s4BGffvopU6ZM\noXDhwkyYMEElTkQkAwkJCdx7770kJCTQp08flbhzKFeuHG+99RYAjzzyCHv37nWcSM6XilwIOXTo\nUPLdGoYMGULFihUdJxIRCX0jRoxg1apVlC9fnkGDBrmOE/K6d+9O69atOXLkCH379nUdR86TplZD\nSPfu3Rk3bhzXXnst8+bN06VGREQycODAAapUqcKxY8f47LPPuOWWW1xH8oQdO3ZQq1YtYmNjmT17\nNu3atXMdSTKgqdUQ99133zFu3DguuOACRo8erRInIpIJzz33HMeOHaN169bcfPPNruN4Rvny5Xn5\n5ZcBePTRR4mPj3ecSLJLbSEEBI7rAHj66aepXLmy40QiIqHvxx9/ZPTo0URERPB///d/unVhFvXt\n25caNWrw66+/5qv70OY1KnIhYOTIkaxdu5YrrriCZ555xnUcERFPePbZZ7HW0rdvX6pWreo6judE\nRkbyzjvvAPDKK6+we/dux4kkO3SMnGNHjx6lUqVKHD58mBkzZtChQwfXkUREQt7ChQu59tpriY6O\nZuvWrZQsWdJ1JM+6/fbbmTFjBg8++CAjRoxwHUfSoWPkQtTrr7/O4cOHueaaa7j11ltdxxERCXnW\nWvr37w/A448/rhJ3nl555RXCwsIYNWoUW7dudR1Hskgjcg79/vvvVKlShbi4OH744QcaN27sNI+I\niBd8/fXX3HjjjZQsWZKtW7cSHR3tOpLn9ejRg7Fjx9K1a1fGjRvnOo6kQSNyIehf//oXcXFx3HHH\nHSpxIiKZNHjwYAD69eunEhckL774IpGRkUyYMIGffvrJdRzJAo3IOfL7779TsWJFzp49y4YNG6hW\nrZqzLCIiXrFixQoaNWpEdHQ0O3fupHjx4q4j5Rl9+/Zl+PDhdOzYkWnTprmOI6loRC7EDB06lDNn\nztCxY0eVOBGRTBoyZAgAvXv3VokLsmeffZbIyEimT5/Or7/+6jqOZJJG5Bw4cOAA5cuXJy4ujtWr\nV1OvXj0nOUREvGTTpk1Uq1aNyMhItm3bxmWXXeY6Up7Ts2dPPvzwQ3r37s3IkSNdx5EUNCIXQt5+\n+23i4uJo166dSpyISCa9++67WGvp2rWrSlwOeeKJJwD46KOP2L9/v+M0khkqcrksNjaW4cOHA75b\ny4iISMZOnjyZfDblP//5T8dp8q7q1atz8803Ex8fz7vvvus6jmSCilwumzhxIseOHaNZs2Y0bdrU\ndRwREU+YOnUqx44do0mTJtStW9d1nDztqaeeAmD48OGcPn3acRrJiIpcLrLWJv+G07dvX8dpRES8\n4z//+Q/gO8lBctbVV19N/fr1OXz4MNOnT3cdRzLgySJnjHnRGPObMWaV/3FTiuf6G2M2G2M2GmNa\nucyZ2qJFi/jpp5+45JJLuOOOO1zHERHxhFWrVrFs2TKKFy/OnXfe6TpOnmeM4YEHHgDg/fffd5xG\nMuLJIuf3prW2gf/xPwBjTHXgTqA60AYYYYz5yxkergRG43r16kVUVJTjNCIi3jB27FgAunXrRsGC\nBR2nyR86depE4cKFWbhwIRs3bnQdR87By0UurYJ2KzDFWptgrd0ObAauytVU6di/fz8zZswgPDyc\nXr16uY4jIuIJCQkJTJ06FfAVOckdRYsWpXPnzoBG5UKdl4tcX2PMj8aY0caYYv5lZYBdKdb53b/M\nuSlTppCQkECbNm24/PLLXccREfGEb7/9ln379hETE0ODBg1cx8lXAoMO48aN48yZM47TSHpCtsgZ\nY+YaY9ameKzzf7wZGAFUtNbWA/YC/3abNmOB0+a7du3qOImIiHdMmjQJgM6dOxNCR8rkC1deeSU1\na9bk8OHDzJ0713UcSUeE6wDpsdbemMlVRwGz/H/+HSib4rnL/cvSNHDgwOQ/t2zZkpYtW2YpY2Zt\n2LCBlStXUqxYMW6++eYceQ8RkbwmLi4u+azJTp06OU6T/xhj6NSpEwMGDGDy5Mm0a9fOdaR8Zf78\n+cyfPz/D9Tx5iy5jzKXW2r3+Pz8GNLLWdjbG1AAmAo3xTanOBaqkdS+u3LxFV//+/Rk8eDD33Xcf\no0aNypX3FBHxulmzZnHLLbdw5ZVXsmLFCtdx8qUtW7ZQuXJlChcuzP79+ylUqJDrSPlWXrtF1+v+\nadYfgWuBxwCstRuAj4ENwBfAQ85uqOpnrU2eGtC0qohI5s2a5Zts6dChg+Mk+VelSpVo3LgxJ0+e\nTP5+SGjxZJGz1naz1tax1taz1naw1u5L8dwga21la211a+1XLnOC7/pHO3fupHTp0jRv3tx1HBER\nT0hKSmL27NkAOiTFscC0duDsYQktnixyXjJz5kzA9xtlWJi+3CIimbFy5Ur27NlD2bJlqVOnjus4\n+drtt98OwFdffaVbdoUgNYscNmPGDABuu+02x0lERLwjMI13880362xVx8qWLUu9evU4efIk3377\nres4koqKXA7avHkz69evp1ixYlx77bWu44iIeMacOXMAaN++veMkAn9Mb+s4udCjIpeDPvvsM8D3\nD5FuySUikjlHjhxh1apVREZG6pfgEBEocrNnz8aLV7vIy1TkctBXX/nOtdC1d0REMm/hwoUkJSXR\npEkTXe4iRFx55ZVceuml7Nq1i7Vr17qOIymoyOWQuLg4Fi1aBMDf/vY3x2lERLwjcBzWdddd5ziJ\nBISFhdG6dWsAvvnmG8dpJCUVuRzy3Xffcfr0aerXr8/FF1/sOo6IiGfMmzcPUJELNddffz2ATngI\nMSpyOSThkfzBAAAgAElEQVRwX7pWrVo5TiIi4h2HDh1i3bp1FChQgCZNmriOIykEivWCBQtISEhw\nnEYCVORyyNdffw3AjTdm9paxIiKybNkyABo2bEiBAgUcp5GUypYtS5UqVThx4gSrVq1yHUf8VORy\nwPHjx1mzZg2RkZE0a9bMdRwREc9YunQpAFdddZXjJJKWwPRqYPpb3FORywFLly4lKSmJBg0aULBg\nQddxREQ8IzAi17hxY8dJJC3XXHMNAEuWLHGcRAJU5HLA4sWLAbj66qsdJxER8Q5rrYpciAt8X5Yu\nXarryYUIFbkcEChymlYVEcm8rVu3cujQIUqVKkW5cuVcx5E0VKxYkZIlS7J//362b9/uOo6gIhd0\niYmJ/PDDD4CKnIhIVqxZswaABg0a6P6qIcoY86dROXFPRS7INm3aRGxsLOXKlaN06dKu44iIeMZP\nP/0EQO3atR0nkXNRkQstKnJB9uOPPwJQv359x0lERLwlUORq1arlOImcS6NGjQBYuXKl4yQCKnJB\nt3r1akBFTkQkq1TkvKFOnToArFu3Tic8hAAVuSALjMjVq1fPcRIREe+Ij49n06ZNhIWFUb16dddx\n5BxKly5NiRIlOHr0KL///rvrOPmeilwQWWtV5EREsmHLli0kJiZSoUIFXX8zxBljkkfl1q5d6ziN\nqMgF0f79+zlw4ADFihXTqfMiIlmwZcsWACpXruw4iWRG4ISUdevWOU4iKnJB9MsvvwBQrVo1nTov\nIpIFgSJXqVIlx0kkMwJFbv369Y6TiIpcEG3atAmAmJgYx0lERLxl69atgO+CsxL6Av/P/frrr46T\niIpcEAVG5KpWreo4iYiIt2hEzlsC3ycVOfdU5IJII3IiItmzbds2QCNyXnHZZZdRoEABDhw4wPHj\nx13HyddU5IJo8+bNgIqciEhW7d69G4AyZco4TiKZERYWljwqFxhNFTdU5ILEWsuOHTsAqFChguM0\nIiLecerUKY4dO0ZUVBQlSpRwHUcyKXCGsaZX3VKRC5LDhw9z6tQpihYtStGiRV3HERHxjD179gC+\nC83qjH/vCFxm67fffnOcJH9TkQuSXbt2AVC2bFnHSUREvCVlkRPvCEyD6+4ObqnIBcnOnTsBdCFg\nEZEsChwfpyLnLZdddhmgIueailyQaERORCR7Dh8+DEDJkiUdJ5Gs0IhcaFCRC5K9e/cC+o1SRCSr\njhw5AsCFF17oOIlkhYpcaFCRC5KDBw8CcPHFFztOIiLiLUePHgWgePHijpNIVlxyySWA7z7j4o6K\nXJAcOHAA0NSAiEhWBYqcRuS8pWjRohhjiI2N5ezZs67j5FsqckGiETkRkezR1Ko3hYWFJY+iBsq4\n5D4VuSAJjMipyImIZM2JEycAiI6OdpxEsipQvgNlXHKfilyQBH6IdVVyEZGsiY+PB+CCCy5wnESy\nSkXOPRW5IImNjQWgSJEijpOIiHiLipx3qci5pyIXBNZaTp48CUChQoUcpxER8RYVOe9SkXNPRS4I\n4uPjSUpKIjIyksjISNdxREQ8RUXOuwoXLgxAXFyc4yT5l4pcEARG4wI/0CIiknkqct4VFRUFwJkz\nZxwnyb9U5IJARU5EJPsCJSBQCsQ7AuU7UMYl96nIBYGKnIjI+TPGuI4gWaQROfdU5IIgcEVr/TYp\nIpJ14eHhACQmJjpOIlmlETn3VOSCwFoL6LdJEZHsiIiIACAhIcFxEsmqQJHTiJw7KnJBpCInIpJ1\nGpHzrsCVGlTk3FGRC4LAiJyIiGSdRuS8KykpCfijjEvuU5ELIo3IiYhknUbkvCtQvlXk3FGRCwKN\nyImIZF9gei5w4ph4R6DIBUZVJfepyImIiFOBe1QH7lkt3hEYRVWRc0dFLggClx3R6dciIlkXHR0N\nwPHjxx0nkazS1Kp7KnJBUKhQIUD3mhMRyY5AkTtx4oTjJJJVGpFzT0UuCAoWLAioyImIZEfRokUB\njch50enTpwFdEN8lFbkgCBS5U6dOOU4iIuI9GpHzrsD3LPA9lNynIhcEGpETEck+HSPnXYEiFxhV\nldynIhcEkZGRhIeHk5iYqNPnRUSyqHjx4gAcOXLEcRLJqkD51oicOypyQWCMoXDhwoBOnxcRyapL\nLrkEgH379jlOIlmlETn3VOSCpESJEgAcPnzYcRIREW+59NJLARU5L9Ixcu6pyAXJRRddBMChQ4cc\nJxER8ZbAiNzevXsdJ5Gs0tSqeyFb5IwxHY0xPxljEo0xDVI9198Ys9kYs9EY0yrF8gbGmLXGmE3G\nmLdzM6+KnIhI9mhq1ZustRw8eBD44/9AyX0hW+SAdcBtwIKUC40x1YE7gepAG2CE+eNu9SOBntba\nGCDGGNM6t8KqyImIZE/RokUpUKAAJ0+e1HHGHnLs2DHOnDlDkSJFki+ML7kvZIuctfYXa+1mwKR6\n6lZgirU2wVq7HdgMXGWMuRSIttYu9683DuiQW3lLliwJqMiJiGSVMUbTqx4UGEENfO/EjZAtcudQ\nBtiV4vPf/cvKAL+lWP6bf1mu0IiciEj2XX755QDs2rUrgzUlVKjIhQanRc4YM9d/TFvgsc7/8WaX\nubJDv02KiGRfhQoVANi2bZvjJJJZgf/vAmcdixtO73Jrrb0xGy/7HSib4vPL/cvSW56ugQMHJv+5\nZcuWtGzZMhtx/G+m3yZFRLJNRc57NCKXs+bPn8/8+fMzXM9pkcuClMfJfQ5MNMa8hW/qtDKwzFpr\njTHHjDFXAcuBbsA759poyiJ3vsqW9XVIFTkRkaxTkfOewIicilzOSD3A9NJLL6W5XsgeI2eM6WCM\n2QU0AWYbY+YAWGs3AB8DG4AvgIestdb/sj7AB8AmYLO19n+5lVcjciIi2aci5z3bt28HoHz58m6D\n5HMhOyJnrZ0JzEznuUHAoDSWrwRq53C0NJUoUYKCBQty/Phxjh8/rtuViIhkgYqc9wSKXOB7J26E\n7Iic1xhjkkflfvvttwzWFhGRlC6//HIiIyPZs2cPp06dch1HMiFQ5K644gqnOfI7FbkgChwnt3Pn\nTsdJRES8JTw8nCpVqgDw888/O04jGTl9+jS7d+8mIiKCMmVy7UpfkgYVuSCqVKkSAL/++qvjJCIi\n3lOjRg0ANmzY4DiJZCQwYFG2bFkiIkL2KK18QUUuiGJiYgDYtGmT4yQiIt5Ts2ZNANavX+84iWRE\nx8eFDhW5IFKRExHJPo3IecfmzZsBqFixouMkoiIXRCpyIiLZpxE57wiU7UD5FndU5IKoYsWKhIeH\ns337duLj413HERHxlCpVqhAREcHWrVuJi4tzHUfOQUUudKjIBVFUVBQVKlTAWsuWLVtcxxER8ZSo\nqCiqVq2KtZaffvrJdRw5h0CRq169uuMkoiIXZFWrVgV0jIeISHZceeWVAKxYscJxEknPwYMH2b9/\nP0WKFEm+7Ja4oyIXZHXq1AFgzZo1jpOIiHhPw4YNARW5ULZx40bANxpnjMlgbclpKnJBVq9ePQB+\n/PFHx0lERLxHRS70BU5G0bRqaFCRC7K6desCGpETEcmOunXrEh4ezvr163WrrhC1atUq4I+BC3FL\nRS7IKleuTMGCBdm1axeHDx92HUdExFMKFSpEzZo1SUxM1C/EIWrlypXAH8czilsqckEWHh6u4+RE\nRM5DoCAsW7bMcRJJLT4+nnXr1mGMoX79+q7jCCpyOSIwvbp69WrHSUREvKdZs2YAfPfdd46TSGo/\n/fQTZ8+eJSYmhujoaNdxBBW5HKHfJkVEsq9FixYALFq0CGut4zSSkqZVQ4+KXA5o2rQpAD/88IPj\nJCIi3hMTE0OpUqXYt29f8j09JTQEilzg7GJxT0UuB9SoUYPo6Gh27NjBnj17XMcREfEUY8yfRuUk\ndCxduhRQkQslKnI5IDw8nMaNGwPw/fffO04jIuI9gSK3cOFCx0kk4NixY6xdu5bIyEgVuRCiIpdD\nmjRpAqjIiYhkxzXXXANoRC6ULFmyBGstDRs2pGDBgq7jiJ+KXA7RcXIiItlXp04dihUrxrZt29i2\nbZvrOMIfpTowWiqhQUUuhwRG5JYvX87p06cdpxER8Zbw8HBuuOEGAL766ivHaQT+uBxM8+bNHSeR\nlFTkckiJEiWoW7cu8fHxGpUTEcmG1q1bA/Dll186TiLx8fHJl9S6+uqrHaeRlFTkctD1118PwLx5\n8xwnERHxnlatWgHwzTffkJCQ4DhN/rZ8+XLi4+OpWbMmJUqUcB1HUlCRy0GBIvfNN984TiIi4j1X\nXHEFMTExHD9+PPmyF+LG119/DUDLli3dBpG/UJHLQddccw3h4eEsW7aMEydOuI4jIuI5ml4NDYHj\nFAOjpBI6slzkjDENciJIXlS0aFEaNmxIQkKC7hkoIpINgSI3Z84cx0nyr6NHj7Js2TIiIiI0IheC\nsjMiV9MY82jKBcaYQcaYW4OUKU/R9KqISPZdd911FCxYkBUrVvD777+7jpMvffvttyQmJtK0aVOK\nFi3qOo6kkuUiZ60dD1xljHk2xbL+wAPGmM7BDJcX3HjjjYB+mxQRyY5ChQolj8p99tlnjtPkT5pW\nDW3ZmVrtA2wHvjTGPJziqQnAG0HKlWc0b96cokWLsmHDBl3UUkQkG2677TYAZsyY4ThJ/qQiF9qy\nM7X6GrDcWrsS2GiMudu/vChwMGjJ8ojIyMjk3yb/+9//Ok4jIuI97dq1Izw8nPnz53PkyBHXcfKV\nX375ha1bt1KiRAmuvPJK13EkDdkpcnOBCgDW2rlAojHmZiAG6BDEbHlGu3btAJg9e7bjJCIi3nPR\nRRdxzTXXkJCQoF+Ic1lgOjtQpiX0ZKfIdQOKGWOKA1hrJwMlgCustZo7TEObNm0wxvDtt98SGxvr\nOo6IiOdoetWNQJG79VadzxiqjLU2OBsy5jagqrV2cFA2mMOMMTZY+54ZTZo0YenSpcycOVN/IURE\nsmjXrl2UK1eOAgUKsH//fqKjo11HyvP27dtH6dKliYqK4uDBgxQpUsR1pHzNGIO11qReHrQLAltr\nZwAfBWt7eU379u0BmDlzpuMkIiLeU7ZsWVq0aMHp06f172gumTVrFtZabrjhBpW4EBbUOztYa/cF\nc3t5yR133AH4ityZM2ccpxER8Z7OnX1XuJo0aZLjJPlDYFq1Qwcd/h7Kgja16jW5PbUKUKtWLdav\nX88XX3xBmzZtcvW9RUS87uDBg5QuXRprLXv27OHiiy92HSnPOnHiBKVKlSI+Pp7du3dz6aWXuo6U\n7+X41Kpk7O9//zsA06ZNc5xERMR7SpYsSatWrUhMTNS/ozns888/5/Tp01x99dUqcSFORS4XBYrc\nzJkzOXv2rOM0IiLeo+nV3DF58mQAOnXq5DiJZERTq7msRo0abNy4kTlz5nDTTTfl+vuLiHhZbGws\nl1xyCadOnWLz5s1UrlzZdaQ859ChQ1x66aVYa9m9ezelSpVyHUnQ1GrICIzKTZ061XESERHvKVKk\nSPK/ox9++KHjNHnTp59+SkJCAjfccINKnAeoyOWywDD19OnTOXXqlOM0IiLec9999wEwZswYEhIS\nHKfJezSt6i0qcrmsWrVqXHXVVZw4cULXQhIRyYarr76aqlWrsmfPHubMmeM6Tp6ye/du5s+fT1RU\nlC474hEqcg50794dgHHjxjlOIiLiPcYYevbsCcAHH3zgOE3eMmHCBKy1tGvXjuLFi7uOI5mgkx0c\nOHToEKVLlyYxMZFdu3Zx2WWXOckhIuJV+/bt4/LLL8day65duyhdurTrSJ5nraVatWps2rSJWbNm\nJd+RSEKDTnYIIRdddBHt27cnKSmJiRMnuo4jIuI5l1xyCTfffDOJiYl89JHuDhkMS5YsYdOmTVx6\n6aW6qoKHqMg5EpheHTNmDPl1VFRE5Hz07t0bgJEjR+qkhyAInAXcvXt3IiIiHKeRzNLUqiNnzpyh\nbNmy7N+/n8WLF9OsWTNnWUREvCgpKYkaNWrwyy+/MG3aNDp27Og6kmfFxsZy6aWXcvLkSX755Rdi\nYmJcR5JUNLUaYqKiorj33nsBeO+99xynERHxnrCwMPr27QvAO++84ziNt02bNo2TJ0/SvHlzlTiP\n0YicQ1u3bqVy5cpERUXx+++/c9FFFznNIyLiNSdOnKBMmTKcOHGC1atXU69ePdeRPKlx48YsW7aM\nDz/8kHvuucd1HEmDRuRCUMWKFWndujXx8fGMHTvWdRwREc+Jjo5OLh7Dhg1znMabli1bxrJly7jw\nwgv5xz/+4TqOZJGKnGMPPvgg4JtedT1CKCLiRX369AFg0qRJHDhwwHEa7xk+fDgAPXv2pFChQo7T\nSFapyDnWtm1bLr/8cjZv3sy8efNcxxER8ZyYmBjat2/P6dOnNSqXRQcOHGDq1KkYY5IHFsRbVOQc\ni4iIoFevXoAO1hURya6nn34agHfffZfY2FjHabzjgw8+ID4+nrZt21KxYkXXcSQbVORCwAMPPMAF\nF1zArFmz2LRpk+s4IiKe07x5c5o1a8aRI0cYNWqU6ziekJCQwMiRIwGSz/4V71GRCwGlSpWia9eu\nWGv5v//7P9dxREQ8KTAq9+abb3LmzBnHaULfzJkz2blzJ5UrV6ZVq1au40g2qciFiEcffRTw3enh\n8OHDjtOIiHhP+/btqVGjBr/99huTJ092HSekWWt5/fXXAXjssccIC1Md8Cp950JEzZo1ad26NadO\nneL99993HUdExHPCwsJ46qmnABgyZAiJiYmOE4WuBQsWsHz5ckqWLEmPHj1cx5HzELJFzhjT0Rjz\nkzEm0RjTIMXy8saYU8aYVf7HiBTPNTDGrDXGbDLGvO0mefb169cP8F0LSdMCIiJZ16lTJ8qXL8/G\njRuZNm2a6zgh64033gDgn//8py454nEhW+SAdcBtwII0nvvVWtvA/3goxfKRQE9rbQwQY4xpnRtB\ng+XGG2+kVq1a7N69mwkTJriOIyLiOVFRUTz33HMAvPTSSxqVS8O6dev44osvKFiwIA899FDGL5CQ\nFrJFzlr7i7V2M/CX21GktcwYcykQba1d7l80DuiQgxGDzhhD//79ARg0aBAJCQmOE4mIeE+PHj2o\nUKECP//8M1OmTHEdJ+QMHToU8F0AuGTJko7TyPkK2SKXgSv806rfGmOa+5eVAX5Lsc5v/mWecued\nd1KpUiV+/fVXPv74Y9dxREQ8JzIykgEDBgC+UTn9UvyH7du3M2nSJMLCwpIP5xFvc1rkjDFz/ce0\nBR7r/B9vPsfLdgPlrLUNgMeBScaYIrmTOOdFREQkj8q9+uqrJCUlOU4kIuI9Xbt2pVKlSmzevJlJ\nkya5jhMyXnvtNRISEujSpQsVKlRwHUeCwIT6/T2NMd8Cj1trV53reXwF71trbXX/8ruAa621ad5z\nxBhjX3zxxeTPW7ZsScuWLYOcPnvOnDlD5cqV2bVrF9OnT+f22293HUlExHPGjh1Ljx49qFixIhs3\nbiQqKsp1JKe2b99OlSpVSEpKYuPGjcTExLiOJOcwf/585s+fn/z5Sy+9hLX2r4eWeaTIPWGtXen/\nvCRw2FqbZIypiO9kiNrW2qPGmB+Ah4HlwH+Bd6y1/0tnuzaU93348OH07duX+vXrs3LlSoxJ61BB\nERFJT0JCArVr1+bnn3/mnXfe4Z///KfrSE716tWLUaNGcffddzN+/HjXcSSLjDHeKnLGmA7AMKAk\ncBT40VrbxhhzO/AycAZIAl6w1n7hf82VwBigAPCFtfaRc2w/pItcXFwcFStWZO/evcyYMYMOHTx1\n3oaISEj47LPP6NChAyVLlmTLli0ULVrUdSQnduzYQeXKlUlKSmLDhg1UrVrVdSTJovSKXMie7GCt\nnWmtLWutLWitLW2tbeNf/qm1tpb/0iMNAyXO/9xKa21ta22Vc5U4LyhYsGDyKfQDBgzQKfQiItlw\nyy230Lx5cw4ePJh8J4P8KHBsXOfOnVXi8piQHZHLaaE+IgcQHx9P1apV2bFjB+PHj+fuu+92HUlE\nxHO+//57mjVrRsGCBdm8eTNlynjuggbnZcuWLVSrVk2jcR7nuRE5gQsuuICBAwcC8OKLL+puDyIi\n2dC0aVPuuOMO4uLiSHmSW34xYMAAEhIS6Nq1q0pcHqQRuRCX8mDdESNG8OCDaZ6EKyIi57Bp0yZq\n1qxJUlISq1atom7duq4j5YqVK1fSsGFDLrjgAjZt2kS5cuVcR5Js0oicR0VERPCvf/0LgH/961+c\nOnXKcSIREe+JiYnhoYceIikpiYcffhgv/CIfDM888wzgu6eqSlzepBE5D0hKSqJRo0asWrWKl19+\nmeeff951JBERzzl69ChVqlTh4MGDTJ48mbvuust1pBw1d+5cWrVqRbFixdi6dSslSpRwHUnOg0bk\nPCwsLIx///vfAAwePJjdu3c7TiQi4j3Fixdn0KBBADzxxBOcPHnScaKck5SUxNNPPw1A//79VeLy\nMBU5j2jZsiUdOnTg1KlTyfcQFBGRrLn33ntp2LAhv//+O6+99prrODlm/PjxrF69mjJlyvDwww+7\njiM5SFOrHrJ582Zq1qxJQkICK1eupH79+q4jiYh4zg8//EDTpk2Jiopi/fr1VK5c2XWkoDpx4gQx\nMTHs3buXcePG0bVrV9eRJAg0tZoHVKlShb59+2KtpV+/fvnmYF0RkWBq0qQJ3bt358yZM8n/puYl\nr7zyCnv37qVJkyZ06dLFdRzJYRqR85gjR45QuXJlDh8+zKeffsptt93mOpKIiOfs37+fatWqceTI\nESZOnEjnzp1dRwqKwMzN2bNnWbp0KVdddZXrSBIkGpHLIy688EJeeuklAB577DFdjkREJBtKlSrF\n0KFDAXj00Uc5fPiw40TB8fjjj3P27Fl69OihEpdPqMh5UO/evalXrx47duzg1VdfdR1HRMST7rnn\nHlq2bMmBAwd48sknXcc5b19++SWzZs0iOjo6+excyfs0tepRgXsHRkZGsm7dOt12RUQkGzZt2kSd\nOnWIj49n3rx5XHfdda4jZUtcXBy1a9dmy5YtvP7663mimMqfaWo1j2natCk9e/bk7NmzefJgXRGR\n3BATE5N8SacHHniAuLg4x4my59VXX2XLli3UqlWLRx991HUcyUUakfOwgwcPUrVqVQ4fPsyUKVP4\nxz/+4TqSiIjnnDlzhgYNGrB+/Xr69euXfAF2r9iwYQP16tXj7NmzLF68mGbNmrmOJDlAI3J5UMmS\nJZOPg3jsscc4evSo40QiIt4TFRXFmDFjCA8P56233mLRokWuI2VaUlISDzzwAGfPnqVXr14qcfmQ\nipzH3XfffTRt2pQ9e/bomAgRkWxq2LAh/fv3x1rLPffc45nbd3300Ud89913lCpVisGDB7uOIw5o\najUP2LBhA/Xr1+fMmTN8/fXX3HDDDa4jiYh4zpkzZ7jqqqtYs2YNffr04d1333Ud6Zz27t1LzZo1\nOXz4cJ66Fp6kTVOreViNGjV4/vnnAbj//vs985ukiEgoiYqKYuzYsURGRjJ8+HC++eYb15HSZa3l\nwQcf5PDhw7Rq1YpOnTq5jiSOqMjlEU8//TR16tRh27ZtyaVORESypm7durzwwgsA9OjRgyNHjjhO\nlLbJkyczc+ZMoqOjGTVqFMb8ZaBG8glNreYhK1eupHHjxiQlJbFkyRKaNGniOpKIiOckJCTQvHlz\nli5dyh133MG0adNCqiilnFIdNWoU9913n+tIkgs0tZoPXHnllTzxxBNYa+nevbtu3yUikg0RERFM\nmjSJ6Ohopk+fzujRo11HSpZ6SrVnz56uI4ljGpHLY06fPs2VV17Jhg0bPHGwrohIqJo4cSJ33303\nBQsWZOXKlVSvXt11JCZNmkSXLl2Ijo7mp59+oly5cq4jSS5Jb0RORS4PWr16NY0bN+bs2bPMmTOH\nm266yXUkERFP6tatG+PHj6du3br88MMPFChQwFmWnTt3UrduXY4ePaop1XxIU6v5SP369Xn55ZcB\nuPfeezl06JDjRCIi3jR8+HAqVarEmjVreOqpp5zlSExMpFu3bhw9epT27dtrSlWSqcjlUU8++STN\nmzdnz5499O7dW/diFRHJhujoaCZPnkxkZCTDhg3j448/dpLj9ddfZ8GCBVxyySV88MEHIXXyhbil\nqdU8bNu2bdSpU4fY2FjGjBlD9+7dXUcSEfGkYcOG8fDDD1OkSBGWL19OtWrVcu29ly9fTrNmzUhI\nSNDhMvmYplbzoQoVKjBs2DAAHnroIX7++WfHiUREvKlv377cddddxMbG0rFjx1y78HpsbCxdunQh\nISGBRx55RCVO/kIjcnmctZZu3boxYcIEateuzdKlSylYsKDrWCIinhMbG0ujRo34+eef6dKlC+PH\nj8/xKc577rmHMWPGULt2bZYtW+b0ZAtxSyNy+ZQxhhEjRhATE8O6det47LHHXEcSEfGkIkWKMH36\ndAoXLszEiRMZOXJkjr7fRx99xJgxYyhQoACTJk1SiZM0aUQun/jxxx9p0qQJ8fHxTJkyhX/84x+u\nI4mIeNLkyZPp3LkzERERfPPNN1xzzTVBf4+1a9fSuHFjTp8+zYcffsg999wT9PcQb9GIXD5Xr149\n3nrrLQDuv/9+fv31V8eJRES8qVOnTvTr14+EhATuuOMOduzYEdTtHz9+nL///e+cPn2ae+65RyVO\nzkkjcvmItZY777yTTz75hNq1a/P9999TuHBh17FERDwnISGB9u3b8+WXX1KnTh0WL15MkSJFznu7\n1lo6derE1KlTqV27Nj/88AOFChUKQmLxOo3ICcYYPvjgg+Tj5e6//35dX05EJBsiIiKYMmUKMTEx\nrF27lh49epCUlHTe2x0xYgRTp06lSJEiTJs2TSVOMqQil88ULVqUmTNnUqRIESZPnszbb7/tOpKI\niCcVL16czz//nGLFijF9+vTkO+pk18KFC3n00UcBGD16NFWrVg1GTMnjNLWaT3366afccccdhIeH\n8yGE+i0AACAASURBVPXXX9OyZUvXkUREPGnOnDm0a9cOay0TJ06kc+fOWd7Gzp07adiwIQcOHODx\nxx9n6NChOZBUvExTq/Int99+O8888wyJiYnceeed7Nq1y3UkERFPatOmDW+++Sbgu+7bggULsvT6\nU6dO0aFDBw4cOMCNN97I4MGDcyKm5FEakcvHEhMTadOmDXPnzqV+/fosWrRIJz+IiGTTI488wjvv\nvEPx4sVZsmQJ1atXz/A11lq6dOnC5MmTqVixIsuXL6dEiRK5kFa8RiNy8hfh4eFMnjyZypUrs3r1\narp16xaUg3VFRPKjN998kw4dOnD06FHatGnD3r17M3zN0KFDmTx5MkWKFOHzzz9XiZMsU5HL5y66\n6CJmzZpFsWLF+PTTTxkwYIDrSCIinhQeHs7EiRNp3LgxO3bsoF27dsTGxqa7/syZM3n66acBGD9+\nPDVr1sytqJKHqMgJ1apV45NPPiE8PJxBgwYxduxY15FERDypUKFCfP7551SsWJFVq1Zxxx13cObM\nmb+st3z5cjp37oy1lldeeYUOHTo4SCt5gY6Rk2TvvfceDz74IJGRkXzzzTe0aNHCdSQREU/atGkT\nzZs358CBA9x5551MmjSJ8PBwAHbs2EHjxo3Zt28f99xzDx988AHG/OXQJ5E/Se8YORU5+ZPAwbol\nSpRg8eLFVKtWzXUkERFPWrVqFddddx3Hjx+nV69evPfeexw/fpyrr76a9evXc/311zNnzhyioqJc\nRxUPUJFLRUUubQkJCdx2223Mnj2b8uXLs2TJEi677DLXsUREPGnhwoW0bt2a06dP8/jjj7NmzRq+\n/vprqlevzpIlSyhevLjriOIRKnKpqMil7+TJk9xwww0sXbqUunXrsmDBAooVK+Y6loiIJ82ePZtb\nb701+aoApUqVYunSpVxxxRVug4mn6PIjkmmFCxdm9uzZxMTEsGbNGm6//Xbi4+NdxxIR8aR27dpx\n0UUXJX9+0003qcRJ0KjISZpKlizJ//73Py699FLmzZsXtBtCi4jkN4MHD+bAgQPJn48bN46RI0c6\nTCR5iYqcpKtChQrMmTOH6OhopkyZwsMPP4ymo0VEMm/UqFE8++yzGGOYOnUqw4YNA+Chhx7i/fff\n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\nnfuBvr+KXDIqcpLRXL9+nY0bN7J69Wo2btzIkSNH7nm8YMGCNGrUiKeffhofHx9q1qypk9zTIZfL\nxaFDh9zF7bvvvuPcuXP3PKdYsWL4+vri6+tL8+bNdUhdJB2LiooiIiKCyMhI+vbt+8DfR0UuGRU5\nyehOnz7Nt99+y8aNG9m4cSMnT5685/Hs2bNTu3ZtfHx88PHxoW7duhQvXlwzYtPYxYsXCQ8Pd99+\n+OEH9yXd7nrooYdo2LAhDRs2pEmTJjzxxBP6dxLJZFTkklGRk8zEWsvx48cJDQ1l27ZthIWF3XMt\nwruKFClCzZo177mVKVNGpSEFWGs5e/Yse/bsYe/evezdu5ft27ffc57jXcWLF6dBgwY0atSIRo0a\nUalSJf0biGRyKnLJqMhJZnf58mXCw8MJCwsjLCyMnTt3Eh0d/ZvneXt7U6VKFapUqULlypXdH4sV\nK6ZycR9RUVEcPnyYQ4cOsX//fndxu3Tp0m+emydPHmrXrk29evWoV68edevWpWTJkg6kFpH0TEUu\nGRU5kXtZa4mMjGTXrl3u286dO7l48eLvPt/b25uKFSvy2GOP8eijj/LYY4+5b0WLFs3QJc9aS1RU\nFJGRkURGRnL8+HGOHDnCoUOHOHTo0O8WNoACBQpQrVo1qlevTrVq1ahZsyaVK1fW7GIR+UMqcsmo\nyIn8MWst58+fZ//+/Rw4cOCej5cvX77v1+XKlYtSpUpRokQJSpYsSYkSJdz3ixcvTuHChSlcuDD5\n8uVLd4UvNjaW8+fPc+7cud98PH36tLu8xcTE3Pd75M2bl4oVK7pvTz75JNWrV6dkyZLp7r9XRDyD\nilwyKnIiD+5uwTt69Cg///wzP//8M8eOHXPfv98eqeSyZcvmLnWFCxfG29ubvHnzki9fvns+5s2b\nlxw5cpAtWzb3LXv27GTLlo2sWbPicrlwuVzcuXPHfd/lchEbG0tMTAwxMTHcvHnTfT8mJobo6Ggu\nX77M5cuX+fXXX933r1+//qeye3t7U6ZMGcqUKUPp0qUpX748FStWpEKFCpo0IiIpTkUuGRU5kdRz\n9epVTp8+zenTpzlz5gxnzpxx3z979iyXLl0iKiqKGzduOB31N7y8vHj44YcpVqwYxYoVo2jRou77\nxYsXp2zZspQuXRpvb2+no4pIJqIil4yKnIjzbt68yaVLl7h06RIXL17kypUrXL9+nWvXrnHt2jX3\n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\n8zlOaAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,numpy.pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can play around with the input values and see what kind of behavior results. Just note that any value of $C > \\frac{2}{3}$ will result in $\\cos \\theta > 1$, which doesn't exist. Python will probably throw a few errors if you hit that condition, but just try again!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* The last case is $C = 0$. Take another look at Equation (16) and plug in $C = 0$, what should happen? It looks like it will just reduce to \n", + "\n", + "$$R = 3z_t$$\n", + "\n", + "It's a constant radius of curvature! In fact, this solution is a series of semi-circles, with a cusp between them. One way to force $C = 0$ that we can figure out from Equation (15), is to make:\n", + "\n", + "\n", + "$$z = 3z_t\\ \\ \\ ,\\ \\ \\ \\theta = 0$$" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\npZeYNm0a1atXp1mzZpx11lkVUfZWef/99xk5ciQ33ngjAMOHD+eLL75g7dq1tGjRgpNOOmmz70/7\nsZa2vuL6l+txJv29WeX8nVxRklQ2/H/q/9x3332xT58+sX///t9pP++88+LcuXNjjDG2a9cuzpkz\np8j3r1ixInbs2HHT88MOOywuXbq0/AreBvn5+fH444+Pv/rVr2KMMc6fPz/ec889m14///zz4zff\nfFPs+7flWCdMmBAff/zxeO+998avv/56K49g80pbX3H9S7Of4n6Xsu1FZhqnRCVJKqVrrrmGE088\n8Ttts2fPZuHChbRo0QKAUaNG0bJlyyLf/+abb9KuXbtNzzt06MA///nP8it4GwwbNoxu3bptev7l\nl18yZswY1q9fD0C9evXYbrvtin3/1h7r559/zpNPPsl5551HixYteP7557fhKIpX2vqK61/e59Qp\nUUlSlTNr1iz+/Oc/f2c9rI2PQwgcdthh9OrVq1T7fOONN2jYsCGDBg3i66+/pn79+px77rlF9v3i\niy9o1KjRpueNGjVi5syZW308xdnW41y2bBnVqlVjxx13ZNWqVQAceOCB5Ofn88Mf/pALLriAY445\nhpo1axa7j6091p///OfcdNNNAHz66adUr169XI6ztPUV13+HHXYo13NqYJMklYkQilzvs9Q2/oW7\nNSZNmsSAAQNo3rw51apV4yc/+Qm9e/f+Xr899tiDu+66a1vK/J7Fixczbdo0hgwZAsCRRx7Jj370\nI9q0afO9vl9//TXbb7/9pufbbbcd33zzTYk+p6THCNt+nH//+9/52c9+xlNPPfWd9htvvJGBAwdy\n/fXX87vf/W6z+9iaY/3Pf/7DO++8w7vvvsvkyZMZNGgQt956a7H9t+U4S1vf5vpv7TktCadEJUmV\nxsEHH8yrr77KD37wA2rWrEnv3r154IEHWLx4cbl/dv369TnggAM2PW/RogWjRo0qtm/BYLpmzRoa\nN25cos8pfIxdu3blt7/9LU8++STvvvvuth1EAe+88w6HHnro99pnzpzJuHHjGDVqFC+//DK33347\nb7/9drH72ZpjfeONNzjhhBO44IILOOuss1i4cCHHHHNMuRxnaesrrv+2nNOScIRNklQmtmVkrCzd\neeedLF68mIcffhjITKc1bdr0O30KTqEVtC1Tou3atWP8+PGbnlerVo28vLwi++65555Mnjx50/Nl\n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\nSZISMm/ePPr160d+fj633norJ5xwQtIlSZVKoiNsIYTRIYQpBbap2Z89AWKMv4gxtiAzBXp5krVK\nkor27bffcsopp7B06VKOPfZYbrvttqRLkiqdREfYYoxHl7DrYOBVYACZEbXdC7y2W7atSAMGDNj0\nuGvXrnTt2rWUVUqSihNj5IILLmDSpEm0atWKwYMHU7169aTLknLC2LFjGTt2bIn6pvmmgzYxxs+y\njy8Hjowx9i1w08GhZKZCR+NNB5KUiPvuu4/rrruOunXrMnHiRNq3b590SVLO2txNB2m+hm1gCGFv\nMjcbzAUuAogxfhxCGAp8DKwHLjGVSVLFe+2117jhhhsA+Otf/2pYk8pRakfYyoIjbJJUPj755BMO\nPfRQVqxYwW233fady08kbZ3NjbAZ2CRJpbJs2TIOO+wwPvvsM/r06cPzzz9PtWqpXSVKyhkGNklS\nmVi7di1HH300b731FgceeCBvvvkm9erVS7osqVLIyYVzJUnpEmPkZz/7GW+99RbNmjVj+PDhhjWp\nghjYJEklcscdd/D0009Tt25dXnnlFZo3d81yqaI4JSpJ2qJBgwZx1llnEULgpZdeomfPnkmXJFU6\nTolKkrba6NGj6d+/PwAPPPCAYU1KgCNskqRivf/++3Tu3JlvvvmG6667jnvuuSfpkqRKy7tEJUml\nNmfOHDp16sSiRYvo168fgwYNcvkOqRwZ2CRJpfLll19y5JFH8sknn3DUUUcxYsQIatWqlXRZUqVm\nYJMkldjKlSvp1q0b7733Hu3bt+fNN9+kYcOGSZclVXredCBJKpE1a9bQq1cv3nvvPfbcc09Gjhxp\nWJNSwMAmSQJgw4YNnH766YwbN45mzZoxevRodtlll6TLkoSBTZIE5OXl0b9/f15++WUaN27MqFGj\naN26ddJlScoysElSFZefn89FF13EoEGDqFu3LiNGjKBdu3ZJlyWpAAObJFVhMUauvPJKHnvsMWrX\nrs2rr77KoYcemnRZkgoxsElSFRVj5Prrr+eRRx5hu+2248UXX6RLly5JlyWpCAY2SaqCYozccsst\n3HfffdSoUYNhw4ZxzDHHJF2WpGLUSLoASVLFijFy8803M3DgQKpXr86QIUM44YQTki5L0mYY2CSp\nCokxcuONN3L33XdvCmsnn3xy0mVJ2gIDmyRVETFGbrjhBu69915q1KhhWJNyiIFNkqqAGCNXX301\nDz74IDVq1GDo0KH06dMn6bIklZCBTZIquby8PC688EIef/xxatasydChQ+ndu3fSZUkqBQObJFVi\n69ev5+yzz2bIkCFsv/32vPDCC/zkJz9JuixJpWRgk6RK6ttvv+W0007j5Zdfpn79+rzyyit07tw5\n6bIkbQUDmyRVQitXrqRPnz688cYb7LDDDowcOZKDDz446bIkbSUDmyRVMosXL6ZHjx6899577LLL\nLowcOZL27dsnXZakbWBgk6RKZPbs2RxzzDF89tlntGnThpEjR7LHHnskXZakbeRXU0lSJfHhhx9y\n+OGH89lnn3HggQcyfvx4w5pUSRjYJKkSGD16NEceeSSLFi2iW7dujB07lqZNmyZdlqQyYmCTpBz3\n5JNP0qNHD/773//St29fRowYQYMGDZIuS1IZMrBJUo6KMfKrX/2K/v37s2HDBm644QaeffZZtt9+\n+6RLk1TGvOlAknLQunXruOCCC3jqqaeoVq0aDz/8MJdccknSZUkqJwY2ScoxS5cu5aSTTuKtt96i\nTp06DBkyhJ49eyZdlqRyZGCTpBzy8ccf07NnT2bNmkWzZs0YPnw4HTt2TLosSeXMa9gkKUeMHDmS\nTp06MWvWLA466CAmTZpkWJOqCAObJKVcjJH777+fHj16sHLlSk455RTefPNNmjVrlnRpkiqIgU2S\nUmz16tWcddZZXHvtteTn5/OLX/yC5557jjp16iRdmqQK5DVskpRSc+fOpU+fPrz//vvUrVuXp556\nipNPPjnpsiQlwMAmSSn0z3/+k759+7J06VL23HNPXnzxRfbff/+ky5KUEKdEJSlF8vPzueuuu+je\nvTtLly7l2GOPZdKkSYY1qYozsElSSnz99deceOKJ3HzzzZuuV3v11VfZYYcdki5NUsKcEpWkFHjv\nvfc45ZRTmD17NjvssANPP/00xx9/fNJlSUoJR9gkKUExRh5++GE6derE7NmzOeigg3jvvfcMa5K+\nw8AmSQn56quvOOmkk7jiiitYt24dF110EePHj6dVq1ZJlyYpZZwSlaQETJw4kX79+jFv3jwaNmzI\nn//8Z0499dSky5KUUo6wSVIF2rBhA7fffjudO3dm3rx5HHroobz//vuGNUmb5QibJFWQ2bNnc9ZZ\nZzFhwgQArr/+eu644w5q1qyZcGWS0i71I2whhGtDCPkhhMYF2m4KIcwMIUwPIRyTZH2StCUxRp56\n6ik6dOjAhAkTaNasGaNHj+buu+82rEkqkVSPsIUQdgOOBuYWaNsX6AvsC+wGjAkh7BVjjMlUKUnF\nW7p0KRdffDHPP/88ACeffDJ/+tOfaNKkScKVScolaR9hewC4vlDbicCQGOOGGOMcYCZwSEUXJklb\n8uKLL9KuXTuef/556tWrxxNPPMHf/vY3w5qkUkttYAsh9ALmxxinFnqpOTC/wPMF2TZJSoWvv/6a\ns846iz59+rBkyRK6dOnChx9+yLnnnksIIenyJOWgRKdEQwijgaYFm4AI/AK4mcx0qCTljFdeeYUL\nL7yQhQsXUrt2bQYOHMhll11GtWqp/fexpByQaGCLMRYZyEII+wOtgA9D5p+juwHvhRAOITOi1qJA\n992ybUUaMGDApsddu3ala9eu21q2JH3PkiVLuPLKKxkyZAgAnTp14sknn2TvvfdOuDJJaTV27FjG\njh1bor4hF67VDyHMBjrGGL8OIewHPAMcSmYqdDRQ5E0HIQTvRZBUrmKMPPPMM1x11VUsW7aM2rVr\nc/vtt3PllVdSvXr1pMuTlENCCMQYi7xuItV3iRYQyUyXEmP8OIQwFPgYWA9cYiqTlITZs2dz6aWX\n8o9//AOA7t2786c//Yk99tgj4cokVTY5McK2tRxhk1Qe1q1bx3333cdvfvMb1qxZQ6NGjbj//vu9\nqUDSNqkMI2ySlArjxo3j4osvZvr06QD069eP+++/n1122SXhyiRVZt62JEklsGjRIs455xy6du3K\n9OnT2WuvvRg9ejSDBw82rEkqdwY2SdqMjdOfe++9N3/961+pVasWAwYMYMqUKXTv3j3p8iRVEU6J\nSlIxRo0axZVXXsmMGTMAOOGEE3jggQdo06ZNwpVJqmocYZOkQj799FN69+7Nsccey4wZM9hrr714\n9dVXGT58uGFNUiIMbJKUtWzZMq644gratWvHSy+9RN26dRk4cCBTp06lR48eSZcnqQpzSlRSlbd2\n7VoeeeQRbr/9dpYvX04IgfPPP5/f/OY37LrrrkmXJ0kGNklVV15eHoMHD+aXv/wlc+bMATKL3953\n3320b98+2eIkqQADm6QqJ8bIq6++ys0338zUqVMB2G+//bjnnns47rjjXPxWUup4DZukKuWtt96i\nc+fO9OzZk6lTp7L77rvzxBNPMGXKFHr06GFYk5RKjrBJqhImTpzIbbfdxpgxYwBo0qQJv/jFL7jo\noovYfvvtE65OkjbPwCapUvv3v//NbbfdxsiRIwFo0KABV199Nddccw0NGjRIuDpJKhkDm6RKafz4\n8dxxxx289tprANSvX58rr7ySa665hh122CHh6iSpdAxskiqNGCOjRo3ijjvu4K233gKgbt26XHHF\nFVx77bU0adIk4QolaesY2CTlvLy8PF588UUGDhzI5MmTAWjUqBFXXHEFV1xxhUFNUs4zsEnKWatX\nr+bJJ5/k/vvv5/PPPwdgp5124pprruGSSy7xGjVJlYaBTVLOWbJkCY8++iiPPvooy5YtA6B169Zc\nc801nHfeedSpUyfhCiWpbBnYJOWM9957j4ceeohnn32WdevWAXDwwQdz/fXXc9JJJ1G9evWEK5Sk\n8mFgk5Rq69ev54UXXuChhx5iwoQJAIQQ6NmzJ9dddx1HHnmki91KqvQMbJJSaf78+Tz22GM89thj\nLFy4EMisoXb++edz2WWXscceeyRcoSRVHAObpNTIy8tj1KhR/PGPf+SVV14hPz8fgLZt23L55Zdz\n9tlnU69evYSrlKSKZ2CTlLg5c+bw5JNP8uSTTzJ37lwAatasyamnnspFF11Ely5dnPaUVKUZ2CQl\nYvXq1bzwwgv85S9/4Y033tjU3rp1ay688EL69+/PzjvvnGCFkpQeBjZJFSY/P59x48YxaNAgnn/+\neVauXAnA9ttvz8knn8x5551H165dqVatWsKVSlK6GNgklasYI1OnTmXQoEEMHjyYBQsWbHrt4IMP\n5vzzz+e0006jUaNGCVYpSelmYJNULqZNm8bQoUMZOnQoM2bM2NTeqlUrzjzzTM444wzatm2bYIWS\nlDsMbJLKRIyRjz76iGHDhjF06FCmT5++6bXGjRtz2mmnceaZZ9KpUydvIJCkUjKwSdpqeXl5TJw4\nkRdffJEXX3yRWbNmbXqtcePG9OnTh759+9KtWzdq1qyZYKWSlNsMbJJKZcWKFYwePZoRI0YwfPhw\nli5duum1nXbaiZ49e9K3b1+OOuooQ5oklREDm6TNijEybdo0RowYwYgRI5gwYQIbNmzY9Pqee+5J\n79696d27N506dfL7PCWpHBjYJH3PggULeP311xkzZgxjxozhP//5z6bXqlevTufOnenRowfHH388\n7dq185o0SSpnBjZJLF68mDfffJM333yTN954g48//vg7rzdt2pTjjjuOHj16cPTRR7sEhyRVMAOb\nVMXEGJkzZw4TJ07kzTffZNy4cXzyySff6VO3bl26du1K9+7d6d69u6NokpQwA5tUya1atYp3332X\nt99+m7fffpt//etfLF68+Dt96tSpw+GHH06XLl3o0qULhx56KNttt11CFUuSCjOwSZXI6tWr+eCD\nD3j33XeZPHky7777LtOnTyc/P/87/Zo0aUKnTp340Y9+RJcuXTjooIO8o1OSUszAJuWg/Px85syZ\nw5QpU5gyZQpTp05lypQpzJw5kxjjd/pWr16dDh060KlTp01bmzZtnOKUpBxiYJNS7JtvvuHzzz/n\nk08+YcaMGUyfPp0ZM2bwySefsGbNmu/1r169Ou3ateOggw7ihz/8IQcddBDt27endu3aCVQvSSor\nBjYpQWvWrOGLL75g3rx5zJ8/nzlz5vD5559v2pYsWVLse3fddVcOOOAA2rdvv2lr27YttWrVqsAj\nkCRVBAObVMa+/fZbli1bxldffcWyZcv48ssvWbRo0Xe2//znP3zxxRd8+eWXm91XrVq1aN26Nfvs\nsw9t27albdu27Lvvvuyzzz4urSFJVYiBTVXe119/zauvvkp+fj55eXmbtvz8fDZs2MDatWv59ttv\nv7OtWrWKlStX8t///nfTzxUrVvDVV18VOVVZnBo1arDbbrvRokULdt99d1q0aMGee+65aWvevDnV\nqlUrx6OXJOWCUPgC5cokhBAr8/GpbEyZMoUOHTqU2f5q1qxJkyZNaNKkCY0bN2bHHXdk1113ZZdd\ndtm0NW3alN13352mTZsayCRJAIQQiDEWeUeYI2yq8ho3bswZZ5xB9erVqVat2nd+Vq9ene233/57\nW506dWjQoAH169f/zs/GjRtTt25d78CUJJUpR9gkSZJSYHMjbM7FSJIkpZyBTZIkKeUMbJIkSSln\nYJMkSUq51Aa2EMJtIYQvQgjvZbefFHjtphDCzBDC9BDCMUnWKUmSVN5SG9iy7o8xdsxurwGEEPYF\n+gL7AscBvw8pWUNh7NixSZegbeD5y12eu9zm+cttnr+KkfbAVlQQOxEYEmPcEGOcA8wEDqnQqorh\nH9rc5vnLXZ673Ob5y22ev4qR9sB2WQjhgxDCYyGEhtm25sD8An0WZNskSZIqpUQDWwhhdAhhSoFt\navZnT+D3wB4xxh8Ai4D7kqxVkiQpKTnxTQchhJbA8Bhj+xDCjUCMMf42+9prwG0xxn8X8b70H5wk\nSVJWzn2XaAhhlxjjouzTk4CPso9fBp4JITxAZiq0DfBOUfso7qAlSZJySWoDG3B3COEHQD4wB7gQ\nIMb4cQhhKPAxsB64xC8MlSRJlVlOTIlKkiRVZWm/SzQnhBDuzi7i+0EIYVgIoUGB11zkN+VCCD8J\nIcwIIXwaQvh50vVo80IIu4UQ3gghTMveqHRFtn2HEMKoEMInIYSRBe4sV8qEEKplF0R/Ofvcc5cj\nQggNQwh/y/6dNi2EcKjnr2IY2MrGKKBd9o7WmcBNACGE/UjpIr/KCCFUAx4BjgXaAf1CCG2TrUpb\nsAG4JsbYDugEXJo9ZzcCY2KM+wBvkP09VCpdSeaylo08d7njQWBEjHFfoAMwA89fhTCwlYEY45gY\nY3726b+A3bKPe5HSRX61ySHAzBjj3BjjemAImcWZlVIxxkUxxg+yj78BppP5nTsReCrb7SmgdzIV\nanNCCLsBPYDHCjR77nJAdvboyBjjEwDZv9tW4PmrEAa2snceMCL72EV+06/wOfoCz1HOCCG0An5A\n5h9KTWOMiyET6oCdk6tMm/EAcD1Q8AJqz11uaA0sDSE8kZ3S/n8hhDp4/iqEga2EtrDI78Y+twDr\nY4zPJliqVCWEEOoBzwNXZkfaCt9B5R1VKRNCOB5YnB0h3dzlIZ67dKoBdAQejTF2BFaRmQ71d68C\npHlZj1SJMR69uddDCOeSGeY/qkDzAmD3As93y7YpPRYALQo89xzlgBBCDTJh7ekY40vZ5sUhhKYx\nxsUhhF2AJclVqGIcAfQKIfQAagP1QwhPA4s8dznhC2B+jHFy9vkwMoHN370K4AhbGQgh/ITMEH+v\nGOPaAi+9DJweQtguhNCazSzyq8RMAtqEEFqGELYDTidz3pRufwE+jjE+WKDtZeDc7ONzgJcKv0nJ\nijHeHGNsEWPcg8zv2hsxxrOA4XjuUi877Tk/hLB3tunHwDT83asQrsNWBkIIM4HtgGXZpn/FGC/J\nvnYTcD6ZRX6vjDGOSqZKFScbuB8k8w+Yx2OMAxMuSZsRQjgCeBOYSmbqJQI3k/nH0FAyo9pzgb4x\nxuVJ1anNCyF0Aa6NMfYKITTGc5cTQggdyNwwUhOYBfQHquP5K3cGNkmSpJRzSlSSJCnlDGySJEkp\nZ2CTJElKOQObJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElK\nOQObJElSytVIugBJyhUhhAuAHYF9gKeBlsDOwP7ADTHGBQmWJ6kSCzHGpGuQpNQLIfwMmBJj/HcI\n4WBgNHAusAp4DegRYxyZYImSKjFH2CSpZJrEGP+dfdwCyIsxvhhCqA10jTG+lWBtkio5R9gkqZRC\nCA8Bu8cY+yRdi6SqwZsOJKn0ugFjky5CUtVhYJOkLQghVAshdA8ZOwPtKBDYQgg3JFacpCrBwCZJ\nW3YhMArYC+gLrAa+AAgh9AI+Sq40SVWB17BJ0haEEDoA1wMzgA+BBsBRwBxgdoxxUHLVSaoKDGyS\nJEkp55SoJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElKOQOb\nJElSyhnYJEmSUu7/A9i2e0jPCtaoAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(16,48,0.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks an awful lot like a quarter circle. And what's the radius of the arc? It's $$r = 48 = 3z_t.$$\n", + "\n", + "We can also get a semi-circle out of our simulated trammel by changing to another configuration where $C$ is (near) zero. Here's one example:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nvS8Z0/tyPr0nGdP7kjG9LznDb4/STXNNdhERERGvZozBXsZBG357lK6IiJyvQoUKxMTEOB1DxG+V\nL1+e/fv3e3y9GuETEZFU7lEEp2OI+K3M/g1e7gif9uETERER8XEqfCIiIiI+ToVPRERExMep8ImI\niIj4OBU+ERERkcu0du1aEhISOHv2LOvWrXM6znl0WhYREZF0Tp06xbhx4wgLC+PPP//k2Wef/dfj\nW7duJTIyksGDB2e6jsWLF7Nz504CAwO56qqr6Ny5c07HzpZt27Yxc+ZMJkyYkLrsYtufXl7Z1uzI\n6P3JSEREBDExMZQuXZp33nkHAGstxYsXJyAgIPXI22bNmjF37twcz52eCp+IiEg6Tz75JCNHjiQs\nLIyqVavywAMPUL58ecD1S3z48OHUrl07068/efIkL730Eps3bwagbt263HvvvZQoUSJX8mfV//3f\n/7F+/XqKFSv2r+UX2v70LmdbN2zYwI8//siJEyfo2rXreTmcltn7k5GhQ4fSokULypYtS2BgIAD7\n9+/nrbfe4o477iAgIIBFixZx991353TsDGlKV0REJI1ffvmFw4cPExYWBsDKlSv/VXYWLFhA48aN\nL7iOtWvXUqVKldT7t956K6tXr86ZwJfhmWeeoXXr1v9adrHtTy+727pv3z7ef/99nnjiCcLCwpg/\nf342tyLnZPT+ZCY4OJirr746tewB5M+fn7Zt21KhQgWKFi1KcHAwlStXzqm4F6QRPhER8Tk///wz\n77777r9OYpvyuTGG22+/nVatWmX4tV9++SWhoaF8+OGHnDhxgiJFitClSxcA4uLiCAgIoGTJkpw6\ndSrT1//111//NSpUrFgx9uzZ47kNdLuc7czMhbY/I9nd1ueff54XXngBgN27d/+rKKWXE9vpadHR\n0VhriYuL44YbbqBVq1aULVs29fHJkyfz9NNPO5ZPhU9ERLLEmGyf5P882b2ax8aNGxk1ahTlypUj\nICCAFi1a0KZNm/OeV7FiRcaMGZOt14iNjWXnzp3MmTMHgPr163PnnXdy/fXXs3DhQrp3784HH3xw\nwXWcOHGC/Pnzp97Ply8f8fHxWXr9rG4jXN52ZuZC25+R7Gzrb7/9RnR0NJs3b2bTpk18+OGHDB8+\nPNPn58R2elq3bt2oUaMGANWrV6dhw4aEhoYCrvcoLi6OkJAQx/Kp8ImISJ5x2223sWzZMt566y12\n7dpFmzZteO211+jUqRNXXnmlR16jSJEiVKtWLfV+WFgYK1eu5Pjx49SpUyfL6zh+/Hjq/TNnzlCm\nTJksfW36bWzUqBHjxo3jyiuvpFq1atSsWfPSNugSZbb9mRW+7Gzrl19+yf3330+PHj04ffo0gwYN\nolmzZjm+na+++ioJCQn/WpYyShgREXHBqeuLufXWW1M/L168OFFRUanTwXPnznVsKjeFCp+IiGSJ\nt1xjd/To0cTGxvLGG28ArunA9GUv7RRgWlmZAqxSpQrr169PvR8QEEBSUhLR0dGcPn2a5cuX89VX\nX5GQkMCnn36a4Xquu+46Nm3alHo/Li6O8PDwbG3ja6+9RuPGjQkPDyciIoJZs2Z5ZDszk9n2ZyY7\n23rw4MHUArR48WLuvfdeZs6cmePbOWjQoIs+JztmzZrFZ599lpo5Pj7+X1PUX375JY899liOvHaW\nWWv98ubadBERScvb/28cPXq0HTp0qLXW2p07d9p169bZe+65x3799dcee42EhAR7++23p96/4447\n7N69e//1nFGjRtkXX3wx9f6+fftscnJy6v1Tp07ZatWqpd6/9dZbbWxsrLXW2j179vzrueml38a+\nffvaAwcOWGutveeeey5jyzL2/vvv2y5duqTev9D2p99Oa7O3rVOnTrVTp0611lp777332piYGNuv\nX78c3c7sSv/+WHv++7B+/Xq7Zs0aa6218fHxtkKFCvbUqVOpj1evXt2uWrUqS6+X2b9B9/Js9x4d\npSsiInnChg0bqFatGs2bN6dJkyYsXLiQa665hkaNGnH77bd77HVCQkIYNWoUI0aMYPjw4fTp04fr\nrrsu9fGPP/6YxYsXs3jx4tQjSx944AG+++671OcULFiQQYMG8Z///IeXX36ZgQMHUrp0aQBatmzJ\nqlWrsryNwAUPaLgcb775JtOmTSMqKooXX3yRv/7664Lbn347s7utDz74INu3b2fq1KkMHz6csLAw\nkpOTc2w7syuj9wfOfx/q1avHwYMHmThxIkOHDmXOnDkULFgw9fESJUpQrly5XM+flrFeMkSf24wx\n1l+3XUQkM2mPgswLZs+eTfny5QkLC+Oaa65xOk6WJCcns2bNmoue2iXFG2+8Qf369alcuTJdunTh\no48+yuGEnnMp25qXt9OTMvs36F6e7SOnVPhERCRVXit8ixcvJjExkdtuu+2ydrjPTfPmzaNly5YU\n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\npozTkbyGRvjysB49elC9enUOHDjA2LFjnY4jIiLimISEhNRrz7/44osqex6mET6HffXVV9x5552E\nhITwww8/ULFiRacjiYiI5LqXX36ZESNGULVqVbZu3UpQkKNnjvM6GuHL4+rVq0fnzp05e/Ys/fv3\nxxtKqIiISG7av38/o0ePBuDNN99U2csBKnxe4NVXXyU0NJTPPvuM+fPnOx1HREQk11hr6d27NwkJ\nCXTs2JGGDRs6HcknaUrXS7zzzjv06tWLMmXKsGvXLooVK+Z0JBERkRw3Z84cOnbsSLFixdi1a5f2\n3cuEpnR9RPfu3alXrx6///47gwcPdjqOiIhIjjtx4kTqgRrjx49X2ctBGuHzIjt37qRGjRokJiay\nfv166tWr53QkERGRHNO9e3emTp1KgwYNWL16NQEBGofKjEb4fEiVKlUYNGgQ4Dply99//+1wIhER\nkZyxZs0apk6dSr58+XjnnXdU9nKY3l0vM3ToUK6//np++OEHxowZ43QcERERj0tISKBnz54ADBky\nhJtuusnhRL5PU7peaM2aNTRq1IigoCA2btxI9erVnY4kIiLiMYMGDWL8+PHcdNNNfPfdd4SEhDgd\nyetpStcHNWzYkH79+nHu3Dm6dOlCYmKi05FEREQ8YsOGDUyYMIGAgADef/99lb1cosLnpcaMGcO1\n117Ltm3bUk9GKSIikpedPn2aLl26YK1l0KBB1KlTx+lIfkNTul4sKiqKxo0ba2pXRER8wjPPPMNr\nr71GlSpV2Lx5s0b3LoGmdH1Yo0aN/jW1q6N2RUQkr1q/fj0TJ04kMDBQU7kOUOHzcmPGjKFixYps\n27aNUaNGOR1HRETkksXHx6dO5b7wwgvUqlXL6Uh+R1O6ecD69etp2LAh1lqioqJo0KCB05FERESy\nrFu3bkybNo1bbrmFjRs3ki9fPqcj5Tma0vUDd955Jy+88ALWWjp37swff/zhdCQREZEsWbBgAdOm\nTSN//vzMnj1bZc8hKnx5xMiRI7nttts4cOAAffv2dTqOiIjIRR06dIju3bsDrmvlVqlSxeFE/ktT\nunnI7t27qVGjBqdPn2bWrFl06tTJ6UgiIiIZSk5OplmzZnzxxRfce++9LF26FGOyPSPp9zSl60cq\nVarE66+/DkDv3r3Zv3+/s4FEREQy8dprr/HFF19QqlQppk+frrLnMI3w5THWWtq3b88nn3xC7dq1\nWbdunfaHEBERr7Jx40bq1atHYmIiS5Ys4f7773c6Up6nET4/Y4xh6tSphIWFER0dzeDBg52OJCIi\nkuqPP/6gQ4cOJCYm0q9fP5U9L6ERvjzqm2++oX79+pw7d47FixfTqlUrpyOJiIifSzsLVbNmTb76\n6iudYNlDNMLnp26//XbGjh0LQJcuXYiJiXE4kYiI+LtJkybxySefULRoUebNm6ey50U0wpeHWWtp\n1aoVS5cu5fbbb2ft2rUEBwc7HUtERPxQdHQ0d955J4mJicyfP5/27ds7HcmnaITPjxljeP/997nm\nmmv45ptvGDhwoNORRETEDx0/fpyHHnqIxMREnnzySZU9L6QRPh/w9ddf07BhQxITE3V+PhERyVVJ\nSUncd999REZGUqtWLdavX6+p3BygET6hbt26qefn69atG9u3b3c4kYiI+IsRI0YQGRlJyZIlmT9/\nvsqel9IIn4+w1vLEE0/w/vvvU7FiRTZt2kTx4sWdjiUiIj7sk08+oV27dgQEBPD555/TpEkTpyP5\nLI3wCeD6QXjrrbcIDw/n559/5pFHHiEpKcnpWCIi4qN27drFY489BsCrr76qsuflVPh8SIECBVi4\ncCElSpRg+fLljBw50ulIIiLig/7880/atm1LfHw8Dz/8MM8884zTkeQiNKXrg1atWkXz5s1JTk7m\no48+4uGHH3Y6koiI+IikpCRat27NsmXLuOWWW9iwYQOFChVyOpbP05SunKdp06a89tprADz++ONE\nR0c7nEhERHzFoEGDWLZsGSVKlOCTTz5R2csjNMLno6y19OrViylTplCmTBk2btzI1Vdf7XQsERHJ\nw6ZOnUr37t0JDg5m1apVNGjQwOlIfuNyR/hU+HxYYmIizZo1IyoqivDwcNauXau/xEREJFtWr15N\ns2bNOHfuHNOmTeOJJ55wOpJf0ZSuZCo4OJj58+dz3XXXsWXLFiIiIkhOTnY6loiI5DF79uyhffv2\nnDt3jueee05lLw9S4fNxJUqUYOnSpYSGhrJgwQIGDx7sdCQREclD4uLiuP/++zlx4gQtW7Zk7Nix\nTkeSbFDh8wM33XQT8+fPJygoiPHjx/Pmm286HUlERPKAM2fO0KpVK3bv3s0tt9zCrFmzCAwMdDqW\nZIMKn59o2rQpU6dOBeDJJ59k0aJFDicSERFvlpSUxKOPPsqGDRu4+uqr+eyzzyhSpIjTsSSbVPj8\nSEREBC+99BLWWjp27MjXX3/tdCQREfFC1lqefvppFi5cSGhoKCtWrKBcuXJOx5LLoKN0/Yy1lh49\nejB16lRKlCjB119/zQ033OB0LBER8SITJkxg4MCB5MuXj8jISBo1auR0JL+n07Jkk78WPoBz587R\nqlUrli9fzrXXXsv69eu56qqrnI4lIiJeYPbs2TzyyCMAulqTF9FpWeSSBQUFMW/ePGrVqsUvv/xC\n8+bNOX78uNOxRETEYcuWLSMiIgKA8ePHq+z5EBU+P1W4cGGWL1/OTTfdxI4dO7jvvvs4deqU07FE\nRMQh69at44EHHuDcuXMMHDiQZ5991ulI4kGa0vVzv/76K/Xq1ePAgQM0a9aMTz/9lJCQEKdjiYhI\nLtqyZQuNGzfm5MmTdO/enXfeeQdjsj17KDlAU7pyWa6++mo+//xzSpUqxcqVK+ncuTNJSUlOxxIR\nkVzy008/0aJFC06ePEmHDh14++23VfZ8kAqfUKlSJSIjIylatCgff/wx3bt31yXYRET8QExMDHff\nfTdHjx6lRYsWzJw5UydW9lEqfAJAjRo1WLp0KQUKFOC9996jV69eKn0iIj7swIEDNG7cmIMHD1Kv\nXj0WLFhAvnz5nI4lOUSFT1LVr1+fpUuXkj9/ft5991369euH9nMUEfE9v/76K40bN+aXX36hdu3a\nLFu2jIIFCzodS3KQCp/8S5MmTVIP3Hj77bcZMGCASp+IiA85dOgQjRs35ueff6ZWrVpERkYSGhrq\ndCzJYSp8cp67776bRYsWkS9fPt544w2eeeYZlT4RER9w+PBhmjRpwt69ewkPD2flypUUK1bM6ViS\nC1T4JEMtWrRg4cKFBAcHM3HiRAYNGqTSJyKSh/322280adKE3bt3U716dT7//HOKFy/udCzJJSp8\nkqn77ruP+fPnExQUxIQJE3juuedU+kRE8qDffvuNu+66i59++olbbrmFVatWccUVVzgdS3KRCp9c\nUKtWrZg3bx7BwcH83//9H3369NHRuyIieUhMTAwNGjRg165dVKtWjS+++IISJUo4HUtyma60IVny\n2Wef0b59exISEujcuTPTp08nKCjI6VgiInIBu3fvpmnTphw8eJDw8HAiIyMpWbKk07EkGy73Shsq\nfJJlq1evpmXLlpw6dYr27dsze/ZsnbNJRMRLbd++nWbNmhEbG0u9evVYtmyZjsbNw3RpNck1jRs3\n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\nvMsjiwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,-numpy.pi/2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is so nice. We have reproduced the trajectories that Lanchester found more than a hundred years ago, painstakingly drawing them by hand with a contraption called a \"trammel.\" It must have taken him days!\n", + "\n", + "Here is how the different phugoid curves are drawn in von Kármán's book, _Aerodynamics_ (1957). He never says _how_ he drew them, but we're guessing by hand, also. We did pretty good!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/vonKarman-phugoids.png)\n", + "\n", + "#### Figure 4. Phugoid curves in von Kármán (1957)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the next notebook of this series, we'll look at the differential equation that arises when you consider small perturbations on the horizontal phugoid, and we'll learn to numerically integrate that to get the flight paths." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Lanchester, F. W. _Aerodonetics_, D. van Nostrand Company: New York, 1909. On the public domain. [Get it from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PP1#v=onepage&q&f=false).\n", + "\n", + "2. Milne-Thompson, L. M. _Theoretical Aerodynamics_, Dover 2012 reprint of the revised 1966 edition. [Read on Google Books](http://books.google.com/books?id=EMfCAgAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see section 18.5)\n", + "\n", + "3. Sinha, N. K. and Ananthkrishnan, N. _Elementary Flight Dynamics with an introduction to Bifurcation and Continuation Methods_, CRC Press, 2013. [Read on Google Books](http://books.google.com/books?id=yXL6AQAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see chapter 5)\n", + "\n", + "4. von Kármán, T. _Aerodynamics_, Dover 2004 reprint of the 1957 2nd edition. (see pages 149–151)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Execute this cell to load the notebook's style sheet, then ignore it\n", + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/01_02_Phugoid_Oscillation.ipynb b/01_phugoid/01_02_Phugoid_Oscillation.ipynb new file mode 100644 index 0000000..eb6283b --- /dev/null +++ b/01_phugoid/01_02_Phugoid_Oscillation.ipynb @@ -0,0 +1,949 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth. Partly based on David Ketcheson's pendulum lesson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Oscillation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome back! This is the second IPython Notebook of the series _\"The phugoid model of glider flight\"_, the first learning module of the course [**\"Practical Numerical Methods with Python.\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about)\n", + "\n", + "In the first notebook, _\"Phugoid Motion\"_, we described the physics of an aircraft's oscillatory trajectory, seen as an exchange of kinetic and potential energy. This analysis goes back to Frederick Lanchester, who published his book _\"Aerodonetics\"_ on aircraft stability in 1909. We concluded that first exposure to our problem of interest by plotting the flight paths predicted by Lanchester's analysis, known as _phugoids_.\n", + "\n", + "Here, we will look at the situation when an aircraft is initially moving on the straight-line phugoid (obtained with the parameters $C=2/3$, $\\cos\\theta=1$, and $z=z_t$ in the previous analysis), and experiences a small upset, a wind gust that slightly perturbs its path. It will then enter into a gentle oscillation around the previous straight-line path: a _phugoid oscillation_.\n", + "\n", + "If the aircraft experiences an upward acceleration of $-d^2z/dt^2$, and we assume that the perturbation is small, then $\\cos\\theta=1$ is a good approximation and Newton's second law in the vertical direction is:\n", + "\n", + "$$\\begin{equation}\n", + "L - W = - \\frac{W}{g}\\frac{d^2 z}{dt^2}\n", + "\\end{equation}$$\n", + "\n", + "In the previous notebook, we saw that the following relation holds for the ratio of lift to weight, in terms of the trim velocity $v_t$:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}=\\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "This will be useful: we can divide Equation (1) by the weight and use Equation (2) to replace $L/W$. Another useful relation from the previous notebook expressed the conservation of energy (per unit mass) as $v^2 = 2 gz$. With this, Equation (1) is rearranged as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d^2z}{dt^2} + \\frac{gz}{z_t} = g\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look at Equation (3) for a moment. Does it ring a bell? Do you recognize it?\n", + "\n", + "If you remember from your physics courses the equation for _simple harmonic motion_, you should see the similarity! \n", + "\n", + "Take the case of a simple spring. Hooke's law is $F=-kx$, where $F$ is a restoring force, $x$ the displacement from a position of equilibrium and $k$ the spring constant. This results in the following ordinary differential equation for the displacement:\n", + "\n", + "$$\\begin{equation}\n", + " \\frac{d^2 x}{dt^2}= -\\frac{k}{m}x\n", + "\\end{equation}$$\n", + "\n", + "which has the solution $x(t) = A \\cos(\\omega t- \\phi)$, representing simple harmonic motion with an angular frequency $\\omega=\\sqrt{k/m}=2\\pi f$ and phase angle $\\phi$.\n", + "\n", + "Now look back at Equation (3): it has nearly the same form and it represents simple harmonic motion with angular frequency $\\omega=\\sqrt{g/z_t}$ around mean height $z_t$. \n", + "\n", + "Think about this for a moment ... we can immediately say what the period of the oscillation is: exactly $2 \\pi \\sqrt{z_t/g}$ — or, in terms of the trim velocity, $\\pi \\sqrt{2} v_t/g$.\n", + "\n", + "_This is a remarkable result!_ Think about it: we know nothing about the aircraft, or the flight altitude, yet we can obtain the period of the phugoid oscillation simply as a function of the trim velocity. For example, if trim velocity is 200 knots, we get a phugoid period of about 47 seconds—over that time, you really would not notice anything if you were flying in that aircraft.\n", + "\n", + "Next, we want to be able to compute the trajectory of the aircraft for a given initial perturbance. We will do this by numerically integrating the equation of motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare to integrate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to integrate the differential equation and plot the trajectory of the aircraft. Are you ready?\n", + "\n", + "The equation for the phugoid oscillation is a second-order, ordinary differential equation (ODE). Let's represent the time derivative with a prime, and write it like this:\n", + "\n", + "$$\\begin{equation}\n", + "z(t)'' + \\frac{g \\,z(t)}{z_t}=g\n", + "\\end{equation}$$\n", + "\n", + "There's a convenient trick when we work with ODEs: we can turn this 2nd-order equation into a system of two 1st-order equations. Like this:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z'(t) &=& b(t)\\\\\n", + "b'(t) &=& g\\left(1-\\frac{z(t)}{z_t}\\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Are you following? Make sure you are following the derivations, even if it means writing the equations down in your own notes! (Yes, the old-fashioned paper way.)\n", + "\n", + "Another way to look at a system of two 1st-order ODEs is by using vectors. You can make a vector with your two independent variables, \n", + "\n", + "$$\\begin{equation}\n", + "\\vec{u} = \\begin{pmatrix} z \\\\ b \\end{pmatrix}\n", + "\\end{equation}$$\n", + "\n", + "and write the differential system as a single vector equation:\n", + "\n", + "\\begin{equation}\n", + "\\vec{u}'(t) = \\begin{pmatrix} b\\\\ g-g\\frac{z(t)}{z_t} \\end{pmatrix}\n", + "\\end{equation}\n", + "\n", + "If you call the right-hand-side $\\vec{f}(\\vec{u})$, then the equation is very short: $\\vec{u}'(t) = \\vec{f}(\\vec{u})$—but let's drop those arrows to denote vectors from now on, as they are a bit cumbersome: just remember that $u$ and $f$ are vectors in the phugoid equation of motion.\n", + "\n", + "Next, we'll prepare to solve this problem numerically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initial value problems" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's step back for a moment. Suppose we have a first-order ODE $u'=f(u)$. You know that if we were to integrate this, there would be an arbitrary constant of integration. To find its value, we do need to know one point on the curve $(t, u)$. When the derivative in the ODE is with respect to time, we call that point the _initial value_ and write something like this:\n", + "\n", + "$$u(t=0)=u_0$$\n", + "\n", + "In the case of a second-order ODE, we already saw how to write it as a system of first-order ODEs, and we would need an initial value for each equation: two conditions are needed to determine our constants of integration. The same applies for higher-order ODEs: if it is of order $n$, we can write it as $n$ first-order equations, and we need $n$ known values. If we have that data, we call the problem an _initial value problem_.\n", + "\n", + "Remember the definition of a derivative? The derivative represents the slope of the tangent at a point of the curve $u=u(t)$, and the definition of the derivative $u'$ for a function is:\n", + "\n", + "$$u'(t) = \\lim_{\\Delta t\\rightarrow 0} \\frac{u(t+\\Delta t)-u(t)}{\\Delta t}$$\n", + "\n", + "If the step $\\Delta t$ is already very small, we can _approximate_ the derivative by dropping the limit. We can write:\n", + "\n", + "$$\\begin{equation}\n", + "u(t+\\Delta t) \\approx u(t) + u'(t) \\Delta t\n", + "\\end{equation}$$\n", + "\n", + "With this equation, and because we know $u'(t)=f(u)$, if we have an initial value, we can step by $\\Delta t$ and find the value of $u(t+\\Delta t)$, then we can take this value, and find $u(t+2\\Delta t)$, and so on: we say that we _step in time_, numerically finding the solution $u(t)$ for a range of values: $t_1, t_2, t_3 \\cdots$, each separated by $\\Delta t$. The numerical solution of the ODE is simply the table of values $t_i, u_i$ that results from this process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to execute the process described above and find the numerical solution of the ODE, we start by choosing the values $t_1,t_2,t_3 \\cdots t_n$—we call these values our *grid* in time. The first point of the grid is given by our _initial value_, and the small difference between two consecutive times is called the _time step_, denoted by $\\Delta t$. The solution value at time $t_n$ is denoted by $u_n$.\n", + "\n", + "Let's build a time grid for our problem. We first choose a final time $T$ and the time step $\\Delta t$. In code, we'll use readily identifiable variable names: `T` and `dt`, respectively. With those values set, we can calculate the number of time steps that will be needed to reach the final time; we call that variable `N`. \n", + "\n", + "Let's write some code. The first thing we do in Python is load our favorite libraries: NumPy for array operations, and the Pyplot module in Matplotlib, to later on be able to plot the numerical solution. The line `%matplotlib inline` tells IPython Notebook to show the plots inline." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy \n", + "from matplotlib import pyplot\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, initialize `T` and `dt`, calculate `N` and build a NumPy array with all the values of time that make up the grid." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100.0\n", + "dt = 0.02\n", + "N = int(T/dt)+1\n", + "t = numpy.linspace(0.0, T, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have our grid! Now it's time to apply the numerical time stepping represented by Equation (10)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Write the code above using the NumPy function `arange()` instead of `linspace()`. If you need to, read the documentation for these functions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Enter a question mark followed by any function, e.g., `?numpy.linspace`, into a code cell and execute it, to get a help pane on the notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The approximate solution at time $t_n$ is $u_n$, and the numerical solution of the differential equation consists of computing a sequence of approximate solutions by the following formula, based on Equation (10):\n", + "\n", + "$$u_{n+1} = u_n + \\Delta t \\,f(u_n).$$\n", + "\n", + "This formula is called **Euler's method**.\n", + "\n", + "For the equations of the phugoid oscillation, Euler's method gives the following algorithm that we need to implement in code:\n", + "\n", + "\\begin{align}\n", + "z_{n+1} & = z_n + \\Delta t \\, b_n \\\\\n", + "b_{n+1} & = b_n + \\Delta t \\left(g - \\frac{g}{z_t} \\, z_n \\right).\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To apply the numerical solution method, we need to set things up in code: define the parameter values needed in the model, initialize a NumPy array to hold the discrete solution values, and initialize another array for the elevation values." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# initial conditions\n", + "z0 = 100. #altitude\n", + "b0 = 10. #upward velocity resulting from gust\n", + "zt = 100.\n", + "g = 9.81\n", + "\n", + "u = numpy.array([z0, b0])\n", + "\n", + "# initialize an array to hold the changing elevation values\n", + "z = numpy.zeros(N)\n", + "z[0] = z0 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should pay attention to a couple of things: (1) See how there is a dot after the numbers used to define our parameters? We just want to be explicit (as a good habit) that these variables are real numbers, called \"floats.\" (2) We both _created_ and _initialized_ with zeros everywhere the solution vector `z`. Look up the documentation for the handy NumPy function `zeros()`, if you need to. (3) In the last line above, we assign the _initial value_ to the first element of the solution vector: `z[0]`.\n", + "\n", + "Now we can step in time using Euler's method. Notice how we are time stepping the two independent variables at once in the time iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-loop using Euler's method\n", + "for n in range(1,N):\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make sure you understand what this code is doing. This is a basic pattern in numerical methods: iterations in a time variable that apply a numerical scheme at each step." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the code is correct, we have stored in the array `z` the position of the glider at each time. Let's use Matplotlib to examine the flight path of the aircraft.\n", + "\n", + "You should explore the [Matplotlib tutorial](http://matplotlib.org/users/pyplot_tutorial.html) (if you need to) and familiarize yourself with the command-style functions that control the size, labels, line style, and so on. Creating good plots is a useful skill: it is about communicating your results effectively. \n", + "\n", + "Here, we set the figure size, the limits of the vertical axis, the format of tick-marks, and axis labels. The final line actually produces the plot, with our chosen line style (continuous black line)." + ] + }, + { + "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": [ + "pyplot.figure(figsize=(10,4)) #set plot size\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z, 'k-');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Explore and think" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try changing the value of `v` in the initial conditions. \n", + "\n", + "* What happens when you have a larger gust? \n", + "* What about a smaller gust? \n", + "* What happens if there isn't a gust (`v = 0`)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The equation for phugoid oscillations is a 2nd-order, linear ODE and it has an exact solution of the following form:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "z(t) = A \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + B \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $A$ and $B$ are constants that we solve for using initial conditions. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our numerical solution used the initial conditions:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z(0) = z_0 \\\\\n", + "b(0) = b_0\n", + "\\end{eqnarray}$$\n", + "\n", + "Applying these to the exact solution and solving for $A$ and $B$, we get:\n", + "\n", + "$$\\begin{equation}\n", + "z(t) = b_0 \\sqrt{\\frac{z_t}{g}} \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + (z_0-z_t) \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We already defined all of these variables for our numerical solution, so we can immediately compute the exact solution. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The expression is a bit long —if you don't feel like scrolling left and right, you can insert a line break in the code using a backslash '\\' _(without any trailing spaces)_ and Python will treat the next line as a continuation of the first." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot our exact solution! Even better, we can plot _both_ the numerical solution *and* the exact solution to see how well Euler's method approximated the phugoid oscillations.\n", + "\n", + "To add another curve to a plot, simply type a second `pyplot.plot()` statement. We also added a legend using the format\n", + "\n", + "```Python\n", + "pyplot.legend([\"line 1\",\"line 2\"])\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nXZ3JngAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10,4))\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z)\n", + "pyplot.plot(t, z_exact)\n", + "pyplot.legend(['Numerical Solution','Analytical Solution']);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks like pretty good agreement, but what's happening towards the end? We'll come back to this. For now, re-run the previous steps with a different timestep, say $dt=0.01$ and pay attention to the difference.\n", + "\n", + "Euler's method, like all numerical methods, introduces some errors. If the method is *convergent*, the approximation will get closer and closer to the exact solution as we reduce the size of the step, $\\Delta t$. The error in the numerical method should tend to zero, in fact, when $\\Delta t\\rightarrow 0$—when this happens, we call the method _consistent_. We'll define these terms more carefully in the theory components of this course. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compare the two solutions, we need to use a **norm** of the difference, like the $L_1$ norm, for example.\n", + "\n", + "$$ E = \\Delta t \\sum_{n=0}^N \\left|z(t_n) - z_n\\right|$$\n", + "\n", + "The $L_1$ norm is the sum of the individual differences between the exact and the numerical solutions, at each mesh point. In other words, $E$ is the discrete representation of the integral over the interval $T$ of the (absolute) difference between the computed $z$ and $z_{\\rm exact}$:\n", + "\n", + "$$ E = \\int \\vert z-z_\\rm{exact}\\vert dt $$\n", + "\n", + "We check for convergence by calculating the numerical solution using progressively smaller values of `dt`. We already have most of the code that we need. We just need to add an extra loop and an array of different $\\Delta t$ values to iterate through. \n", + "\n", + "You should read the documentation for the function [enumerate](https://docs.python.org/2/library/functions.html#enumerate) and make sure you understand how we're using it below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Warning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The cell below can take a little while to finish (the last $\\Delta t$ value alone requires 1 million iterations!). If the cell is still running, the input label will say `In [*]`. When it finishes, the `*` will be replaced by a number." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-increment array\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001, 0.0001])\n", + "\n", + "# array that will contain solution of each grid\n", + "z_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " N = int(T/dt)+1 # number of time-steps\n", + " ### discretize the time using numpy.linspace() ###\n", + " t = numpy.linspace(0.0, T, N)\n", + "\n", + " # initial conditions\n", + " u = numpy.array([z0, b0])\n", + " z = numpy.empty_like(t)\n", + " z[0] = z0\n", + " \n", + " # time loop - Euler method\n", + " for n in range(1,N):\n", + " ### compute next solution using Euler method ###\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0] # store the elevation at time-step n+1\n", + " \n", + " z_values[i] = z.copy() # store the total elevation calculation grid i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculate the error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical solutions for each $\\Delta t$ in the array `z_values`. To calculate the error corresponding to each $\\Delta t$, we can write a function! " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_error(z, dt):\n", + " \"\"\"Returns the error relative to analytical solution using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " z : array of float\n", + " numerical solution.\n", + " dt : float\n", + " time increment.\n", + " \n", + " Returns\n", + " -------\n", + " err : float\n", + " L_{1} norm of the error with respect to the exact solution.\n", + " \"\"\"\n", + " N = len(z)\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt\n", + " \n", + " return dt * numpy.sum(numpy.abs(z-z_exact))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: in the last line of the function, we perform an 'array operation': \n", + "\n", + "`z - z_exact`\n", + "\n", + "We are *not* subtracting one value from another. Instead, we are taking the difference between elements at each corresponding index in both arrays. Here is a quick example:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 2, 1])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = numpy.array([1, 2, 3])\n", + "b = numpy.array([4, 4, 4])\n", + "\n", + "b - a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we iterate through each $\\Delta t$ value and calculate the corresponding error. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "error_values = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " ### call the function get_error() ###\n", + " error_values[i] = get_error(z_values[i], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remember, *if* the method is convergent then the error should get smaller as $\\Delta t$ gets smaller. To visualize this, let's plot $\\Delta t$ vs. error. If you use `pyplot.plot` you won't get a very useful result. Instead, use `pyplot.loglog` to create the same plot with a log-log scale. This is what we do almost always to assess the errors of a numerical scheme graphically." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nWtIESavUofkys59KukjSFElDJT0gaaGZbStJ7n6pu+/s7ru4e3Pbl4Yssi9f7eb72p626+75rp7r\nuL6z7aL42rq3P7OQ14XOM591Scqy0Nf2Ns9C1pdLnqX4Xe9sHXnm91xf1hVbnP/uZN/s3XaF5tmV\nSJo4d1/o7pPd/XZJ6zvZ5AxJ17n7Ne7+vLuPl/S6pJO7ek8zu1vSrZJGm9krZrZnX+uMw//ZpWri\nVqxY0W0dIcT5L6KunuvNX0RxzrLQ18bhL/a05BmXJo48wzVxpciyqzpCv47f9XCvLWUTF/klRsxs\npaRT3X1mbrm/pI8lHZlr8lq3u1jSTu6e6ePP45ArAABIjK4uMdKv1IXkYUtJG0t6s8P6tyRt3dc3\n7yoIAACAJOHsVAAAgASKYxP3jqR1kgZ3WD9YLXNxAAAAZS92TZy7r5H0uKQDOjy1v1rOUgUAACh7\nkczEmdlASTvkFjeS9BUzGyrpXXd/RdL/SLrezB5RS+N2klrm4S6Pol4AAIC4ieTsVDPLSGrKLbr+\ndX236e7+s9w2J0s6U9IQSX+SdLq731fiUgEAAGIp8kuMIBnMbIWkD9RyXb/33H2/aCtKPjPbRNKz\nkm51919GXU9SmdkgSYvVcmShv6TL3P3iaKtKptwF1a+X9AVJn0j6jbvfFm1VyWZmsyUNl9To7kdE\nXU8SmdlBki5Uy5G789z9mohLig2aOOTFzF6S9C13/39R15IWZvZbSZWSXnb3M6OuJ6nMbCNJ/d29\nOdcYPyNpD3d/O+LSEsfMtpa0lbs/bWaD1TKfvIO7r4q4tMQys+GSNpV0HE1c4cysn1p+pzOSVkp6\nQtL33P29KOuKi9id2IBY4xp7gZjZDpK+LmmhyLVP3H19m9vvfVbSaknN3bwEXXD3N9z96dyf31TL\n1QK2iLaqZHP3pZI+irqOBNtD0jPu/rq7fyRpgTY88bFs0cQhXy7pXjN7xMyOirqYFLhA0llRF5EW\nZraZmT0l6WVJU919ZdQ1JZ2Z7SppI3d/LepaUNa2kdR2H3xV0hcjqiV24njHBsTTD9z99dzhlrvN\n7E/u/qeoi0oiMztE0gvu/lcz2zvqetLA3T+Q9F0z20rSEjNrcPe/Rl1XUpnZFpJmSBoXdS0oe8x8\ndYNv4lLIzIaZ2Vwze9XM1pvZcZ1sc4qZvWRmq8zssbbNRO65ZWb2hJlVSJK7v5773zfU8nX2LqX6\nPFErQp57SjoyN2d4gaQTzGxy6T5RtIqxf7Zy97ckZSUNLfoHiYFiZGlmAyTNlnSuuz9Uuk8TvSLu\nm2XbiPQ1U0n/UPtv3r6k9t/MlTWauHQaKOlpSRMkrVKHv0DM7KeSLpI0RS3/sXtA0sLcmWly90vd\nfWd336V1WNzMNs299nOSfijpzyX7NNELmqe7n+3uX3b3r0r6v5KucvcpJfw8UQu9f27VZv/cTNI+\nufcvB6GzNEnTJTW5+42l+xixETTPti8tRfEx1adMJT0qaScz2yb3358DJd1Votrjz915pPihlrN5\nju2w7mFJV3RY94Kk33XxHl+V9GTu8SdJ1VF/riTn2WG74ySdH/XnSnKeknaXtCy3fy7r+H7l8giU\n5d5que3hE7ksl6nlrPTIP18S88w9f7ektyR9LOkVSXtG/dmSlqmkgyU9L+lFSeOi/hxxejATV2bM\nrL9aDoWe3+GpBkl7dfYad39JZXJ4qlC9ybMtd59RjLqSqpf756OSdi5yaYnTyyzvk7RxkUtLpN7+\nrrv7iGLWlWT5Zuru8yTNK2FpicHh1PKzpVr+kn6zw/q31HJrMxSGPMMiz3DIMizyDI9M+4gmDgAA\nIIFo4srPO2qZeRncYf1gSa+XvpzEI8+wyDMcsgyLPMMj0z6iiSsz7r5GLbfS6XjF6/3VclYQCkCe\nYZFnOGQZFnmGR6Z9x4kNKWRmAyXtkFvcSNJXzGyopHfd/RVJ/yPpejN7RC2/KCepZf7g8ijqjTvy\nDIs8wyHLsMgzPDItsqhPj+UR/qGWGwWvzz3WtfnztW22OVnSS2q5x+SjkvaOuu64PsiTPOP6IEvy\njPuDTIv7sFyAAAAASBBm4gAAABKIJg4AACCBaOIAAAASiCYOAAAggWjiAAAAEogmDgAAIIFo4gAA\nABKIJg4AACCBaOIAAAASiCYOAApkZgPM7AUz+0HUtQAoXzRxAFC4EyVtLmlKdxuZ2cZm9pyZbVOa\nsgCUE5o4ACiAmW0i6euSzpY03MxGdLP5rpK2cPd/lKQ4AGWFJg4ACnOKpEskXStpuaTfdLPtvpKa\nSlEUgPJDEwcAeTKz/yPpi+7+rLuvk1QnaU8zO6jDdj82s/+VdLqkz5nZ/5rZ1yMoGUCKmbtHXQMA\nJIKZ/UrSLe7+t9yySfqTpDXuvkuHbftLek/SLu7+QsmLBZB6fBMHAHkwsy0kbd7awEmSt/wr+BxJ\nQ81sTIeX/EDShzRwAIqFJg4A8lMt6Q8dV7r7HZKekFSX+2au1f6SsqUpDUA5ookDgB6Y2WBJ/d39\ntS42+S9J35R0VJt1I5Rr4sxsbzMbUNQiAZQdZuIAoAe5kxQelPRWN5tNl7RG0o7uvs7MPpa0l6Tn\nJE109/OKXiiAskITBwDdMLOtJb0kKZ9v0lzSz9x9hpldKGmtpLclXeHuHxexTABliCYOAAAggZiJ\nAwAASCCaOAAAgASiiQMAAEggmjgAAIAEookDAABIIJo4AACABKKJAwAASCCaOAAAgAT6/wsNBajn\noDeVAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10, 6))\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase tick font size\n", + "pyplot.grid(True) #turn on grid lines\n", + "pyplot.xlabel('$\\Delta t$', fontsize=16) #x label\n", + "pyplot.ylabel('Error', fontsize=16) #y label\n", + "pyplot.loglog(dt_values, error_values, 'ko-') #log-log plot\n", + "pyplot.axis('equal') #make axes scale equally;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the kind of result we like to see! As $\\Delta t$ shrinks (towards the left), the error gets smaller and smaller, like it should." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We calculated the error for several different timestep sizes using two nested `for` loops. That worked, but whenever possible, we like to re-use code (and not just copy and paste it!). \n", + "\n", + "Create a function that implements Euler's method and re-write the error analysis cell to use your function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/01_03_PhugoidFullModel.ipynb b/01_phugoid/01_03_PhugoidFullModel.ipynb new file mode 100644 index 0000000..87184de --- /dev/null +++ b/01_phugoid/01_03_PhugoidFullModel.ipynb @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, I. Hawke. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Full phugoid model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the third IPython Notebook of the series on the _phugoid model of glider flight_, our first learning module of the course [\"Practical Numerical Methods with Python\"](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about). In the first notebook, we described the physics of the trajectories known as phugoids obtained from an exchange of potential and kinetic energy in an idealized motion with no drag. We gave you a neat little code to play with and plot various phugoid curves.\n", + "\n", + "In the second notebook, we looked at the equation representing small perturbations on the straight-line phugoid, resulting in simple harmonic motion. This is a second-order ordinary differential equation, and we solved it numerically using **Euler's method**: the simplest numerical method of all. We learned about convergence and calculated the error of the numerical solution, comparing with an analytical solution. That is a good foundation!\n", + "\n", + "Now, let's go back to the dynamical model, and take away the idealization of no-drag. Let's remind ourselves of the forces affecting an aircraft, considering now that it may be accelerating, with an instantaneous upward trajectory. We use the designation $\\theta$ for the angle, and consider it positive upwards." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces-lesson3.png)\n", + "#### Figure 1. Forces with a positive trajectory angle." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Figure 1, $L$ is the lift, $W$ is the weight, $D$ is the drag, and $\\theta$ the positive angle of the trajectory, instantaneously. \n", + "\n", + "In lesson 1, we wrote the force balance in the directions perpendicular and parallel to the trajectory for a glider in _equilibrium_. What if the forces are _not_ in balance? Well, there will be acceleration terms in the equations of motion, and we would have in that case:\n", + "\n", + "\\begin{align}\n", + "m \\frac{dv}{dt} & = - W \\sin\\theta - D \\\\\n", + "m v \\, \\frac{d\\theta}{dt} & = - W \\cos\\theta + L\n", + "\\end{align}\n", + "\n", + "We can use a few little tricks to make these equations more pleasing. First, use primes to denote the time derivatives and divide through by the weight:\n", + "\n", + "\\begin{align}\n", + " \\frac{v'}{g} & = - \\sin\\theta - D/W \\\\\n", + "\\frac{v}{g} \\, \\theta' & = - \\cos\\theta + L/W\n", + "\\end{align}\n", + "\n", + "\n", + "Recall, from our first lesson, that the ratio of lift to weight is known from the trim conditions—$L/W=v^2/v_t^2$— and also from the definitions of lift and drag, \n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "we see that $L/D=C_L/C_D$. The system of equations can be re-written:\n", + "\n", + "\\begin{align}\n", + " v' & = - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\\n", + " \\theta' & = - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v\n", + "\\end{align}\n", + "\n", + "It is very interesting that the first equation has the factor $C_D/C_L$, which is the inverse of a measure of the aerodynamic efficiency of the aircraft. It turns out, this is the term that contributes damping to the phugoid model: if drag is zero, there is no damping. Drag is never zero in real life, but as engineers design more aerodynam-ically efficient aircraft, they make the phugoid mode more weakly damped. At altitude, this is nothing but a slight bother, but vertical oscillations are unsafe during final approach to land, so this is something to watch out for!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The initial value problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to visualize the flight trajectories predicted by this model, we are going to need to integrate the spatial coordinates, which depend on both the forward velocity (tangential to the trajectory) and the trajectory angle. The position of the glider on a vertical plane will be designated by coordinates $(x, y)$ with respect to an inertial frame of reference, and are obtained from:\n", + "\n", + "\\begin{align}\n", + "x'(t) & = v \\cos(\\theta) \\\\\n", + "y'(t) & = v \\sin(\\theta).\n", + "\\end{align}\n", + "\n", + "Augmenting our original two differential equations by the two equations above, we have a system of four first-order differential equations to solve. We will use a time-stepping approach, like in the previous lesson. To do so, we do need *initial values* for every unknown:\n", + "\n", + "$$\n", + "v(0) = v_0 \\quad \\text{and} \\quad \\theta(0) = \\theta_0\\\\\n", + "x(0) = x_0 \\quad \\text{and} \\quad y(0) = y_0\n", + "$$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solve with Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We know how to apply Euler's method from the previous lesson. We replace each of the time derivatives by an approximation of the form:\n", + "\n", + "$$v'(t) \\approx \\frac{v^{n+1} - v^n}{\\Delta t},$$\n", + "\n", + "where we are now using a superscript $n$ to indicate the $n$-th value in the time iterations. The first differential equation, for example, gives:\n", + "\n", + "$$\\frac{v^{n+1} - v^n}{\\Delta t} = - g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2$$\n", + "\n", + "Alright, we know where this is going. At each time iteration $t^n$, we want to evaluate all the known data of our system to obtain the state at $t^{n+1}$—the next time step. We say that we are _stepping in time_ or _time marching_.\n", + "\n", + "The full system of equations discretized with Euler's method is:\n", + "\n", + "\\begin{align}\n", + "v^{n+1} & = v^n + \\Delta t \\left(- g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2 \\right) \\\\\n", + "\\theta^{n+1} & = \\theta^n + \\Delta t \\left(- \\frac{g}{v^n}\\,\\cos\\theta^n + \\frac{g}{v_t^2}\\, v^n \\right) \\\\\n", + "x^{n+1} & = x^n + \\Delta t \\, v^n \\cos\\theta^n \\\\\n", + "y^{n+1} & = y^n + \\Delta t \\, v^n \\sin\\theta^n.\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we've learned before, the system of differential equations can also be written as a vector equation:\n", + "\n", + "$$u'(t) = f(u)$$\n", + "\n", + "where\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix}.\n", + "\\end{align}\n", + "\n", + "It's a bit tricky to code the solution using a NumPy array holding all your independent variables. But if you do, a function for the Euler step can be written that takes any number of simultaneous equations. It simply steps in time using the same line of code:\n", + "\n", + "```Python\n", + "def euler_step(u, f, dt):\n", + " return u + dt * f(u)\n", + "```\n", + "\n", + "This function can take a NumPy array `u` with any number of components. All we need to do is create an appropriate function `f(u)` describing our system of differential equations. Notice how we are passing a _function_ as part of the arguments list to `euler_step()`. Neat!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we start by loading the modules and libraries that we need for this problem. We'll need a few transcendental functions, including the $\\log$ for a convergence study later on. And remember: the line `%matplotlib inline` is a magic function that tells Matplotlib to give us the plots in the notebook (the default behavior of Matplotlib is to open a pop-up window). In addition, we are importing the module `rcParams` to define notebook-wide plotting parameters: font family and size. Here we go!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log, ceil\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to set things up to start our numerical solution: the parameter \n", + "values and the _initial values_. You know what the acceleration of gravity is: 9.8 m/s$^2$, but what are good values for $C_D/C_L$, the inverse of the aerodynamic efficiency? Some possible values are given on a table in the Wikipedia entry for [lift-to-drag ratio](http://en.wikipedia.org/wiki/Lift-to-drag_ratio): a modern sailplane can have $L/D$ of 40 to 60, depending on span (and, in case you're interested, a flying squirrel has $L/D$ close to 2).\n", + "\n", + "For the _trim velocity_, the speed range for typical sailplanes is between 65 and 280 km/hr, according to Wikipedia (it must be right!). Let's convert that to meters per second: 18 to 78 m/s. We'll pick a value somewhere in the middle of this range.\n", + "\n", + "Here's a possible set of parameters for the simulation, but be sure to come back and change some of these, and see what happens!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 30.0 # trim velocity in m s^{-1} \n", + "C_D = 1/40 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = v_t # start at the trim velocity (or add a delta)\n", + "theta0 = 0 # initial angle of trajectory\n", + "x0 = 0 # horizotal position is arbitrary\n", + "y0 = 1000 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll define a function `f()` to match the right-hand side of Equation (15), the full differential system in vector form. This function assumes that we have available the parameters defined above. If you re-execute the cell above with different parameter values, you can just run the solution without re-executing the function definition." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the code defining function `f(u)` with the differential equations, and convince yourself that it's right!\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix} \\nonumber\n", + "\\end{align}\n", + "\n", + "Now, Euler's method is implemented in a simple function `euler_step()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equations.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After defining a final time for the solution, and the time step $\\Delta t$, we can construct the grid in time using the NumPy function [`linspace()`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html). Make sure you study the decisions we made here to build the time grid: why do we add 1 to the definition of `N`, for example?\n", + "\n", + "Look at the code below, and make sure you understand the following aspects of it.\n", + "\n", + "* The NumPy array `u` contains the solution at every time-step, consisting of the velocity, angle and location of the glider. \n", + "* The first element of the array `u` is set to contain the initial conditions. \n", + "* In the `for`-loop, the function `euler_step()` is called to get the solution at time-step $n+1$. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100 # final time\n", + "dt = 0.1 # time increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u = numpy.empty((N, 4))\n", + "u[0] = numpy.array([v0, theta0, x0, y0])# fill 1st element with initial values\n", + "\n", + "# time loop - Euler method\n", + "for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to plot the path of the glider, we need the location (`x`, `y`) with respect to time. That information is already contained in our NumPy array containing the solution; we just need to pluck it out. \n", + "\n", + "Make sure you understand the indices to `u`, below, and the use of the colon notation. If any of it is confusing, read the Python documentation on [Indexing](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 3.00000000e+01 -1.11022302e-17 6.00000000e+00 1.00000000e+03]\n", + "[ 1000. 1000. 1000. ..., 1000. 1000. 1000.]\n", + "[ 3.00000000e+01 -1.11022302e-17 6.00000000e+00 1.00000000e+03]\n" + ] + } + ], + "source": [ + "# get the glider's position with respect to the time\n", + "print u[2]\n", + "x = u[:,2]\n", + "y = u[:,3]\n", + "print y\n", + "u[2]=euler_step(u[1],f,dt)\n", + "print u[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to plot the path of the glider and get the distance travelled!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nfEtJjyq+OtMP69J+V0lXFvNcrPSG/neSjlf66Pa0bssvtd9K0meLeS5ROmJ0oKR/VLpQd42kiyRt\nU2qzQ9GvE0vLfpWkFUrnWQ4pnZq0WtI3pvAc7FIs733F8n4oab/S9j+qmG/b4venldb7GqUC6B+L\n7T5R0p8k/aq0/F8X835W6Z/MkNI5qV8slvN9Sdt2eV6q6+r2/D1W0m+VjiC/U9LhShd5LlQqqP4s\n6eU12328pLuUPiJ/TfG8HyZpgaSbO89Faf6/Kfr0m6I/ry8/R5L2rCz/cKUL1SYkLZJ0cPH15mK9\nt0p6cqXNnqUsVkv6pqQLJJ0j6amSDpL0kaJvZxfz/qqYd7TIbZfS8jqZvbfIZajazz7/bnYqlvsv\nRV/+VHnN7F6ad/9Shg/skvFwafpQl3XtpXTB7BpJX5b0jOK1doLSTvt5pfaHFMvcqtR+u9L01xev\nt38o1jtP0qpi+usr671fsayRLsvvfG0/hefKXbbzeZXlPKCYd3bx+/8U851ZWVZ1+jlKf/cnF9k+\nR9JVpdfH9sVzdkKx/hO19rW9sKa/MyV9qZjn68UyD5T0Qkk/Lh6/UNKWG/P9fVN9KRWsqyVdOIV5\nfzHZvEoXcndyPan0+BZKf/vr5Vhp/6xS+6c02I69Su1e1WO++aX59i49fmjp8ef0aP+uYr57JN2v\n7fz4mvpX6x3gi6+pfklaXHpD+ruNtMyuBX5lnl4Ffucf4XclzahMe6BSMdirQP1AMf2bklyZNkPS\neNH2/V3aPrm07O9X33yLImDSAr80/6JieT3bVJ6zayTtUJn+Ia1b4F8r6fM1y/pksZx3Ns2n9Pyu\nljSvS9vHFdP+LOmQyrQnSrq3mHZQTdt7JI13mXZtsdwX93iOHqF0XmvXf55KI2msUdq5mN0ji3sl\nvbcybUtJd0h6Y/H7a4t5b5G0dU1/fiHpPzfG30xluUcV6769xzxdC/zS9HIB3q3A/3Yx/Wtdpu1e\nbPdUl/8rVYpypZ3NNUo7XOsVMJP1v8Fz1XM7K/N+Rj0Kw2J65/VxRGXafsW0P0v6L0mPrkx/dun1\nsl6RrnTR6BpJX+wy7X6Sfl70bWkfz8F/Srqhz69fbqTXbJMC/+5i3mU95tm9lOsbS4/v0e3xLu0P\nLs13QoPtePxU2mnte81qSU8qPf6P3R7v0v61pfkesjEy4GvTfHGKDqaT8njDd7TWi4LTaD7PVPqI\n9N8jYnV5eqQL5N7Xo/0jJb1MNRdgFct7p9IRwHnuPd7y0oiongf9AqU38fvS2RFxe+WxBUoFdMcZ\nSgVrNx9S2r4X9bHuBSqO7kbEeqedRDp/9OtKR9JeW5n8LqUdqC9GxKU1bb/VR5863qp09PSKiPh8\nl+Wfr/QJzw7FvHUs6W2Vtn+R9Eilo/JSOv3sHqWj6sevtwD7GZIerh6vxVzZfqrSJzKhLs9TpNMv\nPthgkR+N9Uc6ubj4vqOk2uEOM/XriPhq+YGI+LlSQbyF0qc5V1bafE3p+dxJldFkilNMXlhMX+/C\n9uI95t1Kr8tXuMfwizV2krRbn19TGm9+Y3E6dbBzjcl656eXlKftUPr5/jXzTLX9ZDZ0+fd1/9Ay\nCnygfyOln79VM88lPdo/X+kf5d1Kp+N007kw7H5Kp4/U+W71gYi4NSJu6tFmY+i23tsj4nel38+M\niP+taX998X03Nx/nvjM8Y6/neKXSc/yUzgO2H6J0qouUdgDqnCxpvXOzJ+M0lvtI0bdey7+o6NvR\nrr8ZzdURcXP1wYj4XWfHKiJWKZ3+5Jr+vkLSpRHx46lvRTY6f2N/VpfXWqFX/lXrnQsdEXconUoh\nlYbSnSbGah6/qW56pIspOzvle1YmH1t8/2NEXFGz7M570rZKp3lMWUQ8PyJm9Pm1Y5N1AZs7xsHH\ndFIudHoeSbB9s9LRorKIiI15I51HFd9XRf0FWL/v0f6xxfdtJN1VXBNXFVo7pFuvO+GuVwRuIpOu\ntyh4X6p0Lu/+Srl0e+/ZXumUlUk5Xfz6MKXnZp7tk+pmLebZ3vYDIo2lXz5q+avuzaSI+KUaXJhd\n8gilTKPX8pVO9ZFSofQIpVMfqqaa6/uVjrwO2T6o86lEsTNzpKbvCBidv7HfVj8hK+n1N1Z1S83j\ndynlsE2DZbUtVL89fym+TzZ968rjnfeknWzXjYw01fekaS0i/mz7XqWDK71eF+Vp5U8z76iZZ6rt\nJ7Ohy7+v+4eWUeBjOikfUdpH6fz0Ok9UOgVDSkdiX66Nf3Oizk7GXT3m6TV8YOeI1I1KF2RONnRe\n7WgQ1dN7NqG6okvSX8eR/qbSzaquUvrY/+da+49iL6Uj2VKzoQPLR/M+pCkMmVpaZ7ltr+z6NdXl\nl3cK645O9nx+OyLi+7Z/orTz8gqt/UToX5R2mj4zleVkaEP/xqqm9HxOI2s2cHpV53V4rdK5+pP9\nTd7QcPnTzfVKp7f1Oj2oPO3/Sj/fpPTp7NZ9tp9K37otY6rLb9r+L2q2M42WUeBjOvmG0j/zLZU+\nGv5U3YxRGvPY9n11mkqnYJzZY571hoAs6Qybt01x3uwgWqxU3N+qdCHXqvJE93+n39tKP98dET/r\ns+22fa5/qsvv9dooT7utdq6pe7/Szs7zbZ+qdIRunqSPxEa8Q+wmtqF/Y2im8zrc6r54T7L9n0qj\nxvTjzoj4m43Znym4Qmn0rL17zFOe9teDUBGxxvbPlEZ8mmr7ulMZ1xMRv7N9i9JgA1NZ/h0R8evK\nuqIyT6/2V3W5zgsZ4xx8TBsR8UdJH1U6qnScu4yfvol1isqdXRovvaLXOb2d8bV3tL1b3Uy2D7T9\nEncZN30a+HulfyLfrxb3GyIi7tTa01/27TWv7eNtH1t66Celnx/Wo939ijHMm96U6GqtPeJcu/zS\ntImizYb6pFKBto3SDWyeqzQEapOLUHPT+Rvby/aMmnmm23nzOev8bezV4z1Ntg8p3pMe2HD50+Yi\n20LnTsz72q7byTyw+H5DRFQ/Vf6y0v+rx/VYR6f9pRFRd0pVna9Mcfmhtdsi6a/XnnSua+nV/nFF\n+y827BtaNm0LfNuHOt2cpvYGOBhIiyX9TqlweWPvWe9z5TsbPrVmnl4XxnaGupN6H9X6oNKIKf0e\n7Z6qznm56xS0to+zPdznMjvvMXVF8t59LleSzi+We5jt7bvNYPtvlcZJ/+vzG+mOj98v2j69x/K/\nqfSRdLXQWe95sj27eJ4eUBwt/8IUlv90pX+cFxQj42yQ4jqQTxTrfbnSqWlfiYjrezbMW+dv7H5K\no+l00+tvbGMoZ1PO/Am2j94IyzmgeO3k8P/4/OL7ZDc2+pjSCF/VEYl6moYX2X5O6V4WM5TundDN\nMUp/x+d0mfZxpdx3t31IdWJxkOqoov1H+uhfp82Bth/UZfm7ae2F0N1ucPcRFTfBsl29HkPF+/4s\npVPbPt5H/9CiHN5QGrG9je3TlcZGfoSmeF617YOd7rZ5U3H3wittn1ZcADhZ22cVbX/ndBfFG5zu\nwvkfdUdVi7sLLnW68+JdRdtzbe/TaIOxjmJYvKOVTvn4N9uv7DV/Ufg9qtc8G9CXH2ntEZp/qx5h\ntL2L0k1G6tpfpVS8W9Jp3Y6G2Z6n9BHvmV2G99vYOudX/rUfth+sdAOlfu9ieInS9j2puOCzqvb5\nmYJ3KY2Dv62kt1cnFnm8V2ms8CWVya9R+sd7lO3Hd2n7DKV/jJ/o8ryv9zwpXeA6qrVDz71J6RSZ\nR9teb6hS2y9QuuD4NtUPIdqP9xffZyvdpbLntQm2H+O1d0Xt9WlDKyLiW0rv9Zb0hup023sqXcB9\nXypf+1LO/HRJb5nqQiLiHq09Baa8nNdJ+nBEND1ffqOLiMu1didxcbdhMG3/P6XTVt41jU/9mpKI\nuE3pQJIlvdH2Ohej2n6h0o2ufqv132MUEdcovQdZ0tu67MQtVHot/FhdCnCnu4BfXdQPT+6y/O8o\n7YRsIenfu2zCvyvtnPx3RHQb0etcpfsC7KDKsKjFJ5dvV6qx3l8+7RXTRL8D6LfxpfSR9kqlj+YP\n1yQ3KCq1O17p3O0VSv+0Z0s6Vekf/w8kzaxpt4XSXuutkl6tVCjOUro99E+Kdf99l3Z7KN0A6DZJ\nL1a6Wc/TlS4uvFNdbpjEV+PXwkOVjrCuVnqD+n9KR/Ieq1TYnKg0PvitxTw3Snpzqf1MpQJrTul1\n9PTisZlK5/nvr8pdCovHdiwtZ1elcxlXK10jcJRSQf7CIu9PdFn+dqX291O6Gc1qpdM05irdkXKO\nUrH2Z6Wbad2vS9/nlpa9f/G11wY8pw9WOrXkz8W2HiTp08XfyQGl56Tbc7Z3zTL31No72V6rVIwd\nVDxPFypdAFpd1paVnHvdKGz/0vI/XfxtDiuN///Dou8n1vTtWKXTY27V2jvZPlnpTrOdj6+36dJu\nQdGnHysdVT5K6eK1yyrzPbVY9oRSIfj44ustxfO8SpX3guL19Ogi+85dhTvZ7thtO7r07+Ki7dVT\nmLdzp+C/qMFdKiU9oOjTK7T2Tradfj68mGf74vfOjaRWK/1t7q904eFWxc8HlqYfWzx2/9K6HqR0\ngfZqSV8tMu7cNfkqpcK/251y3WP5WxfzPLJ4vjvvE/9aXX8x37eL6cuK5Z1S/L644d/Yx4t2X1T6\nOzhB6X/Cx4rpDyv68z9Fn88r+vOQ0t9ot+l7VNp33pOWlrdnKturdIrXBcX0nxV9HCqe948Ur5XP\nStpiU73fb+hXsd37l56bzs0F13nN9mj/3uL5+IHSxccHKhXEdytdaPy3PdrOUCrCVyudUvN0pfeB\ndxWP/ULSg2ravqn02j2vZp7tlN6rVhevh8OU3pc+VrT9QfX1XGm/h9bevOwMpbs1P614ja5W+hRt\n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\nouXLl68z30UXXaSRkZH12p988slatmzZOo+Nj49rZGREq1atWufxRYsWacmSJes8dv3112tkZEQr\nV657vfBZZ5213tGEiYkJjYyMrDdW7+joqObOnbte34477rhpvR2nnHLKQGxHxyBtx0Me8pCB2I5B\nyaO8HaeccspAbIc0GHlUt6Pzvjbdt6NsULZj5cqVA7Ed0zmP0dHRv9Zis2fP1gEHHKBTTz11veXk\nwg1HnsyK7TVKI9bMjojru0zfQtItSufFz+l2cyzb35H0BEmvjoj3FI89rMdqvy1pL0kvlHRp8diN\nEXFn0fZMpTHuPxkRJ3RZ3zylcfWviIgDarZrSNLY2NiYhoaGenQFAAAAbRgfH9fw8LAkDUfEeNv9\nKRvoI/jFxbGfVxoG8/DqdNs7KA2PuUbS50rtflX3JekvxWy/Kz1+Z2mxnym+P6WmW09X2in59IZs\nGwAAANDNQBf4hbdLulfSXNv3r0ybL2lrpbvc/t/GWFlEXCLpm5L2sr3OzayKTwaOlrRK0tkbY31o\nR/XjQeSDbPJFNnkjn3yRDZqadgW+7V1s7267fI77bsVju1fnL25Q9VJJu0j6iu1Dbc+2/Wqli2gv\nk9TzJCrb25XW2blYd+fisV26NHmRpOskfdj2Sbb3tj1H0peUPi04triLLqaphQsXtt0F1CCbfJFN\n3sgnX2SDpqbdOfi2r9XaC13XmSQpIqLraDm2D5L0eqXz7beXdK2k/5L0zoi4d5J1LpK0SOnUmqrr\nImK9c/aL03/eIOkYSQ9WGpXnYklvi4irJlkf5+Bn7vrrr2dUg0yRTb7IJm/kky+yyVPO5+BPuwJ/\nc0CBDwAAkLecC/xpd4oOAAAAgHoU+AAAAMAAocAH+lC9+QbyQTb5Ipu8kU++yAZNUeADfZiYmGi7\nC6hBNvkim7yRT77IBk1xkW2GuMgWAAAgb1xkCwAAAGCToMAHAAAABggFPtCHVatWtd0F1CCbfJFN\n3sgnX2SDpijwgT7Mmzev7S6gBtnki2zyRj75Ihs0RYEP9GHx4sVtdwE1yCZfZJM38skX2aApCnyg\nD4xulC+yyRfZ5I188kU2aIoCHwAAABggFPgAAADAAKHAB/qwbNmytruAGmSTL7LJG/nki2zQFAU+\n0Ifx8axuWIcSsskX2eSNfPJFNmjKEdF2H1Bhe0jS2NjYGBfWAAAAZGh8fFzDw8OSNBwRWe2FcQQf\n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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualization of the path\n", + "pyplot.figure(figsize=(8,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'x', fontsize=18)\n", + "pyplot.ylabel(r'y', fontsize=18)\n", + "pyplot.title('Glider trajectory, flight time = %.2f' % T, fontsize=18)\n", + "pyplot.plot(x,y, 'k-', lw=2);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grid convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's study the convergence of Euler's method for the phugoid model. In the previous lesson, when we studied the straight-line phugoid under a small perturbation, we looked at convergence by comparing the numerical solution with the exact solution. Unfortunately, most problems don't have an exact solution (that's why we compute in the first place!). But here's a neat thing: we can use numerical solutions computed on different grids to study the convergence of the method, even without an analytical solution.\n", + "\n", + "We need to be careful, though, and make sure that the fine-grid solution is resolving all of the features in the mathematical model. How can we know this? We'll have a look at that in a bit. Let's see how this works first.\n", + "\n", + "You need a sequence of numerical solutions of the same problem, each with a different number of time grid points.\n", + "\n", + "Let's create a NumPy array called `dt_values` that contains the time-increment of each grid to be solved on. For each element `dt_values[i]`, we will compute the solution `u_values[i]` of the glider model using Euler's method. If we want to use five different values of $\\Delta t$, we'll have five solutions: we put them in an array ... but each one is also an array! We'll have an array of arrays. How meta is that?\n", + "\n", + "We have one more trick up our sleeve: `enumerate()`. To get all the numerical solutions—each with its value of $\\Delta t$—done in one fell swoop, we will loop over the elements of the array `dt_values`. Within the loop, we need to access both `dt_values[i]` and the index `i`. It turns out, `enumerate()` is a built-in Python function that will give us consecutive `index, value` pairs just like we need. \n", + "\n", + "Read the code below carefully, and remember: you can get a help pane on any function by entering a question mark followed by the function name. For example, add a new code cell below and type: `?numpy.empty_like`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), we compared our numerical result to an analytical solution, but now we will instead compare numerical results from different grids. \n", + "\n", + "For each solution, we'll compute the difference relative to the finest grid. You will be tempted to call this an _\"error\"_, but be careful: the solution at the finest grid is _not the exact_ solution, it is just a reference value that we can use to estimate grid convergence.\n", + "\n", + "To calculate the difference between one solution `u_current` and the solution at the finest grid, `u_finest`, we'll use the $L_1$-norm, but any norm will do.\n", + "\n", + "There is a small problem with this, though. The coarsest grid, where $\\Delta t = 0.1$, has 1001 grid points, while the finest grid, with $\\Delta t = 0.001$ has 100001 grid points. How do we know which grid points correspond to the same location in two numerical solutions, in order to compare them? \n", + "\n", + "If we had time grids of 10 and 100 steps, respectively, this would be relatively simple to calculate. Each element in our 10-step grid would span ten elements in our 100-step grid. \n", + "\n", + "Calculating the _ratio_ of the two grid sizes will tell us how many elements in our fine-grid will span over one element in our coarser grid.\n", + "\n", + "Recall that we can _slice_ a NumPy array and grab a subset of values from it. The syntax for that is\n", + "\n", + "```Python\n", + "my_array[3:8]\n", + "```\n", + "\n", + "An additional slicing trick that we can take advantage of is the \"slice step size.\" We add an additional `:` to the slice range and then specify how many steps to take between elements. For example, this code\n", + "\n", + "```Python\n", + "my_array[3:8:2]\n", + "```\n", + "\n", + "will return the values of `my_array[3]`, `my_array[5]` and `my_array[7]`\n", + "\n", + "With that, we can write a function to obtain the differences between coarser and finest grids. Here we go ..." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = ceil(N_fine/N_current)\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the function has been defined, let's compute the grid differences for each solution, relative to the fine-grid solution. Call the function `get_diffgrid()` with two solutions, one of which is always the one at the finest grid. Here's a neat Python trick: you can use negative indexing in Python! If you have an array called `my_array` you access the _first_ element with\n", + "\n", + "`my_array[0]`\n", + "\n", + "But you can also access the _last_ element with \n", + "\n", + "`my_array[-1]`\n", + "\n", + "and the next to last element with\n", + "\n", + "`my_array[-2]`\n", + "\n", + "and so on. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.1\n", + "dt = 0.05\n", + "dt = 0.01\n", + "dt = 0.005\n", + "dt = 0.001\n" + ] + } + ], + "source": [ + "# compute difference between one grid solution and the finest one\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " print('dt = {}'.format(dt))\n", + "\n", + " ### call the function get_diffgrid() ###\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to create a plot of the results! We'll create a *log-log* plot with the Matplotlib function [`loglog()`](http://matplotlib.org/api/pyplot_api.html?highlight=loglog#matplotlib.pyplot.loglog). Remember to skip the difference of the finest-grid solution with itself, which is zero." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIh\nZGatzGyLmZ1Sibanm9nPkhGXSLIpSYmE0/1AE+APlWj7Z6BHYsMRCYaSlEjImNmPgM3ANKCnmZ1X\nTtss4GLgv5IUnkhSaasOkZAxs/HAEOAYIhsdvu3u/1ZG27bAB8Cx7r41eVGKJId6UiIhYmYXA/90\n9x3uvgp4DuhoZpeXaJdjZi8CfwO2AE+Y2ejkRyySWOpJiYSImU0C/t3d90RfHwusAv7H3Q8b9jOz\nmcB6dx+U3EhFkkM9KZGQMLNuwJv7ExSAu39FZHvuc8zsmhLtawA/BRYkNVCRJFJPSiQEohMgXnT3\n60s51xBYDWwHznD3oujxC4D3gObuvjmZ8Yoki3pSIuFwAzCptBPu/i2RqehtgJsOOtWRyDCgEpSk\nLSUpkYCZWW2go7u/UU6zMcAaYLiZ1Y0e60h0qM/MapvZgwkNVCQANYMOQES4DXAzu7OCdp8CXYhM\nTx8BNAdmRc/dCbyYsAhFAqKalEiAor2itUCzSr7Fga+BVkA3oDewFHjL3RcmJEiRAClJiYhIaKkm\nJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIi\nofX/ARE7ZqFnKYAXAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# log-log plot of the grid differences\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel('$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='-', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Order of convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The order of convergence is the rate at which the numerical solution approaches the exact one as the mesh is refined. Considering that we're not comparing with an exact solution, we use 3 grid resolutions that are refined at a constant ratio $r$ to find the *observed order of convergence* ($p$), which is given by:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "p = \\frac{\\log \\left(\\frac{f_3-f_2}{f_2-f_1} \\right) }{\\log(r)}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $f_1$ is the finest mesh solution, and $f_3$ the coarsest. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is p = 1.014\n" + ] + } + ], + "source": [ + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values2 = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values2 = numpy.empty_like(dt_values2, dtype=numpy.ndarray)\n", + "\n", + "diffgrid2 = numpy.empty(2)\n", + "\n", + "for i, dt in enumerate(dt_values2):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + "\n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values2[i] = u\n", + " \n", + "\n", + "#calculate f2 - f1\n", + "diffgrid2[0] = get_diffgrid(u_values2[1], u_values2[0], dt_values2[1])\n", + "\n", + "#calculate f3 - f2\n", + "diffgrid2[1] = get_diffgrid(u_values2[2], u_values2[1], dt_values2[2])\n", + "\n", + "# calculate the order of convergence\n", + "p = (log(diffgrid2[1]) - log(diffgrid2[0])) / log(r)\n", + "\n", + "print('The order of convergence is p = {:.3f}'.format(p));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See how the observed order of convergence is close to 1? This means that the rate at which the grid differences decrease match the mesh-refinement ratio. We say that Euler's method is of *first order*, and this result is a consequence of that." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Paper airplane challenge" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose you wanted to participate in a paper-airplane competition, and you want to use what you know about the phugoid model to improve your chances. For a given value of $L/D$ that you can obtain in your design, you want to know what is the best initial velocity and launch angle to fly the longest distance from a given height.\n", + "\n", + "Using the phugoid model, write a new code to analyze the flight of a paper airplane, with the following conditions:\n", + "\n", + "* Assume $L/D$ of 5.0 (a value close to measurements in Feng et al. 2009)\n", + "* For the trim velocity, let's take an average value of 4.9 m/s.\n", + "* Find a combination of launch angle and velocity that gives the best distance.\n", + "* Think about how you will know when the flight needs to stop ... this will influence how you organize the code.\n", + "* How can you check if your answer is realistic?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Feng, N. B. et al. _\"On the aerodynamics of paper airplanes\"_, AIAA paper 2009-3958, 27th AIAA Applied Aerodynamics Conference, San Antonio, TX. [PDF](http://arc.aiaa.org/doi/abs/10.2514/6.2009-3958)\n", + "\n", + "* Simanca, S. R. and Sutherland, S. _\"Mathematical problem-solving with computers,\"_ 2002 course notes, Stony Brook University, chapter 3: [The Art of Phugoid](https://www.math.sunysb.edu/~scott/Book331/Art_Phugoid.html). (Note that there is an error in the figure: sine and cosine are switched.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/01_04_Second_Order_Methods.ipynb b/01_phugoid/01_04_Second_Order_Methods.ipynb new file mode 100644 index 0000000..dfe6da7 --- /dev/null +++ b/01_phugoid/01_04_Second_Order_Methods.ipynb @@ -0,0 +1,1187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, C.D. Cooper. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid model: bonus!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_The phugoid model of glider flight_ has been such a fun problem to showcase the power of numerical solution of differential equations, we thought you'd enjoy a bonus notebook. The previous lessons were:\n", + "\n", + "* [Phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_01_Phugoid_Theory.ipynb) —Lays the groundwork for our fun problem, with some context, a little history and a description of the physics of phugoids: curves representing the trajectory of a glider exchanging potential and kinetic energy, with no drag.\n", + "* [Phugoid oscillation](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb) —Develops the simple harmonic motion of an aircraft experiencing a small perturbation from the horizontal trajectory: our opportunity to introduce Euler's method, and study its convergence via an exact solution.\n", + "* [Full phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb) —The full model takes into account the force of drag and results in a system of two nonlinear equations. We obtain the trajectories using Euler's method in vectorized form, introduce grid-convergence analysis and finish with the paper-airplane challenge!\n", + "\n", + "That is a fantastic foundation for numerical methods. It's a good time to complement it with some theory: the first screencast of the course uses Taylor series to show that _Euler's method is a first-order method_, and we also show you graphical interpretations. Many problems require a more accurate method, though: second order or higher. Among the most popular higher-order methods that we can mention are the _Runge-Kutta methods_, developed around 1900: more than 100 years after Euler published his book containing the method now named after him!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Euler's method is a first-order method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this screencast, we use a Taylor series expansion to analyze Euler's method and show that it incurs a truncation error of first order. We also use a graphical interpretation to motivate the _modified_ Euler method, which achieves second order." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('6i6qhqDCViA')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Second-order methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The notebook on phugoid oscillation (lesson 2) included a study of the accuracy obtained with Euler's method, using the exact solution for the simple harmonic motion. We made a _convergence plot_ and saw that as $\\Delta t$ gets smaller, the error also gets smaller. \n", + "\n", + "We could have drawn a line with a slope equal to 1 on that log-log plot, and you would have seen that it was parallel to the convergence line. A slope equal to 1 on a log-log convergence plot is an indication that we have a first-order method: the error scales as ${\\mathcal O}(\\Delta t)$. \n", + "\n", + "In lesson 3, using the full phugoid model (which is nonlinear and does not have an exact solution), we did a _grid-convergence study_ with three different grids, and obtained the _observed_ order of convergence—it was very close to 1, indicating a slope of 1 on a log-log plot.\n", + "\n", + "Another way to look at an ${\\mathcal O}(\\Delta t)$ method is to say that the error scales _linearly_ with the step size, or that they are proportional:\n", + "\n", + "$$ e \\propto \\Delta t.$$\n", + "\n", + "where $e$ stands for the error. To get more accuracy, we could use a _second-order_ method, in which the error is ${\\mathcal O}(\\Delta t^2)$. In general, we say that a method is of order $p$ when the error is proportional to $(\\Delta t)^p$.\n", + "\n", + "In the screencast titled \"Euler's method is a first-order method,\" we used a graphical interpretation to get an idea for improving it: by estimating an intermediate point, like the **midpoint**, we can get a better approximation of the area under the curve of $u^\\prime$. The scheme has two steps and is written as:\n", + "\n", + "\\begin{align}\n", + "u_{n+1/2} & = u_n + \\frac{\\Delta t}{2} f(u_n) \\\\\n", + "u_{n+1} & = u_n + \\Delta t \\,\\, f(u_{n+1/2}).\n", + "\\end{align}\n", + "\n", + "This method is known as the *explicit midpoint method* or the *modified Euler method*, and it is a second-order method. Notice that we had to apply the right-hand side, $~f(u)$, twice. This idea can be extended: we could imagine estimating additional points between $u_{n}$ and $u_{n+1}$ and evaulating $~f(u)$ at the intermediate points to get higher accuracy—that's the idea behind Runge-Kutta methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge-Kutta methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the modified Euler method, we improve the accuracy over Euler's method by evaluating the right-hand side of the differential equation at an intermediate point: the midpoint. The same idea can be applied again, and the function $f(u)$ can be evaluated at more intermediate points, improving the accuracy even more. This is the basis of the famous *Runge-Kutta (RK) methods*, going back to Carl Runge and Martin Kutta. The modified Euler method corresponds to _second-order_ Runge-Kutta.\n", + "\n", + "Here's a bit of historical coincidence that will blow your mind: Carl Runge's daughter Iris—an accomplished applied mathematician in her own right—worked assiduously over the summer of 1909 to translate Lanchester's _\"Aerodonetics.\"_ She also reproduced his graphical method to draw the phugoid curves (Tobies, 2012)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Phugoid model with 2nd-order RK" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's compute the motion of a glider under the full phugoid model using the second-order Runge-Kutta method. We'll build on the _paper airplane challenge_ of lesson 3 now, and look for the horizontal distance that the plane travels until the moment it touches the ground. \n", + "\n", + "As usual, let's start by importing the libraries and modules that we need, and setting up the model parameters. We also set some default plotting formats using the [`rcParams`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.rcParams) module. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the paper-airplane challenge of lesson 3, we suggested an $L/D=5.0$ as a realistic value for paper airplanes, according to experiments, and a trim velocity of 4.9 m/s. Let's start with those values, but you could experiment changing these a bit. _What do you think will happen if you make $L/D$ higher?_" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Among the initial parameters that we suggest for your first experiment, we are starting with a velocity a little higher than the trim velocity, launch the paper airplane with a negative initial angle, and take the initial height to be 2 meters—all sound like reasonable choices.\n", + "\n", + "Now, we can define a few functions to carry out the computation:\n", + "* The right-hand side of the phugoid model from [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb),\n", + "* One step of the Euler's method that we learned in [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), and\n", + "* Differences with respect to a fine grid, as in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])\n", + "\n", + "\n", + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)\n", + "\n", + "\n", + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = int(numpy.ceil(N_fine/N_current))\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we also need to define the function `rk2_step()` that computes the next time step using the *modified Euler* method of equations $(1)$ and $(2)$, above, otherwise known as 2nd-order Runge-Kutta or RK2. This function will be called over and over again within the time loop." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def rk2_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using 2nd-order Runge-Kutta.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at the next time step.\n", + " \"\"\"\n", + " u_star = u + 0.5*dt*f(u)\n", + " return u + dt*f(u_star)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we first need to set up the time discretization, then initialize arrays to save the solution and we are set to go! The only difference this time is that we are using _both_ Euler's method and 2nd-order Runge-Kutta to get a solution, to compare the two. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "\n", + "# set initial conditions\n", + "u_euler = numpy.empty((N, 4))\n", + "u_rk2 = numpy.empty((N, 4))\n", + "\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_euler[0] = numpy.array([v0, theta0, x0, y0])\n", + "u_rk2[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "\n", + "# use a for loop to call the function rk2_step()\n", + "for n in range(N-1):\n", + " \n", + " u_euler[n+1] = euler_step(u_euler[n], f, dt)\n", + " u_rk2[n+1] = rk2_step(u_rk2[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get the position of the glider in time, according to both Euler's method and the 2nd-order Runge-Kutta method, by extracting the appropriate portions of the solution arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x_euler = u_euler[:,2]\n", + "y_euler = u_euler[:,3]\n", + "x_rk2 = u_rk2[:,2]\n", + "y_rk2 = u_rk2[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### How far will it fly before touching the ground?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As the $y$-axis measures the vertical coordinate with respect to the ground, negative values of $y$ don't have any physical meaning: the glider would have hit the ground by then! To find out if there are any negative $y$ values we can use the handy function [`numpy.where`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html). This function returns the **indices** of the elements in an array that match a given condition. For example, `numpy.where(y_euler<0)[0]` gives an array of the indices `i` where `y_euler[i]<0` (the `[0]` is necessary as `numpy.where` returns an array, which in this case contains a single line). If no elements of the array match the condition, the array of indices comes out empty. \n", + "\n", + "From the physical problem, we know that once there is one negative value, the glider has hit the ground and all the remaining time-steps are unphysical. Therefore, we are interested in finding the _first_ index where the condition applies, given by `numpy.where(y_euler<0)[0][0]`—do read the documentation of the function if you need to! " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_euler = numpy.where(y_euler<0.0)[0]\n", + "if len(idx_negative_euler)==0:\n", + " idx_ground_euler = N-1\n", + " print ('Euler integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_euler = idx_negative_euler[0]\n", + " \n", + "idx_negative_rk2 = numpy.where(y_rk2<0.0)[0]\n", + "if len(idx_negative_rk2)==0:\n", + " idx_ground_rk2 = N-1\n", + " print ('Runge-Kutta integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_rk2 = idx_negative_rk2[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Do Euler and RK2 produce the same solution?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An easy way to compare the numerical results obtained with the Euler and 2nd-order Runge-Kutta methods is using [`numpy.allclose`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html). This function compares each element of two arrays and returns `True` if each comparison is within some relative tolerance. Here, we use the default tolerance: $10^{-5}$." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Are the x-values close? False\n", + "Are the y-values close? False\n" + ] + } + ], + "source": [ + "# check to see if the paths match\n", + "print('Are the x-values close? {}'.format(numpy.allclose(x_euler, x_rk2)))\n", + "print('Are the y-values close? {}'.format(numpy.allclose(y_euler, y_rk2)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hmmm, they do differ. Maybe $10^{-5}$ is too tight a tolerance, considering we're using a somewhat coarse grid with first- and second-order methods. Perhaps we can assess this visually, by plotting the glider's path? Study the code below, where we are plotting the path twice, taking a closer look in the second plot by \"zooming in\" to the beginning of the flight." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n+eWXL1nerVu3i92pp06dMq1atTKNGzc2x9PpOsjI4cOHjYiY0qVLZysHb3mznwlAdyrQBfgFKOFF\n2RbAH8BB3IdmAAAgAElEQVT6VK/tWN2pu+z3T6Szbo6+L6WC3d69e02FChXMlClT/lm4caMxVata\nP4PF6tXGtGqVbpfuuHHjzI033mhOnTqV46q8PYdpd6qfrVixgh07djB69GhmzJgR8KcbBGIOoHr1\n6rF79252797tSP0qYxcuXCA+Ph4R4ZZbbvFY5tChQzRu3JiCBQuyaNEiChYsmOV6VtkDgDt06JCj\neEOBiNwLDAXijDGH7GWtRaRXqjIlxZ57xxiz0BhT1hhzY8oLSLml7Ul72bOBziPQ3HI+cEse4Hwu\nf/31Fy1atOC+++7jgQce+OeDqlXh55+tn17yey5168KXX6bbpTtkyBCqVatG79690x2q4mvaiPOz\npC1bWNysGU888USOHswbzHLlykXr5s2Z/9lnToei0ti/fz99+vRh7969DBo0iFq1anks16NHDzZs\n2MDIkSMvn0jTC8YYXnzxRWJiYhgxYkROww5qItIZmAG8CTQXkXvtRl0boLRdpgGwD5ia0abS/FQq\nrJw5c4a2bdvSpEkThg8ffnmBXKE14ktEeO2119iwYQMzZswITKXeXK4L9RdOdUecPGmOFi9uRleu\n7Mpu1NT233CDeaJ2bUdjyPZ+HjXKGOtm8ktfo0b5tnx6n/tASndqVFSUKVWqlClVqpTJly+fERFT\nu3Zt88MPP3hcL6U7tU6dOkZETJkyZcz27duzXP/kyZNNdHS0+fbbb3OaSqa82c/4sTsVOAokYXWF\npn4lASPtMjWAI3joIgVKATuB/fY6h+33ddKpL+dfmlJBJikpydx1112mY8eOrvv9uHnzZlOsWDGz\nfv36bG/D23OY4w2sQLycOgkeu+su80FUlNmxY4cj9QfS6aefNq/nzm3+/vtvx2II5192nsbEnT59\n2owYMcKIiGnVqpXHaWBSGnErVqwwvXv3NiJirr76avPbb795XffHH39soqOjzWeffeaTXDLjdCMu\n0K9wPq6Vew0fPtw0aNDAnDlzxhprtnix0yFlz4ULxniY2uTtt982VapUMadPn87WZr09h2l3qp8k\nfvghJz//nB969qRixYqOxRGo8Q55O3TgvyIsWbTIkfrV5fLmzcuzzz5LXFwcCxYs4PXXX0+3rIgw\nffp0evXqxZ49e2jcuLFXd0l9+umndOvWjffff5+2bdv6MHrlRm45H7glD3Aml9mzZzN37lzmzZtH\ndHw8tGkD9kTjOeHIfjlwAO65xxorl0rnzp2pUaMGw4YN82v12ojzhz17ONO9OxNr1aL13Xc7HU1g\nVKqEXHklG9980+lIVBovvvgiERERPP3005w7dy7DstOnT6d3797s3r2bxo0b88cff6Rbdu7cuXTt\n2pU5c+Zw++23X1z+yy+/cPLkSZ/Fr5Ryj9WrV/Poo4/yxRdfUGzHDmjbFmbPhpYtnQ4te666Cj75\nBHr0gPXrLy4WEaZNm8a8efNYvHix/+r35nJdqL8IcHfEsvffN/2KFDGHDh0KaL1O+7NvXzMpXz7H\nxjcEej8Hk/Se2JCiS5cuRkQunQXdXDrFSGp9+/Y1ImIqVKhgdu/efdn23nnnHVOgQAGz2EMXyDXX\nXOPxCRC+4s1+RrtTlQo6e/fuNWXKlLGebhAfb0yJEsbMn+90WL7x4YfGXH21MQcOXLJ48eLF5ppr\nrjEnTpzI0ua8PYeF1q0fIWD//v10HjSI9z7+mOLFizsdTkBd2bMnRefO5Ycffkh3KgvlH9b/+Yyf\nwDB37lzGjBlD7969KVCggMf1U7zyyiuAdWWucePGrFixgjJlygBWV0jPnj1p0qQJK1euZOXKlZes\ne/z4cZ/kpJRyj/Pnz9O+fXv69etH62bNoEoVePnl0L0Cl1b79taUKB06wJIlYN/l36xZM+Li4njs\nsceYOjWjm9WzyZuWXqi/CNBfsmfPnjX169c3o0ePvrjM6efSBbr+YcOGmccff9yR+gO1n4PNDTfc\nYIoXL24iIiJMnjx5TKlSpcztt99+WbmHHnrIREREmCJFipiIiAhTqlQpkzdv3ovLYmJizPnz5y9Z\np1+/fiYiIsJcccUVJiYmxmzdutWUK1fOREREGBHx+IqIiNArcSF4/goEp8+HvuKWPIwJXC4PPPCA\nadOmzT89NWmuWPmC4/slMdGYp5++7Dmrx44dM2XKlMnS3fvensP0SpyPGGMYMGAAJUuW5IknnnA6\nHMe0atWKhx9+mOeee87pUMLGhg0bvCo3adIkJk2alKVtT5s2jWnTpl2ybOfOnVnahlIqvH3wwQcs\nWLCAtWvX/jPhfcmSzgblD5GR8OSTly0uXLgwkyZNol+/fvz0009ERUX5rEox6XS/+JOI1AQGAA2A\nRCAS+Bp4xhhzJJN1cwMjsZ5XmAicAIYaY1ZmsI7xa5779jHto494ZcYMvv/+e6644gr/1RXkLly4\nQIkSJdiyZQslA/yfVETS7U5U7uHNfrbLuGISXb+fv5Tyo+3bt1O/fn0WL17MjTfe6HQ4jjHG0LJl\nS2JjY726Y9Xbc5hTjbgtWM8c7GqMOSMipYGlWHfL1jDGnM1g3VeBWKCBMeaoiNwHTAHqG2N+Tmcd\n/50EDx3iVI0a9D17ltHr1lGhQgX/1BNC2rVrR7t27bj33nsDWq824sKDNuKUCg1nz56lXr169OrV\ni/79+zsdjuN+++036taty08//UTZsmUzLOvtOcypKUaSgWHGmDMAxph9wHjgX0C6oxxFpDLQCxhj\njDlqr/sG1mznge+/O3aME7fdxvQTJ3hoyRKPDTin5xNyov4WLVqwcOFCx+pXSgUnt5wP3JIH+DeX\nRx99lIoVK9JPBBYs8Fs9KYJ9v1SsWJGBAwcydOhQn23TqUZcdWPM72mW7bd/Fs5gvTuwnjO4PM3y\n5VjPMMzno/gyd+QIp+vV470//qDm559Tu3btgFUd7FpVrkzpzz4jOTnZ6VCUUko5YP78+Xz++efM\n6tIFGT0arrvO6ZACzxho3Ro2bbq4aOjQoaxatYrvvvvOJ1U40p3qiYg8BLwIVDbG7EinzHvAXUBU\n6v4FERkETMB69uBaD+v5tjvi8GFO1avHG/v3U/add7j9jjt8t2032L2bY+XL8/uqVdSqUydg1Wp3\nanjQ7lSlgtuBAwe48cYbmTdpEnUfegjefRfi4pwOyxmvvgpvvgkrV1o3PmDd6DF27FjWrl1LpL0s\nrWDvTr2EiEQC9wGvp9eAsxUDTns4o52wfxb1R3xpfb1qFY8fPMi1c+dqA86Tq6/mzJVX8ssbbzgd\niVJKqQAyxtCzZ0/6dO1K3bFjYdiw8G3AAfTuDXnywEsvXVzUoUMH8uXLxzvvvJPjzQdFIw54EjgH\nPOx0IBkxxjBp0iS69O3LXV99RctWrTJdx+k+eqfqP9ukCXz1leP5K6WCh1vOB27JA3yfy2uvvcah\nQ4d48q+/oHJleDhwv9aDcr9ERMCMGfDss2BPzyQijB8/nieffJIzZ87kaPOOzxMnIj2wpguJTbnR\nIQNHgPxyef9CQfvn0fRWvCsujmq33gpYc7bUrFmT2NhY4J8dn9H748eP884777Bt2zYmTpxIYmLi\nxW17s364vT9fpw41P/qIPSdPBqx+FT5WrFhxyf6Pj4/nr7/+AiAhIcG5wJQKYzt27GDEiBF89913\nRF64ABUqgLhiVEPOVKoEgwfDwIHw5ZcgQv369bn55puZMmWKV1OOpMfRMXEi0gUYCsQZYw55UX4Y\n8H9AOWPMH6mWvwT0Bq40xpz2sJ45LMLuRo24Ye5ccnn7OKxz50ieOZO5EREMfvppOnbsyHPPPUd0\ndLR364ezxET+zpuX7155hZb33x+QKnVMXHjQMXFKBZ+kpCQaNWpE+/bteTiAV99Cxvnz8MEH0KXL\nxYbttm3bqF+/Ptu2baNIkSKXFA/6MXEici9pGnAi0lpEeqUqU1Lkkmb8p4ABGqfZXGNgsacGXIoj\ny5eze+tW/o6JYX3Xrly4cMFzQWNg/XoShw/nTMmSfD9sGB+8+ioffvghL7zwgjbgvJUrF18OGMCC\nVaucjkQppZSfTZ48mcjISB588EGnQwlOUVHQteslVyYrVarEHXfcwfjx47O9Wacm++0MvA48ARxM\n9dGtwD5jzGgRaQB8C0w3xvRPte4rWI22lMl+ewAvA/WMMR6fP5Tyl6wxhsWvvMIXM2bw8YEDNGvW\njAYNGnDVVVdRsGBBCrz/PpXfeotjInyemMjam26izdChtG3bFsnmJeHU3T5OcLL+zZs3Exsby4ED\nB7L9/WWFXokLD3olLnQ5fT70FbfkAb7JZevWrTRs2JA1a9Y4OuF9KO6XP/74g5o1a7Jp0yZKlSp1\ncbm35zCnxsRNAaKwJvhNzQCj7X+fBI4B+9KUeQAYBawUkQtYd6Y2T68Bl5qI8O/+/fl3//48tH07\ny5cvZ9WqVRw8eJATJ05QIV8+ytxxB1WbNaNNXBx9y5TJSY5h7zp7XqAtW7ZQpUqVgNQZiMaiUkop\nS1JSEj169GDcgw/qE4uyoWzZsnTp0oX/+7//Y/LkyVleP2jmifMnN/0lG2p69erF9ddfz0MPPeR0\nKCqM6JU4pQJj8uTJrHz3XeYkJCA//ADlyjkdUsg5ePAgVapU4ddff6V06dJACIyJU+GhadOmLF26\n1OkwlFJK+VhCQgLPP/00s5OSkEcf1QZcVnzwAdhjxkuWLEn37t0ZN25cljejjTg/c3r6C6frz5Mn\nD6tXrEj/RhI/cjr3cK7f6dxVcHLLceGWPCD7uRhj6N27N3Nr1yZv4cLWFBoOC6n9kpQEgwZZN1Ni\nPWf2rbfeYv/+/ZmseCltxCm/KlyoEBvPnCE+AA8/VkopFRhvv/02RXbt4rb1663HSkVocyJLOnWy\nph35+GMAYmJi6NKlCxMmTMjSZnRMnPK7nytXZme1atz+ySdOh6LChI6JU8p/jhw5wvXXX8/m667j\nyvvvh3vvdTqk0LRkCfTvD5s2Qe7c7N27lxtuuIHt27dTrFgxHROngkNkixbk/9//nA5DKaWUDwwZ\nMoROnTpx5cKF0Lmz0+GErmbNoHx5mDkTgDJlytCuXTteSvWc1cxoI87PnO6jD4b6K/TtS83Dhzl5\n4kTA63ZSONfvdO4qOLnluHBLHpD1XJYvX87y5ct55plnIDo6qB6rFZL75dlnYeHCi2+HDh3K1KlT\nvV5dG3HK7/JVqcKZvHn5efZsp0NRSimVTefOnaNfv35MmTKFK664wulw3KFOHUg11KhSpUpZmrBY\nx8SpgPg2NpbfChakx+efOx2KCgM6Jk4p33vuuedYs2YNn+t53K82bdpEtWrVvDqHaSNOBcT3339P\nv379iI+PdzoUFQa0EaeUb/3+++/cXasWH69axTUBegJPONPJfoOE0330wVL/zTffTEJCAocOHQp4\n3U4J5/qdzl0FJ7ccF27JA7zPZdCAAXwVFcU1mzf7N6AccNN+8ZY24lRA5MqVi9tuu41ly5Y5HYpS\nSqks+OKLL2j2448UrVMH7rjD6XDcLTk5S8W1O1UFzJQpU9iwYQOvv/6606Eol9PuVKV848yZM9z+\nr3/xxcmTRG3cCGXKOB2Se/35JzRoAD/9hOTLp92pKrg0bdqUr7/+Gv2FpJRSoWHcmDFMOXOGqLFj\ntQHnb0WKQKVKF+eN84Y24vzM6T76YKq/SpUqtDh+nF3ffx/wup0QzvU7nbsKTm45LtySB2Scy86d\nO9k0cSLlKlSAXr0CF1Q2uWK/DB8O48d7XVwbcSpgRISuhQuza9o0p0NRSimVicGDB1N92DDyrFih\nz0YNlFtugQoVvC6uY+JUQP2vVy9yffUVt+zZ43QoysX8PSZORGoCA4AGQCIQCXwNPGOMOZLBevmB\nB4BWQF77lQzMNMZMTGcdPX+pgFuyZAl9+/Zl48aNREdHOx1OeFm6FGnaVOeJS6EnweCxb9068t58\nM4XOniUiKsrpcJRLBaARtwX4BehqjDkjIqWBpVi9GzWMMWfTWe96YD3wX2PMAntZS+BzYJQx5jkP\n6+j5SwXUhQsXqF69OmPHjqVt27ZOhxOWdJ64IOF0H32w1V+6Vi0O5s7N9vfeC3jdgRbO9TudewAk\nA8OMMWcAjDH7gPHAv4CWGax3EnglpQFnr7sAq0HYzn/hBge3HBduyQM85zJ16lTKli1LmzZtAh9Q\nDrhpv3hLG3Eq4PZUqcKR9993OgylcqK6Meb3NMv22z8Lp7eSMSbBGPOgh48KAYGbCVupdBw+fJiX\nn3mGSZMmIUH0cHvlmXanqoBbNGkSi+bM4cUA3aWqwo8T88SJyEPAi0BlY8wOL9fJDwwH7gP+Y4y5\n7Ll0ev5SgTS6Qwcemj+fwocPQ968TocTtrw9h2kjTgXc0aNHKV++PEeOHCFKx8UpPwh0I05EIrHG\nun1vjOnj5Tr/A24GdgC9jDGr0imn5y8VEBt+/pm/b76Zmk8/Tf7HHnM6nLCmY+KChNN99MFYf9Gi\nRbn22mv58ccfA153IIVz/U7n7oAngXPAw96uYIxpCOQDxgBLRWSgn2ILGm45LtySB/yTizGGL+65\nh0olS5J/yBBng8omN+0Xb2kjTjmiSZMmLF261OkwlMoxEekBtMfqDj2TlXWNMUnGmLeB2cAEESnp\njxiVysxXc+Zw/7ZtXPnee5Arl9PhKC9pd6pyxFdffcWYMWP45ptvnA5FuVCgulNFpAswFIgzxmR6\nY4KI5AaSjTFJaZb3B14Gmhljlqb5zHTr1o1y5coBULhwYWrWrElsbCzwz9UHfa/vs/v+woULJNx9\nN/+pU4cdw4c7Hk84vk/5d0JCAgCzZ8/WMXEptBEXfE6ePEmpUqU4dOgQ+fLlczoc5TKBaMSJyL3A\nMFI14ESkNRBjjJlhvy8JHEo5AYnIU8BZY8yYNNsaBwwBbkp7c4Oev5S/TZw4kfjPP2f23LlQvLjT\n4Sh0TFzQcLqPPljrv+KKK3i5SBF+HzUq4HUHSjjX73Tu/iYinYEZwJtAcxG5127UtQFK22UaAPuA\nqalWNcAAEamSalsNgb7AN57uTnUTtxwXbskD4LPPPuP5559n2NSpId+Ac9N+8ZZ2fCvHFLrxRpK+\n/DJLD/tVKkhMAaKwJvhNzQCj7X+fBI5hNeRSzMZ61NZ7Yk3ClQtIAp63t6lUQL399tvcddddVK1a\n1elQVDZod6pyzOqPPuK6jh0pfP68PlxZ+ZQT88T5i56/lL9s27aN+vXrs2nTJkqUKOF0OCoV7U5V\nQe+mtm05mJzMCb25QSmlAu6xxx5jyJAh2oALYdqI8zOn++iDuf6oqCg2XX01u2fODHjdgRDO9Tud\nuwpObjku3JDHD3Pm0GPRIm6sWdPpUHzGDfslq7QRpxyV3KQJF1Z5nKheKaWUHyQnJ/N3v36UbdmS\nPNHRToejckDHxClHrfvhB7p068amzZudDkW5iI6JUyp9y558ksrjxhHz559E5M/vdDjKAx0Tp0JC\nzVq1OHDwIPv27cu8sFJKqRw5d+oUpceO5djjj2sDzgW0EednTvfRB3v9kZGRxMbGsmzZsoDX7W/h\nXL/Tuavg5JbjIpTz+K5bN84XLMj1I0cCoZ1LWm7KxVvaiFOOi4uL80sjTiml1D+OHTvGkkWLyP/a\nayCuGG0Q9nRMnHLcli1b+Pe//01CQgKiJxblAzomTqnLPfroo5w4cYLp06c7HYrKhLfnMH1ig3Jc\n5cqVKXH2LH8sWsQ1LVo4HY5SSrnOrl27mDlzJr/++qvToSgf0u5UP3O6jz4U6hcR+pUvz3kfP0c1\nFHJ3a/1O566Ck1uOi1DM44knnmDAgAHExMRcsjwUc0mPm3Lxll6JU0Gh4J13UnzkSEhO1kdwKaWU\nD8XHx7NkyRK2b9/udCjKx3RMnAoKf/zxB0nly3PN2rVE3Hij0+GoEKdj4pSyJSYy6uabKd6zJwMf\neMDpaJSXdJ44FVLKli3Lqiuu4MDbbzsdilJKucbmIUNouWULvXv3djoU5QfaiPMzp/voQ6n+v2+5\nhfMLFjhStz+Ec/1O566Ck1uOi1DJI/mvvyg+dSrHR40iKk8ej2VCJRdvuCkXb2kjTgWNkh078j/t\nNlJKKZ/Y0q0bqwsVotmwYU6HovxEx8SpoHH48GGuvfZajhw5Qu7cuZ0OR4UwHROnwt35bds4VaUK\nm95/nwZ33+10OCqLdEycCjnFixenfPnyrF271ulQlFIqpG3s25f5FSpoA87ltBHnZ0730Yda/XFx\ncSxdutSRun0tnOt3OncVnNxyXAR7HidOnKDNxo1Uf/fdTMsGey5Z4aZcvKWNOBVUmjRp4rNGnFJK\nhaMXXniBxs2bU71OHadDUX6mY+JUUPn777+JiYnh8OHD5M2b1+lwVIjSMXEqXB08eJCqVauybt06\nypUr53Q4Kpt0TJwKSQUKFOCeChXY17+/06EopVTIeeaZZ+jatas24MKENuL8zOk++lCsv2rDhhT7\n+GPI4dWHUMzdLfU7nbsKTm45LoI1j9927OCDDz5gxIgRXq8TrLlkh5ty8ZY24lTQqXnXXZw+dw62\nbHE6FKWUCg1Hj5Lr5psZ0r8/xYoVczoaFSA6Jk4FnXPnzvH+FVdw9zPPkO+xx5wOR4UgHROnws2h\nzp1ZMG8edx06RP78+Z0OR+WQjolTIStPnjzsqVKFEx9/7HQoSikV/HbsIM+HH2JGjtQGXJhxtBEn\nIjEislBEkp2Mw5+c7qMP1fqv+O9/KbRhA5w/H/C6fSWc63c6dxWc3HJcBFseh+67jxlXXEHnRx7J\n8rrBlktOuCkXbznWiBORdsBKoByQpb4CEUkQkfUeXk38EasKvAZt29LmmmtAH7+llFLpMitXkrx6\nNWUnTiQqKsrpcFSAOTYmTkRWAp2Bp4CuxhivG5QistMYUz4L5XVMSYhJSkqiWLFibN68mVKlSjkd\njgoxOiZOhYtlY8Ywb8YMJm3fTkSEjpByi1AYE9fQGJPgYP0qiEVGRtKoUSOWLVvmdChKKRWUEhMT\n6f/mm7SaNk0bcGHKsb0eLn9aOt1HH8r1x8XF5agRF8q5h3r9TueugpNbjotgyWPWrFmULl2a5s2b\nZ3sbwZKLL7gpF2+FbNNdRMaKyEoR2Soii0SkjdMxKd+Ki4vT56gqpZQHp0+fZvTo0YwZMwYRV4wc\nUNng+DxxIvImWR8TtwZ4wRgzV0RyAb2Bl4EHjDFTPZQPlwt/rmKMoXRMDKs//ZRr6tVzOhwVQnRM\nnHK7sWPH8sMPP/CxTsXkSt6ew3IFIhhfM8bUTfXvRGCaiLQEnheR140x55yLTvmKiNCldm2KtGkD\nhw+D/rWplFKcfP99Xhs3jvkrVzodinJYSDbi0vED0BKoCqxP+2H37t0vPhC4cOHC1KxZk9jYWOCf\nfnR/vE/dRx+I+txW/3V33MHyJUso+N57xHbunKX108YQ6PzDuf74+HgefvjhgNb3119/AZCQkIAK\nTitWrLi430KZo3ns3In07Mkd7dpx3XXX5Xhzbtkn4K5cvGaMcfQFvAkkZ6F8NJDfw/IRQDJQ28Nn\nxinLly93rG431J+QkGDej442yS+/HPC6cyqc63c6d/v/vOPnN1+8nDx/+ZrTx4WvOJnHqf/+1zyf\nN6/ZvXu3T7bnln1ijLty8fYcFixj4roYYyLT+bwkcMhOChHpDtxijOmbptwnQAugmDHmdJrPjNN5\nqux7pEQJnrrhBgrpTQ7KS/4eEyciNYEBQAMgEYgEvgaeMcYcyWC9GKAvcDvWjWW5gE3AKGPMr+ms\no+cvZfnhB441bsyEXr14btIkp6NRfhQK88Sl5jFQEWkA7APS3qzQSURqpyrXAfgvMC5tA06Fvojm\nzYletQoSE50ORakUHwCFgVrGmOpAM6A5sFJEojNYbxTQEWhpjLkBqAkkAWtE5Ho/x6xCmTGcHjCA\n0RERDB450uloVJBw8rFb00RkJ3AnYERkp4j8LiKpn7P0N3AMqyGXYgEwHutmhvX2NoYCfYwxTwUo\nfK+lHp+k9WdPnTZt+K54cTh0KOB150Q41+907gGQDAwzxpwBMMbswzov/QtrbG56DDDWGLPXXu8c\n8BiQF+sue1dzy3HhSB7r1nF4+3Zihg+nSJEiPtusW/YJuCsXbzl2Y4Mxpr8XZTYAxdIsOwQ8a79U\nGGjcuDGVTpzgSIkSrroTR4W06sa6Mz61/fbPwhmsNxCrAZjV9VSY+9EYOuXLxwb7hiGlIAjmiQsE\nHVMS+qpXr86MGTOoW7du5oVV2HNinjgReQh4EahsjNmRhfVqYN1Rf78xZqaHz/X8FeaMMTRt2pQO\nHTrQu7frL9gqQm9MnFIZ0qc3qGAmIpHAfcDrWWnA2XoDvwJv+zww5QpLlixhz5499OzZ0+lQVJDR\nRpyfOd1H75b6mzRpkuVGnFtyD8X6nc7dAU8C54As9XWJSBxwN3C3MeaCPwILJm45LgKZR3JyMsOG\nDeP5558nVy7fDyhxyz4Bd+XiLR1ipEJCo0aNuOeeezh79izR0Rnd/KdUYIlID6A9EJtyo4OX69XA\nmiezjTFmS0ZlnZqsXN+nP7l0QOozhlGjRnH27FnatWvnl/ri4+P9F7++9/p9yr+zOlm5jolTIaNx\nnTq8UbUqFd580+lQVJAL1Jg4EemCdXd8nH3TlbfrVQfmAfcaY1ZlUlbPX2EqqXt3BixcSMcPPgi/\nJxGEOR0Tp1ynYbNmlPjwQ9DHKqkgICL3kqYBJyKtRaRXqjIlRS596K+nBpyIxIjIq4GLXgW9n37i\n7KefcuiGG7QBp9KljTg/c7qP3k31N46LY2XevLBkScDrzo5wrt/p3P1NRDoDM7C6Q5uLyL12o64N\nUNouc9lk5SJyA7AUWARUSLVeB6ByQJNwgFuOC7/nYQyJjzzCU8YwasIEv1blln0C7srFWzomToWM\n+vXr8/DJkzRZsIDcvXplvoJS/jMFiMKa4Dc1A4y2/32SyycrfwooAvSxX6mt8HWQKkTNn8+fmzZx\nuBr+3e0AACAASURBVG1batSo4XQ0KojpmDgVUjo0bMjbGzYQdewYRHp83K5SjswT5y96/goziYkk\nVqnCvQcOMOaXXy7e0KLCi46JU65Uo2VLjubODT/95HQoSinle2fO8HmJEpS+/35twKlMaSPOz5zu\no3db/XFxcQy58kqoUCHgdWdVONfvdO4qOLnluPBnHtsPHKD31q08PmKE3+pIzS37BNyVi7e0EadC\nSq1atZh/5AiHkpKcDkUppXzu8ccfZ/DgwRQrVizzwirs6Zg4FXLatm3LPffcQ8eOHZ0ORQUpHROn\nQtGaNWu488472bZtG/ny5XM6HOUgHROnXCsuLo5ly5Y5HYZSSvmMMYahQ4fy1FNPaQNOeU0bcX7m\ndB+9G+uPi4vz6jmqbsw9VOp3OncVnNxyXPg8jw0b+N+kSRw+fJju3bv7dtuZcMs+AXfl4i2dJ06F\nnGrVqnHy5EkSfv+dcl7c4KCUUkHLGEy/fixMSGDsq6/65SH3yr10TJwKSZ06duTV5csp9NNPUKaM\n0+GoIKNj4lTI+OgjjgwaxF3lyrHsm29I85Q2FaZ0TJxytbimTdkcHQ0LFzodilJKZc/ZsyQ/+ij9\nT59m7IQJ2oBTWaaNOD9zuo/erfU3bdqUd44dw3z5ZcDr9lY41+907io4ueW48FkeL73Ejjx5iGja\nlDp16vhmm1nkln0C7srFW9r5rkJSuXLl+KlkSZKXLCHy3DnIk8fpkJRSynuJiSS+9hpdjhzhveee\nczoaFaJ0TJwKWY888ghDPvqIMrNmQdOmToejgoiOiVOh4ME+fYjMl4+JEyc6HYoKMjomTrleixYt\n+CwyErZvdzoUpZTKki1btvD+J5/wxBNPOB2KCmHaiPMzp/vo3Vx/o0aNeOzPPzmWzpMb3Jx7sNfv\ndO4qOLnluPBFHsOGDWPYsGEULVo05wHlgFv2CbgrF29pI06FrOjoaBo2bOjVxL9KKRUsvvnmGzZs\n2MDAgQOdDkWFOB0Tp0LaSy+9RHx8PG+88YbToaggomPiVFBKTCTZGOrUq8fgwYPp1KmT0xGpIOXt\nOSxLjTgRWQj8DiwHVhhjDmc/xMDRk6B7bd++ndjYWPbs2aNzLKmLPJ0A9fylHPfii2xetIgex4/z\n/fff6zlLpctfNzb8H3AWGAbsE5GNIvKSiLQTkejsBOp2TvfRu73+a6+9lujoaH755ZeA152ZcK7f\n6dzToecvhwXpcZFl2crj8GHM//0f/Tds4MUXXwyaBpxb9gm4KxdvZakRZ4z5xhgzyBhTGyiGdTK8\nEpgN7BaRO/wQo1LpEhH+85//8Msrr8BPPzkdjgpiev5SjnrySX78178o1rAh9evXdzoa5RI+GRMn\nIg8C3wOTgJHGmKAaaa7dEe725ZdfsuuRRxgQGwszZjgdjgoCWRkTp+cv5Xfx8SQ1a0alpCQW//gj\nFStWdDoiFeT80p0qIk+JyHr7Z4XUnxljfgQaAS2yFqpSOdO4cWNm7NtH8vz5oL/sVDr0/KUcYQw8\n9BDvVapEu/vu0wac8qmsjomLBIYC5YFfRGS7iKwD6tmfXwvs9GF8Ic/pPvpwqD9//vwUr1+f0yIQ\nHx/QujMSzvU7nXs69PzlsCA9LrIsS3kYQ0LLlgzbsSMoJ/Z1yz4Bd+Xiraw24g4AGGO6AaWAB4Bn\nge4iUhj4Baji0wiV8kKLFi34oWhRmD/f6VBU8NLzlwo4I0KPhQsZOXo0hQoVcjoc5TJZHhMnIg3t\n9b7z8FllYJ8x5m8fxecTOqbE/TZu3MjzTZrwTvnyyOrVToejHJbeeBI9f6lAmzdvHk888QTx8fHk\nypXL6XBUiPB2TFyWjyhjzP8y+GxrVrenlC9UrVqV1VFR7L37bq5yOhgVtPT8pQLp3LlzDBkyhGnT\npmkDTvmFPnbLz5zuow+X+kWEZq1aMSfVFYtwyT0Y63c6dxWc3HJceJvHlClTqFq1Ks2bN/dvQDng\nln0C7srFW9qIU67RunVrvvzyS6fDUEqFu+XLOf7KK4wdO5YXXnjB6WiUi+mzU5VrnD59mlKlSrFr\n1y6uvPJKp8NRDtJnpyrHnD8P1avz8tVXk1CjBhMmTHA6IhWC/PXYLaWCVr58+bjttttYtGiR06Eo\npcLV5MkcL1aMZzds4Mknn3Q6GuVy2ojzM6f76MOt/jZt2lhdqklJYZd7MNXvdO4qOLnluEg3j717\nMWPH0uv0aZ57/vmQmFLELfsE3JWLt7QRp1ylVatWrJw/H1O+PCQmOh2OUiqcDBnCxoYN2RkZSY8e\nPZyORoUBHROnXOfGG2/k27NnKTB1KjRp4nQ4ygE6Jk4F3JkzXLjnHqqsWcPbH39MvXr1Ml9HqXTo\nmDgVtlq3bs3K4sXhs8+cDkUpFS7y5mXkddfRoFkzbcCpgNFGnJ853UcfjvW3adOGV/buZcWcOdbD\npx0Sjt99MNStgpdbjgtPeWzbto0ZM2YwZsyYwAeUA27ZJ+CuXLyljTjlOrVr12b133+TaAz8/LPT\n4SjlkYjkEZEJIpIkIrc5HY/KPmMMDz744P+3d+9xWo37/8dfn6YSQg5b0rZLNkVp56yTptAvKhqF\n3VY6SV9ySnRAoXTYO8VOiQ46EkK7ohwrkaRiHCKiE1I5ROfDNNfvj3UPY5pqprnv+7rXfb+fj8c8\npnvNWvP5XKs16/7c67rWtejZsyflypXznY6kEI2Jk6TUvn17Oq1dywXt2sG11/pOR+IsHmPizKwG\n0BmoDWQBacCbQF/n3E8H2LYaMBHIBs4C0p1z8/axrs5fCW7q1Km/Px+1RIkSvtORJKAxcZLSmjRp\nQq/sbBVwEkvPAmWAc5xz1YFLgYbAfDMrdYBtuwNdgaGxTVFiatEitq1aRZcuXRg2bJgKOIk7FXEx\n5ruPPlXjX3rppbz77rts2rTJS3xI3X3vO3YcZQPdnXPbAZxza4FBwKnA5QfYto1zbjaQFHfQFlSy\nHBdz586FLVugRQue7dWLCy+8kPr16/tO66Aky/8JJFdbCkpFnCSlI444gmrVqjFr1izfqUjyqu6c\nW5Fn2Q+R72X2t6FzLjs2KUncPPAAv511Ft1mzdLzUcUbjYmTpDVy5EjmzJnD5MmTfaciceZrnjgz\nux0YAlR2zn1dgPXbAk+hMXHh8vHHuEsv5ZrTT6dWs2Z06dLFd0aSZAp6DlMRJ0lr/fr1VKlShXXr\n1nHIIYf4TkfiyEcRZ2ZpwEfAAudcpwJu0xYVceGyZw/UrMmis87ihvffZ8mSJRQvXtx3VpJkdGND\ngvDdR5/K8b/44guqVq3Kh8OGgYdu1VTe977b7kkvYCdwh+9EElVSHBfz5/PWzp1kvPwyI0aMCH0B\nlxT/JxHJ1JaCCvfRJ3IAGRkZfPj669ScMQMuu8x3OpKkzKwd0ILgitr2aP/+tm3bUrFiRQDKlClD\njRo1SE9PB/5449LrOL3OzubBI46g0XnnUatWLf/5FPF1ZmZmQuWTqq9z/r1q1SoKQ92pktS++eYb\n6tesyerdu7Fly6BsWd8pSRzEszvVzFoD3YCLnXMbCrltW9SdGiqLFi3iiiuuYOnSpRxzzDG+05Ek\nFYruVDMrZ2avmpnu1JKYOOWUUyhzwgn8eN55MHWq73QkyZhZK/IUcGbWxMw65lqnrJml1FQiySor\nK4sbb7yRQYMGqYCThOCtiDOzq4D5QEWgUB8zzayEmfU1sy/M7FMzm29mtWORZ1H57qNP5fg5sTMy\nMph56KEwZYqX+L4kwr5PZmZ2HTAKGAc0NLNWkaKuKXBiZJ3awFpg+IF+XQxTTRhhPy6GDh3Kscce\nS/ny5X2nEjVh/z/JLZnaUlA+x8R1BRoADwCnFXLbx4B0oLZz7mcz6wC8bma1nHN6WKb8SUZGBv+a\nMIE2GzdiP/4If/mL75QkOQwFShJM8JubAx6M/HsLsJGgkPudmV0fWad0ZP1nzWwHcL1z7p1YJi0H\nYdkyVpUqRf/+/VmwYAHff/+974xEAI9j4iwy0MPMxhGcuAp0VdDMKgOfAx2cc+NyLf8MWOWca5LP\nNhpTksKcc1SqVInX+/Xj1ObNQdONJD1f88TFgs5fns2cibvtNppUqkTdBg3o0aOH74wkBST8mLgi\nnJUyCLoe5uRZPoegS+OwIiUmScfMyMjI4Jnly1XAiUjB/fYb/N//8dbVV/P9hg107drVd0YifxLG\neeKqA3uANXmWryToHj4j7hnth+8++lSOnzt2RkYGU+N8Y4P2vcifhe646NqV7fXr02rsWEaPHv37\nA+5D1479UFvCLYxF3HHAtnyu5OU86fzYOOcjIVCrVi3WrVvH118f8ElIIiLw6qvw5pvcsm0b1113\nHeeee67vjET24n2euIMYE/c6cIFz7qg8y28ARgKXOedey/MzjSkROnfuzF//+ld69uzpOxWJMY2J\nkyJxDmrW5L3LL6fNxIl8/PHHHHaYRupI/BT0HBbGJzb8BBxue5/Zjox8/zm/jTTjuV5fc8013HHH\nHdQ880wwI71x44TKT68P/nVmZia//vorQKFnPBfZixkbX3qJq887j8mTJ6uAk8TlnPP6RTDHUnYh\n1u8OZAN/y7P8MYLnFh6WzzbOlzlz5niLnerx88bOyspy5cqVc79efbVzgwfHPX68JdK+j7fI37z3\n81s0vnyev6LN93FRGG3btnWdO3fO92dhaseBqC2JqaDnsEQZE7fPvoJ8ZjufGlm/fp5V6wOvO+e2\nxSA/SQJpaWm0aNGCGYcfDs884zsdEUlQM2fOZO7cuQwcONB3KiL7ldBj4iKznc8DnnTO3Zxr+QiC\noi1nst92wDCgpnPuk3x+j/PdTkkM7777LrfcdBOZP/8Mc+ZA5cq+U5IY0Jg4OVi//PIL1atXZ+LE\nidSvn/dagUh8JPw8cWb2uJmtBJoDzsxWmtkKMyuRa7XN5DPbOXArMAWYb2afAjcADfMr4ERyq1Wr\nFj9t3MjPl14Kkyf7TkdEEsVHH8Hu3dx22200b95cBZyEgs/Jfm92zp3snDvCOZcW+Xcl59zuXOt8\n4pw7zjn3UJ5ts5xzvZxzVZxzZzrnajvn5se/FQfme96aVI6fX+xixYpx9dVX81LJkkGXagyvcGjf\ni/xZwh4XK1ZAw4a8Pnw4H3zwAQMGDNjv6gnbjoOgtoRbooyJE4mba665hkfnz4emTWHrVt/piIhP\nWVnQqhWbOnfm+oEDGT9+vO5GldDwPiYuHjSmRHLLzs6mYsWKzJw5k2rVqvlOR2JAY+KkwPr0wb3z\nDk1LlKDG2Wfz0EMPHXgbkRhL+DFxIr7kdKk+//zzvlMREZ/eew+GD2digwas//FH7r//ft8ZiRSK\nirgY891Hn8rx9xf72muv5bnnniOWVzi070X+LOGOi3Hj+O6BB7hz8GAmTZr0+7NRDyTh2lEEaku4\nqYiTlHTeeeeRlZXFRx995DsVEfFk59ChXDl6NH369KGyphuSENKYOElZvXv3ZsuWLQwZMsR3KhJl\nGhMnBdG1a1e+/vpr/ve///HnOeVF/ErmZ6eKRMV1111Heno6g44+mrS//hXatfOdkojEyaxZs3j+\n+efJzMxUASehpe7UGPPdR5/K8Q8Uu3Llypx00kl8vGcPjBkT9/ixlsj7XlJTohwX69ato3379kya\nNIljjz220NsnSjuiQW0JNxVxktJat27N0OXLIedLRJKTc9C7N3vWraNVq1Z07NiRevXq+c5KpEg0\nJk5S2oYNGzjttNPY0KoVJcuUAc0RlRQ0Jk72MngwPPccfRs2ZM577/HGG2+QlpbmOyuRfGmeOJEC\nOP7446lduzZvlC8P48fDnj2+UxKRaJszBwYN4p3bbuOJsWN55plnVMBJUlARF2O+++hTOX5BY7dq\n1Yph8+bB6afD11/HPX6shGHfS2rxclysWQP/+hc/Dh3KNXffzaRJkzjhhBOK9CuT6fhWW8JNRZyk\nvCuvvJL333+fdRMmgOaKEkkeO3ZA8+Zk3X47VzzyCLfeeiv169f3nZVI1GhMnAjQrl07qlatyl13\n3eU7FYkCjYkTALKzYepUbn7zTX5Yt44XX3yRYsV07UISn8bEiRRC+/bteeqpp2L6GC4RibNixRi7\naRNvzZ7N+PHjVcBJ0tERHWO+++hTOX5hYtepU4esrCwWLlzoJX4shGXfS+qI93GxaNEiunXrxtSp\nUznyyCOj9nuT6fhWW8JNRZwIwaXrnKtxIhJ+33//PRkZGYwZM4YzzjjDdzoiMaExcSIRa9eupVq1\nanw3axaHzZ4NPXv6TkkOksbEpajvv4ddu9hWtiwXXXQRLVq0oEePHr6zEim0gp7DVMSJ5NKkSRNa\nN2rEtffdBytXwtFH+05JDoKKuBS0aRPUrUt2+/b8a8ECSpQowYQJE/RcVAkl3diQIHz30ady/IOJ\n3b59e0a88AJcdhlMnBj3+NEUtn0vyS9mx8Xu3XD11VCrFr3Wr2fNmjWMGjUqZgVcMh3faku4qYgT\nyaVJkyZ8/vnnfNekCTz5ZPC8RRFJXNnZ0LYtlCzJqOrVeX7KFKZPn06pUqV8ZyYSc+pOFcnjzjvv\n5JCSJRkwbRqMGgV16vhOSQpJ3akpwjm4/Xb46CNe69qVtjfdxDvvvMPf//5335mJFInGxOWik6AU\nxrJly0hPT+e7u+6i+OrV8NhjvlOSQlIRl0LGjmXxSSdx+b/+xbRp06hZs6bvjESKTGPiEoTvPvpU\njn+wsatUqcIZZ5zB1BNOgEcfjXv8aAnjvpfkFovj4vMLLqBJq1aMHTs2bgVcMh3faku4qYgTycdN\nN93E8NGjIS3Ndyoisg+rV6+mUaNGPPzwwzRu3Nh3OiJxp+5UkXzs3r2bChUq8Oabb2qi0BCKdXeq\nmdUAOgO1gSwgDXgT6Ouc++kA25YAegMtIttuAro55+bvY32dv/Kxdu1a0tPT6dy5M7fffrvvdESi\nSt2pIkVQokQJOnTowBNPPOE7FUlMzwJlgHOcc9WBS4GGwHwzO9BtkY8BVwN1nHNnAk8Br5vZP2KZ\ncFIYPRq+/JJ169bRoEED2rVrpwJOUpqKuBjz3UefyvGLGvvGG2/k6aefZuvWrV7iF1WY930IZAPd\nnXPbAZxza4FBwKnA5fvayMwqAx2Bgc65nyPbjgFWAv1inbRvRTouBg2C/v35adMmGjRowHXXXUdP\nT09VSabjW20Jt+K+ExBJVCeddBJ16tTh2WefpUPx4nD66XD++b7TksRQ3TmXlWfZD5HvZfazXQZg\nwJw8y+cAnczsMOfctijlmBycgwcfhGefZf2UKVzcpg0tWrSgV69evjMT8U5j4kT249VXX+Wee+5h\nSZs22Pz58PzzvlOSAvAxxYiZ3Q4MASo7577exzrPEHSllsx9UjKzO4GHgfOdc4vzbJO656+sLLjl\nFli4kG9HjaJBy5a0bduWe+65R4/TkqSmMXEiUdCwYUO2bdvGe5Urw+zZwfNURfIwszSgAzB6XwVc\nxHHAtnyqsk2R78fGIr/QeuMNWLGCr8eMoU7z5txyyy3ce++9KuBEIlTExZjvPvpUjh+N2MWKFeP2\n22/n4SefhI4dYciQuMYvirDv+5DpBewE7vCdSCIr9HFx2WUsfPBB6jZuTO/evRPmJoZkOr7VlnDT\nmDiRA7j++uvp3bs3q7p1o+Lll0Pv3vCXv/hOSxKEmbUjmC4kPedGh/34CTjc9u4jPTLy/ef8Nrq6\nYUOq1qoFQJkyZahRowbp6enAH29cyfh6+vTptG7dmh49etChQwfv+eS8zszMTIj9E43XmZmZCZVP\nqr7O+feqVasoDI2JEymAHj16sH37dv67bRucey506uQ7JdmPeI2JM7PWQDfgYufchgKs3x0YAFR0\nzq3Jtfwx4Ebg6Lw3NpiZW1+sGNsnTaJCy5bRbUCCcs4xfPhw+vfvz7Rp0zjvvPN8pyQSV3p2ai4q\n4qSovvvuO6pXr87KZcs46vjjfacjBxCPIs7MWgHdyVXAmVkToJxzblTkdVlgQ84JyMxOA74A2jvn\nxuf6XZ8BK51zTfOJ417r0oWz//tfNg8axMl33hnLZvmxcyf06AHt27PztNPo3LkzCxcuZNq0aVSq\nVMl3diJxpxsbEoTvPvpUjh/N2H/9619p1KgRYyZN8hL/YCTLvk9EZnYdMAoYBzQ0s1aRoq4pcGJk\nndrAWmB4znbOua+AkUBPMzs2sl474GTg3n3FazhkCJn9+1Pi7rv59OabY9OoOMj3uPjmG6hVC9as\nYV2JEtSvX5+NGzeyYMGChC3gkun4VlvCTUWcSAHdcccdDB06lKysvNODSQoaCpQkmOB3Qq6vG4Cc\ny/5bgI0EhVxutwJTCJ7u8Glkm4bOuU/2F/CS7t35Yfp0OrzwAkOGDCH0vQvOwciRcOGF0LYtb3Tq\nxNkNGnDZZZcxZcoUSpcu7TtDkYSn7lSRQqhbty4333wzLVNkbFJY+ZgnLlbynr/WrFnDFVdcwTnn\nnMOwYcM49NBDPWZXBNdeC998w+7Ro+n93HNMnDiRCRMm0KBBA9+ZiXinMXG5qIiTaJk1axbdu3fn\n448/1lxVCSyZiziALVu2cMMNN7B06VKeffZZqlat6im7IvjwQ5YWK0a7G2/k2GOPZfz48Ryv8aYi\ngMbEJQzfffSpHD8WsRs1akRaWhqvvPJK8DDuKVPiGr8wkm3fyx9Kly7N5MmT6dKlC+np6XxyySW4\nWbN8p3VAOcfF7t27eWjmTNIvvZSOHTsyc+bMUBVwyXR8qy3hpiJOpBDMjJ49e9K/f39chQrQqxfs\n2eM7LUlBZkb79u155513GLNyJWubN2drejp8+aXv1P7s008hO/v3l7Nnz+bss89m/vz5fPjhh3Ts\n2FFXtUUOkrpTRQppz549nH766YwaOZJ6994bPNtRY+QSSrJ3p+a1e/duHhs8mF/79qU7UKplS9J6\n9oRTTolPkvlZuBAGDYL582HePFakpXH33Xfz4YcfMnjwYDIyMlS8ieyDxsTloiJOom3MmDFMmTKF\nV7t0gS5dgqsNaWm+05KIVCvicqxevZp7bryRCxcupGbDhtR45hmKF4/jg3l27oRp0+DRR2HdOrjt\nNlZdeikPPfIIU6dO5c4776Rr166UKlUqfjmJhJDGxCUI3330qRw/lrFbt27N0qVLWXLssXDkkfmO\njdO+l3irUKECT7/2Gv+YPp07162jWrVqTJo0iV27dsUngalT4Ykn4K67WPLss7TNzOTcevU48cQT\nWb58ObVr106KAi6Zjm+1JdxUxIkchJIlS9KtWzf69O0L/frBokW+UxL53UUXXcTbb7/N0KFDGTt2\nLH/729+47777WLNmDVx1FXTvDm+8Ab/8UvhfvmsXfPVVvj/6tVEjxl1/PRf+5z80v+YaqlSpwldf\nfUWfPn045phjitgqEclL3akiB2nHjh2cdtppvPDCC5x//vm+05FcUrU7dV+++OILRowYwaSJE7m6\nfHnalCvHWRs3Umr5cqx0aaheHV55BYrl+Vy/Zw8MHAg//ABr18KKFUEBV61aMObNjNWrVzN79mxe\nfPFF3nnnHdLT0+nQoQONGzcmTUMMRA6KxsTloiJOYuXJJ5/kpZde4rXXXvOdiuSiIi5/u3btYs6c\nOUydOpXp06eDczStXp2Ly5enVLNmVKhQgQoVKlCmTJlggz174N57yS5Xjm1HHcXPhx/Op86xdOVK\nPvvsM+bNm8eOHTuoV68ezZo1o0mTJhx55JFRyVUklamIy8VnETd37lzS09O9xE71+PGIvWvXLqpU\nqcK4ceO46KKL4h5/f5J93++PirgDc86xevVq3n//fd5//32WL1/O6tWrWb16Ndu3b+eQQw7hkEMO\nwTnH5s2bKV26NMcddxyVK1emSpUqnH766dSpU4fKlSsX+C5T38dFtCRLO0BtSVQFPYfF8bYlkeRT\nsmRJevfuTa9evZg7d66mTJDQMDMqVqxIxYoV+ec///n7cuccWVlZ7Ny5k507d2JmHHXUUeoaFUlA\nuhInUkRZWVlUrVqV4cOHc8kllwSDxTWI2ytdiRORMNMUIyJxUrx4cR588EHuuecesrdsgapVYfly\n32mJiEiSUxEXY77nrUnl+PGMfc011+Cc47kZM+COO+Cuu7TvRfJIluMiWdoBakvYqYgTiYJixYox\nePBgevbsyfZOnWDpUs0dJyIiMaUxcSJRdNVVV3H++efT44wzoGdPyMyEEiV8p5VyNCZORMIs4acY\nMbPjgUeAcyKLPgXucM59X4BtVwEb8/lRV+fc7HzW10lQ4mL58uXUrFmTz5cu5fjWraFpU7j1Vt9p\npRwVcSISZgl9Y4OZlQTeIJji5IzI11ZgjpkdXoBf4ZxzZ+XztVcB55vvPvpUju8j9qmnnkqrVq14\n4MEHmduuXfCII09Sbd9L4kuW4yJZ2gFqS9j5GhPXBjgT6O6cy3bOZQPdgUrATZ5yEomK3r1788IL\nL7Bi+3YoX953OiIikqS8dKea2atAZefcyXmWfwJsdc7VPMD2K/Nue4D11R0hcfXEE0/w9NNPM2/e\nPE0A7IG6U0UkzBK6OxWoDqzMZ/kqgit0B2Rm/zaz+Wb2pZm9ZmZNo5mgSFF07NiRnTt3Mn78eN+p\niIhIkvJVxB0HbM5n+SbgMDM75ADbbwCWOOdqA1WBacA0M+sc3TSLzncffSrH9xk7LS2NDh060KNH\nD3755RcvOaTqvpfElSzHRbK0A9SWsPNVxBWpb8A5d4Fz7vnIv7Occ48DM4H+BSgAReKicuXKtGjR\ngnvuuSdYcPXVwfxxIiIiUeBrTNz3wJfOuQZ5lk8H6jvnjjiI39kbeAA4xzn3UZ6fuTZt2lCxYkUA\nypQpQ40aNUhPTwf+qN71Wq+j/frXX3/llFNOoW/fvtyclgajRzN3wAAoXjwh8kuW15mZmfz6668A\nrFq1ivHjx2tMnIiEVkLPE2dms4Aq+dzY8Cmw2TlXaz/blgLSnHNb8yy/F+gLnO+cW5znZzoJWksf\nJAAAGVFJREFUijeTJ0+mX79+LFm8mEOaNYPataFXL99pJTXd2CAiYZboNza8BFQwswo5C8ysLFAF\neDH3imZW1v58e98/gcH5/M5zgB3A59FP9+D57qNP5fiJ0vZ//vOfnHrqqTzYpw+MGQOPPQYffhi3\n+D743veSmJLluEiWdoDaEna+irhxBE9o+LeZpZlZMWAgsAIYkbOSmdUG1gLD82zf0szOzbXetcCV\nwH+cc9tinLtIoZgZI0aMYMyYMSxauxaGDIHrr4cdO3ynJiIiIZYIj906l+BGh70eu2Vm1YHZwKPO\nuYdybXcjcAVQAigD/AKMcM6N3kcsdUeId5MnT+ahhx5iyeLFlJo1C668EtLSfKeVlNSdKiJhltBj\n4uJNJ0FJBM45mjdvTuXKlRkwYIDvdJKaijgRCbNEHxOXMnz30ady/ERre0636rhx4+KSWyrve0lM\nyXJcJEs7QG0JOxVxInFUtmxZxo0bR+vWrfnpp598pyMiIiGm7lQRD7p168bnn3/OjBkzgmerbt8O\nhx7qO62koe5UEQkzdaeKJLCHHnqIH3/8kf/+97+QnQ0XXghvvOE7LRERCREVcTHmu48+leMncttL\nlizJ5MmT6d+/PwsXLQrmjmvVClasiEv8WPO97yUxJctxkSztALUl7FTEiXhSqVIlRo8eTYsWLVh3\n2mnQuzc0awZbtvhOTQrIzMqZ2atmlu07FxFJPRoTJ+JZnz59eO2115j91lsc0rkzbNoEzz8PlhRD\nuryIx5g4M7sKeBjYBZzqnCvwpH+Rp9UMBC4AsoDfgL7Ouen5rKvzl0iK0Zg4kZC47777OP7447nt\n9tvh8cfhhx/ggw98pyUH1hVoALwPFLhgjExY/h5QEjjNOXcaQTH4kpk1jkWiIpKcVMTFmO8++lSO\nH5a2FytWjAkTJvDuu+8yfPRomDsXLrggbvFjwfe+j5M6zrlVB7HdLUA5oIdzLgvAOfccQTE4KHrp\nJZ5kOS6SpR2gtoSdijiRBHDEEUcwY8YM+vXrx7RXXvGdjhRAEfo4zwV2OeeW51n+KVDFzE4tWmYi\nkio0Jk4kgSxevJjLL7+c6dOnc+GFF/pOJ7TiOU+cmY0DrnfOFehDsZlNAa5wzh2SZ/lw4KbIz17O\ntVznL5EUozFxIiF07rnnMn78eDIyMvjqq6/++EG2bn5MIh8CJcysep7lNSLfj4xzPiISUiriYsx3\nH30qxw9r2y+77DL69etHo0aN+Pbbb2HDBjjrLPj227jEjwbf+z7BDQPWAo+Y2TFmVszMOgJnRn6+\n3V9qsZUsx0WytAPUlrAr7jsBEdlb+/bt+e2332jQoAFvv/02J7ZpA5dcAvPmQdmyvtOTInDObTaz\nOkAfgpsZtgFzgTuBkcBe1Xrbtm2pWLEiAGXKlKFGjRqkp6cDf7xx6XX8XmdmZiZUPkV5nZmZmVD5\npOrrnH+vWrWKwtCYOJEENmDAACZMmMDcuXMpO2IEvPQSvPkmHH+879QSWiKPidvP7+kG3Av8xTm3\nK9dynb9EUkxBz2G6EieSwHr27MnOnTu5+OKLeevNNymbnQ316weFXLlyvtOTP+yzyjKzssCGnErM\nzA4Fajvn3syzahNgUu4CTkRkfzQmLsZ899Gncvxkafv9999PixYtqHvRRay54Qa47jpYvDhu8Q+G\n733vQb6fmM2sNsH4t+G5FpcFZphZjcg6xczsLuAEoFesE/UpWY6LZGkHqC1hpytxIgnOzHjggQc4\n6qijqFu3Lq+//jqVK1f2nVbKM7PHgcuA4wBnZisJrshVds7tjqy2GdhIUMjl2AjMAP5nZpuAbIIn\nONRyzv0Sr/xFJPw0Jk4kRJ566inuu+8+Xn75Zc4++2zf6SSseI6JizWdv0RSj+aJE0lC7du3Z/jw\n4TRq1Ijp0/d6VrqIiKQQFXEx5ruPPpXjJ2vbMzIyeOWVV7jpppt45JFHcM4Fz1udNi0u8QvC976X\nxJQsx0WytAPUlrBTEScSQueddx4LFixg7Nix3HzzzWSVKgU33QRPPuk7NRERiRONiRMJsU2bNtGy\nZUu2bdvGlIEDOa51a2jSBAYNgrQ03+l5ozFxIhJmGhMnkgKOPPJIpk+fTt26dTmrRQs+GDoUPvkE\nmjaF337znZ6IiMSQirgY891Hn8rxU6XtaWlp9OnThyeeeIKmbdowrHFjXKVKzB07Ni7x8+N730ti\nSpbjIlnaAWpL2KmIE0kSjRs3ZsGCBYyZMIGr161jU6VKvlMSEZEY0pg4kSSzY8cOunfvztSpU5k4\ncSL16tXznVLcaUyciIRZQc9hKuJEktTMmTPp0KEDHTp04P7776dEiRKwZ09K3PCgIk5Ewkw3NiQI\n3330qRw/ldsOcNhhh5GZmcmSJUuoW7cua15+Gc4+G5Yvj3ls322XxJQsx0WytAPUlrBTESeSxMqW\nLcsrr7xCy5YtOadtW94980xc7dowY4bv1EREpIjUnSqSIpYuXUqrVq24pHRpBq5YQVr79vDAA0nZ\nvaruVBEJM3WnisifVK1alYULF1K8Th1q7N7NT//7H7Rv7zstERE5SCriYsx3H30qx0/ltu8rfsmS\nJRkwYACPv/giNTdv5r7t29myZUtcYosky3GRLO0AtSXsVMSJpKC6deuy5JNP+P7wwznrrLN4//33\nfackIiKFpDFxIinuxRdfpHPnznTq1In77rsvmIok5DQmTkTCTPPE5aKToMj+/fDDD7Rv356ff/6Z\naRkZlGvbFsqV853WQVMRJyJhphsbEoTvPvpUjp/KbS9s/HLlyjFz5kzatm3LuIceYssZZ+DefTcu\nsSV1JMtxkSztALUl7FTEiQgQfPK7+eabyViyhHuPO47fLr6YTf36ga4CiYgkJHWnishedu/ezbAu\nXfh/Tz7JofXrc/Irr0CIxsqpO1VEwkxj4nLRSVDk4Hzw5pusuuoq3mvcmL4jR3LEEUf4TqlAVMSJ\nSJhpTFyC8N1Hn8rxU7nt0Yp//iWXcPnatWwtXZp//OMfzJ8/P26xJfkky3GRLO0AtSXsVMSJyH6V\nLl2aUaNG8eijj3LVVVcxbNgwdGVIRMQ/daeKSIGtWLGCZs2acc455zBixAhKlSrlO6V8qTtVRMJM\nY+Jy0UlQJHq2bt3KjAsu4NvNm/nXe+9Rvnx53yntRUWciISZxsQlCN999KkcP5XbHsv4hx9+ONfO\nmEGHrVt5/owz+OTjj+MWW8ItWY6LZGkHqC1hpyJORArNTj6ZY5Yupc0xx7D4wgt56403fKckIpJy\n1J0qIgfvt9/4tV49Zi9bxtYRI2jdrp3vjAB1p4pIuKk7VURi76ijKLNgAelXXcXDvXrxyCOP+M5I\nRCRlqIiLMd999KkcP5XbHtf4hx7KMc88w/T58xk+fDgDBw703nZJTMlyXCRLO0BtCbvivhMQkeRQ\noUIF3n77bS6++GKWLVtGvXr1MEuKHk0RkYSkMXEiElXr16/nkksuoUmTJvTv399LIacxcSISZhoT\nJyJelC1bljlvvcW2p59mQP/+vtMREUlaKuJizHcffSrHT+W2+47/2eLFPFy6NCUHD+bxxx/3lkcs\nmVk5M3vVzLJ95xIWvv8moiVZ2gFqS9h5K+LM7Hgze9rMlkW+pphZgaZ+N7MSZtbXzL4ws0/NbL6Z\n1Y51ziJSQIcdRom33uL2I45gzb33MmnSJN8ZRZWZXQXMByoCherrjBR/oyPnr4/NbKmZ3WdmJWKR\nq4gkLy9j4sysJLAIWAa0jCx+CqgFnOWc23qA7Z8A0oHazrmfzawDMBSo5Zzba/p4jSkR8WTFCnbX\nrEmHnTu59umnady4cVzCxnpMnJnNB64DHgCud84V6AOxmRUDlgBpQD3n3EYzqwG8B4x0zt2RzzY6\nf4mkmEQfE9cGOBPo7pzLds5lA92BSsBN+9vQzCoDHYGBzrmfAZxzY4CVQL+YZi0ihVOpEiVmzGCM\nGYNbt+bjfB7RFVJ1nHOrDmK7KsA/gDHOuY0AzrlM4HXgn9FLT0RSga8irjmwOvdJ0Dm3Hvg88rP9\nyQAMmJNn+RygoZkdFsU8i8x3H30qx0/ltvuO/6fY559PiRdf5LZBg7jiiiv44YcfvOUVLUW4NJYV\n+Z6367QEsPvgMwoH338T0ZIs7QC1Jex8FXHVCa6c5bWK4ArdgbbdA6zJs3wlwbx3ZxQ1uWjKzMxU\n/BSMnerx94rdoAHNOnSgU6dONG3alK1b9ztiImk5574CngE6mVkFADNrADQA7veZWzz4/puIlmRp\nB6gtYeeriDsO2JzP8k3AYWZ2yAG23ZbPJ+FNke/HRiG/qPn1118VPwVjp3r8fcXu2bMn1apV4/rr\nryc7O2Vv6mwDzAKWm9n3wIvALc65p/ymFXu+/yaiJVnaAWpL2Pkq4jRKVyQFmRkjR45k/fr19OuX\nekNYzawUMBc4F6jgnCtPcBXuQTP7r8/cRCR8fBVxPwFH5LP8SGCrc27nAbY93PaeBv7IyPefo5Bf\n1KxatUrxUzB2qsffX+ySJUvywgsvMHLkSF599dX4JZUY2gO1gbudcz8AOOc+Av4D3GpmF/hMLtZ8\n/01ES7K0A9SWsPM1xcgsoIpz7uQ8yz8FNjvnau1n2+7AAKCic25NruWPATcCRzvntuXZRlf+RFJM\nPB67ZWbjKNwUIyOATsAJzrkNuZZfBrwCdHLOjcqzjc5fIimoIOew4vFIJB8vAU+aWQXn3GoAMytL\ncPt9j9wrRpZvyDUGbirQH6gPjM+1an3g9bwFHMTnZC4iKWufRVY+56/1ke8VgA25Vq2Q5+d//HKd\nv0RkH3x1p44DPgX+bWZpkQkwBwIrgBE5K0WewrAWGJ6zLHJ310igp5kdG1mvHXAycG+8GiAiEpFv\nkZXf+Yvg3LcZeMjMSkfW+xtwF/AVkHL9yyJy8LwUcc653cClBFOFfB75Kg00yHMlbTOwkeBEmNut\nwBRgfqQL9gagoXPuk1jnLiJiZo+b2UqCeS2dma00sxV5Hp211/krMjfm+cAvwCIz+5igcHuFYALh\nXfFqg4iEn5cxcRI/ZvYOwUDqP40hlKIzs3LAWIIPEHH/QBS2+GY2CfgXkO6cmxfP2OKX/r8kHlLx\n/S4p/5jM7Hgze9rMlkW+pphZ+TjFrmFmo8zsczP7JPJw6/+a2XHxiJ8nl+YEB3TcK3Uza25m88xs\nsZl9Y2aLzKxVHOKea2azcu3/D8zs2hjEKdAD0M2stJkNixyHS83sNTMr8oTUBYlvZn83syFm9llk\nX3xuZuNyJpmNdfw8659LUMAV+VgsTGwzSzezNyLH4fLIfrizqDnEms9zWLQV9lhJVIl0bi8KMzvF\nzB6O/E0sNrMvI+fqy33nVhQ+3++iwcwqmtkWM/son6+j9rmhcy6pvoCSwMfAcwRFajGCcShfAYfH\nIf4ygq7eQyOvTwS+AL4ESsV5PywHXgaygb/FMXYXgi7yCpHXxYGngadiHLci8BvBDS/FIss6Rdrf\nLMqxct6UxgHZ+1lvFjAv5/8e6EMwoP3EWMcn6KabR3DHNsBRkdcbgLLxaH+u9d8GZkT+Ly6K075v\nAXwPVM+1bCAwO5bHYRSOLa/nsBi0p1DHSqJ+Jcq5PQrtuAX4FqgUeW0ENwtmFfVv02ObvL3fRbEN\nFYE5hd0uGa/EtSF4dFd351y2cy4b6A5UAm6KQ/zsSOztAM65tcAg4FQgnp90OgMLgUVxjImZVSSY\nAuZWF7nz2DmXRTBwe/i+t4yKywnmHxwS+X/HOfckwdM8ov1w8QM+AN3MLgX+H9DbObcjsrgvkAbc\nE+v4BJ9IH3B/PGj9N+ABgqeeXBeH+ACYWQZBIfJCEWMWOLaZHQE8QbDvc4+VHUDiP97K9zks2gp8\nrCS4RDm3F9V3wP3OuRXw+3OA/03wN3qFz8SKwMv7XSJIxiKuObA690nDObee4MpQ8zjEr57zx5FL\nzhO/y8QhPmZ2DEHR1JN93DkXQ60JPtHNzr3QOfeDc25JjGPv9XDxyKTQaUT54eKRE9+BNAd2Ae/m\n2m43wZWJIh2LBYzf1Dk3O8+yqByLBYxPZKD/QKArUToWCxi7GXAMwSfz3Nv+5px7Jxp5xJDvc1hU\nFfRYCQHv5/ZocM79z+39iLec7rof451PUXl+v/MuGYu46sDKfJavIvh0G1ORq055nUZwVaRIg7kL\noTcw0Tn3bZzi5VaL4JPe5WY2JzJ+5D0zax+H2JMJujzuM7PDI1PX3ENQwA2OQ/y8qgNr8zkmVgFl\nYz2WZj/HIgSPfoqHzsBHzrkP4hQvRy1gJ3Cymb0aGb+0xMzujhwXiczrOUzylyDn9qiLjLUcDiwh\n9r0lseDz/S7ayprZRDNbGBmr+LSZVdvfBr4m+42l4whu7c9rE3CYmR3i9v9Yr6gyszSgAzDaOfd1\nHOKdClxNMHGyDydFvh4ArnTOrY0MbH7OzE5wzvWPVWDn3GYzu5hg7M1PwBaCqRwaO+cyYxV3P/Z3\nLAIcS5BnPN1IMCl23it0UWdmRwPdCAqqeDuJ4Pw2jmA85DIzu4hgXN6pBPshUSXUOUzyF+9ze7SZ\n2SnAawTd9DOBDOfcFr9ZFU4CvN9F0x6C3qQhzrmPIkNCHgMWmlk959zi/DZK9E+kByPRLt33Irgi\ncEec4v0bGOCcy+9NIB5KAYcC90bGjOCcewmYBtxjZofGKrCZVSYYE7GSYDD/Xwg+pb1pZi1jFTcs\nzKwtcDrBmKt46AU842k8VCmCbvQhzrllAC6Y1mQU0CEydjNRJdo5TPIX73N7VDnnvnHO/Z2gK3U5\n8LEFE1SHie/3u6hxzn3rnKvugmcpE2nT/wFbCW48yVcyFnE/EQxuz+tIYGucr8K1I7hD7rKcwbAx\njlcXqEowoHuvH8c6fsRmgjehvFe+MoHDCIqIWOlL8P98e86NBM655wg+bY6wP0/EGg/7OxYBfo5X\nImbWkODqaMPI+KpYxzsFaAk8lN+PYx2fP65k5XccGnB2HHI4WAlzDpP8xfvcHkvOuc3OuS4Ej3x7\n3Hc+BZUg73cxFXkf+wy4cF/rJGN36ifkf2n1ZIJHfcWFmbUG7iR4CkW8uswuIbj6sCgYzw/ACZHv\nM81sF9DTORfLR/ssA/7B3h8Q9kS+x/KDw5nAd/m8yS0nGOheMfLvePkEOMfMiucZT3MysC5ex4WZ\nXULwOLuGcez2qQ/sAObkOhaPiXwfbWZbgMfyGWAdLcuAK/FzHBZVQpzDJH+ezu1RY2alct0tn9tn\nQHMzKxG5ASvRJcL7XdSY2ZHA9nz2/R72c75K5BPZwXoJqJB7QlMLHkJdBXgxHglYMKltN+Bi59yG\nyLImZtYxlnGdc/c75/7unDsr54s/PqVcFlkW6wN6euR79TzLqwHbgKUxjL0eODEyViW3CgTTA8Tq\nzqt9dX+9SHCn7O9dFGZWMvI6msfi/iYbvhh4kuD//6vIsnPMrHcs4zvnRjvnTs5zLObE7BBZFo0C\nbl9t399x6IB8x5ckCO/nsBgKdVexr3N7lL1qZvld2akI/BaSAi5R3u+iaSh57j6PvF+cCXy4r42S\nsYgbR/Bp9d9mlha5E20gsILgakRMmdl1BONuxgENzaxV5A+/KcHkkPFmeb7H2nME49Luj3yywMzq\nEByc/WLc9fAYQZdTn5wFZlYfyAAmOed+jVHcfPetc+4Ngq7cvrnGAt5LcLdsNG/w2NcD2BsQFDPP\nAOfnOhavIriqE9P4+1kvmsfivvb9AmAq0NWCRz5hZqcT3NAwOsHnLRuHx3NYjIW2mysBz+0HywEP\nRqbmwAK3AecSFBJhFu/3u2hywN1mdgL8fuPMIIIb4B7c91YJMFNxtL+A4wmeEPAlf8yyXT5OsX8m\nuPyZnedrD8HEo/HaB80IBvhvjMT+FlgRp9hHAyOB1ZH9/zHB1Zd4xG5IMEfd5wTdUpkEA4+LRznO\n45H9uzmyf1cSvMmWyLPe4cCwyLH4OUFRd3o84hNMGbCvY7FIT88oaPsj654b+fmPkXV/iKx7UE+t\nKMS+LwX8J/LzLyJf3Yg8MzqRv3yew2LQlgIfK4n8lSjn9ii0oxbwFMEHhY8ifxfvAC1951aENnl7\nv4tiG6oRXIjIjHx9B7wO1NvfdhbZWERERERCJBm7U0VERESSnoo4ERERkRBSESciIiISQiriRERE\nREJIRZyIiIhICKmIExEREQkhFXEiIiIiIaQiTkRERCSEVMSJiIiIhJCKOBEREZEQUhEnIiIiEkIq\n4kRERERCSEWciIiISAipiBMREREJoeK+ExCJJjM7FLgV2AGcBzwBXAjUBHo75z73mJ6IyD7p/CWF\nZc453zmIRI2ZdQMec85tN7P/AZuA9sDPQAvn3BteExQR2Qedv6SwdCVOkoaZGTDfObc9sqgycKdz\nLgs4yl9mIiL7p/OXHAxdiZOkZGblgZXA0c65rb7zEREpKJ2/pKB0Y4MkFTPLOaYvBpbknADNrI6/\nrEREDkznLyksFXGSNMysBbA28rIZ8FVkeWmglq+8REQOROcvORjqTpWkYWYXAncCC4H3Ce7yehs4\nDBjunNvhMT0RkX3S+UsOhoo4ERERkRBSd6qIiIhICKmIExEREQkhFXEiIiIiIaQiTkRERCSEVMSJ\niIiIhJCKOBEREZEQUhEnIiIiEkIq4kRERERCSEWciIiISAipiBMREREJof8Pe6cegU7kETIAAAAA\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(10,6))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler[:idx_ground_euler], y_euler[:idx_ground_euler], 'k-', label='Euler')\n", + "pyplot.plot(x_rk2[:idx_ground_rk2], y_rk2[:idx_ground_rk2], 'r--', label='RK2')\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_rk2[idx_ground_rk2-1]))\n", + "pyplot.legend();\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler, y_euler, 'k-', label='Euler')\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From far away, the Euler and RK2 methods seem to be producing similar answers. However, if we take a closer look, small differences become evident. Keep in mind that we are solving the same equation and both methods will converge to the same solution as we refine the grid. However, they converge to that solution at different rates: RK2 gets more accurate faster, as you make $\\Delta t$ smaller." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Grid-convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we want to do a grid-convergence study with RK2, to see if we indeed observe the expected rate of convergence. It is always an important step in a numerical solution to investigate whether the method is behaving the way we expect it to: this needs to be confirmed experimentally for every new problem we solve and for every new method we apply!\n", + "\n", + "In the code below, a `for`-loop computes the solution on different time grids, with the coarsest and finest grid differing by 100x. We can use the difference between solutions to investigate convergence, as before." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for-loop to compute the solution on different grids\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once those runs are done, we compute the difference between each numerical solution and the fine-grid solution." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# compute diffgrid\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "for i, dt in enumerate(dt_values):\n", + "\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now we plot!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nicaKFSu44YYbWLVqFR9//HHU4UgBmUymza7Dqqy9lhRJb+kkfdpm0qUpfxdffDGTJk3iuOOO449/\n/GPU4VQs6bkLe/aaiEjNNDc3M2XKFMyMa665JupwpEJq6RSR9JaOSByMGDGCX/3qV5x++un86le/\nijocKYFaOiISW4cffji9e/fm6quvjjoUCYGKToql+VmBJEhL/i666CKam5vp27dv1KGEJi25y6cq\nRcfMZlfjviKSTttsU9FEW6kjpeynE2QTt0nu3rWSwOqBmfn48eM1ZVpEpAQtU6YnTJgQfMFPbeKm\niQQiIuWodCLB+8BRwODcayjwMnAHMILspm1H5/77DmAx2U3fpM6luV85CZKav08++YR7772XjRsT\ntcDJpyQ1d6UopaP0L+7+RMsbM5tEdhO3+/NcO93MTia7idvvQopRRFLkrrvu4vzzz+f444/noYce\nijocCZk2cStC3WsitbVmzRoGDhzIkiVLuOeee/j2t78ddUgSQNjP6ewCFJsk0BXYKcB9RSTlbrnl\nFpYsWcLBBx/Mt771rajDkSrQJm4pluZ+5SRIWv7ef/99Jk6cCMA111xDu3axn4tUUNJyV44gk98v\nAR4nu4nbUmAp2WnSPYCewCqgIawARSQdpk6dygcffMBRRx3FMcccE3U4UiWB1l4zs32AnwDHAZ1z\nh1cDTcA4d58bWoQR0piOSO1s2rSJe+65h/32249DDjkk6nCkAsXGdLSJWxF6OFREpHShPBwahJmd\n4e6xXw426S2dpO/pkXTKX3wlPXdRrDJ9Q5XuKyIiMVbKMjiNwM7uPir3vpnia7EZ0NvdO4QVZFSS\n3tIREamGisZ0zOxtYEdgF3dfa2brgafb+MzD3b1ToGjriIqOSPW4O8OHD+dLX/oSF154IZ06xf5X\nhuRUWnR6AB3d/c3c+6Xu3rONr2nzmjhIetFJer9y0sU9fzNnzuS4445jp512YuHChXTtGvuF6UsW\n99y1paIxHXdf1lJwcjqa2VQz+1qRL/t+uUGKSHps2rSJyy+/HIAxY8akquCkXZC11zYB04Hr3P2V\nqkRVJ5Le0hGJyvTp0znjjDPo3bs38+bNU9dawoT6nI6ZLXP3HqFEVudUdETCt379evbdd1+am5u5\n4447OPfcc6MOSUIW9pTpV8ysVxsfeFeA+0qNpXn9pySIa/5WrFhB79692X///TnzzDOjDicScc1d\n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\nzP8H50NbGbioopAAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot using the matplotlib function loglog()\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel(r'$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.xlim(1e-4,1)\n", + "pyplot.ylim(1e-4,1)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='--', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is looking good! The difference relative to our fine-grid solution is decreasing with the mesh size at a faster rate than in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), but *how much faster?* When we computed the observed order of convergence with Euler's method, we got a value close to 1—it's a first-order method. Can you guess what we'll get now with RK2?\n", + "\n", + "To compute the observed order of convergence, we use three grid resolutions that are refined at a constant rate, in this case $r=2$. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 1.983\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " ### call rk2_step() ###\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probably you're not too surprised to see that the observed order of convergence is close to $2$. Because we used a second-order method! This means that the numerical solution is converging with the grid resolution twice as fast compared with Euler's method in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), or in other words, the error scales as ${\\mathcal O}(\\Delta t^2)$. That is a lot faster! However, we are paying a price here: second-order Runge-Kutta requires more computations per iteration." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge task" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How much longer does it take to get the solution with RK2, compared to Euler's method? Run the same solution (same time grid, same parameters), but find a way to *time* the calculation with Python, and compare the runtimes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multi-step methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The screencast *\"Euler's method is a first-order method\"* motivated graphically an idea to get increased accuracy: using intermediate points between $u_{n}$ and $u_{n+1}$ and evaluating the right-hand side of the differential equation at those intermediate points. The idea is to somehow get a better approximation using more data from the function $f(u)$.\n", + "\n", + "Another way to bring more information about $f(u)$ into the numerical solution is to look at time data $t\\lt t_{n}$. For example, we can involve in the calculation of the solution $u_{n+1}$ the known solution at $u_{n-1}$, in addition to $u_{n}$. Schemes that use this idea are called _multi-step methods_.\n", + "\n", + "\n", + "A classical multi-step method achieves second order by applying a _centered difference_ approximation of the derivative $u'$:\n", + "\n", + "$$ u'(t) \\approx \\frac{u_{n+1} - u_{n-1}}{2\\Delta t}.$$\n", + "\n", + "Isolate the future value of the solution $u_{n+1}$ and apply the differential equation $u'=f(u)$, to get the following formula for this method:\n", + "\n", + "$$ u_{n+1} = u_{n-1} + 2\\Delta t \\, f(u_n),$$\n", + "\n", + "This scheme is known as the **leapfrog method**. Notice that it is using the right-hand side of the differential equation, $f(u)$, evaluated at the _midpoint_ between $u_{n-1}$ and $u_{n+1}$, where the time interval between these two solutions is $2\\Delta t$. Why is it called \"leapfrog\"? If you imagine for a moment all of the _even_ indices $n$ of the numerical solution, you notice that these solution values are computed using the slope estimated from _odd_ values $n$, and vice-versa.\n", + "\n", + "Let's define a function that computes the numerical solution using the leapfrog method:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def leapfrog_step(unm1, u, f, dt):\n", + " \"\"\"Returns the solution time-step n+1) using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " unm1 : array of float\n", + " solution at time-step n-1.\n", + " u : array of float\n", + " solution at time-step n.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at time-step n+1.\n", + " \"\"\"\n", + " return unm1 + 2.0*dt*f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But wait ... what will we do at the _initial_ time step, when we don't have information for $u_{n-1}$? This is an issue with all multi-step methods: we say that they are _not self-starting_. In the first time step, we need to use another method to get the first \"kick\"—either Euler's method or 2nd-order Runge Kutta could do: let's use RK2, since it's also second order.\n", + "\n", + "For this calculation, we are going to re-enter the model parameters in the code cell below, so that later on we can experiment here using the leapfrog method and different starting values. At the end of this notebook, we'll give you some other model parameters to try that will create a very interesting situation!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude\n", + "\n", + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# set initial conditions\n", + "u_leapfrog = numpy.empty((N, 4))\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_leapfrog[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "# first step using RK2\n", + "u_leapfrog[1] = rk2_step(u_leapfrog[0], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we have all the required information to loop in time using the leapfrog method. The code cell below calls the leapfrog function for each time step." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for loop to call the function leapfrog_step()\n", + "for n in range(1,N-1):\n", + " \n", + " u_leapfrog[n+1] = leapfrog_step(u_leapfrog[n-1], u_leapfrog[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like before, we extract from the solution array the information about the glider's position in time and find where it reaches the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the glider position in time\n", + "x_leapfrog = u_leapfrog[:,2]\n", + "y_leapfrog = u_leapfrog[:,3]\n", + "\n", + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_leapfrog = numpy.where(y_leapfrog<0.0)[0]\n", + "\n", + "if len(idx_negative_leapfrog)==0:\n", + " idx_ground_leapfrog = N-1\n", + " print ('The glider has not reached the ground yet!')\n", + "else:\n", + " idx_ground_leapfrog = idx_negative_leapfrog[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the glider's trajectory with both the leapfrog and RK2 methods, we find that the solutions are very close to each other now: we don't see the differences that were apparent when we compared Euler's method and RK2." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nz6bl5ZdTu3btDKbcO/nLlrHoxBMpW7069WbMgAMO8B1JpMTQiVMhFaYeE2WJLxNZKlasmNAJVCXt\ndUlUmLKUZGaGVaoEL7/MotataTtoEPuMHOk71i7t2LGDhfPmwQMPkHPyyaw85xzm3XtvZAvUqP+e\naHwlg4pUEQ8uv/xyAF544QU2bNjgOY1IMZix/003sWr0aCrVqQPAokWLWLp0qedg/2vx55+z9YQT\n2DJhAsycSaUePbjgwgt9xxKR3dDhfhFPmjdvzowZM3jyySd3Fq2SXUry4f5dcc7RqlUrunfvzmWX\nXZaGZImbN28eBx10ENWqVQNg+LXXctTFF3NSs2Zec4mUZDrcL5IFrrzySgAee+wx9EeURMXmzZtp\n06YNPXv2BMDl5/P4gw+yZcuWjGd58sknue+++3Y+7vHooypQRbKIitQMClOPibLEl8ksF1xwAbVr\n12bBggW8//77XrPsibJIoipUqMDdd99NqVKlAPho6FC63HorZQcNgm+/Zfv27Wn7o2zJ4sW82LMn\nDBoEwB133LHL651GfR5pfNkt6uNLlIpUEU/Kli3LFVdcAcCjjz7qOY1IelRq2ZIlw4Zha9bAUUex\nqmlThrVtC+vXF/tr79ixg1defhlmzYKbbuKIM87guJEjWVe5MgC1a9fm3nvvLfb3ERE/1JMq4tH3\n33/PwQcfzLZt21i2bBmHH36470iSBPWkJumnn3iyQwfO3rqVOtdeC927c+ONN9KoUSO6desGwKxZ\nszjooIOoWbMmACtWrKBGjRpUjhWegwcP5oorrqBy5co455hdrhyN69ShTJcucOGFvL9mDc1btKBc\nuXKpzS4iKaGeVJEsccABB9ClSxecczz22GO+44ik13770WfGDA749FPo3h2AadOmkZubu/Mpq889\nFzvrLOjaFS6+mJUnncSmDh3giy8AePPNN/n000+B4M3us1tuYdGbb8K990KTJrQ5/XQVqCIRoSI1\ng8LUY6Is8fnIcs011wDw3HPPsb7QIdCS/rrsSpiySPJycnIoXbr0zscTJkygWaGTmb5o3ZqtffpA\nhw7QqROLjz6anzp02Hk90xtuuGHnXlaAy+++m8Z7cUOMqM8jjS+7RX18iSq956eISDodd9xxtGzZ\nkmnTpjF8+HCuvvpq35FEMqborUhvKXJDgCu6dPmfx+eee27aM4lIOKgnVSQExowZwwUXXMARRxzB\n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\nB0lEQVTo/D9EAVodDt65OwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(11,8))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls='-', lw=2)\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_leapfrog[idx_ground_leapfrog-1]), fontsize=18);\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls=':', lw=2)\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about the observed order of convergence? We'll repeat the process we have used before, with a grid-refinement ratio $r=2$ ... here we go:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 2.186\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " u[1] = rk2_step(u[0], f, dt)\n", + " for n in range(1, N-1):\n", + " u[n+1] = leapfrog_step(u[n-1], u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical evidence that our calculation with the leapfrog method indeed exhibits second-order convergence, i.e., the method is ${\\mathcal O}(\\Delta t^2)$. _The leapfrog method is a second-order method_. Good job!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### But chew on this ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Go back to the cell that re-enters the model parameters, just above the leapfrog-method time loop, and change the following: the initial height `y0` to 25, and the final time `T` to 36. Now re-run the leapfrog calculation and the two code cells below that, which extract the glider's position and plot it.\n", + "\n", + "_What is going on?_\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tobies, R. \"Iris Runge: A life at the crossroads of mathematics, science and industry,\" Springer Basel, 1st ed. (2012). [Read on Google books, page 73](http://books.google.com/books?id=EDm0eQqFUQ4C&lpg=PA73&dq=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&pg=PA73#v=onepage&q=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&f=false)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/01_phugoid/README.md b/01_phugoid/README.md new file mode 100644 index 0000000..c7c2701 --- /dev/null +++ b/01_phugoid/README.md @@ -0,0 +1,43 @@ +#Module 1: The phugoid model of glider flight. + +##Summary + +The phugoid model motivates the learning of numerical time integration methods. The model is described by a set of two nonlinear ordinary differential equations, representing the oscillatory trajectory of an aircraft subject to longitudinal perturbations. + +* [Lesson 1](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_01_Phugoid_Theory.ipynb) presents the physics of phugoids in the assumption of zero drag (following Lanchester, 1909). Plotting the flight path gives fascinating curve shapes. +* [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb) develops a single-equation model for zero-drag oscillations, leading to simple harmonic motion. The lesson defines initial-value problems, demonstrates Euler's method, and uses the exact solution to study the numerical convergence. +* [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb) develops the full phugoid model and solves it with (vectorized) Euler's method. In the absence of an exact solution, the study of convergence uses a grid-refinement method, obtaining the observed order of convergence. The lesson ends with the paper-airplane challenge. +* [Lesson 4](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_04_Second_Order_Methods.ipynb) starts with the screencast "Euler's method is a first-order method" and develops second-order methods: explicit midpoint (modified Euler) and Runge-Kutta. It ends with a grid-refinement study. + +##Badge earning + +Completion of this module in the online course platform can earn the learner the Module 1 badge. + +###Description: What does this badge represent? + +The earner completed Module 1 "The phugoid model of glider flight" of the course "Practical Numerical Methods with Python" (a.k.a., numericalmooc). + +###Criteria: What needs to be done to earn it? + +To earn this badge, the learner needs to complete the graded assessment in the course platform including: answering quiz about basic numerical Python commands; answering quiz about basics of initial-value problems; completing the individual coding assignment "Rocket flight" and answering the numeric questions online. Earners should also have completed self-study of the four module lessons, by reading, reflecting on and writing their own version of the codes. This is not directly assessed, but it is assumed. Thus, earners are encouraged to provide evidence of this self-study by giving links to their code repositories or other learning objects they created in the process. + +###Evidence: Website (link to original digital content) + +Desirable: link to the earner's GitHub repository (or equivalent) containing the solution to the "Rocket flight" coding assignment. +Optional: link to the earner's GitHub repository (or equivalent) containing other codes, following the lesson. + +###Category: + +Higher education, graduate + +###Tags: + +engineering, computation, higher education, numericalmooc, python, gwu, george washington university, lorena barba, github + +###Relevant Links: Is there more information on the web? + +[Course About page](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about) + +[Course Wiki](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/wiki/GW.MAE6286.2014_fall/) + +[Course GitHub repo](https://github.com/numerical-mooc/numerical-mooc) diff --git a/01_phugoid/Rocket_Assignment.ipynb b/01_phugoid/Rocket_Assignment.ipynb new file mode 100644 index 0000000..2839d18 --- /dev/null +++ b/01_phugoid/Rocket_Assignment.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Coding Assignment: Rocket" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The equations of motion for a rocket in purely vertical flight are given by\n", + "\n", + "\\begin{align}\n", + "\\frac{dh}{dt} &= v\\\\\n", + "(m_s+m_p) \\frac{dv}{dt}& = -(m_s+m_p)g + \\dot{m}_pv_e - \\frac{1}{2}\\rho v|v|AC_D\n", + "\\end{align}\n", + "\n", + "$h$ is the altitude of the rocket\n", + "\n", + "$m_s = 50kg$ is the weight of the rocket shell\n", + "\n", + "$g = 9.81 \\frac{m}{s^2}$\n", + "\n", + "$\\rho = 1.091 \\frac{kg}{m^3}$ is the average air density (assumed constant throughout flight)\n", + "\n", + "$A = \\pi r^2$ is the maximum cross sectional area of the rocket, where $r = 0.5 m$\n", + "\n", + "$v_e = 325 \\frac{m}{s}$ is the exhaust speed\n", + "\n", + "$C_D = 0.15 $ is the drag coefficient\n", + "\n", + "$m_{po} = 100 kg$ at time $t = 0$ is the initial weight of the rocket propellant\n", + "\n", + "The mass of the remaining propellant is given by:\n", + "\n", + "$$m_p = m_{po} - \\int^t_0 \\dot{m}_p d\\tau$$\n", + "\n", + "where $\\dot{m}_p$ is the time-varying burn rate given by the following figure:\n", + "\n", + "Propellant Burn Rate\n", + "\n", + "![burn rate](./burn.rate.png)\n", + "\n", + "Using Euler's method with a timestep of $\\Delta t=0.1s$, create a Python script to calculate the altitude and velocity of the rocket from launch until crash down. \n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assessment:\n", + "\n", + "To check your answers, you can register for [MAE 6286: Practical Numerical Methods with Python](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about).\n", + "\n", + "1. At time $t=3.2s$, what is the mass (in kg) of rocket propellant remaining in the rocket?\n", + "\n", + "2. What is the maximum speed of the rocket in $\\frac{m}{s}$?\n", + " At what time does this occur (in seconds)? \n", + " What is the altitude at this time (in meters)? \n", + " \n", + "3. What is the rocket's maximum altitude during flight (in meters)? At what time (in seconds) does this occur?\n", + "\n", + "4. At what time (in seconds) does the rocket impact the ground? What is the velocity of the rocket (in $\\frac{m}{s}$) at time of impact?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivation of the rocket equations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In case you are kind of confused about the rocket equations, here we show how to get to them. \n", + "\n", + "Newton's second law states that the acceleration of the vehicle times its mass is equal to all the forces acting on it. Therefore,\n", + "\n", + "\\begin{equation}\n", + "(m_s + m_p)\\frac{d\\bf{v}}{dt}=\\sum {\\bf F}.\n", + "\\end{equation}\n", + "In the above formula we have assumed that the propellant inside the rocket and the rocket move at the same velocity (in other words, their relative velocity is negligible). \n", + "\n", + "Two of the external forces acting on the rocket are,\n", + "\n", + "\\begin{align}\n", + "{\\bf F}_g&= (m_s+m_p)\\bf{g} \\quad (\\rm{Gravity}),\\\\\n", + "{\\bf F}_d&= - \\frac{1}{2} \\rho_a \\mathbf{v} |\\mathbf{v}| A C_D \\quad (\\rm{Drag}).\n", + "\\end{align}\n", + "\n", + "We also need to consider the force resulting from the ejection of the propellant. During an interval $dt$, the engine of the rocket ejects downwards a mass of propellant given by $\\dot m_p dt$. Relative to the rocket, the speed of the ejected burning gas is assumed constant and equal to $v_e$ (the exhaust speed). The momentum variation induced on the exhaust gas by the engine during that interval is therefore, $d{\\bf p}_{gas} = \\dot m_p {\\bf v}_e dt$. Again using Newton's second law we conclude that the force applied by the rocket on the gas is,\n", + "\n", + "\\begin{align}\n", + "{\\bf F}_{rocket\\rightarrow gas} = \\frac{d{\\bf p}_{gas}}{dt} = \\dot m_p {\\bf v}_e\n", + "\\end{align}\n", + "\n", + "Using Newton's third law (|action| = |reaction|), the force exerted by the exhaust gas on the rocket is then,\n", + "\n", + "\\begin{align}\n", + "{\\bf F}_{gas\\rightarrow rocket} = -{\\bf F}_{rocket\\rightarrow gas} = -\\dot m_p {\\bf v}_e\n", + "\\end{align}\n", + "\n", + "If we collect all the forces acting on the rocket we finally have:\n", + "\n", + "\\begin{align}\n", + "(m_s + m_p)\\frac{d\\bf{v}}{dt}=(m_s+m_p){\\bf g}- \\frac{1}{2} \\rho_a \\mathbf{v} |v| A C_D -\\dot m_p {\\bf v}_e\n", + "\\end{align}\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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 +} diff --git a/01_phugoid/burn.rate.png b/01_phugoid/burn.rate.png new file mode 100644 index 0000000..d2cd935 Binary files /dev/null and b/01_phugoid/burn.rate.png differ diff --git a/01_phugoid/figures/glider_forces-lesson3.png b/01_phugoid/figures/glider_forces-lesson3.png new file mode 100644 index 0000000..6d73dd7 Binary files /dev/null and b/01_phugoid/figures/glider_forces-lesson3.png differ diff --git a/01_phugoid/figures/glider_forces.png b/01_phugoid/figures/glider_forces.png new file mode 100644 index 0000000..ac036d5 Binary files /dev/null and b/01_phugoid/figures/glider_forces.png differ diff --git a/01_phugoid/figures/glider_forces_fbd.svg b/01_phugoid/figures/glider_forces_fbd.svg new file mode 100644 index 0000000..47a1d34 --- /dev/null +++ b/01_phugoid/figures/glider_forces_fbd.svg @@ -0,0 +1,465 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trajectory + + + + + + + + + + + + diff --git a/01_phugoid/figures/glider_forces_nodrag.png b/01_phugoid/figures/glider_forces_nodrag.png new file mode 100644 index 0000000..969042c Binary files /dev/null and b/01_phugoid/figures/glider_forces_nodrag.png differ diff --git a/01_phugoid/figures/glider_forces_nodrag.svg b/01_phugoid/figures/glider_forces_nodrag.svg new file mode 100644 index 0000000..00942f4 --- /dev/null +++ b/01_phugoid/figures/glider_forces_nodrag.svg @@ -0,0 +1,368 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trajectory + diff --git a/01_phugoid/figures/oscillatory_trajectory.png b/01_phugoid/figures/oscillatory_trajectory.png new file mode 100644 index 0000000..6e7dca9 Binary files /dev/null and b/01_phugoid/figures/oscillatory_trajectory.png differ diff --git a/01_phugoid/figures/rocket_CV.png b/01_phugoid/figures/rocket_CV.png new file mode 100644 index 0000000..5686f4f Binary files /dev/null and b/01_phugoid/figures/rocket_CV.png differ diff --git a/01_phugoid/figures/vonKarman-phugoids.png b/01_phugoid/figures/vonKarman-phugoids.png new file mode 100644 index 0000000..e3c6414 Binary files /dev/null and b/01_phugoid/figures/vonKarman-phugoids.png differ diff --git a/01_phugoid/phugoid.py b/01_phugoid/phugoid.py new file mode 100755 index 0000000..0f99fd6 --- /dev/null +++ b/01_phugoid/phugoid.py @@ -0,0 +1,112 @@ +# Script to plot the flight path of the phugoid using Lanchester's model. +# It uses the sign convention and formulae provided by Milne-Thomson (1958). + +import numpy +from matplotlib import pyplot + +numpy.seterr(all='ignore') +''' +see http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html for explanation. ignore over/underflow errors that pop up in the radius_of_curvature function +''' + +def radius_of_curvature(z, zt, C): + """Returns the radius of curvature of the flight path at any point. + + Parameters + --------- + z : float + current depth below the reference horizontal line. + zt : float + initial depth below the reference horizontal line. + C : float + constant of integration. + + Returns + ------- + radius : float + radius of curvature. + """ + return zt / (1/3 - C/2*(zt/z)**1.5) + +def rotate(x, z, xCenter, zCenter, angle): + """Returns the new position of the point. + + Parameters + --------- + x : float + previous x-position of the point + z : float + previous z-position of the point. + xCenter : float + x-location of the center of rotation. + zCenter : float + z-location of the center of rotation. + angle : float + angle of rotation + + Returns + ------- + xCenter_new : float + new x-location of the center of rotation. + zCenter_new : float + new z-location of the center of rotation. + """ + dx = x - xCenter + dz = z - zCenter + # the following formulae take into account the orientation of the axes + xNew = dx*numpy.cos(angle) + dz*numpy.sin(angle) + zNew = -dx*numpy.sin(angle) + dz*numpy.cos(angle) + return xCenter + xNew, zCenter + zNew + +def plot_flight_path(zt, z0, theta0): + """Plots the flight path. + + Parameters + --------- + zt : float + trim height of the glider. + z0 : float + initial height of the glider. + theta0 : float + initial orientation of the glider. + + Returns + ------- + None : None + """ + # arrays to store the coordinates of the flight path + N = 1000 + z = numpy.zeros(N) + x = numpy.zeros(N) + + # set initial conditions + z[0] = z0 + x[0] = 0. + theta = theta0 + + # calculate the constant C + C = (numpy.cos(theta) - 1/3*z[0]/zt)*(z[0]/zt)**.5 + # incremental distance along the flight path + ds = 1 + + #obtain the curve coordinates + for i in range(1,N): + # minus sign for the second coordinate because the z-axis points downwards + normal = numpy.array([numpy.cos(theta+numpy.pi/2.), -numpy.sin(theta+numpy.pi/2.)]) + R = radius_of_curvature(z[i-1], zt, C) + center = numpy.array([x[i-1]+normal[0]*R, z[i-1]+normal[1]*R]) + dtheta = ds/R + x[i], z[i] = rotate(x[i-1], z[i-1], center[0], center[1], dtheta) + theta = theta + dtheta + + # generate a plot + pyplot.figure(figsize=(10,6)) + pyplot.plot(x, -z, color = 'k', ls='-', lw=2.0, label="$z_t=\ %.1f,\\,z_0=\ %.1f,\\,\\theta_0=\ %.2f$" % (zt, z[0], theta0)) + pyplot.axis('equal') + pyplot.title("Flight path for $C$ = %.3f" % C, fontsize=18) + pyplot.xlabel("$x$", fontsize=18) + pyplot.ylabel("$z$", fontsize=18) + pyplot.legend() + pyplot.show() + +# End of File diff --git a/HW3/README.md b/HW3/README.md new file mode 100644 index 0000000..45214a4 --- /dev/null +++ b/HW3/README.md @@ -0,0 +1,73 @@ +# Homework #3 +## due 2/15/17 by 11:59pm + + +1. Create a new github repository called 'roots_and_optimization'. + + a. Add rcc02007 and pez16103 as collaborators. + + b. Clone the repository to your computer. + + c. Copy your `projectile.m` function into the 'roots_and_optimization' folder. + *Disable the plotting routine for the solvers* + + d. Use the four solvers `falsepos.m`, `bisect.m`, `newtraph.m` and `mod_secant.m` + to solve for the angle needed to reach h=1.72 m, with an initial speed of 15 m/s. + + e. The `newtraph.m` function needs a derivative, calculate the derivative of your + function with respect to theta, `dprojectile_dtheta.m`. This function should + output d(h)/d(theta). + + + f. In your `README.md` file, document the following under the heading `# + Homework #3`: + + i. Compare the number of iterations that each function needed to reach an + accuracy of 0.00001%. Include a table in your README.md with: + + ``` + | solver | initial guess(es) | ea | number of iterations| + | --- | --- | --- | --- | + |falsepos | | | | + |bisect | | | | + |newtraph | | | | + |mod_secant | | | | + ``` + + ii. Compare the convergence of the 4 methods. Plot the approximate error vs the + number of iterations that the solver has calculated. Save the plot as + `convergence.png` and display the plot in your `README.md` with: + + `![Plot of convergence for four numerical solvers.](convergence.png)` + + iii. In the `README.md` provide a description of the files used to create the + table and the convergence plot. + +2. The Newton-Raphson method and the modified secant method do not always converge to a +solution. One simple example is the function f(x) = x*exp(-x^2). The root is at 0, but +using the numerical solvers, `newtraph.m` and `mod_secant.m`, there are certain initial +guesses that do not converge. + + a. Calculate the first 5 iterations for the Newton-Raphson method with an initial + guess of x_i=2 for f(x)=x*exp(-x^2). + + b. Add the results to a table in the `README.md` with: + + ``` + ### divergence of Newton-Raphson method + + | iteration | x_i | approx error | + | --- | --- | --- | + | 0 | 2 | n/a | + | 1 | | | + | 2 | | | + | 3 | | | + | 4 | | | + | 5 | | | + ``` + + c. Repeat steps a-b for an initial guess of 0.2. (But change the heading from + 'divergence' to 'convergence') + +3. Commit your changes to your repository. Sync your local repository with github. Then +copy and paste the "clone URL" into the following Google Form [Homework 3](https://goo.gl/forms/UJBGwp0fQcSxImkq2) diff --git a/HW4/README.md b/HW4/README.md new file mode 100644 index 0000000..4a06ed0 --- /dev/null +++ b/HW4/README.md @@ -0,0 +1,37 @@ +# Homework #4 +## due 3/1/17 by 11:59pm + + +1. Use your repository 'roots_and_optimization'. Document all the HW4 work under the +heading `# Homework #4` in your `README.md` file + + a. Create a function called 'collar_potential_energy' that computes the total + potential energy of a collar connected to a spring and sliding on a rod. As shown in + the figure given a position, xc, and angle, theta: + + ![Collar-mass on an inclined rod](collar_mass.png) + + The spring is unstretched when x_C=0.5 m. The potential energy due to gravity is: + + PE_g=m x_C\*g\*sin(theta) + + where m=0.5 kg, and g is the acceleration due to gravity, + + and the potential energy due to the spring is: + + PE_s=1/2\*K \*(DL)^2 + + where DL = 0.5 - sqrt(0.5^2+(0.5-x_C)^2) and K=30 N/m. + + b. Use the `goldmin.m` function to solve for the minimum potential energy at xc when + theta=0. *create an anonymous function with `@(x) collar_potential_energy(x,theta)` in + the input for goldmin. Be sure to include the script that solves for xc* + + c. Create a for-loop that solves for the minimum potential energy position, xc, at a + given angle, theta, for theta = 0..90 degrees. + + d. Include a plot of xc vs theta. `plot(theta,xc)` with + + `![Steady-state position of collar on rod at angle theta](plot.png)` + +3. Commit your changes to your repository. Sync your local repository with github. diff --git a/HW4/collar_mass.png b/HW4/collar_mass.png new file mode 100644 index 0000000..f9b2836 Binary files /dev/null and b/HW4/collar_mass.png differ diff --git a/HW4/collar_mass.svg b/HW4/collar_mass.svg new file mode 100644 index 0000000..cc18c3d --- /dev/null +++ b/HW4/collar_mass.svg @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + xc + + + + + + + + 𝝷 + + + L0=0.5m + + diff --git a/HW5/README.html b/HW5/README.html new file mode 100644 index 0000000..96595a9 --- /dev/null +++ b/HW5/README.html @@ -0,0 +1,53 @@ + + + + + + + + + + + +

Homework #5

+

due 3/28/17 by 11:59pm

+

Include all work as either an m-file script, m-file function, or example code included with ``` and document your code in the README.md file

+
    +
  1. Create a new github repository called ‘linear_algebra’.

    +
      +
    1. Add rcc02007 and pez16103 as collaborators.

    2. +
    3. Clone the repository to your computer.

    4. +
  2. +
  3. Create an LU-decomposition function called lu_tridiag.m that takes 3 vectors as inputs and calculates the LU-decomposition of a tridiagonal matrix. The output should be 3 vectors, the diagonal of the Upper matrix, and the two off-diagonal vectors of the Lower and Upper matrices.

    +

    [ud,uo,lo]=lu_tridiag(e,f,g);

  4. +
  5. Use the output from lu_tridiag.m to create a forward substitution and back-substitution function called solve_tridiag.m that provides the solution of Ax=b given the vectors from the output of [ud,uo,lo]=lu_tridiag(e,f,g). Note: do not use the backslash solver \, create an algebraic solution

    +

    x=solve_tridiag(ud,uo,lo,b);

  6. +
  7. Test your function on the matrices A3, A4, …, A10 generated with test_arrays.m Solving for b=ones(N,1); where N is the size of A. In your README.md file, compare the norm of the error between your result and the result of AN.

  8. +
+
| size of A | norm(error) |
+|-----------|-------------|
+|  3 | ... |
+| 4 | ... |
+
+Spring-mass system for analysis +

Spring-mass system for analysis

+
+
    +
  1. In the system shown above, determine the three differential equations for the position of masses 1, 2, and 3. Solve for the vibrational modes of the spring-mass system if k1=10 N/m, k2=k3=20 N/m, and k4=10 N/m. The masses are m1=1 kg, m2=2 kg and m3=4 kg. Determine the eigenvalues and natural frequencies.

  2. +
  3. The curvature of a slender column subject to an axial load P (Fig. P13.10) can be modeled by

  4. +
+

\(\frac{d^{2}y}{dx^{2}} + p^{2} y = 0\)

+

where \(p^{2} = \frac{P}{EI}\)

+

where E = the modulus of elasticity, and I = the moment of inertia of the cross section about its neutral axis.

+

This model can be converted into an eigenvalue problem by substituting a centered finite-difference approximation for the second derivative to give \(\frac{y_{i+1} − 2y_{i} + y_{i−1} }{\Delta x^{2}}+ p^{2} y_{i}\)

+

where i = a node located at a position along the rod’s interior, and \(\Delta x\) = the spacing between nodes. This equation can be expressed as \(y_{i−1} − (2 − \Delta x^{2} p^{2} )y_{i} + y_{i+1} = 0\) Writing this equation for a series of interior nodes along the axis of the column yields a homogeneous system of equations. (See 13.10 for 4 interior-node example)

+

Determine the eigenvalues for a 5-segment (4-interior nodes), 6-segment (5-interior nodes), and 10-segment (9-interior nodes). Using the modulus and moment of inertia of a pole for pole-vaulting ( http://people.bath.ac.uk/taf21/sports_whole.htm) E=76E9 Pa, I=4E-8 m^4, and L= 5m.

+

Include a table in the README.md that shows the following results: What are the largest and smallest eigenvalues for the beam? How many eigenvalues are there?

+
| # of segments | largest | smallest | # of eigenvalues |
+| --- | --- | --- | --- |
+| 5 | ... | ... | ... |
+| 6 | ... | ... | ... |
+| 10 | ... | ... | ... |
+

If the segment length approaches 0, how many eigenvalues would there be?

+ + diff --git a/HW5/README.md b/HW5/README.md new file mode 100644 index 0000000..a8495ea --- /dev/null +++ b/HW5/README.md @@ -0,0 +1,83 @@ +# Homework #5 +## due 3/28/17 by 11:59pm + +*Include all work as either an m-file script, m-file function, or example code included +with \`\`\` and document your code in the README.md file* + +1. Create a new github repository called 'linear_algebra'. + + a. Add rcc02007 and pez16103 as collaborators. + + b. Clone the repository to your computer. + +2. Create an LU-decomposition function called `lu_tridiag.m` that takes 3 vectors as inputs +and calculates the LU-decomposition of a tridiagonal matrix. The output should be 3 +vectors, the diagonal of the Upper matrix, and the two off-diagonal vectors of the Lower +and Upper matrices. + + ```[ud,uo,lo]=lu_tridiag(e,f,g);``` + +3. Use the output from `lu_tridiag.m` to create a forward substitution and +back-substitution function called `solve_tridiag.m` that provides the solution of +Ax=b given the vectors from the output of [ud,uo,lo]=lu_tridiag(e,f,g). *Note: do not use +the backslash solver `\`, create an algebraic solution* + + ```x=solve_tridiag(ud,uo,lo,b);``` + +4. Test your function on the matrices A3, A4, ..., A10 generated with `test_arrays.m` +Solving for `b=ones(N,1);` where N is the size of A. In your `README.md` file, compare +the norm of the error between your result and the result of AN\b. + +``` +| size of A | norm(error) | +|-----------|-------------| +| 3 | ... | +| 4 | ... | +``` + +![Spring-mass system for analysis](spring_mass.png) + +5. In the system shown above, determine the three differential equations for the position +of masses 1, 2, and 3. Solve for the vibrational modes of the spring-mass system if k1=10 +N/m, k2=k3=20 N/m, and k4=10 N/m. The masses are m1=1 kg, m2=2 kg and m3=4 kg. Determine +the eigenvalues and natural frequencies. + +6. The curvature of a slender column subject to an axial load P (Fig. P13.10) can be +modeled by + +$\frac{d^{2}y}{dx^{2}} + p^{2} y = 0$ + +where $p^{2} = \frac{P}{EI}$ + +where E = the modulus of elasticity, and I = the moment of inertia of the cross section +about its neutral axis. + +This model can be converted into an eigenvalue problem by +substituting a centered finite-difference approximation for the second derivative to give +$\frac{y_{i+1} -2y_{i} + y_{i-1} }{\Delta x^{2}}+ p^{2} y_{i}$ + +where i = a node located at a position along the rod’s interior, and $\Delta x$ = the +spacing between nodes. This equation can be expressed as $y_{i-1} - (2 - \Delta x^{2} +p^{2} )y_{i} y_{i+1} = 0$ Writing this equation for a series of interior nodes along the +axis of the column yields a homogeneous system of equations. (See 13.10 for 4 +interior-node example) + +Determine the eigenvalues for a 5-segment (4-interior nodes), 6-segment (5-interior +nodes), and 10-segment (9-interior nodes). Using the modulus and moment of inertia of a +pole for pole-vaulting ( +[http://people.bath.ac.uk/taf21/sports_whole.htm](http://people.bath.ac.uk/taf21/sports_whole.htm)) +E=76E9 Pa, I=4E-8 m^4, and L= 5m. + +Include a table in the `README.md` that shows the following results: +What are the largest and smallest eigenvalues for the beam? How many eigenvalues are +there? + +``` +| # of segments | largest | smallest | # of eigenvalues | +| --- | --- | --- | --- | +| 5 | ... | ... | ... | +| 6 | ... | ... | ... | +| 10 | ... | ... | ... | +``` + +If the segment length ($\Delta x$) approaches 0, how many eigenvalues would there be? diff --git a/HW5/README.pdf b/HW5/README.pdf new file mode 100644 index 0000000..fdb31a3 Binary files /dev/null and b/HW5/README.pdf differ diff --git a/HW5/lu_tridiag.m b/HW5/lu_tridiag.m new file mode 100644 index 0000000..1339973 --- /dev/null +++ b/HW5/lu_tridiag.m @@ -0,0 +1,12 @@ +function [ud,uo,lo]=lu_tridiag(e,f,g);``` + % lu_tridiag calculates the components for LU-decomposition of a tridiagonal matrix + % given its off-diagonal vectors, e and g + % and diagonal vector f + % the output is + % the diagonal of the Upper matrix, ud + % the off-diagonal of the Upper matrix, uo + % and the off-diagonal of the Lower matrix, lo + % note: the diagonal of the Lower matrix is all ones + +end + diff --git a/HW5/solve_tridiag.m b/HW5/solve_tridiag.m new file mode 100644 index 0000000..0c9e510 --- /dev/null +++ b/HW5/solve_tridiag.m @@ -0,0 +1,11 @@ +function x=solve_tridiag(ud,uo,lo,b);``` + % solve_tridiag solves Ax=b for x + % given + % the diagonal of the Upper matrix, ud + % the off-diagonal of the Upper matrix, uo + % the off-diagonal of the Lower matrix, lo + % the vector b + % note: the diagonal of the Lower matrix is all ones + +end + diff --git a/HW5/spring_mass.png b/HW5/spring_mass.png new file mode 100644 index 0000000..274c049 Binary files /dev/null and b/HW5/spring_mass.png differ diff --git a/HW5/spring_mass.svg b/HW5/spring_mass.svg new file mode 100644 index 0000000..b854162 --- /dev/null +++ b/HW5/spring_mass.svg @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + x1 + x2 + x3 + + + + + m1 + m2 + m3 + k1 + k2 + k3 + k4 + + diff --git a/HW5/test_arrays.m b/HW5/test_arrays.m new file mode 100644 index 0000000..002d79c --- /dev/null +++ b/HW5/test_arrays.m @@ -0,0 +1,8 @@ +rand("seed",1); + +for i = 3:10 + e=sort(randi(6,[i-1,1])); + f=sort(randi(10,[i,1])); + g=sort(randi(9,[i-1,1])); + eval(['A',int2str(i),'=diag(f)+diag(e,-1)+diag(g,1);']); +end diff --git a/HW6/.~lock.Primary_Energy_monthly.csv# b/HW6/.~lock.Primary_Energy_monthly.csv# new file mode 100644 index 0000000..eef216f --- /dev/null +++ b/HW6/.~lock.Primary_Energy_monthly.csv# @@ -0,0 +1 @@ +,ryan,fermi,31.03.2017 16:47,file:///home/ryan/.config/libreoffice/4; \ No newline at end of file diff --git a/HW6/README.md b/HW6/README.md new file mode 100644 index 0000000..c72ba05 --- /dev/null +++ b/HW6/README.md @@ -0,0 +1,88 @@ +# Homework #6 +## due 4/14 by 11:59pm + + +0. Create a new github repository called 'curve_fitting'. + + a. Add rcc02007 and pez16103 as collaborators. + + b. Clone the repository to your computer. + + +1. Create a least-squares function called `least_squares.m` that accepts a Z-matrix and +dependent variable y as input and returns the vector of best-fit constants, a, the +best-fit function evaluated at each point $f(x_{i})$, and the coefficient of +determination, r2. + +```matlab +[a,fx,r2]=least_squares(Z,y); +``` + + Test your function on the sets of data in script `problem_1_data.m` and show that the + following functions are the best fit lines: + + a. y=0.3745+0.98644x+0.84564/x + + b. y=-11.4887+7.143817x-1.04121 x^2+0.046676 x^3 + + c. y=4.0046e^(-1.5x)+2.9213e^(-0.3x)+1.5647e^(-0.05x) + + +2. Use the Temperature and failure data from the Challenger O-rings in lecture_18 +(challenger_oring.csv). Your independent variable is temerature and your dependent +variable is failure (1=fail, 0=pass). Create a function called `cost_logistic.m` that +takes the vector `a`, and independent variable `x` and dependent variable `y`. Use the +function, $\sigma(t)=\frac{1}{1+e^{-t}}$ where $t=a_{0}+a_{1}x$. Use the cost function, + + $J(a_{0},a_{1})=1/m\sum_{i=1}^{n}\left[-y_{i}\log(\sigma(t_{i}))-(1-y_{i})\log((1-\sigma(t_{i})))\right]$ + + and gradient + + $\frac{\partial J}{\partial a_{i}}= + 1/m\sum_{k=1}^{N}\left(\sigma(t_{k})-y_{k}\right)x_{k}^{i}$ + + where $x_{k}^{i} is the k-th value of temperature raised to the i-th power (0, and 1) + + a. edit `cost_logistic.m` so that the output is `[J,grad]` or [cost, gradient] + + b. use the following code to solve for a0 and a1 + +```matlab +% Set options for fminunc +options = optimset('GradObj', 'on', 'MaxIter', 400); +% Run fminunc to obtain the optimal theta +% This function will return theta and the cost +[theta, cost] = ... +fminunc(@(a)(costFunction(a, x, y)), initial_a, options); +``` + + c. plot the data and the best-fit logistic regression model + +```matlab +plot(x,y, x, sigma(a(1)+a(2)*x)) +``` + +3. The vertical stress under a corner of a rectangular area subjected to a uniform load of +intensity $q$ is given by the solution of the Boussinesq's equation: + + $\sigma_{z} = + \frac{q}{4\pi}\left(\frac{2mn\sqrt{m^{2}+n^{2}+1}}{m^{2}+n^{2}+1+m^{2}n^{2}}\frac{m^{2}+n^{2}+2}{m^{2}+n^{2}+1}+sin^{-1}\left(\frac{2mn\sqrt{m^{2}+n^{2}+1}}{m^{2}+n^{2}+1+m^{2}n^{2}}\right)\right)$ + + Typically, this equation is solved as a table of values where: + + $\sigma_{z}=q f(m,n)$ + + where $f(m,n)$ is the influence value, q is the uniform load, m=a/z, n=b/z, a and b are + width and length of the rectangular area and z is the depth below the area. + + a. Finish the function `boussinesq_lookup.m` so that when you enter a force, q, + dimensions of rectangular area a, b, and depth, z, it uses a third-order polynomial + interpolation of the four closest values of m to determine the stress in the vertical + direction, sigma_z=$\sigma_{z}$. Use a $0^{th}$-order, polynomial interpolation for + the value of n (i.e. round to the closest value of n). + + b. Copy the `boussinesq_lookup.m` to a file called `boussinesq_spline.m` and use a + cubic spline to interpolate in two dimensions, both m and n, that returns sigma_z. + + + diff --git a/HW6/README.pdf b/HW6/README.pdf new file mode 100644 index 0000000..12116b0 Binary files /dev/null and b/HW6/README.pdf differ diff --git a/HW6/boussinesq_lookup.m b/HW6/boussinesq_lookup.m new file mode 100644 index 0000000..004c91c --- /dev/null +++ b/HW6/boussinesq_lookup.m @@ -0,0 +1,22 @@ +function sigma_z=boussinesq_lookup(q,a,b,z) + % function that determines stress under corner of an a by b rectangular platform + % z-meters below the platform. The calculated solutions are in the fmn data + % m=fmn(:,1) + % in column 2, fmn(:,2), n=1.2 + % in column 3, fmn(:,2), n=1.4 + % in column 4, fmn(:,2), n=1.6 + + fmn= [0.1,0.02926,0.03007,0.03058 + 0.2,0.05733,0.05894,0.05994 + 0.3,0.08323,0.08561,0.08709 + 0.4,0.10631,0.10941,0.11135 + 0.5,0.12626,0.13003,0.13241 + 0.6,0.14309,0.14749,0.15027 + 0.7,0.15703,0.16199,0.16515 + 0.8,0.16843,0.17389,0.17739]; + + m=a/z; + n=b/z; + + %... +end diff --git a/HW6/cost_logistic.m b/HW6/cost_logistic.m new file mode 100644 index 0000000..169718f --- /dev/null +++ b/HW6/cost_logistic.m @@ -0,0 +1,27 @@ +function [J, grad] = cost_logistic(a, x, y) +% cost_logistic Compute cost and gradient for logistic regression +% J = cost_logistic(theta, X, y) computes the cost of using theta as the +% parameter for logistic regression and the gradient of the cost +% w.r.t. to the parameters. + +% Initialize some useful values +N = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; +grad = zeros(size(theta)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of a. +% Compute the partial derivatives and set grad to the partial +% derivatives of the cost w.r.t. each parameter in theta +% +% Note: grad should have the same dimensions as theta +% + + + +% ============================================================= + +end + diff --git a/HW6/problem_1_data.m b/HW6/problem_1_data.m new file mode 100644 index 0000000..3606608 --- /dev/null +++ b/HW6/problem_1_data.m @@ -0,0 +1,15 @@ + +% part a +xa=[1 2 3 4 5]'; +ya=[2.2 2.8 3.6 4.5 5.5]'; + +% part b + +xb=[3 4 5 7 8 9 11 12]'; +yb=[1.6 3.6 4.4 3.4 2.2 2.8 3.8 4.6]'; + +% part c + +xc=[0.5 1 2 3 4 5 6 7 9]'; +yc=[6 4.4 3.2 2.7 2.2 1.9 1.7 1.4 1.1]'; + diff --git a/README.md b/README.md index 8059993..cc10ff0 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Jupiter notebook (with matlab or octave kernel) ### Note on Homework and online forms -The Homeworks are graded based upon effort and completeness. The forms are not graded at +The Homeworks are graded based upon effort, correctness, and completeness. The forms are not graded at all, if they are completed you get credit. It is *your* responsibility to make sure your answers are correct. Use the homeworks and forms as a study guide for the exams. In general, I will not post homework solutions. @@ -74,15 +74,15 @@ general, I will not post homework solutions. |3|1/31||Consistent Coding habits| | |2/2|5|Root Finding| |4|2/7|6|Root Finding con’d| -| |2/9|7|Optimization| -|5|2/14||Intro to Linear Algebra| +| |2/9|7| **Snow Day**| +|5|2/14|| Optimization | | |2/16|8|Linear Algebra| |6|2/21|9|Linear systems: Gauss elimination| | |2/23|10|Linear Systems: LU factorization| -|7|2/28||Midterm Review| -| |3/2||Midterm| -|8|3/7|11|Linear Systems: Error analysis| -| |3/9|13|Eigenvalues| +|7|2/28|11|Linear Systems: Error analysis| +| |3/2|12|Eigenvalues| +|8|3/7|1-10 |Midterm Review| +| |3/9|1-10|Midterm| |9|3/14| N/A |Spring Break!| | |3/16| N/A |Spring Break!| |10|3/21|12|Linear Systems: Iterative methods| diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000..7a034c6 Binary files /dev/null and b/README.pdf differ diff --git a/final_project/README.md b/final_project/README.md new file mode 100644 index 0000000..7a7b0ac --- /dev/null +++ b/final_project/README.md @@ -0,0 +1,103 @@ +# ME 3255 - Final Project +## Due May 1 by 11:59pm + +In this project you are going to solve for the shape of a beam under different loading +conditions. The shape of the beam varies along the x-axis and as a function of time. + +Notes: Label the plots with legends, x- and y-axis labels and make sure the plots are easy +to read (you can use the `setdefaults.m` script we have used in class). All functions +should have a help file and your README.md should describe each file in your repository +and provide a description of each problem and each solution (use `#`-headings in your file +to show the start of new problems) + +You will be graded both on documentation and implementation of the solutions. + +![Diagram of beam and loading conditions](beam.png) + +We will use the Euler-Bernoulli beam equation to describe the shape of the beam, the +differential equation that governs the solution is: + +$\frac{\partial^4 w}{\partial x^4}-\frac{P}{EI}\frac{\partial^2 w}{\partial +x^2}+\frac{\rho A}{EI}\frac{\partial^2 w}{\partial t^2}=q(x)$ (1) + +Where w(x,t) is the displacement of the beam away from the neutral axis as a function of +position along the beam, x, and time, t, P is the transverse loading of the beam, E is the +Young's modulus, I is the second moment of Inertia of the beam, $\rho$ is the density, A +is the cross-sectional area, and q(x) is the transverse distributed load (for a uniform +pressure, it is the applied pressure times the width of the beam, in units of +force/length). + +We can separate the function $w(x,t)=w(x)e^{i\omega t}$, now equation (1) becomes + +$\left(\frac{\partial^4 w}{\partial x^4}-\frac{P}{EI}\frac{\partial^2 w}{\partial +x^2}-\frac{\rho A \omega^{2}}{EI}w\right)e^{i\omega t}=\frac{q(x)}{EI}$ (2) + +For the simply-supported beam shown in Figure 1, the boundary conditions are: + +$w(0)=w(L)=0$ + +$w''(0)=w''(L)=0$ + +The material is aluminum, E=70 GPa, $\rho$=2700 kg/m$^3$. The bar is 1-m-long with a base +width, b=0.1 m, and height, h=0.01 m, and the second moment of inertia, +I=$\frac{bh^3}{12}$. + +1. Analytically solve for the shape of the beam if q(x)=cst, P=0, and $\omega$=0 and +create a function called `shape_simple_support.m` that returns the displacement w(x) given +q and x + +``` +w=shape_simple_support(x,q); +``` + +a. Plot q vs the maximum deflection, $\delta x$, of the beam + +b. Use a Monte Carlo model to determine the mean and standard deviation for the +maximum deflection $\delta x$ if b and h are normally distributed random variables +with 0.1 % standard deviations at q=50 N/m. + +2. Now use the central difference approximation to set up a system of equations for the +beam for q(x)=cst, P=0, and $\omega=0$. Use the boundary conditions with a numerical +differentiation to determine the valuea of the end points + + a. set up the system of equations for 6 segments as a function of q + + b. set up the system of equations for 10 segments as a function of q + + c. set up the system of equations for 20 segments as a function of q + + d. solve a-c for q=1,10,20,30,50 and plot the numerical results of q vs $\delta x$ + + e. Comment on the results from the analytical and numerical approaches (if you used + functions then provide help files, if you used scripts, then describe the steps used) + +3. Now set up the system of equations using a central difference method if P>0 and +$\omega=0$ + + a. set up the system of equations for 6 segments as a function of q and P + + b. set up the system of equations for 10 segments as a function of q and P + + c. set up the system of equations for 20 segments as a function of q and P + + d. solve a-c for q=1,10,20,30,50 and plot the numerical results of q vs $\delta x$ for + P=0, 100, 200, 300 (4 lines, labeled as P=0,P=100,...) + +4. Now set up an eigenvalue problem to solve for the natural frequencies of the simply +supported beam if P=0 and q=0. + + a. set up the system of equations for 6 segments + + b. set up the system of equations for 10 segments + + c. set up the system of equations for 20 segments + + d. solve for the natural frequencies ($\omega_{1}$, $\omega_{2}$,...) + + e. Plot the shape of the beam for the first 3 natural frequencies + +5. (Bonus 5pt) Create a function to return the system of equations for the eigenvalue +problem as a function of P, if P>0. Then, plot the lowest natural frequency vs the applied +load P. + + diff --git a/final_project/beam.png b/final_project/beam.png new file mode 100644 index 0000000..271d614 Binary files /dev/null and b/final_project/beam.png differ diff --git a/final_project/beam.svg b/final_project/beam.svg new file mode 100644 index 0000000..b02b62d --- /dev/null +++ b/final_project/beam.svg @@ -0,0 +1,615 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + q(x) + P + P + + + w(x) + + + x + y + + diff --git a/final_project/final_project.pdf b/final_project/final_project.pdf new file mode 100644 index 0000000..7c6fa9e Binary files /dev/null and b/final_project/final_project.pdf differ diff --git a/final_project/rubric.md b/final_project/rubric.md new file mode 100644 index 0000000..08248bd --- /dev/null +++ b/final_project/rubric.md @@ -0,0 +1,27 @@ +# Grading Rubric + +| Component | Grade | Description | +| --------- |------ |--------------------------------- | +|Solutions | 50 % | Problems are solved correctly and solution makes sense | +|Documentation| 30 % | All files have comments and all functions have help files | +|Problem Statements | 10% | Descriptions of each problem and the approach | +|Team Work | 10% | Each group member made commits to repository| +|Github Bonus | 5% | If a group member opens an [issue](https://guides.github.com/features/issues/) and you commit code to close it| + +The Documentation and Problem Statements will be assessed based upon the included m-files +and the main README.md documentation. This is a final report, so make sure the README.md +is easy to understand with headers (`#`, `##`, ...) to start each problem and sub-problem. + +The Solutions will be graded based upon correctness and the approach. The plots will be +graded based upon the axis labels, titles, legend, correctness, and design. +If you are asked to solve for a value, you can choose to put it in a table or in a +paragraph, but it must be easy to read/understand. + +The Team Work section is meant to demonstrate working knowledge of Github (now as a +collaborative project). If everyone makes commits to the project, then you will receive +credit. + +The Github Bonus requires extra reading. Create an issue and tag your group member. That +group member can then respond and *fix* the issue with a commit. This is a bonus 5pts (on +an individual basis, for everyone to get credit, everyone in the group would need to close +an issue) diff --git a/lecture_01/lecture_01.ipynb b/lecture_01/lecture_01.ipynb new file mode 100644 index 0000000..307bc0c --- /dev/null +++ b/lecture_01/lecture_01.ipynb @@ -0,0 +1,366 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Freefall Model\n", + "## Octave solution (will run same on Matlab)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "set (0, \"defaultaxesfontname\", \"Helvetica\")\n", + "set (0, \"defaultaxesfontsize\", 18)\n", + "set (0, \"defaulttextfontname\", \"Helvetica\")\n", + "set (0, \"defaulttextfontsize\", 18) \n", + "set (0, \"defaultlinelinewidth\", 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define time from 0 to 12 seconds" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "t =\n", + "\n", + " 0\n", + " 2\n", + " 4\n", + " 6\n", + " 8\n", + " 10\n", + " 12\n", + "\n" + ] + } + ], + "source": [ + "t=[0,2,4,6,8,10,12]'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define constants and analytical solution (meters-kilogram-sec)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "v_analytical =\n", + "\n", + " 0.00000\n", + " 18.61630\n", + " 32.45521\n", + " 40.64183\n", + " 44.84646\n", + " 46.84974\n", + " 47.77002\n", + "\n" + ] + } + ], + "source": [ + "c=0.25; m=60; g=9.81; v_terminal=sqrt(m*g/c);\n", + "\n", + "v_analytical = v_terminal*tanh(g*t/v_terminal)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "v_numerical =\n", + "\n", + " 0.00000\n", + " 19.62000\n", + " 36.03213\n", + " 44.83284\n", + " 47.70298\n", + " 48.35986\n", + " 48.49089\n", + "\n" + ] + } + ], + "source": [ + "v_numerical=zeros(length(t),1);\n", + "for i=1:length(t)-1\n", + " v_numerical(i+1)=v_numerical(i)+(g-c/m*v_numerical(i)^2)*2;\n", + "end\n", + "v_numerical" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display time, velocity (analytical) and velocity (numerical)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time (s)|vel analytical (m/s)|vel numerical (m/s)\n", + "-----------------------------------------------\n", + " 0.0 | 0.00 | 0.00\n", + " 2.0 | 18.62 | 19.62\n", + " 4.0 | 32.46 | 36.03\n", + " 6.0 | 40.64 | 44.83\n", + " 8.0 | 44.85 | 47.70\n", + " 10.0 | 46.85 | 48.36\n", + " 12.0 | 47.77 | 48.49\n" + ] + } + ], + "source": [ + "fprintf('time (s)|vel analytical (m/s)|vel numerical (m/s)\\n')\n", + "fprintf('-----------------------------------------------')\n", + "M=[t,v_analytical,v_numerical];\n", + "fprintf('%7.1f | %18.2f | %15.2f\\n',M(:,1:3)');" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t12\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(t,v_analytical,'-',t,v_numerical,'o-')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_01/octave-workspace b/lecture_01/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_01/octave-workspace differ diff --git a/lecture_02/.ipynb_checkpoints/lecture_02-checkpoint.ipynb b/lecture_02/.ipynb_checkpoints/lecture_02-checkpoint.ipynb new file mode 100644 index 0000000..e34d82f --- /dev/null +++ b/lecture_02/.ipynb_checkpoints/lecture_02-checkpoint.ipynb @@ -0,0 +1,594 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solution to Form #1" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 14\r\n" + ] + } + ], + "source": [ + "[1,2,3]*[1;2;3]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "[1,2,3]*[1;2;3]=?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The first source of error is roundoff error\n", + "## Just storing a number in a computer requires rounding" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "realmax = 1.79769313486231570815e+308\n", + "realmin = 2.22507385850720138309e-308\n", + "maximum relative error = 2.22044604925031308085e-16\n" + ] + } + ], + "source": [ + "fprintf('realmax = %1.20e\\n',realmax)\n", + "fprintf('realmin = %1.20e\\n',realmin)\n", + "fprintf('maximum relative error = %1.20e\\n',eps)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1\r\n" + ] + } + ], + "source": [ + "s=1;\n", + "for i=1:1000\n", + " s=s+eps/10;\n", + "end\n", + "s==1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Freefall Model (revisited)\n", + "## Octave solution (will run same on Matlab)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Set default values in Octave for linewidth and text size" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "set (0, \"defaultaxesfontname\", \"Helvetica\")\n", + "set (0, \"defaultaxesfontsize\", 18)\n", + "set (0, \"defaulttextfontname\", \"Helvetica\")\n", + "set (0, \"defaulttextfontsize\", 18) \n", + "set (0, \"defaultlinelinewidth\", 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define time from 0 to 12 seconds with `N` timesteps \n", + "function defined as `freefall`" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function [v_analytical,v_terminal,t]=freefall(N)\n", + " t=linspace(0,12,N)';\n", + " c=0.25; m=60; g=9.81; v_terminal=sqrt(m*g/c);\n", + "\n", + " v_analytical = v_terminal*tanh(g*t/v_terminal);\n", + " v_numerical=zeros(length(t),1);\n", + " delta_time =diff(t);\n", + " for i=1:length(t)-1\n", + " v_numerical(i+1)=v_numerical(i)+(g-c/m*v_numerical(i)^2)*delta_time(i);\n", + " end\n", + " % Print values near 0,2,4,6,8,10,12 seconds\n", + " indices = round(linspace(1,length(t),7));\n", + " fprintf('time (s)|vel analytical (m/s)|vel numerical (m/s)\\n')\n", + " fprintf('-----------------------------------------------\\n')\n", + " M=[t(indices),v_analytical(indices),v_numerical(indices)];\n", + " fprintf('%7.1f | %18.2f | %15.2f\\n',M(:,1:3)');\n", + " plot(t,v_analytical,'-',t,v_numerical,'o-')\n", + "end\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time (s)|vel analytical (m/s)|vel numerical (m/s)\n", + "-----------------------------------------------\n", + " 0.0 | 0.00 | 0.00\n", + " 2.0 | 18.76 | 18.82\n", + " 4.0 | 32.64 | 32.80\n", + " 6.1 | 40.79 | 40.97\n", + " 8.0 | 44.80 | 44.94\n", + " 10.0 | 46.84 | 46.93\n", + " 12.0 | 47.77 | 47.82\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t12\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[v_analytical,v_terminal,t]=freefall(120);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Types of error\n", + "## Freefall is example of \"truncation error\"\n", + "### Truncation error results from approximating exact mathematical procedure" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We approximated the derivative as $\\delta v/\\delta t\\approx\\Delta v/\\Delta t$\n", + "\n", + "Can reduce error by decreasing step size -> $\\Delta t$=`delta_time`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Another example of truncation error is a Taylor series (or Maclaurin if centered at a=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Taylor series:\n", + "$f(x)=f(a)+f'(a)(x-a)+\\frac{f''(a)}{2!}(x-a)^{2}+\\frac{f'''(a)}{3!}(x-a)^{3}+...$\n", + "\n", + "We can approximate the next value in a function by adding Taylor series terms:\n", + "\n", + "|Approximation | formula |\n", + "|---|-------------------------|\n", + "|$0^{th}$-order | $f(x_{i+1})=f(x_{i})+R_{1}$ |\n", + "|$1^{st}$-order | $f(x_{i+1})=f(x_{i})+f'(x_{i})h+R_{2}$ |\n", + "|$2^{nd}$-order | $f(x_{i+1})=f(x_{i})+f'(x_{i})h+\\frac{f''(x_{i})}{2!}h^{2}+R_{3}$|\n", + "|$n^{th}$-order | $f(x_{i+1})=f(x_{i})+f'(x_{i})h+\\frac{f''(x_{i})}{2!}h^{2}+...\\frac{f^{(n)}}{n!}h^{n}+R_{n}$|\n", + "\n", + "Where $R_{n}=\\frac{f^{(n+1)}(\\xi)}{(n+1)!}h^{n+1}$ is the error associated with truncating the approximation at order $n$.\n", + "\n", + "The $n^{th}$-order approximation estimates that the unknown function, $f(x)$, is equal to an $n^{th}$-order polynomial. \n", + "\n", + "In the Freefall example, we estimated the function with a $1^{st}$-order approximation, so \n", + "\n", + "$v(t_{i+1})=v(t_{i})+v'(t_{i})(t_{i+1}-t_{i})+R_{1}$\n", + "\n", + "$v'(t_{i})=\\frac{v(t_{i+1})-v(t_{i})}{t_{i+1}-t_{i}}-\\frac{R_{1}}{t_{i+1}-t_{i}}$\n", + "\n", + "$\\frac{R_{1}}{t_{i+1}-t_{i}}=\\frac{v''(\\xi)}{2!}(t_{i+1}-t_{i})$\n", + "\n", + "or the truncation error for a first-order Taylor series approximation is\n", + "\n", + "$\\frac{R_{1}}{t_{i+1}-t_{i}}=O(\\Delta t)$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. digital representation of a number is rarely exact\n", + "\n", + "2. arithmetic (+,-,/,\\*) causes roundoff error" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.14159265358979311600\n", + "3.14159274101257324219\n" + ] + } + ], + "source": [ + "fprintf('%1.20f\\n',double(pi))\n", + "fprintf('%1.20f\\n',single(pi))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_02/lecture_02.ipynb b/lecture_02/lecture_02.ipynb index 3e0a9e6..e34d82f 100644 --- a/lecture_02/lecture_02.ipynb +++ b/lecture_02/lecture_02.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -18,15 +18,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "ans =\n", - "\n", - " 1 2 3\n", - "\n" + "ans = 14\r\n" ] } ], "source": [ - "[1,2,3]" + "[1,2,3]*[1;2;3]" ] }, { diff --git a/lecture_02/octave-workspace b/lecture_02/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_02/octave-workspace differ diff --git a/lecture_04/lecture_4.ipynb b/lecture_04/lecture_4.ipynb new file mode 100644 index 0000000..7ba7af7 --- /dev/null +++ b/lecture_04/lecture_4.ipynb @@ -0,0 +1,913 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## When using the command prompt, anything in your path or working directory can be run either as a script, function or class (to define objects)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Questions from last class:\n", + "- I downloaded GitHub to my desktop but I cannot sign into my UConn account like I can online. \n", + "- I checked my grades on HuskyCt recently and I received a 0 / 100 for Homework 1.\n", + "- It is very hard to tell if what I'm doing on github is right or wrong.\n", + "- How often will be using our laptops during the lecture?\n", + "- How many frogs would it take to move a car that is stuck in the snow? And what would be the approximate cost to do so\n", + "\n", + "$m_{frog}$=22.7 g (https://en.wikipedia.org/wiki/Common_frog)\n", + "\n", + "$v_{frog}$=17 kph = 4.72 m/s (http://purelyfacts.com/question/14/is-a-toad-faster-than-a-frog?DDA=113&DDB=40)\n", + "\n", + "$m_{car}$=1000 kg (reasonable guess)\n", + "\n", + "conservation of momentum:\n", + "\n", + "$mv_{1} +mv_{2} = mv_{1}'+mv_{2}' = m_{total}v_{2}'$" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number_of_frogs =\n", + "\n", + " 5221\n" + ] + } + ], + "source": [ + "number_of_frogs = 1;\n", + "v2=0;\n", + "while v2 < 0.5 % 0.5 m/s\n", + " m_frogs=number_of_frogs*22.7e-3;\n", + " number_of_frogs=number_of_frogs+1;\n", + " p1=(m_frogs)*4.72; % momentum 1\n", + " v2=p1/(m_frogs+1000); % p2=p1, so v2=p1/m_total\n", + "end\n", + "number_of_frogs\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "That seems better\n" + ] + } + ], + "source": [ + "if 1==2\n", + " fprintf('I dont think so')\n", + "elseif 1==1\n", + " fprintf('That seems better')\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%myscript" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When using the GUI, your command history is saved, but it is better to save your work either as a script or a function or combination of both\n", + "\n", + "Creating a default graph script: `setdefaults.m`\n", + "\n", + "```matlab\n", + "set(0, 'defaultAxesFontSize', 16)\n", + "set(0,'defaultTextFontSize',14)\n", + "set(0,'defaultLineLineWidth',3)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "set(0, 'defaultAxesFontSize', 16)\n", + "set(0,'defaultTextFontSize',14)\n", + "set(0,'defaultLineLineWidth',3)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t_linear=linspace(0,10,100);\n", + "plot(t_linear,t_linear.^2)\n", + "xlabel('time (s)')\n", + "ylabel('displacement (m)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#EOL" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Graphics can be produced with a number of functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2-D plots, 3-D plots, contour plots, 3D contour plots ... " + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Z =\n", + "\n", + " Columns 1 through 7\n", + "\n", + " 0 0.1710 0.2880 0.3570 0.3840 0.3750 0.3360\n", + " -0.1710 0 0.1224 0.2016 0.2430 0.2520 0.2340\n", + " -0.2880 -0.1224 0 0.0840 0.1344 0.1560 0.1536\n", + " -0.3570 -0.2016 -0.0840 0 0.0546 0.0840 0.0924\n", + " -0.3840 -0.2430 -0.1344 -0.0546 0 0.0330 0.0480\n", + " -0.3750 -0.2520 -0.1560 -0.0840 -0.0330 0 0.0180\n", + " -0.3360 -0.2340 -0.1536 -0.0924 -0.0480 -0.0180 0\n", + " -0.2730 -0.1944 -0.1320 -0.0840 -0.0486 -0.0240 -0.0084\n", + " -0.1920 -0.1386 -0.0960 -0.0630 -0.0384 -0.0210 -0.0096\n", + " -0.0990 -0.0720 -0.0504 -0.0336 -0.0210 -0.0120 -0.0060\n", + " 0 0 0 0 0 0 0\n", + " 0.0990 0.0720 0.0504 0.0336 0.0210 0.0120 0.0060\n", + " 0.1920 0.1386 0.0960 0.0630 0.0384 0.0210 0.0096\n", + " 0.2730 0.1944 0.1320 0.0840 0.0486 0.0240 0.0084\n", + " 0.3360 0.2340 0.1536 0.0924 0.0480 0.0180 0.0000\n", + " 0.3750 0.2520 0.1560 0.0840 0.0330 0 -0.0180\n", + " 0.3840 0.2430 0.1344 0.0546 -0.0000 -0.0330 -0.0480\n", + " 0.3570 0.2016 0.0840 0 -0.0546 -0.0840 -0.0924\n", + " 0.2880 0.1224 0 -0.0840 -0.1344 -0.1560 -0.1536\n", + " 0.1710 0.0000 -0.1224 -0.2016 -0.2430 -0.2520 -0.2340\n", + " 0 -0.1710 -0.2880 -0.3570 -0.3840 -0.3750 -0.3360\n", + "\n", + " Columns 8 through 14\n", + "\n", + " 0.2730 0.1920 0.0990 0 -0.0990 -0.1920 -0.2730\n", + " 0.1944 0.1386 0.0720 0 -0.0720 -0.1386 -0.1944\n", + " 0.1320 0.0960 0.0504 0 -0.0504 -0.0960 -0.1320\n", + " 0.0840 0.0630 0.0336 0 -0.0336 -0.0630 -0.0840\n", + " 0.0486 0.0384 0.0210 0 -0.0210 -0.0384 -0.0486\n", + " 0.0240 0.0210 0.0120 0 -0.0120 -0.0210 -0.0240\n", + " 0.0084 0.0096 0.0060 0 -0.0060 -0.0096 -0.0084\n", + " 0 0.0030 0.0024 0 -0.0024 -0.0030 0\n", + " -0.0030 0 0.0006 0 -0.0006 0 0.0030\n", + " -0.0024 -0.0006 0 0 0.0000 0.0006 0.0024\n", + " 0 0 0 0 0 0 0\n", + " 0.0024 0.0006 -0.0000 0 0 -0.0006 -0.0024\n", + " 0.0030 0 -0.0006 0 0.0006 0 -0.0030\n", + " 0 -0.0030 -0.0024 0 0.0024 0.0030 0\n", + " -0.0084 -0.0096 -0.0060 0 0.0060 0.0096 0.0084\n", + " -0.0240 -0.0210 -0.0120 0 0.0120 0.0210 0.0240\n", + " -0.0486 -0.0384 -0.0210 0 0.0210 0.0384 0.0486\n", + " -0.0840 -0.0630 -0.0336 0 0.0336 0.0630 0.0840\n", + " -0.1320 -0.0960 -0.0504 0 0.0504 0.0960 0.1320\n", + " -0.1944 -0.1386 -0.0720 0 0.0720 0.1386 0.1944\n", + " -0.2730 -0.1920 -0.0990 0 0.0990 0.1920 0.2730\n", + "\n", + " Columns 15 through 21\n", + "\n", + " -0.3360 -0.3750 -0.3840 -0.3570 -0.2880 -0.1710 0\n", + " -0.2340 -0.2520 -0.2430 -0.2016 -0.1224 -0.0000 0.1710\n", + " -0.1536 -0.1560 -0.1344 -0.0840 0 0.1224 0.2880\n", + " -0.0924 -0.0840 -0.0546 0 0.0840 0.2016 0.3570\n", + " -0.0480 -0.0330 0.0000 0.0546 0.1344 0.2430 0.3840\n", + " -0.0180 0 0.0330 0.0840 0.1560 0.2520 0.3750\n", + " -0.0000 0.0180 0.0480 0.0924 0.1536 0.2340 0.3360\n", + " 0.0084 0.0240 0.0486 0.0840 0.1320 0.1944 0.2730\n", + " 0.0096 0.0210 0.0384 0.0630 0.0960 0.1386 0.1920\n", + " 0.0060 0.0120 0.0210 0.0336 0.0504 0.0720 0.0990\n", + " 0 0 0 0 0 0 0\n", + " -0.0060 -0.0120 -0.0210 -0.0336 -0.0504 -0.0720 -0.0990\n", + " -0.0096 -0.0210 -0.0384 -0.0630 -0.0960 -0.1386 -0.1920\n", + " -0.0084 -0.0240 -0.0486 -0.0840 -0.1320 -0.1944 -0.2730\n", + " 0 -0.0180 -0.0480 -0.0924 -0.1536 -0.2340 -0.3360\n", + " 0.0180 0 -0.0330 -0.0840 -0.1560 -0.2520 -0.3750\n", + " 0.0480 0.0330 0 -0.0546 -0.1344 -0.2430 -0.3840\n", + " 0.0924 0.0840 0.0546 0 -0.0840 -0.2016 -0.3570\n", + " 0.1536 0.1560 0.1344 0.0840 0 -0.1224 -0.2880\n", + " 0.2340 0.2520 0.2430 0.2016 0.1224 0 -0.1710\n", + " 0.3360 0.3750 0.3840 0.3570 0.2880 0.1710 0\n" + ] + } + ], + "source": [ + "x=linspace(-1,1,21); y=linspace(-1,1,21);\n", + "[X,Y]=meshgrid(x,y);\n", + "Z=(X.*Y.^3-X.^3.*Y)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MESHGRID Cartesian grid in 2-D/3-D space\n", + " [X,Y] = MESHGRID(xgv,ygv) replicates the grid vectors xgv and ygv to \n", + " produce the coordinates of a rectangular grid (X, Y). The grid vector\n", + " xgv is replicated numel(ygv) times to form the columns of X. The grid \n", + " vector ygv is replicated numel(xgv) times to form the rows of Y.\n", + " \n", + " [X,Y,Z] = MESHGRID(xgv,ygv,zgv) replicates the grid vectors xgv, ygv, zgv \n", + " to produce the coordinates of a 3D rectangular grid (X, Y, Z). The grid \n", + " vectors xgv,ygv,zgv form the columns of X, rows of Y, and pages of Z \n", + " respectively. (X,Y,Z) are of size numel(ygv)-by-numel(xgv)-by(numel(zgv).\n", + " \n", + " [X,Y] = MESHGRID(gv) is equivalent to [X,Y] = MESHGRID(gv,gv).\n", + " [X,Y,Z] = MESHGRID(gv) is equivalent to [X,Y,Z] = MESHGRID(gv,gv,gv).\n", + " \n", + " The coordinate arrays are typically used for the evaluation of functions \n", + " of two or three variables and for surface and volumetric plots.\n", + " \n", + " MESHGRID and NDGRID are similar, though MESHGRID is restricted to 2-D \n", + " and 3-D while NDGRID supports 1-D to N-D. In 2-D and 3-D the coordinates \n", + " output by each function are the same, the difference is the shape of the \n", + " output arrays. For grid vectors xgv, ygv and zgv of length M, N and P \n", + " respectively, NDGRID(xgv, ygv) will output arrays of size M-by-N while \n", + " MESHGRID(xgv, ygv) outputs arrays of size N-by-M. Similarly, \n", + " NDGRID(xgv, ygv, zgv) will output arrays of size M-by-N-by-P while \n", + " MESHGRID(xgv, ygv, zgv) outputs arrays of size N-by-M-by-P. \n", + " \n", + " Example: Evaluate the function x*exp(-x^2-y^2) \n", + " over the range -2 < x < 2, -4 < y < 4,\n", + " \n", + " [X,Y] = meshgrid(-2:.2:2, -4:.4:4);\n", + " Z = X .* exp(-X.^2 - Y.^2);\n", + " surf(X,Y,Z)\n", + " \n", + " \n", + " Class support for inputs xgv,ygv,zgv:\n", + " float: double, single\n", + " integer: uint8, int8, uint16, int16, uint32, int32, uint64, int64\n", + " \n", + " See also SURF, SLICE, NDGRID.\n", + "\n", + " Reference page in Doc Center\n", + " doc meshgrid\n", + "\n", + " Other functions named meshgrid\n", + "\n", + " codistributed/meshgrid gpuArray/meshgrid\n" + ] + } + ], + "source": [ + "help meshgrid" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Y =\n", + "\n", + " Columns 1 through 7\n", + "\n", + " -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000\n", + " -0.9000 -0.9000 -0.9000 -0.9000 -0.9000 -0.9000 -0.9000\n", + " -0.8000 -0.8000 -0.8000 -0.8000 -0.8000 -0.8000 -0.8000\n", + " -0.7000 -0.7000 -0.7000 -0.7000 -0.7000 -0.7000 -0.7000\n", + " -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 -0.6000\n", + " -0.5000 -0.5000 -0.5000 -0.5000 -0.5000 -0.5000 -0.5000\n", + " -0.4000 -0.4000 -0.4000 -0.4000 -0.4000 -0.4000 -0.4000\n", + " -0.3000 -0.3000 -0.3000 -0.3000 -0.3000 -0.3000 -0.3000\n", + " -0.2000 -0.2000 -0.2000 -0.2000 -0.2000 -0.2000 -0.2000\n", + " -0.1000 -0.1000 -0.1000 -0.1000 -0.1000 -0.1000 -0.1000\n", + " 0 0 0 0 0 0 0\n", + " 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000\n", + " 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000\n", + " 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000\n", + " 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000\n", + " 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000\n", + " 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000\n", + " 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000\n", + " 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000\n", + " 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000\n", + " 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n", + "\n", + " Columns 8 through 14\n", + "\n", + " -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000\n", + " -0.9000 -0.9000 -0.9000 -0.9000 -0.9000 -0.9000 -0.9000\n", + " -0.8000 -0.8000 -0.8000 -0.8000 -0.8000 -0.8000 -0.8000\n", + " -0.7000 -0.7000 -0.7000 -0.7000 -0.7000 -0.7000 -0.7000\n", + " -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 -0.6000\n", + " -0.5000 -0.5000 -0.5000 -0.5000 -0.5000 -0.5000 -0.5000\n", + " -0.4000 -0.4000 -0.4000 -0.4000 -0.4000 -0.4000 -0.4000\n", + " -0.3000 -0.3000 -0.3000 -0.3000 -0.3000 -0.3000 -0.3000\n", + " -0.2000 -0.2000 -0.2000 -0.2000 -0.2000 -0.2000 -0.2000\n", + " -0.1000 -0.1000 -0.1000 -0.1000 -0.1000 -0.1000 -0.1000\n", + " 0 0 0 0 0 0 0\n", + " 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000\n", + " 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000\n", + " 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000\n", + " 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000\n", + " 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000\n", + " 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000\n", + " 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000\n", + " 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000\n", + " 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000\n", + " 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n", + "\n", + " Columns 15 through 21\n", + "\n", + " -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000\n", + " -0.9000 -0.9000 -0.9000 -0.9000 -0.9000 -0.9000 -0.9000\n", + " -0.8000 -0.8000 -0.8000 -0.8000 -0.8000 -0.8000 -0.8000\n", + " -0.7000 -0.7000 -0.7000 -0.7000 -0.7000 -0.7000 -0.7000\n", + " -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 -0.6000\n", + " -0.5000 -0.5000 -0.5000 -0.5000 -0.5000 -0.5000 -0.5000\n", + " -0.4000 -0.4000 -0.4000 -0.4000 -0.4000 -0.4000 -0.4000\n", + " -0.3000 -0.3000 -0.3000 -0.3000 -0.3000 -0.3000 -0.3000\n", + " -0.2000 -0.2000 -0.2000 -0.2000 -0.2000 -0.2000 -0.2000\n", + " -0.1000 -0.1000 -0.1000 -0.1000 -0.1000 -0.1000 -0.1000\n", + " 0 0 0 0 0 0 0\n", + " 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000\n", + " 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000\n", + " 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000\n", + " 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000\n", + " 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000\n", + " 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000\n", + " 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000\n", + " 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000\n", + " 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000\n", + " 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n" + ] + } + ], + "source": [ + "Y" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "contour(X,Y,Z)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n1gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mesh(X,Y,Z)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[0;31mOperands to the || and && operators must be convertible to logical scalar values.\n", + "\u001b[0m" + ] + } + ], + "source": [ + "pcolor(X,Y,Z)\n", + "colorbar([0 0 0],[1,1,1])" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "COLORMAP Color look-up table.\n", + " COLORMAP(MAP) sets the current figure's colormap to MAP.\n", + " COLORMAP('default') sets the current figure's colormap to\n", + " the root's default, whose setting is PARULA.\n", + " MAP = COLORMAP returns the three-column matrix of RGB triplets defining \n", + " the colormap for the current figure.\n", + " COLORMAP(FIG,...) sets the colormap for the figure specified by FIG.\n", + " COLORMAP(AX,...) sets the colormap for the axes specified by AX. \n", + " Each axes within a figure can have a unique colormap. After you set\n", + " an axes colormap, changing the figure colormap does not affect the axes.\n", + " MAP = COLORMAP(FIG) returns the colormap for the figure specified by FIG.\n", + " MAP = COLORMAP(AX) returns the colormap for the axes specified by AX.\n", + " \n", + " A color map matrix may have any number of rows, but it must have\n", + " exactly 3 columns. Each row is interpreted as a color, with the\n", + " first element specifying the intensity of red light, the second\n", + " green, and the third blue. Color intensity can be specified on the\n", + " interval 0.0 to 1.0.\n", + " For example, [0 0 0] is black, [1 1 1] is white,\n", + " [1 0 0] is pure red, [.5 .5 .5] is gray, and\n", + " [127/255 1 212/255] is aquamarine.\n", + " \n", + " Graphics objects that use pseudocolor -- SURFACE and PATCH objects,\n", + " which are created by the functions MESH, SURF, and PCOLOR -- map\n", + " a color matrix, C, whose values are in the range [Cmin, Cmax],\n", + " to an array of indices, k, in the range [1, m].\n", + " The values of Cmin and Cmax are either min(min(C)) and max(max(C)),\n", + " or are specified by CAXIS. The mapping is linear, with Cmin\n", + " mapping to index 1 and Cmax mapping to index m. The indices are\n", + " then used with the colormap to determine the color associated\n", + " with each matrix element. See CAXIS for details.\n", + " \n", + " Type HELP GRAPH3D to see a number of useful colormaps.\n", + " \n", + " COLORMAP is a function that sets the Colormap property of a figure.\n", + " \n", + " See also HSV, CAXIS, SPINMAP, BRIGHTEN, RGBPLOT, FIGURE, COLORMAPEDITOR.\n", + "\n", + " Reference page in Doc Center\n", + " doc colormap\n" + ] + } + ], + "source": [ + "help colormap" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far, everything has been executed as a script, or calling a built-in function. Now we begin building our own functions.\n", + "\n", + "Functions are saved in memory (or better yet) in a folder in your path or current directory\n", + "\n", + "Example of storing function in memory\n", + "\n", + "$f(x,y) = (xy^{3}-x^{3}y)$" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = \n", + "\n", + " @(x,y)(x.*y.^3-x.^3.*y)\n" + ] + } + ], + "source": [ + "f= @(x,y) (x.*y.^3-x.^3.*y)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " Columns 1 through 7\n", + "\n", + " 0 0.1710 0.2880 0.3570 0.3840 0.3750 0.3360\n", + " -0.1710 0 0.1224 0.2016 0.2430 0.2520 0.2340\n", + " -0.2880 -0.1224 0 0.0840 0.1344 0.1560 0.1536\n", + " -0.3570 -0.2016 -0.0840 0 0.0546 0.0840 0.0924\n", + " -0.3840 -0.2430 -0.1344 -0.0546 0 0.0330 0.0480\n", + " -0.3750 -0.2520 -0.1560 -0.0840 -0.0330 0 0.0180\n", + " -0.3360 -0.2340 -0.1536 -0.0924 -0.0480 -0.0180 0\n", + " -0.2730 -0.1944 -0.1320 -0.0840 -0.0486 -0.0240 -0.0084\n", + " -0.1920 -0.1386 -0.0960 -0.0630 -0.0384 -0.0210 -0.0096\n", + " -0.0990 -0.0720 -0.0504 -0.0336 -0.0210 -0.0120 -0.0060\n", + " 0 0 0 0 0 0 0\n", + " 0.0990 0.0720 0.0504 0.0336 0.0210 0.0120 0.0060\n", + " 0.1920 0.1386 0.0960 0.0630 0.0384 0.0210 0.0096\n", + " 0.2730 0.1944 0.1320 0.0840 0.0486 0.0240 0.0084\n", + " 0.3360 0.2340 0.1536 0.0924 0.0480 0.0180 0.0000\n", + " 0.3750 0.2520 0.1560 0.0840 0.0330 0 -0.0180\n", + " 0.3840 0.2430 0.1344 0.0546 -0.0000 -0.0330 -0.0480\n", + " 0.3570 0.2016 0.0840 0 -0.0546 -0.0840 -0.0924\n", + " 0.2880 0.1224 0 -0.0840 -0.1344 -0.1560 -0.1536\n", + " 0.1710 0.0000 -0.1224 -0.2016 -0.2430 -0.2520 -0.2340\n", + " 0 -0.1710 -0.2880 -0.3570 -0.3840 -0.3750 -0.3360\n", + "\n", + " Columns 8 through 14\n", + "\n", + " 0.2730 0.1920 0.0990 0 -0.0990 -0.1920 -0.2730\n", + " 0.1944 0.1386 0.0720 0 -0.0720 -0.1386 -0.1944\n", + " 0.1320 0.0960 0.0504 0 -0.0504 -0.0960 -0.1320\n", + " 0.0840 0.0630 0.0336 0 -0.0336 -0.0630 -0.0840\n", + " 0.0486 0.0384 0.0210 0 -0.0210 -0.0384 -0.0486\n", + " 0.0240 0.0210 0.0120 0 -0.0120 -0.0210 -0.0240\n", + " 0.0084 0.0096 0.0060 0 -0.0060 -0.0096 -0.0084\n", + " 0 0.0030 0.0024 0 -0.0024 -0.0030 0\n", + " -0.0030 0 0.0006 0 -0.0006 0 0.0030\n", + " -0.0024 -0.0006 0 0 0.0000 0.0006 0.0024\n", + " 0 0 0 0 0 0 0\n", + " 0.0024 0.0006 -0.0000 0 0 -0.0006 -0.0024\n", + " 0.0030 0 -0.0006 0 0.0006 0 -0.0030\n", + " 0 -0.0030 -0.0024 0 0.0024 0.0030 0\n", + " -0.0084 -0.0096 -0.0060 0 0.0060 0.0096 0.0084\n", + " -0.0240 -0.0210 -0.0120 0 0.0120 0.0210 0.0240\n", + " -0.0486 -0.0384 -0.0210 0 0.0210 0.0384 0.0486\n", + " -0.0840 -0.0630 -0.0336 0 0.0336 0.0630 0.0840\n", + " -0.1320 -0.0960 -0.0504 0 0.0504 0.0960 0.1320\n", + " -0.1944 -0.1386 -0.0720 0 0.0720 0.1386 0.1944\n", + " -0.2730 -0.1920 -0.0990 0 0.0990 0.1920 0.2730\n", + "\n", + " Columns 15 through 21\n", + "\n", + " -0.3360 -0.3750 -0.3840 -0.3570 -0.2880 -0.1710 0\n", + " -0.2340 -0.2520 -0.2430 -0.2016 -0.1224 -0.0000 0.1710\n", + " -0.1536 -0.1560 -0.1344 -0.0840 0 0.1224 0.2880\n", + " -0.0924 -0.0840 -0.0546 0 0.0840 0.2016 0.3570\n", + " -0.0480 -0.0330 0.0000 0.0546 0.1344 0.2430 0.3840\n", + " -0.0180 0 0.0330 0.0840 0.1560 0.2520 0.3750\n", + " -0.0000 0.0180 0.0480 0.0924 0.1536 0.2340 0.3360\n", + " 0.0084 0.0240 0.0486 0.0840 0.1320 0.1944 0.2730\n", + " 0.0096 0.0210 0.0384 0.0630 0.0960 0.1386 0.1920\n", + " 0.0060 0.0120 0.0210 0.0336 0.0504 0.0720 0.0990\n", + " 0 0 0 0 0 0 0\n", + " -0.0060 -0.0120 -0.0210 -0.0336 -0.0504 -0.0720 -0.0990\n", + " -0.0096 -0.0210 -0.0384 -0.0630 -0.0960 -0.1386 -0.1920\n", + " -0.0084 -0.0240 -0.0486 -0.0840 -0.1320 -0.1944 -0.2730\n", + " 0 -0.0180 -0.0480 -0.0924 -0.1536 -0.2340 -0.3360\n", + " 0.0180 0 -0.0330 -0.0840 -0.1560 -0.2520 -0.3750\n", + " 0.0480 0.0330 0 -0.0546 -0.1344 -0.2430 -0.3840\n", + " 0.0924 0.0840 0.0546 0 -0.0840 -0.2016 -0.3570\n", + " 0.1536 0.1560 0.1344 0.0840 0 -0.1224 -0.2880\n", + " 0.2340 0.2520 0.2430 0.2016 0.1224 0 -0.1710\n", + " 0.3360 0.3750 0.3840 0.3570 0.2880 0.1710 0\n" + ] + } + ], + "source": [ + "f(X,Y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we will save a function called `my_function` as `my_function.m`\n", + "\n", + "```matlab \n", + "function [vx,vy] = my_function(x,y,t)\n", + " % Help documentation of \"my_function\"\n", + " % This function computes the velocity in the x- and y-directions given\n", + " % three vectors of position in x- and y-directions as a function of time\n", + " % x = x-position\n", + " % y = y-position\n", + " % t = time\n", + " % output\n", + " % vx = velocity in x-direction\n", + " % vy = velocity in y-direction\n", + " \n", + " vx=zeros(length(t),1);\n", + " vy=zeros(length(t),1);\n", + " \n", + " vx(1:end-1) = diff(x)./diff(t); % calculate vx as delta x/delta t\n", + " vy(1:end-1) = diff(y)./diff(t); % calculate vy as delta y/delta t\n", + " \n", + " vx(end) = vx(end-1);\n", + " vy(end) = vy(end-1);\n", + "\n", + "end\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help documentation of \"my_function\"\n", + " This function computes the velocity in the x- and y-directions given\n", + " three vectors of position in x- and y-directions as a function of time\n", + " x = x-position\n", + " y = y-position\n", + " t = time\n", + " output\n", + " vx = velocity in x-direction\n", + " vy = velocity in y-direction\n" + ] + } + ], + "source": [ + "help my_function" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t=linspace(0,10,100)'; \n", + "x=t.^3; % vx = 3*t^2\n", + "y=t.^2/2; % vy = t\n", + "[vx,vy]=my_function(x,y,t);" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\niYi9ehErWj58ibeK5YO/soL74RRhCIHkA49kj5VGSIhoT22r+4lHG/bUs13s5FLJw1enCXwO6yex\nMTRDuopthMpG1UoLZgiEGQCIk+qm+yhCSkRd3+93P/Go9d+b2baqEqk8/kc/D0D7RAYnxvrG73aa\nnvr4KCv/fFZKnl4zPWVE5YmOVyqaXt7Xd7jk//2/8auu1QasiQAQCC3bn23Z+gwrx11zR2zObVHa\nKd2137Ub32r79HV2fdTtj6kXPRy4NooFAslnlr5x8JWKJk9375mp+fttQ9mxFACCXdP6h9t3v+Xp\nbtz8JaML/uLP9ogWAsmXXvqi4Xc7auvbup0vjlUpVi/QuR9tDgDho23nP1q2P2truWjXLtmoMaNu\n+xXeHnEQSAAAIAqY1AAAAKKAQAIAAFFAIAEAgCggkAAAQBSwdZDo2O32L7744uTJk01NTSkpKYmJ\nibNnz46IwK8OQcNut/f29vZbTSqV4h+r2PT29trtdiKKiIiQSqWDehbfXO8hkMTlH//4R3FxcUvL\nRWe2jho1atmyZXfccUegWgWD8uGHHz766KP9VnvhhReuvfZaP7QHBPT09JSVlR05cuSbb7756quv\nmpr6lhLefPPNTz/99MA/B99cn0AgicjDDz/88cc8232fPn26qKjowIEDf/7zn/3fKoBQtWPHjgcf\nfND7z8E311cQSGKxYcMG7t/pvLy8m2++WavVmkymt99++9VXXyWiDz/8cPz48QUFBQFtJgzCuHHj\npk7lPaGeiGj06NH+bAy4s9lcD9WUSqUDGW51hm+uDyGQRMFkMhUXF7Py73//+0WL+nYInjx58hNP\nPHHJJZc89dRTRLRhw4abbropLU1oh1YQj6uuuor9gwPRSk5Ovuyyy6ZOnZqRkTF79uw1a9a89ZbH\nPX5cmEwmIsI314fwwk0UNm3axH4vmz17NvfvNOe2226bOXMmEfX29r7yyisBaB9AKLrhhht27979\n3HPP/eIXv8jJyVEqlYN6fNOmTfjm+hYCKfDsdvs///lPVr7nnnt46+Tn57PCu+++y2YBAUAAsa8t\nvrm+hUAKvIqKirNnzxKRTCabN28eb53s7GyZTEZEHR0d3377rV/bBwBu2NcW31zfQiAF3vfff88K\nU6dO9bRqQSqVTps2zaU+AASK89cQ31xfQSAFXlVVFSuMGTNGoFpKSgor4PesYHHw4MFHHnnk+uuv\n1+v18+fPf+CBB4qLi+vq+M+5h+DCfW0J31zfwSy7wOvo6GCF2NhYgWrcXa4+iFxlZWVlZSUrt7e3\nnzhxYufOnc8999yiRYsef/xx4X/cIHLOX0N8c30FPaTA6+npYYVx48YJVNPpdKxw7ty5YW8T+EhM\nTMyUKVMSEhIiIyO5i2+//faSJUvMZnMAGwZe4r62hG+u76CHFHjc6ryRI0cKVIuJiWEFzNUROalU\nesstt1xzzTXZ2dlyuZxdtNvtFRUV69ev379/PxHV1NSsWLFiy5YtAW0pDJ3zolp8c30FPSQAH7vx\nxhv/8Ic/XHvttVwaEVFERMTMmTNfffXVn/70p+zKF198sWvXrgC1EUCMEEiBx2aFUn9DzNxd7B8c\n1J544okpU6aw8sA3BQCx4b62hG+u7+BvUOBxv0cfO3ZMoBp31/ltBASju+66ixXKysoC2xIYMufu\nL765voJACjxuALq9vV2gGndXeMAaxI/bcdVqtQ52K08QCeevIb65voJACrzMzExWEF6hcuLECVbg\n1tlBkEpMTOTKeNEdpLivLeGb6zsIpMCbNGkSKxw8eNDT78u9vb3fffedS30IUtwCSalUOthjSUEk\nnL+G+Ob6CgIp8K644go2MdRms3366ae8dT799FM2zTQ2Nnb69Ol+bR/42oEDB1ghJSUFL7qDFPva\n4pvrW/gyBF5ERMSPf/xjVi4pKeGts2nTJla45ZZb/NMqGCaNjY3s3DYiysnJCWxjYMjY1xbfXN9C\nIIlCfn4+G7r58ssv3c9N+cc//sF2oJHJZEuXLg1A+2DA9u3b9/7773t6M/TDDz/ccccd3BbRd999\nt39bB76Un5+Pb65vSRwOR6DbAERExcXFzz33HCvfeuutt9xyy6RJkw4ePPjee+9xq1WWL19+//33\nB66N0L/t27evWrUqJibGYDBMnz59zJgxcrncbre3tLR8+umnzithV61ahUAKuF/96ldWq5X748GD\nB9kchJSUFOdpC1KplPt6usA314cQSCLy2GOPvffee57uLlq06Pe//70/2wNDwAJJuI5UKn388ceR\nRmIwY8YM1mEVFhkZKbBXN765voJAEpc333yzuLi4qanJ+WJKSsoDDzzgfkAyiFB1dfWLL764e/du\n59+7OTKZ7Cc/+ck999yTkZHh/7aBO58EEuGb6yMIJDH6+uuvjx8/3t3dHRUVNXbsWEzOCUYNDQ2H\nDh06c+ZMd3e3VCqNiopKSkqaMWMGptWFMHxzvYRAAgAAUcAvawAAIAoIJAAAEAUEEgAAiAICCQAA\nRAGBBAAAooBAAgAAUUAgAQCAKCCQAABAFBBIAAAgCggkAAAQBQQSAACIAgIJAABEAYEEAACigEAC\nAABRkAW6AQCi1t3d3dvbS0TsTKNANwcglKGHBCDk6aefzsrKysrK+uUvfxnotgCEOAQSAACIAgIJ\nws7q1aunTZs2bdq0goKCQLcFAC7AOyQIOzab7dy5c0TEXg4BgEggkACErFq16je/+Q0RRURgOAFg\neCGQAIRIpVKpVBroVgCEBfzSBwAAooAeEoSRsrIyIjp58iT7Y2trK7viLCkpKSMjg/ujyWRqaGgg\nori4uMzMTJfKR44caW5uJqKEhISJEyeyi3v27Nm1a1dLS4vD4YiJibnmmmvmz5/vPuJXUVFhNBob\nGhpsNptSqbzqqqsWLFgw8KVOVVVVX3zxxeHDh7u6uiQSSXR09MyZM+fNmzdq1KgBfgKA2EgcDkeg\n2wDgJ1xmCLj55puffvpp7o+//e1vX3vtNSKaO3fu5s2bXSo/9thj7733HhFdd911GzZsqKqq+vWv\nf11TU+NSTafTbdiwgcs5k8n0yCOPVFVVuVRLSkpau3btzJkzhVtYVlb29NNPf//99+63pFLpkiVL\nli9fHhsb2+9fKYDYYMgOwDcqKiruvPNO9zQiotra2ttvv531tCorKxcvXuyeRkTU3Nz8i1/8orq6\nWuCnPPfcc/n5+bxpRES9vb2vvfbaLbfccurUqSH9RQAEEobsIIy88MILRPTaa6+xkbrMzEz3pUga\njWYIn2w2mx966KGurq5JkybdcccdaWlpMpmstbX1zTff3LNnDxG1t7cXFhb+4Q9/WLZsWUdHh06n\nu/3229PT0yMjI8+ePfvee+99/PHHRGS1WletWvXOO+/w/pTnn3++uLiYlZOSku66666srKypU6fa\n7fby8vKdO3e+/fbbRFRXV7d06dJ3330Xex1BcEEgQRi59tprichoNLI/JiYmsive+/LLL4nozjvv\nfOqpp5yvL1iwgBvW++9//7tixYqWlpYf/ehHTz/9tFwu56rl5OQ888wzL7/8MhFVVVVVVFRcccUV\nLj+ioqKCBSoRXXPNNX/+85+jo6OdPyEnJ2fhwoUFBQU2m62mpmbjxo0PPfSQT/7qAPwDQ3YAvjF7\n9myXNGIee+wxbuL4/v37J02a9MwzzzinEeP84mfnzp3un7NmzRpWmDRp0vr1653TiJOdnf3II4+w\n8qZNm3p6eob0lwIQGAgkAN9Yvnw573W1Wn355Zdzf3zwwQd5FzbJ5fK5c+eycl1dncvdb7/99uDB\ng6y8atUqgaVReXl5MTExRNTV1bV79+7B/BUABBgCCcAHYmJisrKyPN1NSUlhBZlMNn/+fE/VuEmA\n7nMW/vOf/7DCqFGjhKfhSaXSefPmsbL7pHYAMUMgAfjArFmzBO5yA3QajUZgC6LRo0ezQkdHh8ut\nw4cPs4JzZ8uTuLg4VmBrpACCBSY1APiA8PZCkZGRrKDT6QSqyWR930f3XV+//vprVvj0009nzJgh\n3Jju7m5WwDskCC4IJAD/GfIOrWfPnmUFm81ms9l81yIAEUEgAQSTcePGTZ06dYCVJ0+ePKyNAfAt\nBBJAEIiJibFarUR0xRVX/P73vw90cwCGBSY1AASB6dOns8Lx48cD2xKA4YNAgrATjEftcYNvBw4c\nMJvNgW0MwDAJvm8mgJdUKhUrBNGs6IULF7JCb2/vq6++GtjGAAwTBBKEnfHjx7PCkSNH7HZ7YBsz\nQBMnTuT2cdi4cWNlZWW/jwTLXxoAB4EEYWfSpEmscO7cOW7zbPErLCxUKpVE1Nvb+7Of/ezdd9/1\nVNNsNm/evNlX+8YC+A1m2UHYmThx4pQpU9jWcOvXr//b3/526aWXcnuVzp49Oz8/P6AN5KfVap99\n9tkHHnjAZrOdPXv28ccf37hxY05OzrRp05RKpcPh6Ojo+Pbbb7///vsDBw64L60FED8EEoSjP/7x\nj/n5+S0tLURktVr379/P3YqPjw9cu/qRk5OzadMmdoYFEdXW1tbW1ga6UQA+gyE7CEcTJ0786KOP\nli9fbjAYYmJiuD17xG/WrFk7dux48MEHR40a5anOhAkTfvnLX/773//2Z8MAvCdxOByBbgMADEVV\nVdWxY8caGxtPnDihVqvT0tLi4+P1ej3vUUkA4odAAgAAUcCQHQAAiAICCQAARAGBBAAAooBAAgAA\nUUAgAQCAKCCQAABAFP4/JHGsrwmk9SMAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yyaxis left\n", + "plot(t(1:10:end),vx(1:10:end),'o',t,3*t.^2)\n", + "ylabel('v_{x}')\n", + "yyaxis right\n", + "plot(t(1:10:end),vy(1:10:end),'s',t, t)\n", + "ylabel('v_{y}')\n", + "xlabel('time')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, create a new function that calls 'my_function' called, `my_caller.m`" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help documentation of \"my_caller\"\n", + " This function computes the acceleration in the x- and y-directions given\n", + " three vectors of position in x- and y-directions as a function of time\n", + " x = x-position\n", + " y = y-position\n", + " t = time\n", + " output\n", + " ax = velocity in x-direction\n", + " ay = velocity in y-direction\n" + ] + } + ], + "source": [ + "help my_caller" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "[ax,ay]=my_caller(x,y,t);" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yyaxis left\n", + "plot(t(1:10:end),ax(1:10:end),'o',t,6*t)\n", + "ylabel('a_{x}')\n", + "yyaxis right\n", + "plot(t(1:10:end),ay(1:10:end),'s',t, 1*t./t)\n", + "ylabel('a_{y}')\n", + "xlabel('time')\n", + "axis([0,10,0,3])" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[0;31mUndefined function 'diff_match_dims' for input arguments of type 'double'.\n", + "\u001b[0m" + ] + } + ], + "source": [ + "diff_match_dims(x,t)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Matlab", + "language": "matlab", + "name": "matlab" + }, + "language_info": { + "codemirror_mode": "octave", + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "matlab", + "version": "0.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_06/bisect.m b/lecture_06/bisect.m new file mode 100644 index 0000000..c09ffbf --- /dev/null +++ b/lecture_06/bisect.m @@ -0,0 +1,37 @@ +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); \ No newline at end of file diff --git a/lecture_06/falsepos.m b/lecture_06/falsepos.m new file mode 100644 index 0000000..0a3477c --- /dev/null +++ b/lecture_06/falsepos.m @@ -0,0 +1,39 @@ +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + % xr = (xl + xu)/2; % bisect method + xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); diff --git a/lecture_06/incsearch.m b/lecture_06/incsearch.m new file mode 100644 index 0000000..bd82554 --- /dev/null +++ b/lecture_06/incsearch.m @@ -0,0 +1,37 @@ +function xb = incsearch(func,xmin,xmax,ns) +% incsearch: incremental search root locator +% xb = incsearch(func,xmin,xmax,ns): +% finds brackets of x that contain sign changes +% of a function on an interval +% input: +% func = name of function +% xmin, xmax = endpoints of interval +% ns = number of subintervals (default = 50) +% output: +% xb(k,1) is the lower bound of the kth sign change +% xb(k,2) is the upper bound of the kth sign change +% If no brackets found, xb = []. +if nargin < 3, error('at least 3 arguments required'), end +if nargin < 4, ns = 50; end %if ns blank set to 50 +% Incremental search +x = linspace(xmin,xmax,ns); +f = func(x); +nb = 0; xb = []; %xb is null unless sign change detected +%for k = 1:length(x)-1 +% if sign(f(k)) ~= sign(f(k+1)) %check for sign change +% nb = nb + 1; +% xb(nb,1) = x(k); +% xb(nb,2) = x(k+1); +% end +%end +sign_change = diff(sign(f)); +[~,i_change] = find(sign_change~=0); +nb=length(i_change); +xb=[x(i_change)',x(i_change+1)']; + +if isempty(xb) %display that no brackets were found + fprintf('no brackets found\n') + fprintf('check interval or increase ns\n') +else + fprintf('number of brackets: %i\n',nb) %display number of brackets +end diff --git a/lecture_06/lecture_06.ipynb b/lecture_06/lecture_06.ipynb new file mode 100644 index 0000000..f44f84c --- /dev/null +++ b/lecture_06/lecture_06.ipynb @@ -0,0 +1,834 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "my_caller.m\n", + "```matlab\n", + "function [vx,vy] = my_caller(max_time)\n", + " N=100;\n", + " t=linspace(0,max_time,N);\n", + " [x,y]=my_function(max_time);\n", + " vx=diff(x)./diff(t);\n", + " vy=diff(y)./diff(t);\n", + "end\n", + "```\n", + "\n", + "my_function.m\n", + "```matlab\n", + "function [x,y] = my_function(max_time)\n", + " N=100;\n", + " t=linspace(0,max_time,N);\n", + " x=t.^2;\n", + " y=2*t;\n", + "end\n", + "```\n", + "\n", + "In order to use `my_caller.m` where does `my_function.m` need to be saved?\n", + "![responses](q1.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "What cool personal projects are you working on?\n", + "While we delve deeper into Matlab functions, could we review some of the basic logic\n", + "operators it uses and command codes. \n", + "\n", + "I still dont know when these forms are technically due. \n", + " \n", + " -by the following lecture\n", + "\n", + "I'm having trouble interfacing Atom with GitHub. Is there a simple tutorial for this?\n", + " \n", + " -Mac? Seems there could be a bug that folks are working on\n", + "\n", + "What are the bear necessities of life? \n", + "please go over how to \"submit\" the homeworks because it is still confusing\n", + "\n", + "Do you prefer Matlab or Octave?\n", + " \n", + " -octave is my preference, but Matlab has some benefits\n", + "\n", + "Would you consider a country to be open-source?\n", + " \n", + " -??\n", + "\n", + "Is there a way to download matlab for free?\n", + " \n", + " -not legally\n", + "\n", + "how do you add files to current folder in matlab?\n", + " \n", + " -you can do this either through a file browser or cli\n", + "\n", + "How should Homework 2 be submitted? By simply putting the function into the homework_1\n", + "repository?\n", + " \n", + " -yes\n", + " \n", + "How can we tell that these forms are being received?\n", + " \n", + " -when you hit submit, the form says \"form received\"\n", + " \n", + "can you save scripted outputs from matlab/octave as an excel file?\n", + " \n", + " -yes, easy way is open a file with a .csv extension then fprintf and separate everything with commas, harder way is to use the `xlswrite`\n", + " \n", + "\n", + "Also, can you update your notes to show what happens when these things are run, as you do\n", + "in class?\"\n", + " \n", + " -I always update the lecture notes after class so they should display what we did in class\n", + " \n", + "I have a little difficulty following along in class on my laptop when you have programs\n", + "pre-written. Maybe if you posted those codes on Github so I could copy them when you\n", + "switch to different desktops I would be able to follow along better.\n", + "\n", + "Kirk or Picard?\n", + " \n", + " -Kirk\n", + " \n", + "Who is our TA?\n", + " \n", + " -Peiyu Zhang peiyu.zhang@uconn.edu\n", + "\n", + "Can we download libraries of data like thermodynamic tables into matlab?\n", + " \n", + "-YES! [Matlab Steam Tables](http://bit.ly/2kZygu8)\n", + "\n", + "Will we use the Simulink addition to Matlab? I found it interesting and useful for\n", + "evaluating ODEs in Linear systems.\n", + " \n", + " -not in this class, everything in simulink has a matlab script/function that can be substituted, but many times its hidden by the gui. Here we want to look directly at our solvers\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Roots and Optimization\n", + "## Bracketing ch. 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you are given a function, numerical or analytical, it's not always possible to solve directly for a given variable. \n", + "\n", + "Even for the freefall example we first explored, \n", + "\n", + "$v(t)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)$\n", + "\n", + "There is no way to solve for m in terms of the other variables. \n", + "\n", + "Instead, we can solve the problem by creating a new function f(m) where\n", + "\n", + "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$. \n", + "\n", + "When f(m) = 0, we have solved for m in terms of the other variables (e.g. for a given time, velocity, drag coefficient and acceleration due to gravity)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t140\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t160\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t180\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "setdefaults\n", + "g=9.81; % acceleration due to gravity\n", + "m=linspace(50, 200,100); % possible values for mass 50 to 200 kg\n", + "c_d=0.25; % drag coefficient\n", + "t=4; % at time = 4 seconds\n", + "v=36; % speed must be 36 m/s\n", + "f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m\n", + "\n", + "plot(m,f_m(m),m,zeros(length(m),1))\n", + "axis([45 200 -5 1])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0.045626\r\n" + ] + } + ], + "source": [ + "f_m(145)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Brute force method is plot f_m vs m and with smaller and smaller steps until f_m ~ 0\n", + "\n", + "Better methods are the \n", + "1. Bracketing methods\n", + "2. Open methods\n", + "\n", + "Both need an initial guess. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Incremental method (Brute force)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You know that for one value, m_lower, f_m is negative and for another value, m_upper, f_m is positive. \n", + "\n", + "```matlab\n", + "function xb = incsearch(func,xmin,xmax,ns)\n", + "% incsearch: incremental search root locator\n", + "% xb = incsearch(func,xmin,xmax,ns):\n", + "% finds brackets of x that contain sign changes\n", + "% of a function on an interval\n", + "% input:\n", + "% func = name of function\n", + "% xmin, xmax = endpoints of interval\n", + "% ns = number of subintervals (default = 50)\n", + "% output:\n", + "% xb(k,1) is the lower bound of the kth sign change\n", + "% xb(k,2) is the upper bound of the kth sign change\n", + "% If no brackets found, xb = [].\n", + "if nargin < 3, error('at least 3 arguments required'), end\n", + "if nargin < 4, ns = 50; end %if ns blank set to 50\n", + "% Incremental search\n", + "x = linspace(xmin,xmax,ns);\n", + "f = func(x);\n", + "nb = 0; xb = []; %xb is null unless sign change detected\n", + "for k = 1:length(x)-1\n", + " if sign(f(k)) ~= sign(f(k+1)) %check for sign change\n", + " nb = nb + 1;\n", + " xb(nb,1) = x(k);\n", + " xb(nb,2) = x(k+1);\n", + " end\n", + "end\n", + "if isempty(xb) %display that no brackets were found\n", + " fprintf('no brackets found\\n')\n", + " fprintf('check interval or increase ns\\n')\n", + "else\n", + " fprintf('number of brackets: %i\\n',nb) %display number of brackets\n", + "end\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'incsearch' is a function from the file /home/ryan/Documents/UConn/ME3255/me3255_S2017/lecture_06/incsearch.m\n", + "\n", + " incsearch: incremental search root locator\n", + " xb = incsearch(func,xmin,xmax,ns):\n", + " finds brackets of x that contain sign changes\n", + " of a function on an interval\n", + " input:\n", + " func = name of function\n", + " xmin, xmax = endpoints of interval\n", + " ns = number of subintervals (default = 50)\n", + " output:\n", + " xb(k,1) is the lower bound of the kth sign change\n", + " xb(k,2) is the upper bound of the kth sign change\n", + " If no brackets found, xb = [].\n", + "\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help incsearch" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no brackets found\n", + "check interval or increase ns\n", + "ans = [](1x0)\n" + ] + } + ], + "source": [ + "incsearch(f_m,50, 200,55)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Bisection method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Divide interval in half until error is reduced to some level\n", + "\n", + "in previous example of freefall, choose x_l=50, x_u=200\n", + "\n", + "x_r = (50+200)/2 = 125\n", + "\n", + "f_m(125) = -0.408\n", + "\n", + "x_r= (125+200)/2 = 162.5\n", + "\n", + "f_m(162.5) = 0.3594\n", + "\n", + "x_r = (125+162.5)/2=143.75\n", + "\n", + "f_m(143.75)= 0.0206" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0.020577\r\n" + ] + } + ], + "source": [ + "f_m(143.75)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much better root locator, with 4 iterations, our function is already close to zero\n", + "\n", + "Automate this with a function:\n", + "`bisect.m`\n", + "\n", + "```matlab\n", + "function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin)\n", + "% bisect: root location zeroes\n", + "% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):\n", + "% uses bisection method to find the root of func\n", + "% input:\n", + "% func = name of function\n", + "% xl, xu = lower and upper guesses\n", + "% es = desired relative error (default = 0.0001%)\n", + "% maxit = maximum allowable iterations (default = 50)\n", + "% p1,p2,... = additional parameters used by func\n", + "% output:\n", + "% root = real root\n", + "% fx = function value at root\n", + "% ea = approximate relative error (%)\n", + "% iter = number of iterations\n", + "if nargin<3,error('at least 3 input arguments required'),end\n", + "test = func(xl,varargin{:})*func(xu,varargin{:});\n", + "if test>0,error('no sign change'),end\n", + "if nargin<4|isempty(es), es=0.0001;end\n", + "if nargin<5|isempty(maxit), maxit=50;end\n", + "iter = 0; xr = xl; ea = 100;\n", + "while (1)\n", + " xrold = xr;\n", + " xr = (xl + xu)/2;\n", + " iter = iter + 1;\n", + " if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end\n", + " test = func(xl,varargin{:})*func(xr,varargin{:});\n", + " if test < 0\n", + " xu = xr;\n", + " elseif test > 0\n", + " xl = xr;\n", + " else\n", + " ea = 0;\n", + " end\n", + " if ea <= es | iter >= maxit,break,end\n", + "end\n", + "root = xr; fx = func(xr, varargin{:});\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## False position (linear interpolation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rather than bisecting each bracket (1/2 each time) we can calculate the slope between the two points and update the xr position in this manner\n", + "\n", + "$ x_{r} = x_{u} - \\frac{f(x_{u})(x_{l}-x_{u})}{f(x_{l})-f(x_{u})}$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t\t \n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xl=50; xu=200; \n", + "xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu));\n", + "\n", + "plot(m,f_m(m),xl,f_m(xl),'s',xu,f_m(xu),'s',xr,0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much better root locator, with 4 iterations, our function is already close to zero\n", + "\n", + "Automate this with a function:\n", + "`falsepos.m`\n", + "\n", + "```matlab\n", + "function [root,fx,ea,iter]=falsepos(func,xl,xu,es,maxit,varargin)\n", + "% falsepos: root location zeroes\n", + "% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):\n", + "% uses false position method to find the root of func\n", + "% input:\n", + "% func = name of function\n", + "% xl, xu = lower and upper guesses\n", + "% es = desired relative error (default = 0.0001%)\n", + "% maxit = maximum allowable iterations (default = 50)\n", + "% p1,p2,... = additional parameters used by func\n", + "% output:\n", + "% root = real root\n", + "% fx = function value at root\n", + "% ea = approximate relative error (%)\n", + "% iter = number of iterations\n", + "if nargin<3,error('at least 3 input arguments required'),end\n", + "test = func(xl,varargin{:})*func(xu,varargin{:});\n", + "if test>0,error('no sign change'),end\n", + "if nargin<4|isempty(es), es=0.0001;end\n", + "if nargin<5|isempty(maxit), maxit=50;end\n", + "iter = 0; xr = xl; ea = 100;\n", + "while (1)\n", + " xrold = xr;\n", + " % xr = (xl + xu)/2; % bisect method\n", + " xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method\n", + " iter = iter + 1;\n", + " if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end\n", + " test = func(xl,varargin{:})*func(xr,varargin{:});\n", + " if test < 0\n", + " xu = xr;\n", + " elseif test > 0\n", + " xl = xr;\n", + " else\n", + " ea = 0;\n", + " end\n", + " if ea <= es | iter >= maxit,break,end\n", + "end\n", + "root = xr; fx = func(xr, varargin{:});\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_06/lecture_06.md b/lecture_06/lecture_06.md new file mode 100644 index 0000000..b3d2266 --- /dev/null +++ b/lecture_06/lecture_06.md @@ -0,0 +1,373 @@ + + +```octave +%plot --format svg +``` + +my_caller.m +```matlab +function [vx,vy] = my_caller(max_time) + N=100; + t=linspace(0,max_time,N); + [x,y]=my_function(max_time); + vx=diff(x)./diff(t); + vy=diff(y)./diff(t); +end +``` + +my_function.m +```matlab +function [x,y] = my_function(max_time) + N=100; + t=linspace(0,max_time,N); + x=t.^2; + y=2*t; +end +``` + +In order to use `my_caller.m` where does `my_function.m` need to be saved? +![responses](q1.png) + + +What cool personal projects are you working on? +While we delve deeper into Matlab functions, could we review some of the basic logic +operators it uses and command codes. + +I still dont know when these forms are technically due. + + -by the following lecture + +I'm having trouble interfacing Atom with GitHub. Is there a simple tutorial for this? + + -Mac? Seems there could be a bug that folks are working on + +What are the bear necessities of life? +please go over how to "submit" the homeworks because it is still confusing + +Do you prefer Matlab or Octave? + + -octave is my preference, but Matlab has some benefits + +Would you consider a country to be open-source? + + -?? + +Is there a way to download matlab for free? + + -not legally + +how do you add files to current folder in matlab? + + -you can do this either through a file browser or cli + +How should Homework 2 be submitted? By simply putting the function into the homework_1 +repository? + + -yes + +How can we tell that these forms are being received? + + -when you hit submit, the form says "form received" + +can you save scripted outputs from matlab/octave as an excel file? + + -yes, easy way is open a file with a .csv extension then fprintf and separate everything with commas, harder way is to use the `xlswrite` + + +Also, can you update your notes to show what happens when these things are run, as you do +in class?" + + -I always update the lecture notes after class so they should display what we did in class + +I have a little difficulty following along in class on my laptop when you have programs +pre-written. Maybe if you posted those codes on Github so I could copy them when you +switch to different desktops I would be able to follow along better. + +Kirk or Picard? + + -Kirk + +Who is our TA? + + -Peiyu Zhang peiyu.zhang@uconn.edu + +Can we download libraries of data like thermodynamic tables into matlab? + +-YES! [Matlab Steam Tables](http://bit.ly/2kZygu8) + +Will we use the Simulink addition to Matlab? I found it interesting and useful for +evaluating ODEs in Linear systems. + + -not in this class, everything in simulink has a matlab script/function that can be substituted, but many times its hidden by the gui. Here we want to look directly at our solvers + + +# Roots and Optimization +## Bracketing ch. 5 + +When you are given a function, numerical or analytical, it's not always possible to solve directly for a given variable. + +Even for the freefall example we first explored, + +$v(t)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)$ + +There is no way to solve for m in terms of the other variables. + +Instead, we can solve the problem by creating a new function f(m) where + +$f(m)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)-v(t)$. + +When f(m) = 0, we have solved for m in terms of the other variables (e.g. for a given time, velocity, drag coefficient and acceleration due to gravity) + + +```octave +setdefaults +g=9.81; % acceleration due to gravity +m=linspace(50, 200,100); % possible values for mass 50 to 200 kg +c_d=0.25; % drag coefficient +t=4; % at time = 4 seconds +v=36; % speed must be 36 m/s +f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m + +plot(m,f_m(m),m,zeros(length(m),1)) +axis([45 200 -5 1]) +``` + + +![svg](lecture_06_files/lecture_06_5_0.svg) + + + +```octave +f_m(145) +``` + + ans = 0.045626 + + +Brute force method is plot f_m vs m and with smaller and smaller steps until f_m ~ 0 + +Better methods are the +1. Bracketing methods +2. Open methods + +Both need an initial guess. + + +## Incremental method (Brute force) + +You know that for one value, m_lower, f_m is negative and for another value, m_upper, f_m is positive. + +```matlab +function xb = incsearch(func,xmin,xmax,ns) +% incsearch: incremental search root locator +% xb = incsearch(func,xmin,xmax,ns): +% finds brackets of x that contain sign changes +% of a function on an interval +% input: +% func = name of function +% xmin, xmax = endpoints of interval +% ns = number of subintervals (default = 50) +% output: +% xb(k,1) is the lower bound of the kth sign change +% xb(k,2) is the upper bound of the kth sign change +% If no brackets found, xb = []. +if nargin < 3, error('at least 3 arguments required'), end +if nargin < 4, ns = 50; end %if ns blank set to 50 +% Incremental search +x = linspace(xmin,xmax,ns); +f = func(x); +nb = 0; xb = []; %xb is null unless sign change detected +for k = 1:length(x)-1 + if sign(f(k)) ~= sign(f(k+1)) %check for sign change + nb = nb + 1; + xb(nb,1) = x(k); + xb(nb,2) = x(k+1); + end +end +if isempty(xb) %display that no brackets were found + fprintf('no brackets found\n') + fprintf('check interval or increase ns\n') +else + fprintf('number of brackets: %i\n',nb) %display number of brackets +end +``` + + +```octave +help incsearch +``` + + 'incsearch' is a function from the file /home/ryan/Documents/UConn/ME3255/me3255_S2017/lecture_06/incsearch.m + + incsearch: incremental search root locator + xb = incsearch(func,xmin,xmax,ns): + finds brackets of x that contain sign changes + of a function on an interval + input: + func = name of function + xmin, xmax = endpoints of interval + ns = number of subintervals (default = 50) + output: + xb(k,1) is the lower bound of the kth sign change + xb(k,2) is the upper bound of the kth sign change + If no brackets found, xb = []. + + + Additional help for built-in functions and operators is + available in the online version of the manual. Use the command + 'doc ' to search the manual index. + + Help and information about Octave is also available on the WWW + at http://www.octave.org and via the help@octave.org + mailing list. + + + +```octave +incsearch(f_m,50, 200,55) +``` + + no brackets found + check interval or increase ns + ans = [](1x0) + + +## Bisection method + +Divide interval in half until error is reduced to some level + +in previous example of freefall, choose x_l=50, x_u=200 + +x_r = (50+200)/2 = 125 + +f_m(125) = -0.408 + +x_r= (125+200)/2 = 162.5 + +f_m(162.5) = 0.3594 + +x_r = (125+162.5)/2=143.75 + +f_m(143.75)= 0.0206 + + +```octave +f_m(143.75) +``` + + ans = 0.020577 + + +Much better root locator, with 4 iterations, our function is already close to zero + +Automate this with a function: +`bisect.m` + +```matlab +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); +``` + +## False position (linear interpolation) + +Rather than bisecting each bracket (1/2 each time) we can calculate the slope between the two points and update the xr position in this manner + +$ x_{r} = x_{u} - \frac{f(x_{u})(x_{l}-x_{u})}{f(x_{l})-f(x_{u})}$ + + +```octave +xl=50; xu=200; +xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); + +plot(m,f_m(m),xl,f_m(xl),'s',xu,f_m(xu),'s',xr,0) +``` + + +![svg](lecture_06_files/lecture_06_18_0.svg) + + +Much better root locator, with 4 iterations, our function is already close to zero + +Automate this with a function: +`falsepos.m` + +```matlab +function [root,fx,ea,iter]=falsepos(func,xl,xu,es,maxit,varargin) +% falsepos: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses false position method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + % xr = (xl + xu)/2; % bisect method + xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); +``` + + +```octave + +``` diff --git a/lecture_06/lecture_06_files/lecture_06_18_0.svg b/lecture_06/lecture_06_files/lecture_06_18_0.svg new file mode 100644 index 0000000..9652b37 --- /dev/null +++ b/lecture_06/lecture_06_files/lecture_06_18_0.svg @@ -0,0 +1,144 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -5 + + + + + -4 + + + + + -3 + + + + + -2 + + + + + -1 + + + + + 0 + + + + + 1 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + 150 + + + + + 200 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + gnuplot_plot_3a + + + + + + gnuplot_plot_4a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_06/lecture_06_files/lecture_06_5_0.svg b/lecture_06/lecture_06_files/lecture_06_5_0.svg new file mode 100644 index 0000000..3ecaecd --- /dev/null +++ b/lecture_06/lecture_06_files/lecture_06_5_0.svg @@ -0,0 +1,145 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -5 + + + + + -4 + + + + + -3 + + + + + -2 + + + + + -1 + + + + + 0 + + + + + 1 + + + + + 60 + + + + + 80 + + + + + 100 + + + + + 120 + + + + + 140 + + + + + 160 + + + + + 180 + + + + + 200 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/.ipynb_checkpoints/lecture_07-checkpoint.ipynb b/lecture_07/.ipynb_checkpoints/lecture_07-checkpoint.ipynb new file mode 100644 index 0000000..d7ff495 --- /dev/null +++ b/lecture_07/.ipynb_checkpoints/lecture_07-checkpoint.ipynb @@ -0,0 +1,1042 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Roots: Open methods\n", + "## Newton-Raphson" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0)\n", + "\n", + "$f'(x_{i})=\\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "Use Newton-Raphson to find solution when $e^{x}=x$" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error_approx = 1\r\n" + ] + } + ], + "source": [ + "f= @(x) exp(-x)-x;\n", + "df= @(x) -exp(-x)-1;\n", + "\n", + "x_i= 0;\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_r=x_i;\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.50000\n", + "error_approx = 1\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56631\n", + "error_approx = 0.11709\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56714\n", + "error_approx = 0.0014673\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. \n", + "\n", + "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$.\n", + "\n", + "to use the Newton-Raphson method, we need the derivative $\\frac{df}{dm}$\n", + "\n", + "$\\frac{df}{dm}=\\frac{1}{2}\\sqrt{\\frac{g}{mc_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-\n", + "\\frac{g}{2m}\\mathrm{sech}^{2}(\\sqrt{\\frac{gc_{d}}{m}}t)$" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults\n", + "g=9.81; % acceleration due to gravity\n", + "m=linspace(50, 200,100); % possible values for mass 50 to 200 kg\n", + "c_d=0.25; % drag coefficient\n", + "t=4; % at time = 4 seconds\n", + "v=36; % speed must be 36 m/s\n", + "f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m\n", + "df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2;" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 142.74\r\n" + ] + } + ], + "source": [ + "newtraph(f_m,df_m,140,0.00001)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Secant Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not always able to evaluate the derivative. Approximation of derivative:\n", + "\n", + "$f'(x_{i})=\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}=\n", + " x_{i}-\\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$\n", + " \n", + "What values should $x_{i}$ and $x_{i-1}$ take?\n", + "\n", + "To reduce arbitrary selection of variables, use the\n", + "\n", + "## Modified Secant method\n", + "\n", + "Change the x evaluations to a perturbation $\\delta$. \n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})(\\delta x_{i})}{f(x_{i}+\\delta x_{i})-f(x_{i})}$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 142.74\r\n" + ] + } + ], + "source": [ + "mod_secant(f_m,1e-6,50,0.00001)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error: 'plot_bool' undefined near line 12 column 6\n", + "error: called from\n", + " car_payments at line 12 column 3\n", + " mod_secant at line 22 column 8\n", + "error: 'Amt' undefined near line 1 column 14\n", + "error: evaluating argument list element number 1\n" + ] + } + ], + "source": [ + "Amt_numerical=mod_secant(@(A) car_payments(A,30000,0.05,5),1e-6,50,0.001)\n", + "car_payments(Amt,30000,0.05,5)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error: 'Amt' undefined near line 1 column 1\r\n" + ] + } + ], + "source": [ + "Amt*12*5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amt = 566.14\r\n" + ] + } + ], + "source": [ + "% Amortization calculation\n", + "A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1);\n", + "Amt=A(30000,0.05/12,5*12)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matlab's function\n", + "\n", + "Matlab and Octave combine bracketing and open methods in the `fzero` function. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m\n", + "\n", + " -- Function File: fzero (FUN, X0)\n", + " -- Function File: fzero (FUN, X0, OPTIONS)\n", + " -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...)\n", + " Find a zero of a univariate function.\n", + "\n", + " FUN is a function handle, inline function, or string containing the\n", + " name of the function to evaluate.\n", + "\n", + " X0 should be a two-element vector specifying two points which\n", + " bracket a zero. In other words, there must be a change in sign of\n", + " the function between X0(1) and X0(2). More mathematically, the\n", + " following must hold\n", + "\n", + " sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0\n", + "\n", + " If X0 is a single scalar then several nearby and distant values are\n", + " probed in an attempt to obtain a valid bracketing. If this is not\n", + " successful, the function fails.\n", + "\n", + " OPTIONS is a structure specifying additional options. Currently,\n", + " 'fzero' recognizes these options: \"FunValCheck\", \"OutputFcn\",\n", + " \"TolX\", \"MaxIter\", \"MaxFunEvals\". For a description of these\n", + " options, see *note optimset: XREFoptimset.\n", + "\n", + " On exit, the function returns X, the approximate zero point and\n", + " FVAL, the function value thereof.\n", + "\n", + " INFO is an exit flag that can have these values:\n", + "\n", + " * 1 The algorithm converged to a solution.\n", + "\n", + " * 0 Maximum number of iterations or function evaluations has\n", + " been reached.\n", + "\n", + " * -1 The algorithm has been terminated from user output\n", + " function.\n", + "\n", + " * -5 The algorithm may have converged to a singular point.\n", + "\n", + " OUTPUT is a structure containing runtime information about the\n", + " 'fzero' algorithm. Fields in the structure are:\n", + "\n", + " * iterations Number of iterations through loop.\n", + "\n", + " * nfev Number of function evaluations.\n", + "\n", + " * bracketx A two-element vector with the final bracketing of the\n", + " zero along the x-axis.\n", + "\n", + " * brackety A two-element vector with the final bracketing of the\n", + " zero along the y-axis.\n", + "\n", + " See also: optimset, fsolve.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help fzero" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 563.79\r\n" + ] + } + ], + "source": [ + "fzero(@(A) car_payments(A,30000,0.05,5,0),500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparison of Solvers\n", + "\n", + "It's helpful to compare to the convergence of different routines to see how quickly you find a solution. \n", + "\n", + "Comparing the freefall example\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: axis: omitting non-positive data in log plot\n", + "warning: called from\n", + " __line__ at line 120 column 16\n", + " line at line 56 column 8\n", + " __plt__>__plt2vv__ at line 500 column 10\n", + " __plt__>__plt2__ at line 246 column 14\n", + " __plt__ at line 133 column 15\n", + " semilogy at line 60 column 10\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t104\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t250\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t350\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t400\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tnewton-raphson\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tnewton-raphson\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmod-secant\n", + "\n", + "\t\n", + "\t\tmod-secant\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tfalse point\n", + "\n", + "\t\n", + "\t\tfalse point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbisection\n", + "\n", + "\t\n", + "\t\tbisection\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=20;\n", + "iterations = linspace(1,400,N);\n", + "ea_nr=zeros(1,N); % appr error Newton-Raphson\n", + "ea_ms=zeros(1,N); % appr error Modified Secant\n", + "ea_fp=zeros(1,N); % appr error false point method\n", + "ea_bs=zeros(1,N); % appr error bisect method\n", + "for i=1:length(iterations)\n", + " [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,200,0,iterations(i));\n", + " [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i));\n", + " [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i));\n", + " [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i));\n", + "end\n", + " \n", + "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n", + "legend('newton-raphson','mod-secant','false point','bisection')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ea_ms =\n", + "\n", + " Columns 1 through 6:\n", + "\n", + " 2.3382e+03 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14\n", + "\n", + " Columns 7 through 12:\n", + "\n", + " 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14\n", + "\n", + " Columns 13 through 18:\n", + "\n", + " 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14\n", + "\n", + " Columns 19 and 20:\n", + "\n", + " 1.9171e-14 1.9171e-14\n", + "\n" + ] + } + ], + "source": [ + "ea_ms" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: axis: omitting non-positive data in log plot\n", + "warning: called from\n", + " __line__ at line 120 column 16\n", + " line at line 56 column 8\n", + " __plt__>__plt2vv__ at line 500 column 10\n", + " __plt__>__plt2__ at line 246 column 14\n", + " __plt__ at line 133 column 15\n", + " semilogy at line 60 column 10\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t104\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tnewton-raphson\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tnewton-raphson\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmod-secant\n", + "\n", + "\t\n", + "\t\tmod-secant\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tfalse point\n", + "\n", + "\t\n", + "\t\tfalse point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbisection\n", + "\n", + "\t\n", + "\t\tbisection\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=20;\n", + "f= @(x) x^10-1;\n", + "df=@(x) 10*x^9;\n", + "iterations = linspace(1,50,N);\n", + "ea_nr=zeros(1,N); % appr error Newton-Raphson\n", + "ea_ms=zeros(1,N); % appr error Modified Secant\n", + "ea_fp=zeros(1,N); % appr error false point method\n", + "ea_bs=zeros(1,N); % appr error bisect method\n", + "for i=1:length(iterations)\n", + " [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i));\n", + " [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i));\n", + " [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i));\n", + " [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i));\n", + "end\n", + " \n", + "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n", + "legend('newton-raphson','mod-secant','false point','bisection')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ea_bs =\n", + "\n", + " Columns 1 through 6:\n", + "\n", + " 9.5357e+03 -4.7554e-01 -2.1114e-01 6.0163e-02 -2.4387e-03 6.1052e-04\n", + "\n", + " Columns 7 through 12:\n", + "\n", + " 2.2891e-04 -9.5367e-06 2.3842e-06 8.9407e-07 -2.2352e-07 9.3132e-09\n", + "\n", + " Columns 13 through 18:\n", + "\n", + " -2.3283e-09 -8.7311e-10 3.6380e-11 -9.0949e-12 -3.4106e-12 8.5265e-13\n", + "\n", + " Columns 19 and 20:\n", + "\n", + " -3.5527e-14 8.8818e-15\n", + "\n", + "ans = 16.208\n" + ] + } + ], + "source": [ + "ea_bs\n", + "newtraph(f,df,0.5,0,12)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1.9683e+23\r\n" + ] + } + ], + "source": [ + "df(300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_07/.lecture_07.md.swp b/lecture_07/.lecture_07.md.swp new file mode 100644 index 0000000..0998c86 Binary files /dev/null and b/lecture_07/.lecture_07.md.swp differ diff --git a/lecture_07/.newtraph.m.swp b/lecture_07/.newtraph.m.swp new file mode 100644 index 0000000..9759dd2 Binary files /dev/null and b/lecture_07/.newtraph.m.swp differ diff --git a/lecture_07/bisect.m b/lecture_07/bisect.m new file mode 100644 index 0000000..9f696a0 --- /dev/null +++ b/lecture_07/bisect.m @@ -0,0 +1,37 @@ +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4||isempty(es), es=0.0001;end +if nargin<5||isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es || iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); diff --git a/lecture_07/car_payments.m b/lecture_07/car_payments.m new file mode 100644 index 0000000..9d5b2a5 --- /dev/null +++ b/lecture_07/car_payments.m @@ -0,0 +1,17 @@ +function amount_left = car_payments(monthly_payment,price,apr,no_of_years,plot_bool) + interest_per_month = apr/12; + number_of_months = no_of_years*12; + principle=price; + P_vector=zeros(1,number_of_months); + for i = 1:number_of_months + principle=principle-monthly_payment; + principle=(1+interest_per_month)*principle; + P_vector(i)=principle; + end + amount_left=principle; + if plot_bool + plot([1:number_of_months]/12, P_vector) + xlabel('time (years)') + ylabel('principle amount left ($)') + end +end diff --git a/lecture_07/falsepos.m b/lecture_07/falsepos.m new file mode 100644 index 0000000..d5575d5 --- /dev/null +++ b/lecture_07/falsepos.m @@ -0,0 +1,39 @@ +function [root,fx,ea,iter]=falsepos(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4||isempty(es), es=0.0001;end +if nargin<5||isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + % xr = (xl + xu)/2; % bisect method + xr=xu - (func(xu)*(xl-xu))/(func(xl)-func(xu)); % false position method + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es || iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); diff --git a/lecture_07/fzerosimp.m b/lecture_07/fzerosimp.m new file mode 100644 index 0000000..05c7a9b --- /dev/null +++ b/lecture_07/fzerosimp.m @@ -0,0 +1,41 @@ +function b = fzerosimp(xl,xu) +a = xl; b = xu; fa = f(a); fb = f(b); +c = a; fc = fa; d = b - c; e = d; +while (1) + if fb == 0, break, end + if sign(fa) == sign(fb) %If needed, rearrange points + a = c; fa = fc; d = b - c; e = d; + end + if abs(fa) < abs(fb) + c = b; b = a; a = c; + fc = fb; fb = fa; fa = fc; + end + m = 0.5*(a - b); %Termination test and possible exit + tol = 2 * eps * max(abs(b), 1); + if abs(m) <= tol | fb == 0. + break + end + %Choose open methods or bisection + if abs(e) >= tol & abs(fc) > abs(fb) + s = fb/fc; + if a == c %Secant method + p = 2*m*s; + q = 1 - s; + else %Inverse quadratic interpolation + q = fc/fa; r = fb/fa; + p = s * (2*m*q * (q - r) - (b - c)*(r - 1)); + q = (q - 1)*(r - 1)*(s - 1); + end + if p > 0, q = -q; else p = -p; end; + if 2*p < 3*m*q - abs(tol*q) & p < abs(0.5*e*q) + e = d; d = p/q; + else + d = m; e = m; + end + else %Bisection + d = m; e = m; + end + c = b; fc = fb; + if abs(d) > tol, b=b+d; else b=b-sign(b-a)*tol; end + fb = f(b); +end \ No newline at end of file diff --git a/lecture_07/incsearch.m b/lecture_07/incsearch.m new file mode 100644 index 0000000..bd82554 --- /dev/null +++ b/lecture_07/incsearch.m @@ -0,0 +1,37 @@ +function xb = incsearch(func,xmin,xmax,ns) +% incsearch: incremental search root locator +% xb = incsearch(func,xmin,xmax,ns): +% finds brackets of x that contain sign changes +% of a function on an interval +% input: +% func = name of function +% xmin, xmax = endpoints of interval +% ns = number of subintervals (default = 50) +% output: +% xb(k,1) is the lower bound of the kth sign change +% xb(k,2) is the upper bound of the kth sign change +% If no brackets found, xb = []. +if nargin < 3, error('at least 3 arguments required'), end +if nargin < 4, ns = 50; end %if ns blank set to 50 +% Incremental search +x = linspace(xmin,xmax,ns); +f = func(x); +nb = 0; xb = []; %xb is null unless sign change detected +%for k = 1:length(x)-1 +% if sign(f(k)) ~= sign(f(k+1)) %check for sign change +% nb = nb + 1; +% xb(nb,1) = x(k); +% xb(nb,2) = x(k+1); +% end +%end +sign_change = diff(sign(f)); +[~,i_change] = find(sign_change~=0); +nb=length(i_change); +xb=[x(i_change)',x(i_change+1)']; + +if isempty(xb) %display that no brackets were found + fprintf('no brackets found\n') + fprintf('check interval or increase ns\n') +else + fprintf('number of brackets: %i\n',nb) %display number of brackets +end diff --git a/lecture_07/lecture_07.ipynb b/lecture_07/lecture_07.ipynb new file mode 100644 index 0000000..08d29c4 --- /dev/null +++ b/lecture_07/lecture_07.ipynb @@ -0,0 +1,1458 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Roots: Open methods\n", + "## Newton-Raphson" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0)\n", + "\n", + "$f'(x_{i})=\\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "Use Newton-Raphson to find solution when $e^{-x}=x$" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.50000\n", + "error_approx = 1\n" + ] + } + ], + "source": [ + "f= @(x) exp(-x)-x;\n", + "df= @(x) -exp(-x)-1;\n", + "\n", + "x_i= 0;\n", + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56631\n", + "error_approx = 0.11709\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56714\n", + "error_approx = 0.0014673\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56714\n", + "error_approx = 2.2106e-07\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. \n", + "\n", + "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$.\n", + "\n", + "to use the Newton-Raphson method, we need the derivative $\\frac{df}{dm}$\n", + "\n", + "$\\frac{df}{dm}=\\frac{1}{2}\\sqrt{\\frac{g}{mc_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-\n", + "\\frac{g}{2m}\\mathrm{sech}^{2}(\\sqrt{\\frac{gc_{d}}{m}}t)$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults\n", + "g=9.81; % acceleration due to gravity\n", + "m=linspace(50, 200,100); % possible values for mass 50 to 200 kg\n", + "c_d=0.25; % drag coefficient\n", + "t=4; % at time = 4 seconds\n", + "v=36; % speed must be 36 m/s\n", + "f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m\n", + "df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2;" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "root = 142.74\n", + "ea = 8.0930e-06\n", + "iter = 48\n" + ] + } + ], + "source": [ + "[root,ea,iter]=newtraph(f_m,df_m,140,0.00001)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Secant Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not always able to evaluate the derivative. Approximation of derivative:\n", + "\n", + "$f'(x_{i})=\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}=\n", + " x_{i}-\\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$\n", + " \n", + "What values should $x_{i}$ and $x_{i-1}$ take?\n", + "\n", + "To reduce arbitrary selection of variables, use the\n", + "\n", + "## Modified Secant method\n", + "\n", + "Change the x evaluations to a perturbation $\\delta$. \n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})(\\delta x_{i})}{f(x_{i}+\\delta x_{i})-f(x_{i})}$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "root = 142.74\n", + "ea = 3.0615e-07\n", + "iter = 7\n" + ] + } + ], + "source": [ + "[root,ea,iter]=mod_secant(f_m,1,50,0.00001)" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1.1185e+04\r\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t25000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tprinciple amount left ($)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ttime (years)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "car_payments(400,30000,0.05,5,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amt_numerical = 5467.0\n", + "ans = 3.9755e-04\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t400000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t500000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t600000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t700000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t25\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tprinciple amount left ($)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ttime (years)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Amt_numerical=mod_secant(@(A) car_payments(A,700000,0.0875,30,0),1e-6,50,0.001)\n", + "car_payments(Amt_numerical,700000,0.0875,30,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1.9681e+06\r\n" + ] + } + ], + "source": [ + "Amt_numerical*12*30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amt = 566.14\r\n" + ] + } + ], + "source": [ + "% Amortization calculation\n", + "A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1);\n", + "Amt=A(30000,0.05/12,5*12)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matlab's function\n", + "\n", + "Matlab and Octave combine bracketing and open methods in the `fzero` function. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m\n", + "\n", + " -- Function File: fzero (FUN, X0)\n", + " -- Function File: fzero (FUN, X0, OPTIONS)\n", + " -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...)\n", + " Find a zero of a univariate function.\n", + "\n", + " FUN is a function handle, inline function, or string containing the\n", + " name of the function to evaluate.\n", + "\n", + " X0 should be a two-element vector specifying two points which\n", + " bracket a zero. In other words, there must be a change in sign of\n", + " the function between X0(1) and X0(2). More mathematically, the\n", + " following must hold\n", + "\n", + " sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0\n", + "\n", + " If X0 is a single scalar then several nearby and distant values are\n", + " probed in an attempt to obtain a valid bracketing. If this is not\n", + " successful, the function fails.\n", + "\n", + " OPTIONS is a structure specifying additional options. Currently,\n", + " 'fzero' recognizes these options: \"FunValCheck\", \"OutputFcn\",\n", + " \"TolX\", \"MaxIter\", \"MaxFunEvals\". For a description of these\n", + " options, see *note optimset: XREFoptimset.\n", + "\n", + " On exit, the function returns X, the approximate zero point and\n", + " FVAL, the function value thereof.\n", + "\n", + " INFO is an exit flag that can have these values:\n", + "\n", + " * 1 The algorithm converged to a solution.\n", + "\n", + " * 0 Maximum number of iterations or function evaluations has\n", + " been reached.\n", + "\n", + " * -1 The algorithm has been terminated from user output\n", + " function.\n", + "\n", + " * -5 The algorithm may have converged to a singular point.\n", + "\n", + " OUTPUT is a structure containing runtime information about the\n", + " 'fzero' algorithm. Fields in the structure are:\n", + "\n", + " * iterations Number of iterations through loop.\n", + "\n", + " * nfev Number of function evaluations.\n", + "\n", + " * bracketx A two-element vector with the final bracketing of the\n", + " zero along the x-axis.\n", + "\n", + " * brackety A two-element vector with the final bracketing of the\n", + " zero along the y-axis.\n", + "\n", + " See also: optimset, fsolve.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help fzero" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 563.79\r\n" + ] + } + ], + "source": [ + "fzero(@(A) car_payments(A,30000,0.05,5,0),500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparison of Solvers\n", + "\n", + "It's helpful to compare to the convergence of different routines to see how quickly you find a solution. \n", + "\n", + "Comparing the freefall example\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: axis: omitting non-positive data in log plot\n", + "warning: called from\n", + " __line__ at line 120 column 16\n", + " line at line 56 column 8\n", + " __plt__>__plt2vv__ at line 500 column 10\n", + " __plt__>__plt2__ at line 246 column 14\n", + " __plt__ at line 133 column 15\n", + " semilogy at line 60 column 10\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t104\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t250\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t350\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t400\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tnewton-raphson\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tnewton-raphson\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmod-secant\n", + "\n", + "\t\n", + "\t\tmod-secant\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tfalse point\n", + "\n", + "\t\n", + "\t\tfalse point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbisection\n", + "\n", + "\t\n", + "\t\tbisection\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=20;\n", + "iterations = linspace(1,400,N);\n", + "ea_nr=zeros(1,N); % appr error Newton-Raphson\n", + "ea_ms=zeros(1,N); % appr error Modified Secant\n", + "ea_fp=zeros(1,N); % appr error false point method\n", + "ea_bs=zeros(1,N); % appr error bisect method\n", + "for i=1:length(iterations)\n", + " [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,300,0,iterations(i));\n", + " [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i));\n", + " [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i));\n", + " [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i));\n", + "end\n", + "\n", + "setdefaults\n", + "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n", + "legend('newton-raphson','mod-secant','false point','bisection')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ea_nr =\n", + "\n", + " Columns 1 through 8:\n", + "\n", + " 6.36591 0.06436 0.00052 0.00000 0.00000 0.00000 0.00000 0.00000\n", + "\n", + " Columns 9 through 16:\n", + "\n", + " 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000\n", + "\n", + " Columns 17 through 20:\n", + "\n", + " 0.00000 0.00000 0.00000 0.00000\n", + "\n" + ] + } + ], + "source": [ + "ea_nr" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: axis: omitting non-positive data in log plot\n", + "warning: called from\n", + " __line__ at line 120 column 16\n", + " line at line 56 column 8\n", + " __plt__>__plt2vv__ at line 500 column 10\n", + " __plt__>__plt2__ at line 246 column 14\n", + " __plt__ at line 133 column 15\n", + " semilogy at line 60 column 10\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t104\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tnewton-raphson\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tnewton-raphson\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmod-secant\n", + "\n", + "\t\n", + "\t\tmod-secant\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tfalse point\n", + "\n", + "\t\n", + "\t\tfalse point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbisection\n", + "\n", + "\t\n", + "\t\tbisection\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=20;\n", + "f= @(x) x^10-1;\n", + "df=@(x) 10*x^9;\n", + "iterations = linspace(1,50,N);\n", + "ea_nr=zeros(1,N); % appr error Newton-Raphson\n", + "ea_ms=zeros(1,N); % appr error Modified Secant\n", + "ea_fp=zeros(1,N); % appr error false point method\n", + "ea_bs=zeros(1,N); % appr error bisect method\n", + "for i=1:length(iterations)\n", + " [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i));\n", + " [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i));\n", + " [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i));\n", + " [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i));\n", + "end\n", + " \n", + "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n", + "legend('newton-raphson','mod-secant','false point','bisection')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ea_nr =\n", + "\n", + " Columns 1 through 7:\n", + "\n", + " 99.03195 11.11111 11.11111 11.11111 11.11111 11.11111 11.11111\n", + "\n", + " Columns 8 through 14:\n", + "\n", + " 11.11111 11.11111 11.11111 11.11109 11.11052 11.10624 10.99684\n", + "\n", + " Columns 15 through 20:\n", + "\n", + " 8.76956 2.12993 0.00000 0.00000 0.00000 0.00000\n", + "\n", + "ans = 16.208\n" + ] + } + ], + "source": [ + "ea_nr\n", + "newtraph(f,df,0.5,0,12)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1.9683e+23\r\n" + ] + } + ], + "source": [ + "df(300)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f =\n", + "\n", + "@(x) tan (x) - (x - 1) .^ 2\n", + "\n", + "ans = 0.37375\n" + ] + } + ], + "source": [ + "% our class function\n", + "f= @(x) tan(x)-(x-1).^2\n", + "mod_secant(f,1e-3,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = -3.5577e-13\r\n" + ] + } + ], + "source": [ + "f(ans)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0.39218\n", + "ans = 0.39219\n" + ] + } + ], + "source": [ + "tan(0.37375)\n", + "(0.37375-1)^2" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " Columns 1 through 8:\n", + "\n", + " -1.0000 1.5574 -3.1850 -4.1425 -7.8422 -19.3805 -25.2910 -35.1286\n", + "\n", + " Columns 9 through 11:\n", + "\n", + " -55.7997 -64.4523 -80.3516\n", + "\n" + ] + } + ], + "source": [ + "f([0:10])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_07/lecture_07.md b/lecture_07/lecture_07.md new file mode 100644 index 0000000..3aacefb --- /dev/null +++ b/lecture_07/lecture_07.md @@ -0,0 +1,448 @@ + + +```octave +%plot --format svg +``` + + +```octave +setdefaults +``` + +# Roots: Open methods +## Newton-Raphson + +First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0) + +$f'(x_{i})=\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$ + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$ + +Use Newton-Raphson to find solution when $e^{-x}=x$ + + +```octave +f= @(x) exp(-x)-x; +df= @(x) -exp(-x)-1; + +x_i= 0; +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; + +``` + + x_r = 0.50000 + error_approx = 1 + + + +```octave +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; +``` + + x_r = 0.56631 + error_approx = 0.11709 + + + +```octave +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; +``` + + x_r = 0.56714 + error_approx = 0.0014673 + + + +```octave +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; +``` + + x_r = 0.56714 + error_approx = 2.2106e-07 + + +In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. + +$f(m)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)-v(t)$. + +to use the Newton-Raphson method, we need the derivative $\frac{df}{dm}$ + +$\frac{df}{dm}=\frac{1}{2}\sqrt{\frac{g}{mc_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)- +\frac{g}{2m}\mathrm{sech}^{2}(\sqrt{\frac{gc_{d}}{m}}t)$ + + +```octave +setdefaults +g=9.81; % acceleration due to gravity +m=linspace(50, 200,100); % possible values for mass 50 to 200 kg +c_d=0.25; % drag coefficient +t=4; % at time = 4 seconds +v=36; % speed must be 36 m/s +f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m +df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2; +``` + + +```octave +[root,ea,iter]=newtraph(f_m,df_m,140,0.00001) +``` + + root = 142.74 + ea = 8.0930e-06 + iter = 48 + + +## Secant Methods + +Not always able to evaluate the derivative. Approximation of derivative: + +$f'(x_{i})=\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$ + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$ + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}= + x_{i}-\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$ + +What values should $x_{i}$ and $x_{i-1}$ take? + +To reduce arbitrary selection of variables, use the + +## Modified Secant method + +Change the x evaluations to a perturbation $\delta$. + +$x_{i+1}=x_{i}-\frac{f(x_{i})(\delta x_{i})}{f(x_{i}+\delta x_{i})-f(x_{i})}$ + + +```octave +[root,ea,iter]=mod_secant(f_m,1,50,0.00001) +``` + + root = 142.74 + ea = 3.0615e-07 + iter = 7 + + + +```octave +car_payments(400,30000,0.05,5,1) +``` + + ans = 1.1185e+04 + + + +![svg](lecture_07_files/lecture_07_15_1.svg) + + + +```octave +Amt_numerical=mod_secant(@(A) car_payments(A,700000,0.0875,30,0),1e-6,50,0.001) +car_payments(Amt_numerical,700000,0.0875,30,1) +``` + + Amt_numerical = 5467.0 + ans = 3.9755e-04 + + + +![svg](lecture_07_files/lecture_07_16_1.svg) + + + +```octave +Amt_numerical*12*30 +``` + + ans = 1.9681e+06 + + +Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. + + +```octave +% Amortization calculation +A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1); +Amt=A(30000,0.05/12,5*12) +``` + + Amt = 566.14 + + +## Matlab's function + +Matlab and Octave combine bracketing and open methods in the `fzero` function. + + +```octave +help fzero +``` + + 'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m + + -- Function File: fzero (FUN, X0) + -- Function File: fzero (FUN, X0, OPTIONS) + -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...) + Find a zero of a univariate function. + + FUN is a function handle, inline function, or string containing the + name of the function to evaluate. + + X0 should be a two-element vector specifying two points which + bracket a zero. In other words, there must be a change in sign of + the function between X0(1) and X0(2). More mathematically, the + following must hold + + sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0 + + If X0 is a single scalar then several nearby and distant values are + probed in an attempt to obtain a valid bracketing. If this is not + successful, the function fails. + + OPTIONS is a structure specifying additional options. Currently, + 'fzero' recognizes these options: "FunValCheck", "OutputFcn", + "TolX", "MaxIter", "MaxFunEvals". For a description of these + options, see *note optimset: XREFoptimset. + + On exit, the function returns X, the approximate zero point and + FVAL, the function value thereof. + + INFO is an exit flag that can have these values: + + * 1 The algorithm converged to a solution. + + * 0 Maximum number of iterations or function evaluations has + been reached. + + * -1 The algorithm has been terminated from user output + function. + + * -5 The algorithm may have converged to a singular point. + + OUTPUT is a structure containing runtime information about the + 'fzero' algorithm. Fields in the structure are: + + * iterations Number of iterations through loop. + + * nfev Number of function evaluations. + + * bracketx A two-element vector with the final bracketing of the + zero along the x-axis. + + * brackety A two-element vector with the final bracketing of the + zero along the y-axis. + + See also: optimset, fsolve. + + Additional help for built-in functions and operators is + available in the online version of the manual. Use the command + 'doc ' to search the manual index. + + Help and information about Octave is also available on the WWW + at http://www.octave.org and via the help@octave.org + mailing list. + + + +```octave +fzero(@(A) car_payments(A,30000,0.05,5,0),500) +``` + + ans = 563.79 + + +## Comparison of Solvers + +It's helpful to compare to the convergence of different routines to see how quickly you find a solution. + +Comparing the freefall example + + + +```octave +N=20; +iterations = linspace(1,400,N); +ea_nr=zeros(1,N); % appr error Newton-Raphson +ea_ms=zeros(1,N); % appr error Modified Secant +ea_fp=zeros(1,N); % appr error false point method +ea_bs=zeros(1,N); % appr error bisect method +for i=1:length(iterations) + [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,300,0,iterations(i)); + [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i)); + [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i)); + [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i)); +end + +setdefaults +semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs)) +legend('newton-raphson','mod-secant','false point','bisection') +``` + + warning: axis: omitting non-positive data in log plot + warning: called from + __line__ at line 120 column 16 + line at line 56 column 8 + __plt__>__plt2vv__ at line 500 column 10 + __plt__>__plt2__ at line 246 column 14 + __plt__ at line 133 column 15 + semilogy at line 60 column 10 + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + + + +![svg](lecture_07_files/lecture_07_24_1.svg) + + + +```octave +ea_nr +``` + + ea_nr = + + Columns 1 through 8: + + 6.36591 0.06436 0.00052 0.00000 0.00000 0.00000 0.00000 0.00000 + + Columns 9 through 16: + + 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 + + Columns 17 through 20: + + 0.00000 0.00000 0.00000 0.00000 + + + + +```octave +N=20; +f= @(x) x^10-1; +df=@(x) 10*x^9; +iterations = linspace(1,50,N); +ea_nr=zeros(1,N); % appr error Newton-Raphson +ea_ms=zeros(1,N); % appr error Modified Secant +ea_fp=zeros(1,N); % appr error false point method +ea_bs=zeros(1,N); % appr error bisect method +for i=1:length(iterations) + [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i)); + [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i)); + [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i)); + [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i)); +end + +semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs)) +legend('newton-raphson','mod-secant','false point','bisection') +``` + + warning: axis: omitting non-positive data in log plot + warning: called from + __line__ at line 120 column 16 + line at line 56 column 8 + __plt__>__plt2vv__ at line 500 column 10 + __plt__>__plt2__ at line 246 column 14 + __plt__ at line 133 column 15 + semilogy at line 60 column 10 + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + + + +![svg](lecture_07_files/lecture_07_26_1.svg) + + + +```octave +ea_nr +newtraph(f,df,0.5,0,12) +``` + + ea_nr = + + Columns 1 through 7: + + 99.03195 11.11111 11.11111 11.11111 11.11111 11.11111 11.11111 + + Columns 8 through 14: + + 11.11111 11.11111 11.11111 11.11109 11.11052 11.10624 10.99684 + + Columns 15 through 20: + + 8.76956 2.12993 0.00000 0.00000 0.00000 0.00000 + + ans = 16.208 + + + +```octave +df(300) +``` + + ans = 1.9683e+23 + + + +```octave +% our class function +f= @(x) tan(x)-(x-1).^2 +mod_secant(f,1e-3,1) +``` + + f = + + @(x) tan (x) - (x - 1) .^ 2 + + ans = 0.37375 + + + +```octave +f(ans) +``` + + ans = -3.5577e-13 + + + +```octave +tan(0.37375) +(0.37375-1)^2 +``` + + ans = 0.39218 + ans = 0.39219 + + + +```octave +f([0:10]) +``` + + ans = + + Columns 1 through 8: + + -1.0000 1.5574 -3.1850 -4.1425 -7.8422 -19.3805 -25.2910 -35.1286 + + Columns 9 through 11: + + -55.7997 -64.4523 -80.3516 + + + + +```octave + +``` diff --git a/lecture_07/lecture_07.pdf b/lecture_07/lecture_07.pdf new file mode 100644 index 0000000..70d8fc2 Binary files /dev/null and b/lecture_07/lecture_07.pdf differ diff --git a/lecture_07/lecture_07_files/lecture_07_14_1.svg b/lecture_07/lecture_07_files/lecture_07_14_1.svg new file mode 100644 index 0000000..9d54798 --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_14_1.svg @@ -0,0 +1,146 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -5000 + + + + + 0 + + + + + 5000 + + + + + 10000 + + + + + 15000 + + + + + 20000 + + + + + 25000 + + + + + 30000 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + + principle amount left ($) + + + + + time (years) + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_15_1.svg b/lecture_07/lecture_07_files/lecture_07_15_1.svg new file mode 100644 index 0000000..903c445 --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_15_1.svg @@ -0,0 +1,131 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10000 + + + + + 15000 + + + + + 20000 + + + + + 25000 + + + + + 30000 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + + principle amount left ($) + + + + + time (years) + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_16_1.svg b/lecture_07/lecture_07_files/lecture_07_16_1.svg new file mode 100644 index 0000000..a3a2125 --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_16_1.svg @@ -0,0 +1,151 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 100000 + + + + + 200000 + + + + + 300000 + + + + + 400000 + + + + + 500000 + + + + + 600000 + + + + + 700000 + + + + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 25 + + + + + 30 + + + + + + + + + principle amount left ($) + + + + + time (years) + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_22_1.svg b/lecture_07/lecture_07_files/lecture_07_22_1.svg new file mode 100644 index 0000000..502c4c4 --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_22_1.svg @@ -0,0 +1,197 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-14 + + + + + 10-12 + + + + + 10-10 + + + + + 10-8 + + + + + 10-6 + + + + + 10-4 + + + + + 10-2 + + + + + 100 + + + + + 102 + + + + + 104 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + 150 + + + + + 200 + + + + + 250 + + + + + 300 + + + + + 350 + + + + + 400 + + + + + + + + + + + + + newton-raphson + + + + + newton-raphson + + + + + + mod-secant + + + mod-secant + + + + + + false point + + + false point + + + + + + bisection + + + bisection + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_24_1.svg b/lecture_07/lecture_07_files/lecture_07_24_1.svg new file mode 100644 index 0000000..b511b10 --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_24_1.svg @@ -0,0 +1,197 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-14 + + + + + 10-12 + + + + + 10-10 + + + + + 10-8 + + + + + 10-6 + + + + + 10-4 + + + + + 10-2 + + + + + 100 + + + + + 102 + + + + + 104 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + 150 + + + + + 200 + + + + + 250 + + + + + 300 + + + + + 350 + + + + + 400 + + + + + + + + + + + + + newton-raphson + + + + + newton-raphson + + + + + + mod-secant + + + mod-secant + + + + + + false point + + + false point + + + + + + bisection + + + bisection + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_26_1.svg b/lecture_07/lecture_07_files/lecture_07_26_1.svg new file mode 100644 index 0000000..a8b614c --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_26_1.svg @@ -0,0 +1,182 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-14 + + + + + 10-12 + + + + + 10-10 + + + + + 10-8 + + + + + 10-6 + + + + + 10-4 + + + + + 10-2 + + + + + 100 + + + + + 102 + + + + + 104 + + + + + 0 + + + + + 10 + + + + + 20 + + + + + 30 + + + + + 40 + + + + + 50 + + + + + + + + + + + + + newton-raphson + + + + + newton-raphson + + + + + + mod-secant + + + mod-secant + + + + + + false point + + + false point + + + + + + bisection + + + bisection + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/mod_secant.m b/lecture_07/mod_secant.m new file mode 100644 index 0000000..a3caa10 --- /dev/null +++ b/lecture_07/mod_secant.m @@ -0,0 +1,31 @@ +function [root,ea,iter]=mod_secant(func,dx,xr,es,maxit,varargin) +% newtraph: Modified secant root location zeroes +% [root,ea,iter]=mod_secant(func,dfunc,xr,es,maxit,p1,p2,...): +% uses modified secant method to find the root of func +% input: +% func = name of function +% dx = perturbation fraction +% xr = initial guess +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by function +% output: +% root = real root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +if nargin<4 || isempty(es),es=0.0001;end +if nargin<5 || isempty(maxit),maxit=50;end +iter = 0; +while (1) + xrold = xr; + dfunc=(func(xr+dx)-func(xr))./dx; + xr = xr - func(xr)/dfunc; + iter = iter + 1; + if xr ~= 0 + ea = abs((xr - xrold)/xr) * 100; + end + if ea <= es || iter >= maxit, break, end +end +root = xr; + diff --git a/lecture_07/newtraph.m b/lecture_07/newtraph.m new file mode 100644 index 0000000..94ca667 --- /dev/null +++ b/lecture_07/newtraph.m @@ -0,0 +1,29 @@ +function [root,ea,iter]=newtraph(func,dfunc,xr,es,maxit,varargin) +% newtraph: Newton-Raphson root location zeroes +% [root,ea,iter]=newtraph(func,dfunc,xr,es,maxit,p1,p2,...): +% uses Newton-Raphson method to find the root of func +% input: +% func = name of function +% dfunc = name of derivative of function +% xr = initial guess +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by function +% output: +% root = real root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +if nargin<4 || isempty(es),es=0.0001;end +if nargin<5 || isempty(maxit),maxit=50;end +iter = 0; +while (1) + xrold = xr; + xr = xr - func(xr)/dfunc(xr); + iter = iter + 1; + if xr ~= 0 + ea = abs((xr - xrold)/xr) * 100; + end + if ea <= es || iter >= maxit, break, end +end +root = xr; diff --git a/lecture_07/octave-workspace b/lecture_07/octave-workspace new file mode 100644 index 0000000..a214fe9 Binary files /dev/null and b/lecture_07/octave-workspace differ diff --git a/lecture_08/.ipynb_checkpoints/lecture_08-checkpoint.ipynb b/lecture_08/.ipynb_checkpoints/lecture_08-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_08/.ipynb_checkpoints/lecture_08-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_08/Auchain_model.gif b/lecture_08/Auchain_model.gif new file mode 100644 index 0000000..2f8c78c Binary files /dev/null and b/lecture_08/Auchain_model.gif differ diff --git a/lecture_08/Auchain_model.png b/lecture_08/Auchain_model.png new file mode 100644 index 0000000..dce9cd7 Binary files /dev/null and b/lecture_08/Auchain_model.png differ diff --git a/lecture_08/au_chain.jpg b/lecture_08/au_chain.jpg new file mode 100644 index 0000000..492fee8 Binary files /dev/null and b/lecture_08/au_chain.jpg differ diff --git a/lecture_08/goldenratio.png b/lecture_08/goldenratio.png new file mode 100644 index 0000000..9493c8c Binary files /dev/null and b/lecture_08/goldenratio.png differ diff --git a/lecture_08/goldmin.m b/lecture_08/goldmin.m new file mode 100644 index 0000000..fb4ce0b --- /dev/null +++ b/lecture_08/goldmin.m @@ -0,0 +1,36 @@ +function [x,fx,ea,iter]=goldmin(f,xl,xu,es,maxit,varargin) +% goldmin: minimization golden section search +% [x,fx,ea,iter]=goldmin(f,xl,xu,es,maxit,p1,p2,...): +% uses golden section search to find the minimum of f +% input: +% f = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by f +% output: +% x = location of minimum +% fx = minimum function value +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +phi=(1+sqrt(5))/2; +iter=0; +while(1) + d = (phi-1)*(xu - xl); + x1 = xl + d; + x2 = xu - d; + if f(x1,varargin{:}) < f(x2,varargin{:}) + xopt = x1; + xl = x2; + else + xopt = x2; + xu = x1; + end + iter=iter+1; + if xopt~=0, ea = (2 - phi) * abs((xu - xl) / xopt) * 100;end + if ea <= es | iter >= maxit,break,end +end +x=xopt;fx=f(xopt,varargin{:}); diff --git a/lecture_08/lecture_08.ipynb b/lecture_08/lecture_08.ipynb new file mode 100644 index 0000000..32b973c --- /dev/null +++ b/lecture_08/lecture_08.ipynb @@ -0,0 +1,2762 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "function h = parabola(x)\n", + " y=1;\n", + " h=sum(x.^2+y.^2-1);\n", + "end\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0\r\n" + ] + } + ], + "source": [ + "fzero(@(x) parabola(x),1)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Optimization\n", + "\n", + "Many problems involve finding a minimum or maximum based on given constraints. Engineers and scientists typically use energy balance equations to find the conditions of minimum energy, but this value may never go to 0 and the actual value of energy may not be of interest. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Lennard-Jones potential is commonly used to model interatomic bonding. \n", + "\n", + "$E_{LJ}(x)=4\\epsilon \\left(\\left(\\frac{\\sigma}{x}\\right)^{12}-\\left(\\frac{\\sigma}{x}\\right)^{6}\\right)$\n", + "\n", + "Considering a 1-D gold chain, we can calculate the bond length, $x_{b}$, with no force applied to the chain and even for tension, F. This will allow us to calculate the nonlinear spring constant of a 1-D gold chain. \n", + "\n", + "![TEM image of Gold chain](au_chain.jpg)\n", + "\n", + "Computational Tools to Study and Predict the Long-Term Stability of Nanowires.\n", + "By Martin E. Zoloff Michoff, Patricio Vélez, Sergio A. Dassie and Ezequiel P. M. Leiva \n", + "\n", + "![Model of Gold chain, from molecular dynamics simulation](Auchain_model.png)\n", + "\n", + "[Single atom gold chain mechanics](http://www.uam.es/personal_pdi/ciencias/agrait/)\n", + "\n", + "### First, let's find the minimum energy $\\min(E_{LJ}(x))$\n", + "\n", + "## Brute force" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "setdefaults\n", + "epsilon = 0.039; % kcal/mol\n", + "sigma = 2.934; % Angstrom\n", + "x=linspace(2.8,6,200); % bond length in Angstrom\n", + "\n", + "Ex = lennard_jones(x,sigma,epsilon);\n", + "\n", + "[Emin,imin]=min(Ex);\n", + "\n", + "plot(x,Ex,x(imin),Emin,'o')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 3.2824\n", + "ans = 3.2985\n", + "ans = 3.3146\n" + ] + } + ], + "source": [ + "x(imin-1)\n", + "x(imin)\n", + "x(imin+1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Golden Search Algorithm\n", + "\n", + "We can't just look for a sign change for the problem (unless we can take a derivative) so we need a new approach to determine whether we have a maximum between the two bounds.\n", + "\n", + "Rather than using the midpoint of initial bounds, here the problem is more difficult. We need to compare the values of 4 function evaluations. The golden search uses the golden ratio to determine two interior points. \n", + "\n", + "![golden ratio](goldenratio.png)\n", + "\n", + "Start with bounds of 2.5 and 6 Angstrom. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "current_min = -0.019959\r\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% define Au atomic potential\n", + "epsilon = 0.039; % kcal/mol\n", + "sigma = 2.934; % Angstrom\n", + "Au_x= @(x) lennard_jones(x,sigma,epsilon);\n", + "\n", + "% calculate golden ratio\n", + "phi = 1/2+sqrt(5)/2;\n", + "% set initial limits\n", + "x_l=2.8; \n", + "x_u=6; \n", + "\n", + "% Iteration #1\n", + "d=(phi-1)*(x_u-x_l);\n", + "\n", + "x1=x_l+d; % define point 1\n", + "x2=x_u-d; % define point 2\n", + "\n", + "\n", + "% evaluate Au_x(x1) and Au_x(x2)\n", + "\n", + "f1=Au_x(x1);\n", + "f2=Au_x(x2);\n", + "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n", + "hold on;\n", + "\n", + "if f2\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% Iteration #2\n", + "d=(phi-1)*(x_u-x_l);\n", + "\n", + "x1=x_l+d; % define point 1\n", + "x2=x_u-d; % define point 2\n", + "\n", + "% evaluate Au_x(x1) and Au_x(x2)\n", + "\n", + "f1=Au_x(x1);\n", + "f2=Au_x(x2);\n", + "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n", + "hold on;\n", + "\n", + "if f2\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% Iteration #3\n", + "d=(phi-1)*(x_u-x_l);\n", + "\n", + "x1=x_l+d; % define point 1\n", + "x2=x_u-d; % define point 2\n", + "\n", + "% evaluate Au_x(x1) and Au_x(x2)\n", + "\n", + "f1=Au_x(x1);\n", + "f2=Au_x(x2);\n", + "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n", + "hold on;\n", + "\n", + "if f2\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% Iteration #3\n", + "d=(phi-1)*(x_u-x_l);\n", + "\n", + "x1=x_l+d; % define point 1\n", + "x2=x_u-d; % define point 2\n", + "\n", + "% evaluate Au_x(x1) and Au_x(x2)\n", + "\n", + "f1=Au_x(x1);\n", + "f2=Au_x(x2);\n", + "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n", + "hold on;\n", + "\n", + "if f2\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% define Au atomic potential\n", + "epsilon = 0.039; % kcal/mol\n", + "sigma = 2.934; % Angstrom\n", + "Au_x= @(x) lennard_jones(x,sigma,epsilon);\n", + "\n", + "% set initial limits\n", + "x_l=2.8; \n", + "x_u=3.5; \n", + "\n", + "% Iteration #1\n", + "x1=x_l;\n", + "x2=mean([x_l,x_u]);\n", + "x3=x_u;\n", + "\n", + "% evaluate Au_x(x1), Au_x(x2) and Au_x(x3)\n", + " \n", + "f1=Au_x(x1);\n", + "f2=Au_x(x2);\n", + "f3=Au_x(x3);\n", + "p = polyfit([x1,x2,x3],[f1,f2,f3],2);\n", + "x_fit = linspace(x1,x3,20);\n", + "y_fit = polyval(p,x_fit);\n", + "\n", + "plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')\n", + "hold on\n", + "if f2x2\n", + " plot(x4,f4,'*',[x1,x2],[f1,f2])\n", + " x1=x2;\n", + " f1=f2;\n", + " else\n", + " plot(x4,f4,'*',[x3,x2],[f3,f2])\n", + " x3=x2;\n", + " f3=f2;\n", + " end\n", + " x2=x4; f2=f4;\n", + "else\n", + " error('no minimum in bracket')\n", + "end\n", + "hold off" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "p = polyfit([x1,x2,x3],[f1,f2,f3],2);\n", + "x_fit = linspace(x1,x3,20);\n", + "y_fit = polyval(p,x_fit);\n", + "\n", + "plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')\n", + "hold on\n", + "if f2x2\n", + " plot(x4,f4,'*',[x1,x2],[f1,f2])\n", + " x1=x2;\n", + " f1=f2;\n", + " else\n", + " plot(x4,f4,'*',[x3,x2],[f3,f2])\n", + " x3=x2;\n", + " f3=f2;\n", + " end\n", + " x2=x4; f2=f4;\n", + "else\n", + " error('no minimum in bracket')\n", + "end\n", + "hold off\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "p = polyfit([x1,x2,x3],[f1,f2,f3],2);\n", + "x_fit = linspace(x1,x3,20);\n", + "y_fit = polyval(p,x_fit);\n", + "\n", + "plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')\n", + "hold on\n", + "if f2x2\n", + " plot(x4,f4,'*',[x1,x2],[f1,f2])\n", + " x1=x2;\n", + " f1=f2;\n", + " else\n", + " plot(x4,f4,'*',[x3,x2],[f3,f2])\n", + " x3=x2;\n", + " f3=f2;\n", + " end\n", + " x2=x4; f2=f4;\n", + "else\n", + " error('no minimum in bracket')\n", + "end\n", + "hold off\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Parabolic interpolation does not converge in many scenarios even though it it a bracketing method. Instead, functions like `fminbnd` in Matlab and Octave use a combination of the two (Golden Ratio and Parabolic)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using the solutions to minimization for the nonlinear spring constant\n", + "\n", + "Now, we have two routines to find minimums of a univariate function (Golden Ratio and Parabolic). Let's use these to solve for the minimum energy given a range of applied forces to the single atom gold chain\n", + "\n", + "$E_{total}(\\Delta x) = E_{LJ}(x_{min}+\\Delta x) - F \\cdot \\Delta x$\n", + "\n", + "$1 aJ = 10^{-18} J = 1~nN* 1~nm = 10^{-9}N * 10^{-9} m$" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: Matlab-style short-circuit operation performed for operator |\n", + "warning: called from\n", + " goldmin at line 17 column 1\n", + "warning: Matlab-style short-circuit operation performed for operator |\n", + "warning: Matlab-style short-circuit operation performed for operator |\n", + "xmin = 0.32933\n", + "Emin = -2.7096e-04\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.0004\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.0002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0004\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0006\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.7\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tLennard Jones Potential (aJ/atom)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tbond length (nm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "epsilon = 0.039; % kcal/mol\n", + "epsilon = epsilon*6.9477e-21; % J/atom\n", + "epsilon = epsilon*1e18; % aJ/J\n", + "% final units for epsilon are aJ\n", + "\n", + "sigma = 2.934; % Angstrom\n", + "sigma = sigma*0.10; % nm/Angstrom\n", + "x=linspace(2.8,6,200)*0.10; % bond length in um\n", + "\n", + "Ex = lennard_jones(x,sigma,epsilon);\n", + "\n", + "%[Emin,imin]=min(Ex);\n", + "\n", + "[xmin,Emin] = goldmin(@(x) lennard_jones(x,sigma,epsilon),0.28,0.6)\n", + "\n", + "plot(x,Ex,xmin,Emin,'o')\n", + "ylabel('Lennard Jones Potential (aJ/atom)')\n", + "xlabel('bond length (nm)')\n", + "\n", + "Etotal = @(dx,F) lennard_jones(xmin+dx,sigma,epsilon)-F.*dx;\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0025\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.01\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.025\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.03\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.035\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tForce (nN)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tdx (nm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=50;\n", + "warning('off')\n", + "dx = zeros(1,N); % [in nm]\n", + "F_applied=linspace(0,0.0022,N); % [in nN]\n", + "for i=1:N\n", + " optmin=goldmin(@(dx) Etotal(dx,F_applied(i)),-0.001,0.035);\n", + " dx(i)=optmin;\n", + "end\n", + "\n", + "plot(dx,F_applied)\n", + "xlabel('dx (nm)')\n", + "ylabel('Force (nN)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this function, it is possible to take a derivative and compare the analytical result:\n", + "\n", + "dE/dx = 0 = d(E_LJ)/dx - F\n", + "\n", + "F= d(E_LJ)/dx" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "F =\n", + "\n", + "@(dx) 4 * epsilon * 6 * (sigma ^ 6 ./ (xmin + dx) .^ 7 - 2 * sigma ^ 12 ./ (xmin + dx) .^ 13)\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0025\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.01\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.03\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.05\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dx_full=linspace(0,0.06,50);\n", + "F= @(dx) 4*epsilon*6*(sigma^6./(xmin+dx).^7-2*sigma^12./(xmin+dx).^13)\n", + "plot(dx_full,F(dx_full),dx,F_applied)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Curve-fitting\n", + "Another example is minimizing error in your approximation of a function. If you have data (now we have Force-displacement data) we can fit this to a function, such as:\n", + "\n", + "$F(x) = K_{1}\\Delta x + \\frac{1}{2} K_{2}(\\Delta x)^{2}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function SSE = sse_of_parabola(K,xdata,ydata)\n", + " % calculate the sum of squares error for a parabola given a function, func, and xdata and ydata\n", + " % output is SSE=sum of squares error\n", + " K1=K(1);\n", + " K2=K(2);\n", + " y_function = K1*xdata+1/2*K2*xdata.^2;\n", + " SSE = sum((ydata-y_function).^2);\n", + "end\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "The nonlinear spring constants are K1=0.16 nN/nm and K2=-5.98 nN/nm^2\n", + "The mininum sum of squares error = 7.35e-08\n" + ] + } + ], + "source": [ + "[K,SSE_min]=fminsearch(@(K) sse_of_parabola(K,dx,F_applied),[1,1]);\n", + "fprintf('\\nThe nonlinear spring constants are K1=%1.2f nN/nm and K2=%1.2f nN/nm^2\\n',K)\n", + "fprintf('The mininum sum of squares error = %1.2e',SSE_min)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0025\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.01\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.025\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.03\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.035\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(dx,F_applied,'o',dx,K(1)*dx+1/2*K(2)*dx.^2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_08/lecture_08.md b/lecture_08/lecture_08.md new file mode 100644 index 0000000..79edc0a --- /dev/null +++ b/lecture_08/lecture_08.md @@ -0,0 +1,626 @@ + + +```octave +%plot --format svg +``` + +# Optimization + +Many problems involve finding a minimum or maximum based on given constraints. Engineers and scientists typically use energy balance equations to find the conditions of minimum energy, but this value may never go to 0 and the actual value of energy may not be of interest. + +The Lennard-Jones potential is commonly used to model interatomic bonding. + +$E_{LJ}(x)=4\epsilon \left(\left(\frac{\sigma}{x}\right)^{12}-\left(\frac{\sigma}{x}\right)^{6}\right)$ + +Considering a 1-D gold chain, we can calculate the bond length, $x_{b}$, with no force applied to the chain and even for tension, F. This will allow us to calculate the nonlinear spring constant of a 1-D gold chain. + +![TEM image of Gold chain](au_chain.jpg) + +Computational Tools to Study and Predict the Long-Term Stability of Nanowires. +By Martin E. Zoloff Michoff, Patricio Vélez, Sergio A. Dassie and Ezequiel P. M. Leiva + +![Model of Gold chain, from molecular dynamics simulation](Auchain_model.png) + +[Single atom gold chain mechanics](http://www.uam.es/personal_pdi/ciencias/agrait/) + +### First, let's find the minimum energy $\min(E_{LJ}(x))$ + +## Brute force + + +```octave +setdefaults +epsilon = 0.039; % kcal/mol +sigma = 2.934; % Angstrom +x=linspace(2.8,6,200); % bond length in Angstrom + +Ex = lennard_jones(x,sigma,epsilon); + +[Emin,imin]=min(Ex); + +plot(x,Ex,x(imin),Emin,'o') +``` + + +![svg](lecture_08_files/lecture_08_3_0.svg) + + + +```octave +x(imin-1) +x(imin) +x(imin+1) +``` + + ans = 3.2824 + ans = 3.2985 + ans = 3.3146 + + +## Golden Search Algorithm + +We can't just look for a sign change for the problem (unless we can take a derivative) so we need a new approach to determine whether we have a maximum between the two bounds. + +Rather than using the midpoint of initial bounds, here the problem is more difficult. We need to compare the values of 4 function evaluations. The golden search uses the golden ratio to determine two interior points. + +![golden ratio](goldenratio.png) + +Start with bounds of 2.5 and 6 Angstrom. + + +```octave +% define Au atomic potential +epsilon = 0.039; % kcal/mol +sigma = 2.934; % Angstrom +Au_x= @(x) lennard_jones(x,sigma,epsilon); + +% calculate golden ratio +phi = 1/2+sqrt(5)/2; +% set initial limits +x_l=2.8; +x_u=6; + +% Iteration #1 +d=(phi-1)*(x_u-x_l); + +x1=x_l+d; % define point 1 +x2=x_u-d; % define point 2 + + +% evaluate Au_x(x1) and Au_x(x2) + +f1=Au_x(x1); +f2=Au_x(x2); +plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go') +hold on; + +if f2x2 + plot(x4,f4,'*',[x1,x2],[f1,f2]) + x1=x2; + f1=f2; + else + plot(x4,f4,'*',[x3,x2],[f3,f2]) + x3=x2; + f3=f2; + end + x2=x4; f2=f4; +else + error('no minimum in bracket') +end +hold off +``` + + +![svg](lecture_08_files/lecture_08_11_0.svg) + + + +```octave +p = polyfit([x1,x2,x3],[f1,f2,f3],2); +x_fit = linspace(x1,x3,20); +y_fit = polyval(p,x_fit); + +plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o') +hold on +if f2x2 + plot(x4,f4,'*',[x1,x2],[f1,f2]) + x1=x2; + f1=f2; + else + plot(x4,f4,'*',[x3,x2],[f3,f2]) + x3=x2; + f3=f2; + end + x2=x4; f2=f4; +else + error('no minimum in bracket') +end +hold off + +``` + + +![svg](lecture_08_files/lecture_08_12_0.svg) + + + +```octave +p = polyfit([x1,x2,x3],[f1,f2,f3],2); +x_fit = linspace(x1,x3,20); +y_fit = polyval(p,x_fit); + +plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o') +hold on +if f2x2 + plot(x4,f4,'*',[x1,x2],[f1,f2]) + x1=x2; + f1=f2; + else + plot(x4,f4,'*',[x3,x2],[f3,f2]) + x3=x2; + f3=f2; + end + x2=x4; f2=f4; +else + error('no minimum in bracket') +end +hold off + +``` + + +![svg](lecture_08_files/lecture_08_13_0.svg) + + +Parabolic interpolation does not converge in many scenarios even though it it a bracketing method. Instead, functions like `fminbnd` in Matlab and Octave use a combination of the two (Golden Ratio and Parabolic) + +## Using the solutions to minimization for the nonlinear spring constant + +Now, we have two routines to find minimums of a univariate function (Golden Ratio and Parabolic). Let's use these to solve for the minimum energy given a range of applied forces to the single atom gold chain + +$E_{total}(\Delta x) = E_{LJ}(x_{min}+\Delta x) - F \cdot \Delta x$ + + +```octave +epsilon = 0.039; % kcal/mol +epsilon = epsilon*6.9477e-21; % J/atom +epsilon = epsilon*1e18; % aJ/J +% final units for epsilon are aJ + +sigma = 2.934; % Angstrom +sigma = sigma*0.10; % nm/Angstrom +x=linspace(2.8,6,200)*0.10; % bond length in um + +Ex = lennard_jones(x,sigma,epsilon); + +%[Emin,imin]=min(Ex); + +[xmin,Emin] = fminbnd(@(x) lennard_jones(x,sigma,epsilon),0.28,0.6) + +plot(x,Ex,xmin,Emin,'o') +ylabel('Lennard Jones Potential (aJ/atom)') +xlabel('bond length (nm)') + +Etotal = @(dx,F) lennard_jones(xmin+dx,sigma,epsilon)-F.*dx; + +``` + + xmin = 0.32933 + Emin = -2.7096e-04 + + + +![svg](lecture_08_files/lecture_08_16_1.svg) + + + +```octave +N=50; +dx = zeros(1,N); % [in nm] +F_applied=linspace(0,0.0022,N); % [in nN] +for i=1:N + optmin=goldmin(@(dx) Etotal(dx,F_applied(i)),-0.001,0.035); + dx(i)=optmin; +end + +plot(dx,F_applied) +xlabel('dx (nm)') +ylabel('Force (nN)') +``` + + warning: Matlab-style short-circuit operation performed for operator | + warning: called from + goldmin at line 17 column 1 + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + warning: Matlab-style short-circuit operation performed for operator | + + + +![svg](lecture_08_files/lecture_08_17_1.svg) + + +For this function, it is possible to take a derivative and compare the analytical result: + + +```octave +dx_full=linspace(0,0.06,50); +F= @(dx) 4*epsilon*6*(sigma^6./(xmin+dx).^7-2*sigma^12./(xmin+dx).^13) +plot(dx_full,F(dx_full),dx,F_applied) +``` + + F = + + @(dx) 4 * epsilon * 6 * (sigma ^ 6 ./ (xmin + dx) .^ 7 - 2 * sigma ^ 12 ./ (xmin + dx) .^ 13) + + + + +![svg](lecture_08_files/lecture_08_19_1.svg) + + +## Curve-fitting +Another example is minimizing error in your approximation of a function. If you have data (now we have Force-displacement data) we can fit this to a function, such as: + +$F(x) = K_{1}\Delta x + \frac{1}{2} K_{2}(\Delta x)^{2}$ + + + +```octave +function SSE = sse_of_parabola(K,xdata,ydata) + % calculate the sum of squares error for a parabola given a function, func, and xdata and ydata + % output is SSE=sum of squares error + K1=K(1); + K2=K(2); + y_function = K1*xdata+1/2*K2*xdata.^2; + SSE = sum((ydata-y_function).^2); +end + +``` + + +```octave +[K,SSE_min]=fminsearch(@(K) sse_of_parabola(K,dx,F_applied),[1,1]); +fprintf('\nThe nonlinear spring constants are K1=%1.2f nN/nm and K2=%1.2f nN/nm^2\n',K) +fprintf('The mininum sum of squares error = %1.2e',SSE_min) +``` + + + The nonlinear spring constants are K1=0.16 nN/nm and K2=-5.98 nN/nm^2 + The mininum sum of squares error = 7.35e-08 + + + +```octave +plot(dx,F_applied,'o',dx,K(1)*dx+1/2*K(2)*dx.^2) +``` + + +![svg](lecture_08_files/lecture_08_23_0.svg) + diff --git a/lecture_08/lecture_08.pdf b/lecture_08/lecture_08.pdf new file mode 100644 index 0000000..c251694 Binary files /dev/null and b/lecture_08/lecture_08.pdf differ diff --git a/lecture_08/lecture_08_files/lecture_08_11_0.svg b/lecture_08/lecture_08_files/lecture_08_11_0.svg new file mode 100644 index 0000000..c61f790 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_11_0.svg @@ -0,0 +1,168 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.06 + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_12_0.svg b/lecture_08/lecture_08_files/lecture_08_12_0.svg new file mode 100644 index 0000000..b641032 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_12_0.svg @@ -0,0 +1,163 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_13_0.svg b/lecture_08/lecture_08_files/lecture_08_13_0.svg new file mode 100644 index 0000000..3e467e5 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_13_0.svg @@ -0,0 +1,163 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_16_1.svg b/lecture_08/lecture_08_files/lecture_08_16_1.svg new file mode 100644 index 0000000..ff27c29 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_16_1.svg @@ -0,0 +1,142 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.0004 + + + + + -0.0002 + + + + + 0 + + + + + 0.0002 + + + + + 0.0004 + + + + + 0.0006 + + + + + 0.2 + + + + + 0.3 + + + + + 0.4 + + + + + 0.5 + + + + + 0.6 + + + + + 0.7 + + + + + + + + + Lennard Jones Potential (aJ/atom) + + + + + bond length (nm) + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_17_1.svg b/lecture_08/lecture_08_files/lecture_08_17_1.svg new file mode 100644 index 0000000..1f3103b --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_17_1.svg @@ -0,0 +1,136 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0.0005 + + + + + 0.001 + + + + + 0.0015 + + + + + 0.002 + + + + + 0.0025 + + + + + -0.01 + + + + + 0 + + + + + 0.01 + + + + + 0.02 + + + + + 0.03 + + + + + 0.04 + + + + + + + + + Force (nN) + + + + + dx (nm) + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_19_1.svg b/lecture_08/lecture_08_files/lecture_08_19_1.svg new file mode 100644 index 0000000..2a891df --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_19_1.svg @@ -0,0 +1,135 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0.0005 + + + + + 0.001 + + + + + 0.0015 + + + + + 0.002 + + + + + 0.0025 + + + + + 0 + + + + + 0.01 + + + + + 0.02 + + + + + 0.03 + + + + + 0.04 + + + + + 0.05 + + + + + 0.06 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_23_0.svg b/lecture_08/lecture_08_files/lecture_08_23_0.svg new file mode 100644 index 0000000..8fa3bb1 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_23_0.svg @@ -0,0 +1,196 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0.0005 + + + + + 0.001 + + + + + 0.0015 + + + + + 0.002 + + + + + 0.0025 + + + + + 0 + + + + + 0.005 + + + + + 0.01 + + + + + 0.015 + + + + + 0.02 + + + + + 0.025 + + + + + 0.03 + + + + + 0.035 + + + + + 0.04 + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_3_0.svg b/lecture_08/lecture_08_files/lecture_08_3_0.svg new file mode 100644 index 0000000..2c38150 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_3_0.svg @@ -0,0 +1,147 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_6_1.svg b/lecture_08/lecture_08_files/lecture_08_6_1.svg new file mode 100644 index 0000000..ecf7a18 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_6_1.svg @@ -0,0 +1,169 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + gnuplot_plot_3a + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + gnuplot_plot_6a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_7_1.svg b/lecture_08/lecture_08_files/lecture_08_7_1.svg new file mode 100644 index 0000000..e63011c --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_7_1.svg @@ -0,0 +1,169 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + gnuplot_plot_3a + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + gnuplot_plot_6a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_8_1.svg b/lecture_08/lecture_08_files/lecture_08_8_1.svg new file mode 100644 index 0000000..873b04d --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_8_1.svg @@ -0,0 +1,169 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + gnuplot_plot_3a + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + gnuplot_plot_6a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lecture_08_files/lecture_08_9_1.svg b/lecture_08/lecture_08_files/lecture_08_9_1.svg new file mode 100644 index 0000000..28fd681 --- /dev/null +++ b/lecture_08/lecture_08_files/lecture_08_9_1.svg @@ -0,0 +1,169 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.04 + + + + + -0.02 + + + + + 0 + + + + + 0.02 + + + + + 0.04 + + + + + 0.06 + + + + + 0.08 + + + + + 2.5 + + + + + 3 + + + + + 3.5 + + + + + 4 + + + + + 4.5 + + + + + 5 + + + + + 5.5 + + + + + 6 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + gnuplot_plot_3a + + + + + + gnuplot_plot_4a + + + + + + gnuplot_plot_5a + + + + + + gnuplot_plot_6a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_08/lennard_jones.m b/lecture_08/lennard_jones.m new file mode 100644 index 0000000..d18a6ad --- /dev/null +++ b/lecture_08/lennard_jones.m @@ -0,0 +1,4 @@ +function E_LJ =lennard_jones(x,sigma,epsilon) + E_LJ = 4*epsilon*((sigma./x).^12-(sigma./x).^6); +end + diff --git a/lecture_08/octave-workspace b/lecture_08/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_08/octave-workspace differ diff --git a/lecture_09/.ipynb_checkpoints/lecture_09-checkpoint.ipynb b/lecture_09/.ipynb_checkpoints/lecture_09-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_09/.ipynb_checkpoints/lecture_09-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_09/.lecture_09.md.swp b/lecture_09/.lecture_09.md.swp new file mode 100644 index 0000000..4000b4f Binary files /dev/null and b/lecture_09/.lecture_09.md.swp differ diff --git a/lecture_09/even_odd_perm.svg b/lecture_09/even_odd_perm.svg new file mode 100644 index 0000000..eeaca19 --- /dev/null +++ b/lecture_09/even_odd_perm.svg @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + + even+ + odd- + + + diff --git a/lecture_09/lecture_09.ipynb b/lecture_09/lecture_09.ipynb new file mode 100644 index 0000000..4889d52 --- /dev/null +++ b/lecture_09/lecture_09.ipynb @@ -0,0 +1,1151 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear Algebra (Review/Introduction)\n", + "\n", + "Representation of linear equations:\n", + "\n", + "1. $5x_{1}+3x_{2} =1$\n", + "\n", + "2. $x_{1}+2x_{2}+3x_{3} =2$\n", + "\n", + "3. $x_{1}+x_{2}+x_{3} =3$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{ccc}\n", + "5 & 3 & 0 \\\\\n", + "1 & 2 & 3 \\\\\n", + "1 & 1 & 1 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "x_{3}\\end{array}\\right]=\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "2 \\\\\n", + "3\\end{array}\\right]$\n", + "\n", + "$Ax=b$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Vectors \n", + "\n", + "column vector x (length of 3):\n", + "\n", + "$\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "x_{3}\\end{array}\\right]$\n", + "\n", + "row vector y (length of 3):\n", + "\n", + "$\\left[\\begin{array}{ccc} \n", + "y_{1}~ \n", + "y_{2}~ \n", + "y_{3}\\end{array}\\right]$\n", + "\n", + "vector of length N:\n", + "\n", + "$\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "\\vdots \\\\\n", + "x_{N}\\end{array}\\right]$\n", + "\n", + "The $i^{th}$ element of x is $x_{i}$" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 1 2 3 4 5 6 7 8 9 10\n", + "\n" + ] + } + ], + "source": [ + "x=[1:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1\n", + " 2\n", + " 3\n", + " 4\n", + " 5\n", + " 6\n", + " 7\n", + " 8\n", + " 9\n", + " 10\n", + "\n" + ] + } + ], + "source": [ + "x'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Matrices\n", + "\n", + "Matrix A is 3x3:\n", + "\n", + "$A=\\left[ \\begin{array}{ccc}\n", + "5 & 3 & 0 \\\\\n", + "1 & 2 & 3 \\\\\n", + "1 & 1 & 1 \\end{array} \\right]$\n", + "\n", + "elements in the matrix are denoted $A_{row~column}$, $A_{23}=3$\n", + "\n", + "In general, matrix, B, can be any size, $M \\times N$ (M-rows and N-columns):\n", + "\n", + "$B=\\left[ \\begin{array}{cccc}\n", + "B_{11} & B_{12} &...& B_{1N} \\\\\n", + "B_{21} & B_{22} &...& B_{2N} \\\\\n", + "\\vdots & \\vdots &\\ddots& \\vdots \\\\\n", + "B_{M1} & B_{M2} &...& B_{MN}\\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 5 3 0\n", + " 1 2 3\n", + " 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "A=[5,3,0;1,2,3;1,1,1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiplication\n", + "\n", + "A column vector is a $1\\times N$ matrix and a row vector is a $M\\times 1$ matrix\n", + "\n", + "**Multiplying matrices is not commutative**\n", + "\n", + "$A B \\neq B A$\n", + "\n", + "Inner dimensions must agree, output is outer dimensions. \n", + "\n", + "A is $M1 \\times N1$ and B is $M2 \\times N2$\n", + "\n", + "C=AB\n", + "\n", + "Therefore N1=M2 and C is $M1 \\times N2$\n", + "\n", + "If $C'=BA$, then N2=M1 and C is $M2 \\times N1$\n", + "\n", + "\n", + "e.g. \n", + "$A=\\left[ \\begin{array}{cc}\n", + "5 & 3 & 0 \\\\\n", + "1 & 2 & 3 \\end{array} \\right]$\n", + "\n", + "$B=\\left[ \\begin{array}{cccc}\n", + "1 & 2 & 3 & 4 \\\\\n", + "5 & 6 & 7 & 8 \\\\\n", + "9 & 10 & 11 & 12 \\end{array} \\right]$\n", + "\n", + "C=AB\n", + "\n", + "$[2\\times 4] = [2 \\times 3][3 \\times 4]$\n", + "\n", + "The rule for multiplying matrices, A and B, is\n", + "\n", + "$C_{ij} = \\sum_{k=1}^{n}A_{ik}B_{kj}$\n", + "\n", + "In the previous example, \n", + "\n", + "$C_{11} = A_{11}B_{11}+A_{12}B_{21}+A_{13}B_{31} = 5*1+3*5+0*9=20$\n", + "\n", + "\n", + "Multiplication is associative:\n", + "\n", + "$(AB)C = A(BC)$\n", + "\n", + "and distributive:\n", + "\n", + "$A(B+C)=AB+AC$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 5 3 0\n", + " 1 2 3\n", + "\n", + "B =\n", + "\n", + " 1 2 3 4\n", + " 5 6 7 8\n", + " 9 10 11 12\n", + "\n" + ] + } + ], + "source": [ + "A=[5,3,0;1,2,3] \n", + "B=[1,2,3,4;5,6,7,8;9,10,11,12]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "C =\n", + "\n", + " 0 0 0 0\n", + " 0 0 0 0\n", + "\n", + "C =\n", + "\n", + " 20 28 36 44\n", + " 38 44 50 56\n", + "\n" + ] + } + ], + "source": [ + "C=zeros(2,4)\n", + "C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1);\n", + "C(1,2)=A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2);\n", + "\n", + "C=A*B" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error: operator *: nonconformant arguments (op1 is 3x4, op2 is 2x3)\r\n" + ] + } + ], + "source": [ + "Cp=B*A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Representation of a problem with Matrices and Vectors\n", + "\n", + "If you have a set of known output, $y_{1},~y_{2},~...y_{N}$ and a set of equations that\n", + "relate unknown inputs, $x_{1},~x_{2},~...x_{N}$, then these can be written in a vector\n", + "matrix format as:\n", + "\n", + "$y=Ax=\\left[\\begin{array}{c} \n", + "y_{1} \\\\ \n", + "y_{2} \\\\\n", + "\\vdots \\\\\n", + "y_{N}\\end{array}\\right]\n", + "=\n", + "A\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "\\vdots \\\\\n", + "x_{N}\\end{array}\\right]$\n", + "\n", + "$A=\n", + "\\left[\\begin{array}{cccc} \n", + "| & | & & | \\\\ \n", + "a_{1} & a_{2} & ... & a_{N} \\\\ \n", + "| & | & & | \\end{array}\\right]$\n", + "\n", + "or \n", + "\n", + "$y = a_{1}x_{1} + a_{2}x_{2} +...+a_{N}x_{N}$\n", + "\n", + "where each $a_{i}$ is a column vector and $x_{i}$ is a scalar taken from the $i^{th}$\n", + "element of x.\n", + "\n", + "Consider the following problem, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n", + "x =\n", + "\n", + " 9.8100\n", + " 18.6390\n", + " 25.5060\n", + " 29.4300\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]\n", + "\n", + "x=K\\y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matrix Operations\n", + "\n", + "Identity matrix `eye(M,N)` **Assume M=N unless specfied**\n", + "\n", + "$I_{ij} =1$ if $i=j$ \n", + "\n", + "$I_{ij} =0$ if $i\\neq j$ \n", + "\n", + "AI=A=IA\n", + "\n", + "Diagonal matrix, D, is similar to the identity matrix, but each diagonal element can be any\n", + "number\n", + "\n", + "$D_{ij} =d_{i}$ if $i=j$ \n", + "\n", + "$D_{ij} =0$ if $i\\neq j$ " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Transpose\n", + "\n", + "The transpose of a matrix changes the rows -> columns and columns-> rows\n", + "\n", + "$(A^{T})_{ij} = A_{ji}$\n", + "\n", + "for diagonal matrices, $D^{T}=D$\n", + "\n", + "in general, the transpose has the following qualities:\n", + " \n", + "1. $(A^{T})^{T}=A$\n", + "\n", + "2. $(AB)^{T} = B^{T}A^{T}$\n", + "\n", + "3. $(A+B)^{T} = A^{T} +B^{T}$ \n", + "\n", + "All matrices have a symmetric and antisymmetric part:\n", + "\n", + "$A= 1/2(A+A^{T}) +1/2(A-A^{T})$\n", + "\n", + "If $A=A^{T}$, then A is symmetric, if $A=-A^{T}$, then A is antisymmetric." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 20 38\n", + " 28 44\n", + " 36 50\n", + " 44 56\n", + "\n", + "ans =\n", + "\n", + " 20 38\n", + " 28 44\n", + " 36 50\n", + " 44 56\n", + "\n", + "error: operator *: nonconformant arguments (op1 is 3x2, op2 is 4x3)\n" + ] + } + ], + "source": [ + "(A*B)'\n", + "\n", + "B'*A' % if this wasnt true, then inner dimensions wouldn;t match\n", + "\n", + "A'*B' == (A*B)'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Square matrix operations\n", + "\n", + "### Trace\n", + "\n", + "The trace of a square matrix is the sum of the diagonal elements\n", + "\n", + "$tr~A=\\sum_{i=1}^{N}A_{ii}$\n", + "\n", + "The trace is invariant, meaning that if you change the basis through a rotation, then the\n", + "trace remains the same. \n", + "\n", + "It also has the following properties:\n", + "\n", + "1. $tr~A=tr~A^{T}$\n", + "\n", + "2. $tr~A+tr~B=tr(A+B)$\n", + "\n", + "3. $tr(kA)=k tr~A$\n", + "\n", + "4. $tr(AB)=tr(BA)$" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id_m =\n", + "\n", + "Diagonal Matrix\n", + "\n", + " 1 0 0\n", + " 0 1 0\n", + " 0 0 1\n", + "\n", + "ans = 3\n" + ] + } + ], + "source": [ + "id_m=eye(3)\n", + "trace(id_m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inverse\n", + "\n", + "The inverse of a square matrix, $A^{-1}$ is defined such that\n", + "\n", + "$A^{-1}A=I=AA^{-1}$\n", + "\n", + "Not all square matrices have an inverse, they can be *singular* or *non-invertible*\n", + "\n", + "The inverse has the following properties:\n", + "\n", + "1. $(A^{-1})^{-1}=A$\n", + "\n", + "2. $(AB)^{-1}=B^{-1}A^{-1}$\n", + "\n", + "3. $(A^{-1})^{T}=(A^{T})^{-1}$" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 0.5762106 0.3533174 0.7172134\n", + " 0.7061664 0.4863733 0.9423436\n", + " 0.4255961 0.0016613 0.3561407\n", + "\n" + ] + } + ], + "source": [ + "A=rand(3,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ainv =\n", + "\n", + " 41.5613 -30.1783 -3.8467\n", + " 36.2130 -24.2201 -8.8415\n", + " -49.8356 36.1767 7.4460\n", + "\n" + ] + } + ], + "source": [ + "Ainv=inv(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "B =\n", + "\n", + " 0.524529 0.470856 0.708116\n", + " 0.084491 0.730986 0.528292\n", + " 0.303545 0.782522 0.389282\n", + "\n" + ] + } + ], + "source": [ + "B=rand(3,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " -182.185 125.738 40.598\n", + " -133.512 97.116 17.079\n", + " 282.422 -200.333 -46.861\n", + "\n", + "ans =\n", + "\n", + " -182.185 125.738 40.598\n", + " -133.512 97.116 17.079\n", + " 282.422 -200.333 -46.861\n", + "\n", + "ans =\n", + "\n", + " 41.5613 36.2130 -49.8356\n", + " -30.1783 -24.2201 36.1767\n", + " -3.8467 -8.8415 7.4460\n", + "\n", + "ans =\n", + "\n", + " 41.5613 36.2130 -49.8356\n", + " -30.1783 -24.2201 36.1767\n", + " -3.8467 -8.8415 7.4460\n", + "\n" + ] + } + ], + "source": [ + "inv(A*B)\n", + "inv(B)*inv(A)\n", + "\n", + "inv(A')\n", + "\n", + "inv(A)'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Orthogonal Matrices\n", + "\n", + "Vectors are *orthogonal* if $x^{T}$ y=0, and a vector is *normalized* if $||x||_{2}=1$. A\n", + "square matrix is *orthogonal* if all its column vectors are orthogonal to each other and\n", + "normalized. The column vectors are then called *orthonormal* and the following results\n", + "\n", + "$U^{T}U=I=UU^{T}$\n", + "\n", + "and \n", + "\n", + "$||Ux||_{2}=||x||_{2}$\n", + "\n", + "### Determinant\n", + "\n", + "The **determinant** of a matrix has 3 properties\n", + "\n", + "1. The determinant of the identity matrix is one, $|I|=1$\n", + "\n", + "2. If you multiply a single row by scalar $t$ then the determinant is $t|A|$:\n", + "\n", + "$t|A|=\\left[ \\begin{array}{cccc}\n", + "tA_{11} & tA_{12} &...& tA_{1N} \\\\\n", + "A_{21} & A_{22} &...& A_{2N} \\\\\n", + "\\vdots & \\vdots &\\ddots& \\vdots \\\\\n", + "A_{M1} & A_{M2} &...& A_{MN}\\end{array} \\right]$\n", + "\n", + "3. If you switch 2 rows, the determinant changes sign:\n", + "\n", + "\n", + "$-|A|=\\left[ \\begin{array}{cccc}\n", + "A_{21} & A_{22} &...& A_{2N} \\\\\n", + "A_{11} & A_{12} &...& A_{1N} \\\\\n", + "\\vdots & \\vdots &\\ddots& \\vdots \\\\\n", + "A_{M1} & A_{M2} &...& A_{MN}\\end{array} \\right]$\n", + "\n", + "4. inverse of the determinant is the determinant of the inverse:\n", + "\n", + "$|A^{-1}|=\\frac{1}{|A|}=|A|^{-1}$\n", + "\n", + "For a $2\\times2$ matrix, \n", + "\n", + "$|A|=\\left|\\left[ \\begin{array}{cc}\n", + "A_{11} & A_{12} \\\\\n", + "A_{21} & A_{22} \\\\\n", + "\\end{array} \\right]\\right| = A_{11}A_{22}-A_{21}A_{12}$\n", + "\n", + "For a $3\\times3$ matrix,\n", + "\n", + "$|A|=\\left|\\left[ \\begin{array}{ccc}\n", + "A_{11} & A_{12} & A_{13} \\\\\n", + "A_{21} & A_{22} & A_{23} \\\\\n", + "A_{31} & A_{32} & A_{33}\\end{array} \\right]\\right|=$\n", + "\n", + "$A_{11}A_{22}A_{33}+A_{12}A_{23}A_{31}+A_{13}A_{21}A_{32}\n", + "-A_{31}A_{22}A_{13}-A_{32}A_{23}A_{11}-A_{33}A_{21}A_{12}$\n", + "\n", + "For larger matrices, the determinant is \n", + "\n", + "$|A|=\n", + "\\frac{1}{n!}\n", + "\\sum_{i_{r}}^{N}\n", + "\\sum_{j_{r}}^{N}\n", + "\\epsilon_{i_{1}...i_{N}}\n", + "\\epsilon_{j_{1}...j_{N}}\n", + "A_{i_{1}j_{1}}\n", + "A_{i_{2}j_{2}}\n", + "...\n", + "A_{i_{N}j_{N}}$\n", + "\n", + "Where the Levi-Cevita symbol is $\\epsilon_{i_{1}i_{2}...i_{N}} = 1$ if it is an even\n", + "permutation and $\\epsilon_{i_{1}i_{2}...i_{N}} = -1$ if it is an odd permutation and\n", + "$\\epsilon_{i_{1}i_{2}...i_{N}} = 0$ if $i_{n}=i_{m}$ e.g. $i_{1}=i_{7}$\n", + "\n", + "![Levi-Cevita rule for even and odd permutations for an $N\\times N$\n", + "determinant](even_odd_perm.svg)\n", + "\n", + "So a $4\\times4$ matrix determinant,\n", + "\n", + "$|A|=\\left|\\left[ \\begin{array}{cccc}\n", + "A_{11} & A_{12} & A_{13} & A_{14} \\\\\n", + "A_{21} & A_{22} & A_{23} & A_{24} \\\\\n", + "A_{31} & A_{32} & A_{33} & A_{34} \\\\\n", + "A_{41} & A_{42} & A_{43} & A_{44} \\end{array} \\right]\\right|$\n", + "\n", + "$=\\epsilon_{1234}\\epsilon_{1234}A_{11}A_{22}A_{33}A_{44}+\n", + "\\epsilon_{2341}\\epsilon_{1234}A_{21}A_{32}A_{43}A_{14}+\n", + "\\epsilon_{3412}\\epsilon_{1234}A_{31}A_{42}A_{13}A_{24}+\n", + "\\epsilon_{4123}\\epsilon_{1234}A_{41}A_{12}A_{23}A_{34}+...\n", + "\\epsilon_{4321}\\epsilon_{4321}A_{44}A_{33}A_{22}A_{11}$\n", + "\n", + "### Special Case for determinants\n", + "\n", + "The determinant of a diagonal matrix $|D|=D_{11}D_{22}D_{33}...D_{NN}$. \n", + "\n", + "Similarly, if a matrix is upper triangular (so all values of $A_{ij}=0$ when $j +Babel <3.9q> and hyphenation patterns for 81 language(s) loaded. +! You can't use `macro parameter character #' in vertical mode. +l.2 # + Linear Algebra (Review/Introduction) +? +! Interruption. + + +l.2 # + Linear Algebra (Review/Introduction) +? xx + +Here is how much of TeX's memory you used: + 6 strings out of 493030 + 147 string characters out of 6136260 + 53067 words of memory out of 5000000 + 3641 multiletter control sequences out of 15000+600000 + 3640 words of font info for 14 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 5i,0n,1p,57b,8s stack positions out of 5000i,500n,10000p,200000b,80000s +No pages of output. diff --git a/lecture_09/lecture_09.md b/lecture_09/lecture_09.md new file mode 100644 index 0000000..a1d53d1 --- /dev/null +++ b/lecture_09/lecture_09.md @@ -0,0 +1,802 @@ + +# Linear Algebra (Review/Introduction) + +Representation of linear equations: + +1. $5x_{1}+3x_{2} =1$ + +2. $x_{1}+2x_{2}+3x_{3} =2$ + +3. $x_{1}+x_{2}+x_{3} =3$ + +in matrix form: + +$\left[ \begin{array}{ccc} +5 & 3 & 0 \\ +1 & 2 & 3 \\ +1 & 1 & 1 \end{array} \right] +\left[\begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3}\end{array}\right]=\left[\begin{array}{c} +1 \\ +2 \\ +3\end{array}\right]$ + +$Ax=b$ + +### Vectors + +column vector x (length of 3): + +$\left[\begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3}\end{array}\right]$ + +row vector y (length of 3): + +$\left[\begin{array}{ccc} +y_{1}~ +y_{2}~ +y_{3}\end{array}\right]$ + +vector of length N: + +$\left[\begin{array}{c} +x_{1} \\ +x_{2} \\ +\vdots \\ +x_{N}\end{array}\right]$ + +The $i^{th}$ element of x is $x_{i}$ + + +```octave +x=[1:10] +``` + + x = + + 1 2 3 4 5 6 7 8 9 10 + + + + +```octave +x' +``` + + ans = + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + + + +### Matrices + +Matrix A is 3x3: + +$A=\left[ \begin{array}{ccc} +5 & 3 & 0 \\ +1 & 2 & 3 \\ +1 & 1 & 1 \end{array} \right]$ + +elements in the matrix are denoted $A_{row~column}$, $A_{23}=3$ + +In general, matrix, B, can be any size, $M \times N$ (M-rows and N-columns): + +$B=\left[ \begin{array}{cccc} +B_{11} & B_{12} &...& B_{1N} \\ +B_{21} & B_{22} &...& B_{2N} \\ +\vdots & \vdots &\ddots& \vdots \\ +B_{M1} & B_{M2} &...& B_{MN}\end{array} \right]$ + + +```octave +A=[5,3,0;1,2,3;1,1,1] +``` + + A = + + 5 3 0 + 1 2 3 + 1 1 1 + + + +## Multiplication + +A column vector is a $1\times N$ matrix and a row vector is a $M\times 1$ matrix + +**Multiplying matrices is not commutative** + +$A B \neq B A$ + +Inner dimensions must agree, output is outer dimensions. + +A is $M1 \times N1$ and B is $M2 \times N2$ + +C=AB + +Therefore N1=M2 and C is $M1 \times N2$ + +If $C'=BA$, then N2=M1 and C is $M2 \times N1$ + + +e.g. +$A=\left[ \begin{array}{cc} +5 & 3 & 0 \\ +1 & 2 & 3 \end{array} \right]$ + +$B=\left[ \begin{array}{cccc} +1 & 2 & 3 & 4 \\ +5 & 6 & 7 & 8 \\ +9 & 10 & 11 & 12 \end{array} \right]$ + +C=AB + +$[2\times 4] = [2 \times 3][3 \times 4]$ + +The rule for multiplying matrices, A and B, is + +$C_{ij} = \sum_{k=1}^{n}A_{ik}B_{kj}$ + +In the previous example, + +$C_{11} = A_{11}B_{11}+A_{12}B_{21}+A_{13}B_{31} = 5*1+3*5+0*9=20$ + + +Multiplication is associative: + +$(AB)C = A(BC)$ + +and distributive: + +$A(B+C)=AB+AC$ + + +```octave +A=[5,3,0;1,2,3] +B=[1,2,3,4;5,6,7,8;9,10,11,12] +``` + + A = + + 5 3 0 + 1 2 3 + + B = + + 1 2 3 4 + 5 6 7 8 + 9 10 11 12 + + + + +```octave +C=zeros(2,4) +C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1); +C(1,2)=A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2); + +C=A*B +``` + + C = + + 0 0 0 0 + 0 0 0 0 + + C = + + 20 28 36 44 + 38 44 50 56 + + + + +```octave +Cp=B*A +``` + + error: operator *: nonconformant arguments (op1 is 3x4, op2 is 2x3) + + +## Representation of a problem with Matrices and Vectors + +If you have a set of known output, $y_{1},~y_{2},~...y_{N}$ and a set of equations that +relate unknown inputs, $x_{1},~x_{2},~...x_{N}$, then these can be written in a vector +matrix format as: + +$y=Ax=\left[\begin{array}{c} +y_{1} \\ +y_{2} \\ +\vdots \\ +y_{N}\end{array}\right] += +A\left[\begin{array}{c} +x_{1} \\ +x_{2} \\ +\vdots \\ +x_{N}\end{array}\right]$ + +$A= +\left[\begin{array}{cccc} +| & | & & | \\ +a_{1} & a_{2} & ... & a_{N} \\ +| & | & & | \end{array}\right]$ + +or + +$y = a_{1}x_{1} + a_{2}x_{2} +...+a_{N}x_{N}$ + +where each $a_{i}$ is a column vector and $x_{i}$ is a scalar taken from the $i^{th}$ +element of x. + +Consider the following problem, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? + +![Springs-masses](mass_springs.svg) + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass: + +$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$ + +$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$ + +$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$ + +$m_{4}g-k(x_{4}-x_{3})=0$ + +in matrix form: + +$\left[ \begin{array}{cccc} +2k & -k & 0 & 0 \\ +-k & 2k & -k & 0 \\ +0 & -k & 2k & -k \\ +0 & 0 & -k & k \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \\ +x_{4} \end{array} \right]= +\left[ \begin{array}{c} +m_{1}g \\ +m_{2}g \\ +m_{3}g \\ +m_{4}g \end{array} \right]$ + + +```octave +k=10; % N/m +m1=1; % kg +m2=2; +m3=3; +m4=4; +g=9.81; % m/s^2 +K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k] +y=[m1*g;m2*g;m3*g;m4*g] + +x=K\y +``` + + K = + + 20 -10 0 0 + -10 20 -10 0 + 0 -10 20 -10 + 0 0 -10 10 + + y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + x = + + 9.8100 + 18.6390 + 25.5060 + 29.4300 + + + +## Matrix Operations + +Identity matrix `eye(M,N)` **Assume M=N unless specfied** + +$I_{ij} =1$ if $i=j$ + +$I_{ij} =0$ if $i\neq j$ + +AI=A=IA + +Diagonal matrix, D, is similar to the identity matrix, but each diagonal element can be any +number + +$D_{ij} =d_{i}$ if $i=j$ + +$D_{ij} =0$ if $i\neq j$ + +### Transpose + +The transpose of a matrix changes the rows -> columns and columns-> rows + +$(A^{T})_{ij} = A_{ji}$ + +for diagonal matrices, $D^{T}=D$ + +in general, the transpose has the following qualities: + +1. $(A^{T})^{T}=A$ + +2. $(AB)^{T} = B^{T}A^{T}$ + +3. $(A+B)^{T} = A^{T} +B^{T}$ + +All matrices have a symmetric and antisymmetric part: + +$A= 1/2(A+A^{T}) +1/2(A-A^{T})$ + +If $A=A^{T}$, then A is symmetric, if $A=-A^{T}$, then A is antisymmetric. + + +```octave +(A*B)' + +B'*A' % if this wasnt true, then inner dimensions wouldn;t match + +A'*B' == (A*B)' +``` + + ans = + + 20 38 + 28 44 + 36 50 + 44 56 + + ans = + + 20 38 + 28 44 + 36 50 + 44 56 + + error: operator *: nonconformant arguments (op1 is 3x2, op2 is 4x3) + + +## Square matrix operations + +### Trace + +The trace of a square matrix is the sum of the diagonal elements + +$tr~A=\sum_{i=1}^{N}A_{ii}$ + +The trace is invariant, meaning that if you change the basis through a rotation, then the +trace remains the same. + +It also has the following properties: + +1. $tr~A=tr~A^{T}$ + +2. $tr~A+tr~B=tr(A+B)$ + +3. $tr(kA)=k tr~A$ + +4. $tr(AB)=tr(BA)$ + + +```octave +id_m=eye(3) +trace(id_m) +``` + + id_m = + + Diagonal Matrix + + 1 0 0 + 0 1 0 + 0 0 1 + + ans = 3 + + +### Inverse + +The inverse of a square matrix, $A^{-1}$ is defined such that + +$A^{-1}A=I=AA^{-1}$ + +Not all square matrices have an inverse, they can be *singular* or *non-invertible* + +The inverse has the following properties: + +1. $(A^{-1})^{-1}=A$ + +2. $(AB)^{-1}=B^{-1}A^{-1}$ + +3. $(A^{-1})^{T}=(A^{T})^{-1}$ + + +```octave +A=rand(3,3) +``` + + A = + + 0.5762106 0.3533174 0.7172134 + 0.7061664 0.4863733 0.9423436 + 0.4255961 0.0016613 0.3561407 + + + + +```octave +Ainv=inv(A) +``` + + Ainv = + + 41.5613 -30.1783 -3.8467 + 36.2130 -24.2201 -8.8415 + -49.8356 36.1767 7.4460 + + + + +```octave +B=rand(3,3) +``` + + B = + + 0.524529 0.470856 0.708116 + 0.084491 0.730986 0.528292 + 0.303545 0.782522 0.389282 + + + + +```octave +inv(A*B) +inv(B)*inv(A) + +inv(A') + +inv(A)' +``` + + ans = + + -182.185 125.738 40.598 + -133.512 97.116 17.079 + 282.422 -200.333 -46.861 + + ans = + + -182.185 125.738 40.598 + -133.512 97.116 17.079 + 282.422 -200.333 -46.861 + + ans = + + 41.5613 36.2130 -49.8356 + -30.1783 -24.2201 36.1767 + -3.8467 -8.8415 7.4460 + + ans = + + 41.5613 36.2130 -49.8356 + -30.1783 -24.2201 36.1767 + -3.8467 -8.8415 7.4460 + + + +### Orthogonal Matrices + +Vectors are *orthogonal* if $x^{T}$ y=0, and a vector is *normalized* if $||x||_{2}=1$. A +square matrix is *orthogonal* if all its column vectors are orthogonal to each other and +normalized. The column vectors are then called *orthonormal* and the following results + +$U^{T}U=I=UU^{T}$ + +and + +$||Ux||_{2}=||x||_{2}$ + +### Determinant + +The **determinant** of a matrix has 3 properties + +1. The determinant of the identity matrix is one, $|I|=1$ + +2. If you multiply a single row by scalar $t$ then the determinant is $t|A|$: + +$t|A|=\left[ \begin{array}{cccc} +tA_{11} & tA_{12} &...& tA_{1N} \\ +A_{21} & A_{22} &...& A_{2N} \\ +\vdots & \vdots &\ddots& \vdots \\ +A_{M1} & A_{M2} &...& A_{MN}\end{array} \right]$ + +3. If you switch 2 rows, the determinant changes sign: + + +$-|A|=\left[ \begin{array}{cccc} +A_{21} & A_{22} &...& A_{2N} \\ +A_{11} & A_{12} &...& A_{1N} \\ +\vdots & \vdots &\ddots& \vdots \\ +A_{M1} & A_{M2} &...& A_{MN}\end{array} \right]$ + +4. inverse of the determinant is the determinant of the inverse: + +$|A^{-1}|=\frac{1}{|A|}=|A|^{-1}$ + +For a $2\times2$ matrix, + +$|A|=\left|\left[ \begin{array}{cc} +A_{11} & A_{12} \\ +A_{21} & A_{22} \\ +\end{array} \right]\right| = A_{11}A_{22}-A_{21}A_{12}$ + +For a $3\times3$ matrix, + +$|A|=\left|\left[ \begin{array}{ccc} +A_{11} & A_{12} & A_{13} \\ +A_{21} & A_{22} & A_{23} \\ +A_{31} & A_{32} & A_{33}\end{array} \right]\right|=$ + +$A_{11}A_{22}A_{33}+A_{12}A_{23}A_{31}+A_{13}A_{21}A_{32} +-A_{31}A_{22}A_{13}-A_{32}A_{23}A_{11}-A_{33}A_{21}A_{12}$ + +For larger matrices, the determinant is + +$|A|= +\frac{1}{n!} +\sum_{i_{r}}^{N} +\sum_{j_{r}}^{N} +\epsilon_{i_{1}...i_{N}} +\epsilon_{j_{1}...j_{N}} +A_{i_{1}j_{1}} +A_{i_{2}j_{2}} +... +A_{i_{N}j_{N}}$ + +Where the Levi-Cevita symbol is $\epsilon_{i_{1}i_{2}...i_{N}} = 1$ if it is an even +permutation and $\epsilon_{i_{1}i_{2}...i_{N}} = -1$ if it is an odd permutation and +$\epsilon_{i_{1}i_{2}...i_{N}} = 0$ if $i_{n}=i_{m}$ e.g. $i_{1}=i_{7}$ + +![Levi-Cevita rule for even and odd permutations for an $N\times N$ +determinant](even_odd_perm.svg) + +So a $4\times4$ matrix determinant, + +$|A|=\left|\left[ \begin{array}{cccc} +A_{11} & A_{12} & A_{13} & A_{14} \\ +A_{21} & A_{22} & A_{23} & A_{24} \\ +A_{31} & A_{32} & A_{33} & A_{34} \\ +A_{41} & A_{42} & A_{43} & A_{44} \end{array} \right]\right|$ + +$=\epsilon_{1234}\epsilon_{1234}A_{11}A_{22}A_{33}A_{44}+ +\epsilon_{2341}\epsilon_{1234}A_{21}A_{32}A_{43}A_{14}+ +\epsilon_{3412}\epsilon_{1234}A_{31}A_{42}A_{13}A_{24}+ +\epsilon_{4123}\epsilon_{1234}A_{41}A_{12}A_{23}A_{34}+... +\epsilon_{4321}\epsilon_{4321}A_{44}A_{33}A_{22}A_{11}$ + +### Special Case for determinants + +The determinant of a diagonal matrix $|D|=D_{11}D_{22}D_{33}...D_{NN}$. + +Similarly, if a matrix is upper triangular (so all values of $A_{ij}=0$ when $j + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + m1 + m2 + m3 + + + m4 + + + + + + + + + diff --git a/lecture_09/octave-workspace b/lecture_09/octave-workspace new file mode 100644 index 0000000..f7e8b2b Binary files /dev/null and b/lecture_09/octave-workspace differ diff --git a/lecture_10/.ipynb_checkpoints/lecture_10-checkpoint.ipynb b/lecture_10/.ipynb_checkpoints/lecture_10-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_10/.ipynb_checkpoints/lecture_10-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_10/GaussNaive.m b/lecture_10/GaussNaive.m new file mode 100644 index 0000000..d8c60d3 --- /dev/null +++ b/lecture_10/GaussNaive.m @@ -0,0 +1,25 @@ +function [x,Aug] = GaussNaive(A,y) +% GaussNaive: naive Gauss elimination +% x = GaussNaive(A,b): Gauss elimination without pivoting. +% input: +% A = coefficient matrix +% y = right hand side vector +% output: +% x = solution vector +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +nb = n+1; +Aug = [A y]; +% forward elimination +for k = 1:n-1 + for i = k+1:n + factor = Aug(i,k)/Aug(k,k); + Aug(i,k:nb) = Aug(i,k:nb)-factor*Aug(k,k:nb); + end +end +% back substitution +x = zeros(n,1); +x(n) = Aug(n,nb)/Aug(n,n); +for i = n-1:-1:1 + x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +end diff --git a/lecture_10/GaussPivot.m b/lecture_10/GaussPivot.m new file mode 100644 index 0000000..20df9e8 --- /dev/null +++ b/lecture_10/GaussPivot.m @@ -0,0 +1,33 @@ +function [x,Aug,npivots] = GaussPivot(A,b) +% GaussPivot: Gauss elimination pivoting +% x = GaussPivot(A,b): Gauss elimination with pivoting. +% input: +% A = coefficient matrix +% b = right hand side vector +% output: +% x = solution vector +[m,n]=size(A); +if m~=n, error('Matrix A must be square'); end +nb=n+1; +Aug=[A b]; +npivots=0; % initially no pivots used +% forward elimination +for k = 1:n-1 + % partial pivoting + [big,i]=max(abs(Aug(k:n,k))); + ipr=i+k-1; + if ipr~=k + npivots=npivots+1; % if the max is not the current index ipr, pivot count + Aug([k,ipr],:)=Aug([ipr,k],:); + end + for i = k+1:n + factor=Aug(i,k)/Aug(k,k); + Aug(i,k:nb)=Aug(i,k:nb)-factor*Aug(k,k:nb); + end +end +% back substitution +x=zeros(n,1); +x(n)=Aug(n,nb)/Aug(n,n); +for i = n-1:-1:1 + x(i)=(Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +end diff --git a/lecture_10/Tridiag.m b/lecture_10/Tridiag.m new file mode 100644 index 0000000..ac4ec9b --- /dev/null +++ b/lecture_10/Tridiag.m @@ -0,0 +1,22 @@ +function x = Tridiag(e,f,g,r) +% Tridiag: Tridiagonal equation solver banded system +% x = Tridiag(e,f,g,r): Tridiagonal system solver. +% input: +% e = subdiagonal vector +% f = diagonal vector +% g = superdiagonal vector +% r = right hand side vector +% output: +% x = solution vector +n=length(f); +% forward elimination +for k = 2:n + factor = e(k)/f(k-1); + f(k) = f(k) - factor*g(k-1); + r(k) = r(k) - factor*r(k-1); +end +% back substitution +x(n) = r(n)/f(n); +for k = n-1:-1:1 + x(k) = (r(k)-g(k)*x(k+1))/f(k); +end diff --git a/lecture_10/lecture_10.aux b/lecture_10/lecture_10.aux new file mode 100644 index 0000000..d8d4c62 --- /dev/null +++ b/lecture_10/lecture_10.aux @@ -0,0 +1,40 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}Gauss Elimination}{1}{section.1}} +\newlabel{gauss-elimination}{{1}{1}{Gauss Elimination}{section.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.0.1}Solving sets of equations with matrix operations}{1}{subsubsection.1.0.1}} +\newlabel{solving-sets-of-equations-with-matrix-operations}{{1.0.1}{1}{Solving sets of equations with matrix operations}{subsubsection.1.0.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Gauss elimination}{4}{subsection.1.1}} +\newlabel{gauss-elimination}{{1.1}{4}{Gauss elimination}{subsection.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}Solving sets of equations systematically}{4}{subsubsection.1.1.1}} +\newlabel{solving-sets-of-equations-systematically}{{1.1.1}{4}{Solving sets of equations systematically}{subsubsection.1.1.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Springs-masses\relax }}{4}{figure.caption.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Automate Gauss Elimination}{6}{subsection.1.2}} +\newlabel{automate-gauss-elimination}{{1.2}{6}{Automate Gauss Elimination}{subsection.1.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Problem (Diagonal element is zero)}{7}{subsection.1.3}} +\newlabel{problem-diagonal-element-is-zero}{{1.3}{7}{Problem (Diagonal element is zero)}{subsection.1.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}Spring-Mass System again}{9}{subsubsection.1.3.1}} +\newlabel{spring-mass-system-again}{{1.3.1}{9}{Spring-Mass System again}{subsubsection.1.3.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Springs-masses\relax }}{9}{figure.caption.2}} +\gdef \LT@i {\LT@entry + {2}{61.69104pt}\LT@entry + {1}{261.39424pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.4}Tridiagonal matrix}{10}{subsection.1.4}} +\newlabel{tridiagonal-matrix}{{1.4}{10}{Tridiagonal matrix}{subsection.1.4}{}} diff --git a/lecture_10/lecture_10.bbl b/lecture_10/lecture_10.bbl new file mode 100644 index 0000000..e69de29 diff --git a/lecture_10/lecture_10.blg b/lecture_10/lecture_10.blg new file mode 100644 index 0000000..36b5e7a --- /dev/null +++ b/lecture_10/lecture_10.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2015/Debian) +Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 +The top-level auxiliary file: lecture_10.aux +I found no \citation commands---while reading file lecture_10.aux +I found no \bibdata command---while reading file lecture_10.aux +I found no \bibstyle command---while reading file lecture_10.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 494 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/lecture_10/lecture_10.ipynb b/lecture_10/lecture_10.ipynb new file mode 100644 index 0000000..46d4f00 --- /dev/null +++ b/lecture_10/lecture_10.ipynb @@ -0,0 +1,1685 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gauss Elimination\n", + "### Solving sets of equations with matrix operations\n", + "\n", + "The number of dimensions of a matrix indicate the degrees of freedom of the system you are solving. \n", + "\n", + "If you have a set of known output, $y_{1},~y_{2},~...y_{N}$ and a set of equations that\n", + "relate unknown inputs, $x_{1},~x_{2},~...x_{N}$, then these can be written in a vector\n", + "matrix format as:\n", + "\n", + "$y=Ax$\n", + "\n", + "Consider a problem with 2 DOF:\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "1 & 3 \\\\\n", + "2 & 1 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "The solution for $x_{1}$ and $x_{2}$ is the intersection of two lines:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x21=[-2:2];\n", + "x11=1-3*x21;\n", + "x21=[-2:2];\n", + "x22=1-2*x21;\n", + "plot(x11,x21,x21,x22)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.40000\n", + " 0.20000\n", + "\n" + ] + } + ], + "source": [ + "A=[1,3;2,1]; y=[1;1];\n", + "A\\y % matlab's Ax=y solution for x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a $3\\times3$ matrix, the solution is the intersection of the 3 planes.\n", + "\n", + "$10x_{1}+2x_{2}+x_{3}=1$\n", + "\n", + "$2x_{1}+x_{2}+x_{3}=1$\n", + "\n", + "$x_{1}+2x_{2}+10x_{3}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "10 & 2 & 1\\\\\n", + "2 & 1 & 1 \\\\\n", + "1 & 2 & 10\\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "x_{3} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1 \\\\\n", + "1\\end{array}\\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=25;\n", + "x11=linspace(-2,2,N);\n", + "x12=linspace(-2,2,N);\n", + "[X11,X12]=meshgrid(x11,x12);\n", + "X13=1-10*X11-2*X12;\n", + "\n", + "x21=linspace(-2,2,N);\n", + "x22=linspace(-2,2,N);\n", + "[X21,X22]=meshgrid(x21,x22);\n", + "X23=1-2*X11-X22;\n", + "\n", + "x31=linspace(-2,2,N);\n", + "x32=linspace(-2,2,N);\n", + "[X31,X32]=meshgrid(x31,x32);\n", + "X33=1/10*(1-X31-2*X32);\n", + "\n", + "mesh(X11,X12,X13);\n", + "hold on;\n", + "mesh(X21,X22,X23)\n", + "mesh(X31,X32,X33)\n", + "x=[10,2, 1;2,1, 1; 1, 2, 10]\\[1;1;1];\n", + "plot3(x(1),x(2),x(3),'o')\n", + "xlabel('x1')\n", + "ylabel('x2')\n", + "zlabel('x3')\n", + "view(10,45)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After 3 DOF problems, the solutions are described as *hyperplane* intersections. Which are even harder to visualize" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gauss elimination\n", + "### Solving sets of equations systematically\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "2 & 1 & 1 & 1 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $\n", + "\n", + "Ay(2,:)-Ay(1,:)/5 = ([2 1 1 1]-1/5[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $\n", + "\n", + "Ay(3,:)-Ay(1,:)/10 = ([1 2 10 1]-1/10[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 1.8 & 9.9 & 0.9\\end{array} \n", + "\\right] $\n", + "\n", + "Ay(3,:)-1.8\\*5/3\\*Ay(2,:) = ([0 1.8 9.9 0.9]-3\\*[0 3/5 4/5 4/5])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 0 & 7.5 & -1.5\\end{array} \n", + "\\right] $\n", + "\n", + "now, $7.5x_{3}=-1.5$ so $x_{3}=-\\frac{1}{5}$\n", + "\n", + "then, $3/5x_{2}+4/5(-1/5)=1$ so $x_{2}=\\frac{8}{5}$\n", + "\n", + "finally, $10x_{1}+2(8/5)+1(-\\frac{1}{5})=1$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K1 =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000 9.81000\n", + " 0.00000 15.00000 -10.00000 0.00000 24.52500\n", + " 0.00000 -10.00000 20.00000 -10.00000 29.43000\n", + " 0.00000 0.00000 -10.00000 10.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K1=[K y];\n", + "K1(2,:)=K1(1,:)/2+K1(2,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000 9.81000\n", + " 0.00000 15.00000 -10.00000 0.00000 24.52500\n", + " 0.00000 0.00000 13.33333 -10.00000 45.78000\n", + " 0.00000 0.00000 -10.00000 10.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K2=K1;\n", + "K2(3,:)=K1(2,:)*2/3+K1(3,:)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000 9.81000\n", + " 0.00000 15.00000 -10.00000 0.00000 24.52500\n", + " 0.00000 0.00000 13.33333 -10.00000 45.78000\n", + " 0.00000 0.00000 0.00000 2.50000 73.57500\n", + "\n" + ] + } + ], + "source": [ + "K2(4,:)=-K2(3,:)*K2(4,3)/K2(3,3)+K2(4,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x4 = 29.430\n", + "x3 = 25.506\n", + "x2 = 18.639\n", + "x1 = 9.8100\n" + ] + } + ], + "source": [ + "yp=K2(:,5);\n", + "x4=yp(4)/K2(4,4)\n", + "x3=(yp(3)+10*x4)/K2(3,3)\n", + "x2=(yp(2)+10*x3)/K2(2,2)\n", + "x1=(yp(1)+10*x2)/K2(1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 9.8100\n", + " 18.6390\n", + " 25.5060\n", + " 29.4300\n", + "\n" + ] + } + ], + "source": [ + "K\\y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Automate Gauss Elimination\n", + "\n", + "We can automate Gauss elimination with a function whose input is A and y:\n", + "\n", + "`x=GaussNaive(A,y)`" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 9.8100\n", + " 18.6390\n", + " 25.5060\n", + " 29.4300\n", + "\n" + ] + } + ], + "source": [ + "x=GaussNaive(K,y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem (Diagonal element is zero)\n", + "\n", + "If a diagonal element is 0 or very small either:\n", + "\n", + "1. no solution found\n", + "2. errors are introduced \n", + "\n", + "Therefore, we would want to pivot before applying Gauss elimination\n", + "\n", + "Consider:\n", + "\n", + "(a) $\\left[ \\begin{array}{cccc}\n", + "0 & 2 & 3 \\\\\n", + "4 & 6 & 7 \\\\\n", + "2 & -3 & 6 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "8 \\\\\n", + "-3 \\\\\n", + "5\\end{array} \\right]$\n", + "\n", + "(b) $\\left[ \\begin{array}{cccc}\n", + "0.0003 & 3.0000 \\\\\n", + "1.0000 & 1.0000 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "2.0001 \\\\\n", + "1.0000 \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: division by zero\n", + "warning: called from\n", + " GaussNaive at line 16 column 12\n", + "warning: division by zero\n", + "warning: division by zero\n", + "ans =\n", + "\n", + " NaN\n", + " NaN\n", + " NaN\n", + "\n", + "ans =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n" + ] + } + ], + "source": [ + "format short\n", + "Aa=[0,2,3;4,6,7;2,-3,6]; ya=[8;-3;5];\n", + "GaussNaive(Aa,ya)\n", + "Aa\\ya" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n", + "Aug =\n", + "\n", + " 4.00000 6.00000 7.00000 -3.00000\n", + " 0.00000 -6.00000 2.50000 6.50000\n", + " 0.00000 0.00000 3.83333 10.16667\n", + "\n", + "npivots = 2\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Aa,ya)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.325665420556713\n", + " 0.666666666666667\n", + "\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "format long\n", + "Ab=[0.3E-13,3.0000;1.0000,1.0000];yb=[2+0.1e-13;1.0000];\n", + "GaussNaive(Ab,yb)\n", + "Ab\\yb" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n", + "Aug =\n", + "\n", + " 1.000000000000000 1.000000000000000 1.000000000000000\n", + " 0.000000000000000 2.999999999999970 1.999999999999980\n", + "\n", + "npivots = 1\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Ab,yb)\n", + "Ab\\yb\n", + "format short" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = -3.0000\n", + "ans = 3.0000\n" + ] + } + ], + "source": [ + "% determinant is (-1)^(number_of_pivots)*diagonal_elements\n", + "det(Ab)\n", + "Aug(1,1)*Aug(2,2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spring-Mass System again\n", + "Now, 4 masses are connected in series to 4 springs with $K_{1}$=10 N/m, $K_{2}$=5 N/m, \n", + "$K_{3}$=2 N/m \n", + "and $K_{4}$=1 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses have the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$\n", + "\n", + "$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k_{4}(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "k_1+k_2 & -k_2 & 0 & 0 \\\\\n", + "-k_2 & k_2+k_3 & -k_3 & 0 \\\\\n", + "0 & -k_3 & k_3+k_4 & -k_4 \\\\\n", + "0 & 0 & -k_4 & k_4 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 15 -5 0 0\n", + " -5 7 -2 0\n", + " 0 -2 3 -1\n", + " 0 0 -1 1\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k1=10; k2=5;k3=2;k4=1; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[k1+k2 -k2 0 0; -k2, k2+k3, -k3 0; 0 -k3, k3+k4, -k4; 0 0 -k4 k4]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tridiagonal matrix\n", + "\n", + "This matrix, K, could be rewritten as 3 vectors e, f and g\n", + "\n", + "$e=\\left[ \\begin{array}{c}\n", + "0 \\\\\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\end{array} \\right]$\n", + "\n", + "$f=\\left[ \\begin{array}{c}\n", + "15 \\\\\n", + "7 \\\\\n", + "3 \\\\\n", + "1 \\end{array} \\right]$\n", + "\n", + "$g=\\left[ \\begin{array}{c}\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\\\\n", + "0 \\end{array} \\right]$\n", + "\n", + "Where all other components are 0 and the length of the vectors are n and the first component of e and the last component of g are zero\n", + "\n", + "`e(1)=0` \n", + "\n", + "`g(end)=0`\n", + "\n", + "No need to pivot and number of calculations reduced enormously.\n", + "\n", + "|method |Number of Floating point operations for n$\\times$n-matrix|\n", + "|----------------|---------|\n", + "| Gauss | n-cubed |\n", + "| Tridiagonal | n |" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 9.8100 27.4680 61.8030 101.0430\n", + "\n", + "ans =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n" + ] + } + ], + "source": [ + "e=[0;-5;-2;-1];\n", + "g=[-5;-2;-1;0];\n", + "f=[15;7;3;1];\n", + "Tridiag(e,f,g,y)\n", + "K\\y\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "% tic ... t=toc \n", + "% is Matlab timer used for debugging programs\n", + "t_GE = zeros(1,100);\n", + "t_GE_tridiag = zeros(1,100);\n", + "t_TD = zeros(1,100);\n", + "%for n = 1:200\n", + "for n=1:100\n", + " A = rand(n,n);\n", + " e = rand(n,1); e(1)=0;\n", + " f = rand(n,1);\n", + " g = rand(n,1); g(end)=0;\n", + " Atd=diag(f, 0) - diag(e(2:n), -1) - diag(g(1:n-1), 1);\n", + " b = rand(n,1);\n", + " tic;\n", + " x = GaussPivot(A,b);\n", + " t_GE(n) = toc;\n", + " tic;\n", + " x = A\\b;\n", + " t_GE_tridiag(n) = toc;\n", + " tic;\n", + " x = Tridiag(e,f,g,b);\n", + " t_TD(n) = toc;\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t101\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ttime (s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tnumber of elements\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tGauss elim\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tGauss elim\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tMatlab \\\n", + "\n", + "\t\n", + "\t\tMatlab \n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tTriDiag\n", + "\n", + "\t\n", + "\t\tTriDiag\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n=1:100;\n", + "loglog(n,t_GE,n,t_TD,n,t_GE_tridiag)\n", + "legend('Gauss elim','Matlab \\','TriDiag')\n", + "xlabel('number of elements')\n", + "ylabel('time (s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n", + "Aug =\n", + "\n", + " 15.00000 -5.00000 0.00000 0.00000 9.81000\n", + " 0.00000 5.33333 -2.00000 0.00000 22.89000\n", + " 0.00000 0.00000 2.25000 -1.00000 38.01375\n", + " 0.00000 0.00000 0.00000 0.55556 56.13500\n", + "\n", + "npivots = 0\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(K,y)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 15.00000 -5.00000 0.00000 0.00000\n", + " 0.00000 5.33333 -2.00000 0.00000\n", + " 0.00000 0.00000 2.25000 -1.00000\n", + " 0.00000 0.00000 0.00000 0.55556\n", + "\n" + ] + } + ], + "source": [ + "A=Aug(1:4,1:4)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 100.00\n", + "detA = 100.00\n" + ] + } + ], + "source": [ + "det(A)\n", + "detA=A(1,1)*A(2,2)*A(3,3)*A(4,4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_10/lecture_10.log b/lecture_10/lecture_10.log new file mode 100644 index 0000000..9e3113d --- /dev/null +++ b/lecture_10/lecture_10.log @@ -0,0 +1,871 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2017.1.11) 21 FEB 2017 11:46 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**lecture_10.tex +(./lecture_10.tex +LaTeX2e <2016/02/01> +Babel <3.9q> and hyphenation patterns for 81 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def +File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 48. +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2016/01/03 v1.0q Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg +File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 95. + +(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) +) +\Gread@gobject=\count87 +)) +\Gin@req@height=\dimen103 +\Gin@req@width=\dimen104 +) +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2016/02/21 v3.3-144 Customizing captions (AR) + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2016/02/04 v1.7-139 caption3 kernel (AR) +Package caption3 Info: TeX engine: e-TeX on input line 67. +\captionmargin=\dimen105 +\captionmargin@=\dimen106 +\captionwidth=\dimen107 +\caption@tempdima=\dimen108 +\caption@indent=\dimen109 +\caption@parindent=\dimen110 +\caption@hangindent=\dimen111 +) +\c@ContinuedFloat=\count88 +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2012/05/21 v1.0 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks15 +\XKV@tempa@toks=\toks16 +) +\XKV@depth=\count89 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2012/05/16 v1.0 Trim and clip general TeX material + +(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box26 +) +\tc@llx=\dimen112 +\tc@lly=\dimen113 +\tc@urx=\dimen114 +\tc@ury=\dimen115 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2012/05/13 v1.0 Clipping driver for pdftex +)) +\adjbox@Width=\dimen116 +\adjbox@Height=\dimen117 +\adjbox@Depth=\dimen118 +\adjbox@Totalheight=\dimen119 + +(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2011/09/13 v1.0 Conditionals for odd/even page detection +\c@checkoddpage=\count90 +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box27 +\sift@deathcycles=\count91 +\@vwid@loff=\dimen120 +\@vwid@roff=\dimen121 +)) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1341. +Package xcolor Info: Model `RGB' extended on input line 1353. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks17 +) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2010/09/12 v5.6 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) +Package ifpdf Info: pdfTeX in PDF mode is detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty +Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) +Package ifvtex Info: VTeX not detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty +Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional +) +\Gm@cnth=\count92 +\Gm@cntv=\count93 +\c@Gm@tempcnt=\count94 +\Gm@bindingoffset=\dimen122 +\Gm@wd@mp=\dimen123 +\Gm@odd@mp=\dimen124 +\Gm@even@mp=\dimen125 +\Gm@layoutwidth=\dimen126 +\Gm@layoutheight=\dimen127 +\Gm@layouthoffset=\dimen128 +\Gm@layoutvoffset=\dimen129 +\Gm@dimlist=\toks18 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2016/03/03 v2.15a AMS math features +\@mathmargin=\skip43 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen130 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen131 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count95 +LaTeX Info: Redefining \frac on input line 199. +\uproot@=\count96 +\leftroot@=\count97 +LaTeX Info: Redefining \overline on input line 297. +\classnum@=\count98 +\DOTSCASE@=\count99 +LaTeX Info: Redefining \ldots on input line 394. +LaTeX Info: Redefining \dots on input line 397. +LaTeX Info: Redefining \cdots on input line 518. +\Mathstrutbox@=\box28 +\strutbox@=\box29 +\big@size=\dimen132 +LaTeX Font Info: Redeclaring font encoding OML on input line 630. +LaTeX Font Info: Redeclaring font encoding OMS on input line 631. +\macc@depth=\count100 +\c@MaxMatrixCols=\count101 +\dotsspace@=\muskip10 +\c@parentequation=\count102 +\dspbrk@lvl=\count103 +\tag@help=\toks20 +\row@=\count104 +\column@=\count105 +\maxfields@=\count106 +\andhelp@=\toks21 +\eqnshift@=\dimen133 +\alignsep@=\dimen134 +\tagshift@=\dimen135 +\tagwidth@=\dimen136 +\totwidth@=\dimen137 +\lineht@=\dimen138 +\@envbody=\toks22 +\multlinegap=\skip44 +\multlinetaggap=\skip45 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2735. +LaTeX Info: Redefining \] on input line 2736. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2005/09/27 v1.99g Standard LaTeX package +Package textcomp Info: Sub-encoding information: +(textcomp) 5 = only ISO-Adobe without \textcurrency +(textcomp) 4 = 5 + \texteuro +(textcomp) 3 = 4 + \textohm +(textcomp) 2 = 3 + \textestimated + \textcurrency +(textcomp) 1 = TS1 - \textcircled - \t +(textcomp) 0 = TS1 (full) +(textcomp) Font families with sub-encoding setting implement +(textcomp) only a restricted character set as indicated. +(textcomp) Family '?' is the default used for unknown fonts. +(textcomp) See the documentation for details. +Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 79. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +) +LaTeX Info: Redefining \oldstylenums on input line 334. +Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 349. +Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 350. +Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 351. +Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 352. +Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 353. +Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 354. +Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 355. +Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 356. +Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 357. +Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 358. +Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 359. +Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 360. +Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 361. +Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 362. +Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 363. +Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 364. +Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 365. +Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 366. +Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 367. +Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 368. +Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 369. +Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 370. +Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 371. +Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 372. + +Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 373. +Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 374. +Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 375. +Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 376. +Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 377. +Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 378. +Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 379. +Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 380. +Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 381. +Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 382. +Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 383. +Package textcomp Info: Setting lmtt sub-encoding to TS1/0 on input line 384. +Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 385. +Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 386. +Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 387. +Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 388. +Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 389. +Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 390. +Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 391. +Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 392. +Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 393. +Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 394. +Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 395. +Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 396. +Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 397. +Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 398. +Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 399. +Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 400. +Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 401. +Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 402. +Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 403. +Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 404. +Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 405. +Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 406. +Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 407. +Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 408. +Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 409. +) +(/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texlive/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box30 +) +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count107 +\uc@combtoks=\toks24 +\uc@combtoksb=\toks25 +\uc@temptokena=\toks26 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2015/03/17 v1.2c Input encoding file +\inpenc@prehook=\toks27 +\inpenc@posthook=\toks28 + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/utf8x.def +File: utf8x.def 2004/10/17 UCS: Input encoding UTF-8 +)) +(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2008/02/07 + +Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix +<2008/02/07> (tvz) +\FV@CodeLineNo=\count108 +\FV@InFile=\read1 +\FV@TabBox=\box31 +\c@FancyVerbLine=\count109 +\FV@StepNumber=\count110 +\FV@OutFile=\write3 +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grffile.sty +Package: grffile 2012/04/05 v1.16 Extended file name support for graphics (HO) + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty +Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty +Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +))) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty +Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +Package grffile Info: Option `multidot' is set to `true'. +Package grffile Info: Option `extendedchars' is set to `false'. +Package grffile Info: Option `space' is set to `true'. +Package grffile Info: \Gin@ii of package `graphicx' fixed on input line 486. +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty +Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) + + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty +Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) +Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) +Package hobsub Info: Skipping package `infwarerr' (already loaded). +Package hobsub Info: Skipping package `ltxcmds' (already loaded). +Package hobsub Info: Skipping package `ifluatex' (already loaded). +Package hobsub Info: Skipping package `ifvtex' (already loaded). +Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) +Package hobsub Info: Skipping package `ifpdf' (already loaded). +Package hobsub Info: Skipping package `etexcmds' (already loaded). +Package hobsub Info: Skipping package `kvsetkeys' (already loaded). +Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) +Package hobsub Info: Skipping package `pdftexcmds' (already loaded). +Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) +Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO +) +Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) +Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) +) +Package hobsub Info: Skipping package `hobsub' (already loaded). +Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) +Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) +Package: xcolor-patch 2011/01/30 xcolor patch +Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) +Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) +Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty +Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen139 +\Hy@linkcounter=\count111 +\Hy@pagecounter=\count112 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) +) +\Hy@SavedSpaceFactor=\count113 + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +) +Package hyperref Info: Hyper figures OFF on input line 4443. +Package hyperref Info: Link nesting OFF on input line 4448. +Package hyperref Info: Hyper index ON on input line 4451. +Package hyperref Info: Plain pages OFF on input line 4458. +Package hyperref Info: Backreferencing OFF on input line 4463. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4688. +\c@Hy@tempcnt=\count114 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip11 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5041. +\XeTeXLinkMargin=\dimen140 +\Fld@menulength=\count115 +\Field@Width=\dimen141 +\Fld@charsize=\dimen142 +Package hyperref Info: Hyper figures OFF on input line 6295. +Package hyperref Info: Link nesting OFF on input line 6300. +Package hyperref Info: Hyper index ON on input line 6303. +Package hyperref Info: backreferencing OFF on input line 6310. +Package hyperref Info: Link coloring OFF on input line 6315. +Package hyperref Info: Link coloring with OCG OFF on input line 6320. +Package hyperref Info: PDF/A mode OFF on input line 6325. +LaTeX Info: Redefining \ref on input line 6365. +LaTeX Info: Redefining \pageref on input line 6369. +\Hy@abspage=\count116 +\c@Item=\count117 +\c@Hfootnote=\count118 +) + +Package hyperref Message: Driver (autodetected): hpdftex. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX +\Fld@listcount=\count119 +\c@bookmark@seq@number=\count120 + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +82. +) +\Hy@SectionHShift=\skip46 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2014/10/28 v4.11 Multi-page Table package (DPC) +\LTleft=\skip47 +\LTright=\skip48 +\LTpre=\skip49 +\LTpost=\skip50 +\LTchunksize=\count121 +\LTcapwidth=\dimen143 +\LT@head=\box32 +\LT@firsthead=\box33 +\LT@foot=\box34 +\LT@lastfoot=\box35 +\LT@cols=\count122 +\LT@rows=\count123 +\c@LT@tables=\count124 +\c@LT@chunks=\count125 +\LT@p@ftn=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2005/04/14 v1.61803 publication quality tables +\heavyrulewidth=\dimen144 +\lightrulewidth=\dimen145 +\cmidrulewidth=\dimen146 +\belowrulesep=\dimen147 +\belowbottomsep=\dimen148 +\aboverulesep=\dimen149 +\abovetopsep=\dimen150 +\cmidrulesep=\dimen151 +\cmidrulekern=\dimen152 +\defaultaddspace=\dimen153 +\@cmidla=\count126 +\@cmidlb=\count127 +\@aboverulesep=\dimen154 +\@belowrulesep=\dimen155 +\@thisruleclass=\count128 +\@lastruleclass=\count129 +\@thisrulewidth=\dimen156 +) +(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2011/09/28 v3.5.2 Customized lists +\labelindent=\skip51 +\enit@outerparindent=\dimen157 +\enit@toks=\toks30 +\enit@inbox=\box36 +\enitdp@description=\count130 +) +(/usr/share/texlive/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box37 +\UL@hyphenbox=\box38 +\UL@skip=\skip52 +\UL@hook=\toks31 +\UL@height=\dimen158 +\UL@pe=\count131 +\UL@pixel=\dimen159 +\ULC@box=\box39 +Package: ulem 2012/05/18 +\ULdepth=\dimen160 +) +Package hyperref Info: Option `breaklinks' set `true' on input line 264. +Package hyperref Info: Option `colorlinks' set `true' on input line 264. + (./lecture_10.aux + +LaTeX Warning: Label `gauss-elimination' multiply defined. + +) +\openout1 = `lecture_10.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 271. +LaTeX Font Info: Try loading font information for TS1+cmr on input line 271. + + (/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Try loading font information for T1+ppl on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count132 +\scratchdimen=\dimen161 +\scratchbox=\box40 +\nofMPsegments=\count133 +\nofMParguments=\count134 +\everyMPshowfont=\toks32 +\MPscratchCnt=\count135 +\MPscratchDim=\dimen162 +\MPnumerator=\count136 +\makeMPintoPDFobject=\count137 +\everyMPtoPDFconversion=\toks33 +) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty +Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty +Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) +) +Package grfext Info: Graphics extension search list: +(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 452. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texlive/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2013/06/09 v1.4-94 longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +\AtBeginShipoutBox=\box41 +Package hyperref Info: Link coloring ON on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) +) +\c@section@level=\count138 +) +LaTeX Info: Redefining \ref on input line 271. +LaTeX Info: Redefining \pageref on input line 271. +LaTeX Info: Redefining \nameref on input line 271. + +(./lecture_10.out) (./lecture_10.out) +\@outlinefile=\write4 +\openout4 = `lecture_10.out'. + +LaTeX Font Info: Try loading font information for OT1+ppl on input line 275. + + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Try loading font information for OML+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Try loading font information for OMS+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Try loading font information for OMX+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Try loading font information for OT1+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. + + +LaTeX Warning: No \author given. + +LaTeX Font Info: Try loading font information for T1+cmtt on input line 279. + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <14.4> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 287. +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <10.95> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 290. + + +Package hyperref Warning: Difference (2) between bookmark levels is greater +(hyperref) than one, level fixed on input line 290. + +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 295. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 295. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 295. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 295. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 295. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 295. + +File: lecture_10_files/lecture_10_3_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_10_files/lecture_10_3_0.pdf used on input line + 321. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +Underfull \hbox (badness 10000) in paragraph at lines 323--324 + + [] + +LaTeX Font Info: Try loading font information for TS1+cmtt on input line 327 +. +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) [2 <./lecture_10_files/lecture_10_3_0.pdf>] + +File: lecture_10_files/lecture_10_6_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_10_files/lecture_10_6_0.pdf used on input line + 382. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + +Underfull \hbox (badness 10000) in paragraph at lines 384--385 + + [] + +[3 <./lecture_10_files/lecture_10_6_0.pdf>] +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <12> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 389. + + +! LaTeX Error: Unknown graphics extension: .svg. + +See the LaTeX manual or LaTeX Companion for explanation. +Type H for immediate help. + ... + +l.444 ...egraphics{../lecture_09/mass_springs.svg} + +? +[4] [5] [6] [7] [8] + +! LaTeX Error: Unknown graphics extension: .svg. + +See the LaTeX manual or LaTeX Companion for explanation. +Type H for immediate help. + ... + +l.735 ...egraphics{../lecture_09/mass_springs.svg} + +? +[9] [10] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 843. + +File: lecture_10_files/lecture_10_29_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_10_files/lecture_10_29_0.pdf used on input lin +e 871. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + [11] +Underfull \hbox (badness 10000) in paragraph at lines 873--874 + + [] + +[12 <./lecture_10_files/lecture_10_29_0.pdf>] +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 933. + [13] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 933. + (./lecture_10.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 933. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 933. +Package rerunfilecheck Info: File `lecture_10.out' has not changed. +(rerunfilecheck) Checksum: F41F49C8B1F4406369908EBDD24F2572;629. + + +LaTeX Warning: There were multiply-defined labels. + +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 933. + ) +Here is how much of TeX's memory you used: + 10943 strings out of 493029 + 163805 string characters out of 6136234 + 273063 words of memory out of 5000000 + 14226 multiletter control sequences out of 15000+600000 + 35779 words of font info for 91 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 36i,8n,77p,494b,465s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/texli +ve/texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf/fonts/enc/dvips/cm- +super/cm-super-t1.enc} +Output written on lecture_10.pdf (13 pages, 190161 bytes). +PDF statistics: + 176 PDF objects out of 1000 (max. 8388607) + 142 compressed objects within 2 object streams + 29 named destinations out of 1000 (max. 500000) + 80 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/lecture_10/lecture_10.md b/lecture_10/lecture_10.md new file mode 100644 index 0000000..dd426e0 --- /dev/null +++ b/lecture_10/lecture_10.md @@ -0,0 +1,593 @@ + + +```octave +%plot --format svg +``` + + +```octave +setdefaults +``` + +# Gauss Elimination +### Solving sets of equations with matrix operations + +The number of dimensions of a matrix indicate the degrees of freedom of the system you are solving. + +If you have a set of known output, $y_{1},~y_{2},~...y_{N}$ and a set of equations that +relate unknown inputs, $x_{1},~x_{2},~...x_{N}$, then these can be written in a vector +matrix format as: + +$y=Ax$ + +Consider a problem with 2 DOF: + +$x_{1}+3x_{2}=1$ + +$2x_{1}+x_{2}=1$ + +$\left[ \begin{array}{cc} +1 & 3 \\ +2 & 1 \end{array} \right] +\left[\begin{array}{c} +x_{1} \\ +x_{2} \end{array}\right]= +\left[\begin{array}{c} +1 \\ +1\end{array}\right]$ + +The solution for $x_{1}$ and $x_{2}$ is the intersection of two lines: + + +```octave +x21=[-2:2]; +x11=1-3*x21; +x21=[-2:2]; +x22=1-2*x21; +plot(x11,x21,x21,x22) +``` + + +![svg](lecture_10_files/lecture_10_3_0.svg) + + +For a 3$\times$3 matrix, the solution is the intersection of the 3 planes. + +$10x_{1}+2x_{2}+x_{3}=1$ + +$2x_{1}+x_{2}+x_{3}=1$ + +$x_{1}+2x_{2}+10x_{3}=1$ + +$\left[ \begin{array}{cc} +10 & 2 & 1\\ +2 & 1 & 1 \\ +1 & 2 & 10\end{array} \right] +\left[\begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \end{array}\right]= +\left[\begin{array}{c} +1 \\ +1 \\ +1\end{array}\right]$ + + +```octave +x11=linspace(-2,2,5); +x12=linspace(-2,2,5); +[X11,X12]=meshgrid(x11,x12); +X13=1-10*X11-2*X22; + +x21=linspace(-2,2,5); +x22=linspace(-2,2,5); +[X21,X22]=meshgrid(x21,x22); +X23=1-2*X11-X22; + +x31=linspace(-2,2,5); +x32=linspace(-2,2,5); +[X31,X32]=meshgrid(x31,x32); +X33=1/10*(1-X31-2*X32); + +mesh(X11,X12,X13); +hold on; +mesh(X21,X22,X23) +mesh(X31,X32,X33) +x=[10,2, 1;2,1, 1; 1, 2, 10]\[1;1;1]; +plot3(x(1),x(2),x(3),'o') +view(45,45) +``` + + +![svg](lecture_10_files/lecture_10_5_0.svg) + + +After 3 DOF problems, the solutions are described as *hyperplane* intersections. Which are even harder to visualize + +## Gauss elimination +### Solving sets of equations systematically + +$\left[ \begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +2 & 1 & 1 & 1 \\ +1 & 2 & 10 & 1\end{array} +\right] $ + +Ay(2,:)-Ay(1,:)/5 = ([2 1 1 1]-1/5[10 2 1 1]) + +$\left[ \begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +0 & 3/5 & 4/5 & 4/5 \\ +1 & 2 & 10 & 1\end{array} +\right] $ + +Ay(3,:)-Ay(1,:)/10 = ([1 2 10 1]-1/10[10 2 1 1]) + +$\left[ \begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +0 & 3/5 & 4/5 & 4/5 \\ +0 & 1.8 & 9.9 & 0.9\end{array} +\right] $ + +Ay(3,:)-1.8\*5/3\*Ay(2,:) = ([0 1.8 9.9 0.9]-3\*[0 3/5 4/5 4/5]) + +$\left[ \begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +0 & 3/5 & 4/5 & 4/5 \\ +0 & 0 & 7.5 & -1.5\end{array} +\right] $ + +now, $7.5x_{3}=-1.5$ so $x_{3}=-\frac{1}{5}$ + +then, $3/5x_{2}+4/5(-1/5)=1$ so $x_{2}=\frac{8}{5}$ + +finally, $10x_{1}+2(8/5) + +Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? + +![Springs-masses](../lecture_09/mass_springs.svg) + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass: + +$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$ + +$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$ + +$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$ + +$m_{4}g-k(x_{4}-x_{3})=0$ + +in matrix form: + +$\left[ \begin{array}{cccc} +2k & -k & 0 & 0 \\ +-k & 2k & -k & 0 \\ +0 & -k & 2k & -k \\ +0 & 0 & -k & k \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \\ +x_{4} \end{array} \right]= +\left[ \begin{array}{c} +m_{1}g \\ +m_{2}g \\ +m_{3}g \\ +m_{4}g \end{array} \right]$ + + +```octave +k=10; % N/m +m1=1; % kg +m2=2; +m3=3; +m4=4; +g=9.81; % m/s^2 +K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k] +y=[m1*g;m2*g;m3*g;m4*g] +``` + + K = + + 20 -10 0 0 + -10 20 -10 0 + 0 -10 20 -10 + 0 0 -10 10 + + y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + + +```octave +K1=[K y]; +K1(2,:)=K1(1,:)/2+K1(2,:) +``` + + K1 = + + 20.00000 -10.00000 0.00000 0.00000 9.81000 + 0.00000 15.00000 -10.00000 0.00000 24.52500 + 0.00000 -10.00000 20.00000 -10.00000 29.43000 + 0.00000 0.00000 -10.00000 10.00000 39.24000 + + + + +```octave +K2=K1; +K2(3,:)=K1(2,:)*2/3+K1(3,:) + +``` + + K2 = + + 20.00000 -10.00000 0.00000 0.00000 9.81000 + 0.00000 15.00000 -10.00000 0.00000 24.52500 + 0.00000 0.00000 13.33333 -10.00000 45.78000 + 0.00000 0.00000 -10.00000 10.00000 39.24000 + + + + +```octave +K2(4,:)=-K2(3,:)*K2(4,3)/K2(3,3)+K2(4,:) +``` + + K2 = + + 20.00000 -10.00000 0.00000 0.00000 9.81000 + 0.00000 15.00000 -10.00000 0.00000 24.52500 + 0.00000 0.00000 13.33333 -10.00000 45.78000 + 0.00000 0.00000 0.00000 2.50000 73.57500 + + + + +```octave +yp=K2(:,5); +x4=yp(4)/K2(4,4) +x3=(yp(3)+10*x4)/K2(3,3) +x2=(yp(2)+10*x3)/K2(2,2) +x1=(yp(1)+10*x2)/K2(1,1) +``` + + x4 = 29.430 + x3 = 25.506 + x2 = 18.639 + x1 = 9.8100 + + + +```octave +K\y +``` + + ans = + + 9.8100 + 18.6390 + 25.5060 + 29.4300 + + + +## Automate Gauss Elimination + +We can automate Gauss elimination with a function whose input is A and y: + +`x=GaussNaive(A,y)` + + +```octave +x=GaussNaive(K,y) +``` + + x = + + 9.8100 + 18.6390 + 25.5060 + 29.4300 + + + +## Problem (Diagonal element is zero) + +If a diagonal element is 0 or very small either: + +1. no solution found +2. errors are introduced + +Therefore, we would want to pivot before applying Gauss elimination + +Consider: + +(a) $\left[ \begin{array}{cccc} +0 & 2 & 3 \\ +4 & 6 & 7 \\ +2 & -3 & 6 \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \end{array} \right]= +\left[ \begin{array}{c} +8 \\ +-3 \\ +5\end{array} \right]$ + +(b) $\left[ \begin{array}{cccc} +0.0003 & 3.0000 \\ +1.0000 & 1.0000 \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \end{array} \right]= +\left[ \begin{array}{c} +2.0001 \\ +1.0000 \end{array} \right]$ + + +```octave +format short +Aa=[0,2,3;4,6,7;2,-3,6]; ya=[8;-3;5]; +GaussNaive(Aa,ya) +Aa\ya +``` + + warning: division by zero + warning: called from + GaussNaive at line 16 column 12 + warning: division by zero + warning: division by zero + ans = + + NaN + NaN + NaN + + ans = + + -5.423913 + 0.021739 + 2.652174 + + + + +```octave +[x,Aug,npivots]=GaussPivot(Aa,ya) +``` + + x = + + -5.423913 + 0.021739 + 2.652174 + + Aug = + + 4.00000 6.00000 7.00000 -3.00000 + 0.00000 -6.00000 2.50000 6.50000 + 0.00000 0.00000 3.83333 10.16667 + + npivots = 2 + + + +```octave +format long +Ab=[0.3E-13,3.0000;1.0000,1.0000];yb=[2+0.1e-13;1.0000]; +GaussNaive(Ab,yb) +Ab\yb +``` + + ans = + + 0.325665420556713 + 0.666666666666667 + + ans = + + 0.333333333333333 + 0.666666666666667 + + + + +```octave +[x,Aug,npivots]=GaussPivot(Ab,yb) +Ab\yb +format short +``` + + x = + + 0.333333333333333 + 0.666666666666667 + + Aug = + + 1.000000000000000 1.000000000000000 1.000000000000000 + 0.000000000000000 2.999999999999970 1.999999999999980 + + npivots = 1 + ans = + + 0.333333333333333 + 0.666666666666667 + + + +### Spring-Mass System again +Now, 4 masses are connected in series to 4 springs with $K_{1}$=10 N/m, $K_{2}$=5 N/m, +$K_{3}$=2 N/m +and $K_{4}$=1 N/m. What are the final positions of the masses? + +![Springs-masses](../lecture_09/mass_springs.svg) + +The masses have the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass: + +$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$ + +$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$ + +$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$ + +$m_{4}g-k_{4}(x_{4}-x_{3})=0$ + +in matrix form: + +$\left[ \begin{array}{cccc} +k_1+k_2 & -k_2 & 0 & 0 \\ +-k_2 & k_2+k_3 & -k_3 & 0 \\ +0 & -k_3 & k_3+k_4 & -k_4 \\ +0 & 0 & -k_4 & k_4 \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \\ +x_{4} \end{array} \right]= +\left[ \begin{array}{c} +m_{1}g \\ +m_{2}g \\ +m_{3}g \\ +m_{4}g \end{array} \right]$ + + +```octave +k1=10; k2=5;k3=2;k4=1; % N/m +m1=1; % kg +m2=2; +m3=3; +m4=4; +g=9.81; % m/s^2 +K=[k1+k2 -k2 0 0; -k2, k2+k3, -k3 0; 0 -k3, k3+k4, -k4; 0 0 -k4 k4] +y=[m1*g;m2*g;m3*g;m4*g] +``` + + K = + + 15 -5 0 0 + -5 7 -2 0 + 0 -2 3 -1 + 0 0 -1 1 + + y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + +## Tridiagonal matrix + +This matrix, K, could be rewritten as 3 vectors e, f and g + +$e=\left[ \begin{array}{c} +0 \\ +-5 \\ +-2 \\ +-1 \end{array} \right]$ + +$f=\left[ \begin{array}{c} +15 \\ +7 \\ +3 \\ +1 \end{array} \right]$ + +$g=\left[ \begin{array}{c} +-5 \\ +-2 \\ +-1 \\ +0 \end{array} \right]$ + +Where all other components are 0 and the length of the vectors are n and the first component of e and the last component of g are zero + +`e(1)=0` + +`g(end)=0` + +No need to pivot and number of calculations reduced enormously. + +|method |Number of Floating point operations for n$\times$n-matrix| +|----------------|---------| +| Naive Gauss | n-cubed | +| Tridiagonal | n | + + +```octave +e=[0;-5;-2;-1]; +g=[-5;-2;-1;0]; +f=[15;7;3;1]; +Tridiag(e,f,g,y) + +``` + + ans = + + 9.8100 27.4680 61.8030 101.0430 + + + + +```octave +% tic ... t=toc +% is Matlab timer used for debugging programs +t_GE = zeros(1,100); +t_GE_tridiag = zeros(1,100); +t_TD = zeros(1,100); +for n = 1:200 + A = rand(n,n); + e = rand(n,1); e(1)=0; + f = rand(n,1); + g = rand(n,1); g(end)=0; + Atd=diag(f, 0) - diag(e(2:n), -1) - diag(g(1:n-1), 1); + b = rand(n,1); + tic; + x = GaussPivot(A,b); + t_GE(n) = toc; + tic; + x = GaussPivot(Atd,b); + t_GE_tridiag(n) = toc; + tic; + x = Tridiag(e,f,g,b); + t_TD(n) = toc; +end +``` + + +```octave +n=1:200; +loglog(n,t_GE,n,t_TD,n,t_GE_tridiag) +xlabel('number of elements') +ylabel('time (s)') +``` + + +![svg](lecture_10_files/lecture_10_27_0.svg) + + + +```octave +plot(t_TD) +``` + + +![svg](lecture_10_files/lecture_10_28_0.svg) + + + +```octave + +``` diff --git a/lecture_10/lecture_10.out b/lecture_10/lecture_10.out new file mode 100644 index 0000000..cb5b517 --- /dev/null +++ b/lecture_10/lecture_10.out @@ -0,0 +1,8 @@ +\BOOKMARK [1][-]{section.1}{Gauss Elimination}{}% 1 +\BOOKMARK [2][-]{subsubsection.1.0.1}{Solving sets of equations with matrix operations}{section.1}% 2 +\BOOKMARK [2][-]{subsection.1.1}{Gauss elimination}{section.1}% 3 +\BOOKMARK [3][-]{subsubsection.1.1.1}{Solving sets of equations systematically}{subsection.1.1}% 4 +\BOOKMARK [2][-]{subsection.1.2}{Automate Gauss Elimination}{section.1}% 5 +\BOOKMARK [2][-]{subsection.1.3}{Problem \(Diagonal element is zero\)}{section.1}% 6 +\BOOKMARK [3][-]{subsubsection.1.3.1}{Spring-Mass System again}{subsection.1.3}% 7 +\BOOKMARK [2][-]{subsection.1.4}{Tridiagonal matrix}{section.1}% 8 diff --git a/lecture_10/lecture_10.pdf b/lecture_10/lecture_10.pdf new file mode 100644 index 0000000..d75909f Binary files /dev/null and b/lecture_10/lecture_10.pdf differ diff --git a/lecture_10/lecture_10.tex b/lecture_10/lecture_10.tex new file mode 100644 index 0000000..633c945 --- /dev/null +++ b/lecture_10/lecture_10.tex @@ -0,0 +1,933 @@ + +% Default to the notebook output style + + + + +% Inherit from the specified cell style. + + + + + +\documentclass[11pt]{article} + + + + \usepackage[T1]{fontenc} + % Nicer default font (+ math font) than Computer Modern for most use cases + \usepackage{mathpazo} + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % We will generate all images so they have a width \maxwidth. This means + % that they will get their normal width if they fit onto the page, but + % are scaled down if they would overflow the margins. + \makeatletter + \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth + \else\Gin@nat@width\fi} + \makeatother + \let\Oldincludegraphics\includegraphics + % Set max figure width to be 80% of text width, for now hardcoded. + \renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=.8\maxwidth]{#1}} + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionLabelFormat{nolabel}{} + \captionsetup{labelformat=nolabel} + + \usepackage{adjustbox} % Used to constrain images to a maximum size + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatability definitions + \def\gt{>} + \def\lt{<} + % Document parameters + \title{lecture\_10} + + + + + % Pygments definitions + +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % Exact colors from NB + \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} + \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} + + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + + \begin{document} + + + \maketitle + + + + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}1}]:} \PY{c}{\PYZpc{}plot \PYZhy{}\PYZhy{}format svg} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}2}]:} \PY{n}{setdefaults} +\end{Verbatim} + + \section{Gauss Elimination}\label{gauss-elimination} + +\subsubsection{Solving sets of equations with matrix +operations}\label{solving-sets-of-equations-with-matrix-operations} + +The number of dimensions of a matrix indicate the degrees of freedom of +the system you are solving. + +If you have a set of known output, \(y_{1},~y_{2},~...y_{N}\) and a set +of equations that relate unknown inputs, \(x_{1},~x_{2},~...x_{N}\), +then these can be written in a vector matrix format as: + +\(y=Ax\) + +Consider a problem with 2 DOF: + +\(x_{1}+3x_{2}=1\) + +\(2x_{1}+x_{2}=1\) + +\(\left[ \begin{array}{cc} 1 & 3 \\ 2 & 1 \end{array} \right] \left[\begin{array}{c} x_{1} \\ x_{2} \end{array}\right]= \left[\begin{array}{c} 1 \\ 1\end{array}\right]\) + +The solution for \(x_{1}\) and \(x_{2}\) is the intersection of two +lines: + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}3}]:} \PY{n}{x21}\PY{p}{=}\PY{p}{[}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{:}\PY{l+m+mi}{2}\PY{p}{]}\PY{p}{;} + \PY{n}{x11}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3}\PY{o}{*}\PY{n}{x21}\PY{p}{;} + \PY{n}{x21}\PY{p}{=}\PY{p}{[}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{:}\PY{l+m+mi}{2}\PY{p}{]}\PY{p}{;} + \PY{n}{x22}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x21}\PY{p}{;} + \PY{n+nb}{plot}\PY{p}{(}\PY{n}{x11}\PY{p}{,}\PY{n}{x21}\PY{p}{,}\PY{n}{x21}\PY{p}{,}\PY{n}{x22}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_10_files/lecture_10_3_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}4}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} + \PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{y} \PY{c}{\PYZpc{} matlab\PYZsq{}s Ax=y solution for x} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 0.40000 + 0.20000 + + + \end{Verbatim} + + For a \(3\times3\) matrix, the solution is the intersection of the 3 +planes. + +\(10x_{1}+2x_{2}+x_{3}=1\) + +\(2x_{1}+x_{2}+x_{3}=1\) + +\(x_{1}+2x_{2}+10x_{3}=1\) + +$\left[ \begin{array}{ccc} 10 & 2 & 1\\ 2 & 1 & 1 \\ 1 & 2 & 10\end{array} \right] + \left[\begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \end{array}\right]= + \left[\begin{array}{c} 1 \\ 1 \\ 1\end{array}\right]$ + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}9}]:} \PY{n}{N}\PY{p}{=}\PY{l+m+mi}{25}\PY{p}{;} + \PY{n}{x11}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{n}{x12}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{p}{[}\PY{n}{X11}\PY{p}{,}\PY{n}{X12}\PY{p}{]}\PY{p}{=}\PY{n+nb}{meshgrid}\PY{p}{(}\PY{n}{x11}\PY{p}{,}\PY{n}{x12}\PY{p}{)}\PY{p}{;} + \PY{n}{X13}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{o}{*}\PY{n}{X11}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{X12}\PY{p}{;} + + \PY{n}{x21}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{n}{x22}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{p}{[}\PY{n}{X21}\PY{p}{,}\PY{n}{X22}\PY{p}{]}\PY{p}{=}\PY{n+nb}{meshgrid}\PY{p}{(}\PY{n}{x21}\PY{p}{,}\PY{n}{x22}\PY{p}{)}\PY{p}{;} + \PY{n}{X23}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{X11}\PY{o}{\PYZhy{}}\PY{n}{X22}\PY{p}{;} + + \PY{n}{x31}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{n}{x32}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{p}{[}\PY{n}{X31}\PY{p}{,}\PY{n}{X32}\PY{p}{]}\PY{p}{=}\PY{n+nb}{meshgrid}\PY{p}{(}\PY{n}{x31}\PY{p}{,}\PY{n}{x32}\PY{p}{)}\PY{p}{;} + \PY{n}{X33}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{10}\PY{o}{*}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{n}{X31}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{X32}\PY{p}{)}\PY{p}{;} + + \PY{n+nb}{mesh}\PY{p}{(}\PY{n}{X11}\PY{p}{,}\PY{n}{X12}\PY{p}{,}\PY{n}{X13}\PY{p}{)}\PY{p}{;} + \PY{n+nb}{hold} \PY{n}{on}\PY{p}{;} + \PY{n+nb}{mesh}\PY{p}{(}\PY{n}{X21}\PY{p}{,}\PY{n}{X22}\PY{p}{,}\PY{n}{X23}\PY{p}{)} + \PY{n+nb}{mesh}\PY{p}{(}\PY{n}{X31}\PY{p}{,}\PY{n}{X32}\PY{p}{,}\PY{n}{X33}\PY{p}{)} + \PY{n}{x}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{;} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{10}\PY{p}{]}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} + \PY{n}{plot3}\PY{p}{(}\PY{n}{x}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{,}\PY{n}{x}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,}\PY{n}{x}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{o\PYZsq{}}\PY{p}{)} + \PY{n+nb}{xlabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x1\PYZsq{}}\PY{p}{)} + \PY{n+nb}{ylabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x2\PYZsq{}}\PY{p}{)} + \PY{n+nb}{zlabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x3\PYZsq{}}\PY{p}{)} + \PY{n+nb}{view}\PY{p}{(}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{45}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_10_files/lecture_10_6_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + After 3 DOF problems, the solutions are described as \emph{hyperplane} +intersections. Which are even harder to visualize + + \subsection{Gauss elimination}\label{gauss-elimination} + +\subsubsection{Solving sets of equations +systematically}\label{solving-sets-of-equations-systematically} + +$\left[ +\begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +2 & 1 & 1 & 1 \\ +1 & 2 & 10 & 1\end{array} +\right] $ + +Ay(2,:)-Ay(1,:)/5 = ({[}2 1 1 1{]}-1/5{[}10 2 1 1{]}) + +$\left[ +\begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +0 & 3/5 & 4/5 & 4/5 \\ +1 & 2 & 10 & 1\end{array} +\right] $ + +Ay(3,:)-Ay(1,:)/10 = ({[}1 2 10 1{]}-1/10{[}10 2 1 1{]}) + +$\left[ +\begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +0 & 3/5 & 4/5 & 4/5 \\ +0 & 1.8 & 9.9 & 0.9\end{array} +\right] $ + +Ay(3,:)-1.8*5/3*Ay(2,:) = ({[}0 1.8 9.9 0.9{]}-3*{[}0 3/5 4/5 4/5{]}) + +$\left[ +\begin{array}{ccc|c} + & A & & y \\ +10 & 2 & 1 & 1\\ +0 & 3/5 & 4/5 & 4/5 \\ +0 & 0 & 7.5 & -1.5\end{array} +\right]$ + +now, \(7.5x_{3}=-1.5\) so \(x_{3}=-\frac{1}{5}\) + +then, \(3/5x_{2}+4/5(-1/5)=1\) so \(x_{2}=\frac{8}{5}\) + +finally, \(10x_{1}+2(8/5)+1(-\frac{1}{5})=1\) + + Consider the problem again from the intro to Linear Algebra, 4 masses +are connected in series to 4 springs with K=10 N/m. What are the final +positions of the masses? + +\begin{figure}[htbp] +\centering +\includegraphics{../lecture_09/mass_springs.svg} +\caption{Springs-masses} +\end{figure} + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses +1-4. Using a FBD for each mass: + +\(m_{1}g+k(x_{2}-x_{1})-kx_{1}=0\) + +\(m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0\) + +\(m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0\) + +\(m_{4}g-k(x_{4}-x_{3})=0\) + +in matrix form: + +\(\left[ \begin{array}{cccc} 2k & -k & 0 & 0 \\ -k & 2k & -k & 0 \\ 0 & -k & 2k & -k \\ 0 & 0 & -k & k \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{array} \right]= \left[ \begin{array}{c} m_{1}g \\ m_{2}g \\ m_{3}g \\ m_{4}g \end{array} \right]\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}10}]:} \PY{n}{k}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} + \PY{n}{m3}\PY{p}{=}\PY{l+m+mi}{3}\PY{p}{;} + \PY{n}{m4}\PY{p}{=}\PY{l+m+mi}{4}\PY{p}{;} + \PY{n}{g}\PY{p}{=}\PY{l+m+mf}{9.81}\PY{p}{;} \PY{c}{\PYZpc{} m/s\PYZca{}2} + \PY{n}{K}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{0} \PY{l+m+mi}{0}\PY{p}{;} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{0}\PY{p}{;} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{p}{;} \PY{l+m+mi}{0} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{n}{k}\PY{p}{]} + \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{n}{m1}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m2}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m3}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m4}\PY{o}{*}\PY{n}{g}\PY{p}{]} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K = + + 20 -10 0 0 + -10 20 -10 0 + 0 -10 20 -10 + 0 0 -10 10 + +y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}11}]:} \PY{n}{K1}\PY{p}{=}\PY{p}{[}\PY{n}{K} \PY{n}{y}\PY{p}{]}\PY{p}{;} + \PY{n}{K1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{K1}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{l+m+mi}{2}\PY{o}{+}\PY{n}{K1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K1 = + + 20.00000 -10.00000 0.00000 0.00000 9.81000 + 0.00000 15.00000 -10.00000 0.00000 24.52500 + 0.00000 -10.00000 20.00000 -10.00000 29.43000 + 0.00000 0.00000 -10.00000 10.00000 39.24000 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}12}]:} \PY{n}{K2}\PY{p}{=}\PY{n}{K1}\PY{p}{;} + \PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{K1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{*}\PY{l+m+mi}{2}\PY{o}{/}\PY{l+m+mi}{3}\PY{o}{+}\PY{n}{K1}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K2 = + + 20.00000 -10.00000 0.00000 0.00000 9.81000 + 0.00000 15.00000 -10.00000 0.00000 24.52500 + 0.00000 0.00000 13.33333 -10.00000 45.78000 + 0.00000 0.00000 -10.00000 10.00000 39.24000 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}13}]:} \PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{o}{\PYZhy{}}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{*}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{/}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{+}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{p}{:}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K2 = + + 20.00000 -10.00000 0.00000 0.00000 9.81000 + 0.00000 15.00000 -10.00000 0.00000 24.52500 + 0.00000 0.00000 13.33333 -10.00000 45.78000 + 0.00000 0.00000 0.00000 2.50000 73.57500 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}14}]:} \PY{n}{yp}\PY{p}{=}\PY{n}{K2}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{;} + \PY{n}{x4}\PY{p}{=}\PY{n}{yp}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{/}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)} + \PY{n}{x3}\PY{p}{=}\PY{p}{(}\PY{n}{yp}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{+}\PY{l+m+mi}{10}\PY{o}{*}\PY{n}{x4}\PY{p}{)}\PY{o}{/}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)} + \PY{n}{x2}\PY{p}{=}\PY{p}{(}\PY{n}{yp}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{+}\PY{l+m+mi}{10}\PY{o}{*}\PY{n}{x3}\PY{p}{)}\PY{o}{/}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)} + \PY{n}{x1}\PY{p}{=}\PY{p}{(}\PY{n}{yp}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{+}\PY{l+m+mi}{10}\PY{o}{*}\PY{n}{x2}\PY{p}{)}\PY{o}{/}\PY{n}{K2}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x4 = 29.430 +x3 = 25.506 +x2 = 18.639 +x1 = 9.8100 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}15}]:} \PY{n}{K}\PY{o}{\PYZbs{}}\PY{n}{y} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 9.8100 + 18.6390 + 25.5060 + 29.4300 + + + \end{Verbatim} + + \subsection{Automate Gauss +Elimination}\label{automate-gauss-elimination} + +We can automate Gauss elimination with a function whose input is A and +y: + +\texttt{x=GaussNaive(A,y)} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}16}]:} \PY{n}{x}\PY{p}{=}\PY{n}{GaussNaive}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{n}{y}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x = + + 9.8100 + 18.6390 + 25.5060 + 29.4300 + + + \end{Verbatim} + + \subsection{Problem (Diagonal element is +zero)}\label{problem-diagonal-element-is-zero} + +If a diagonal element is 0 or very small either: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + no solution found +\item + errors are introduced +\end{enumerate} + +Therefore, we would want to pivot before applying Gauss elimination + +Consider: + +\begin{enumerate} +\def\labelenumi{(\alph{enumi})} +\item + \(\left[ \begin{array}{cccc} 0 & 2 & 3 \\ 4 & 6 & 7 \\ 2 & -3 & 6 \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \end{array} \right]= \left[ \begin{array}{c} 8 \\ -3 \\ 5\end{array} \right]\) +\item + \(\left[ \begin{array}{cccc} 0.0003 & 3.0000 \\ 1.0000 & 1.0000 \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \end{array} \right]= \left[ \begin{array}{c} 2.0001 \\ 1.0000 \end{array} \right]\) +\end{enumerate} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}17}]:} \PY{n}{format} \PY{n}{short} + \PY{n}{Aa}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{6}\PY{p}{,}\PY{l+m+mi}{7}\PY{p}{;}\PY{l+m+mi}{2}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{6}\PY{p}{]}\PY{p}{;} \PY{n}{ya}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{8}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{5}\PY{p}{]}\PY{p}{;} + \PY{n}{GaussNaive}\PY{p}{(}\PY{n}{Aa}\PY{p}{,}\PY{n}{ya}\PY{p}{)} + \PY{n}{Aa}\PY{o}{\PYZbs{}}\PY{n}{ya} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +warning: division by zero +warning: called from + GaussNaive at line 16 column 12 +warning: division by zero +warning: division by zero +ans = + + NaN + NaN + NaN + +ans = + + -5.423913 + 0.021739 + 2.652174 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}32}]:} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{Aug}\PY{p}{,}\PY{n}{npivots}\PY{p}{]}\PY{p}{=}\PY{n}{GaussPivot}\PY{p}{(}\PY{n}{Aa}\PY{p}{,}\PY{n}{ya}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x = + + -5.423913 + 0.021739 + 2.652174 + +Aug = + + 4.00000 6.00000 7.00000 -3.00000 + 0.00000 -6.00000 2.50000 6.50000 + 0.00000 0.00000 3.83333 10.16667 + +npivots = 2 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}33}]:} \PY{n}{format} \PY{n}{long} + \PY{n}{Ab}\PY{p}{=}\PY{p}{[}\PY{l+m+mf}{0.3E\PYZhy{}13}\PY{p}{,}\PY{l+m+mf}{3.0000}\PY{p}{;}\PY{l+m+mf}{1.0000}\PY{p}{,}\PY{l+m+mf}{1.0000}\PY{p}{]}\PY{p}{;}\PY{n}{yb}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{o}{+}\PY{l+m+mf}{0.1e\PYZhy{}13}\PY{p}{;}\PY{l+m+mf}{1.0000}\PY{p}{]}\PY{p}{;} + \PY{n}{GaussNaive}\PY{p}{(}\PY{n}{Ab}\PY{p}{,}\PY{n}{yb}\PY{p}{)} + \PY{n}{Ab}\PY{o}{\PYZbs{}}\PY{n}{yb} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 0.325665420556713 + 0.666666666666667 + +ans = + + 0.333333333333333 + 0.666666666666667 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}34}]:} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{Aug}\PY{p}{,}\PY{n}{npivots}\PY{p}{]}\PY{p}{=}\PY{n}{GaussPivot}\PY{p}{(}\PY{n}{Ab}\PY{p}{,}\PY{n}{yb}\PY{p}{)} + \PY{n}{Ab}\PY{o}{\PYZbs{}}\PY{n}{yb} + \PY{n}{format} \PY{n}{short} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x = + + 0.333333333333333 + 0.666666666666667 + +Aug = + + 1.000000000000000 1.000000000000000 1.000000000000000 + 0.000000000000000 2.999999999999970 1.999999999999980 + +npivots = 1 +ans = + + 0.333333333333333 + 0.666666666666667 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}36}]:} \PY{c}{\PYZpc{} determinant is (\PYZhy{}1)\PYZca{}(number\PYZus{}of\PYZus{}pivots)*diagonal\PYZus{}elements} + \PY{n+nb}{det}\PY{p}{(}\PY{n}{Ab}\PY{p}{)} + \PY{n}{Aug}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{Aug}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = -3.0000 +ans = 3.0000 + + \end{Verbatim} + + \subsubsection{Spring-Mass System again}\label{spring-mass-system-again} + +Now, 4 masses are connected in series to 4 springs with \(K_{1}\)=10 +N/m, \(K_{2}\)=5 N/m, \(K_{3}\)=2 N/m and \(K_{4}\)=1 N/m. What are the +final positions of the masses? + +\begin{figure}[htbp] +\centering +\includegraphics{../lecture_09/mass_springs.svg} +\caption{Springs-masses} +\end{figure} + +The masses have the following amounts, 1, 2, 3, and 4 kg for masses 1-4. +Using a FBD for each mass: + +\(m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0\) + +\(m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0\) + +\(m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0\) + +\(m_{4}g-k_{4}(x_{4}-x_{3})=0\) + +in matrix form: + +\(\left[ \begin{array}{cccc} k_1+k_2 & -k_2 & 0 & 0 \\ -k_2 & k_2+k_3 & -k_3 & 0 \\ 0 & -k_3 & k_3+k_4 & -k_4 \\ 0 & 0 & -k_4 & k_4 \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{array} \right]= \left[ \begin{array}{c} m_{1}g \\ m_{2}g \\ m_{3}g \\ m_{4}g \end{array} \right]\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}24}]:} \PY{n}{k1}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} \PY{n}{k2}\PY{p}{=}\PY{l+m+mi}{5}\PY{p}{;}\PY{n}{k3}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;}\PY{n}{k4}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} + \PY{n}{m3}\PY{p}{=}\PY{l+m+mi}{3}\PY{p}{;} + \PY{n}{m4}\PY{p}{=}\PY{l+m+mi}{4}\PY{p}{;} + \PY{n}{g}\PY{p}{=}\PY{l+m+mf}{9.81}\PY{p}{;} \PY{c}{\PYZpc{} m/s\PYZca{}2} + \PY{n}{K}\PY{p}{=}\PY{p}{[}\PY{n}{k1}\PY{o}{+}\PY{n}{k2} \PY{o}{\PYZhy{}}\PY{n}{k2} \PY{l+m+mi}{0} \PY{l+m+mi}{0}\PY{p}{;} \PY{o}{\PYZhy{}}\PY{n}{k2}\PY{p}{,} \PY{n}{k2}\PY{o}{+}\PY{n}{k3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{n}{k3} \PY{l+m+mi}{0}\PY{p}{;} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k3}\PY{p}{,} \PY{n}{k3}\PY{o}{+}\PY{n}{k4}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{n}{k4}\PY{p}{;} \PY{l+m+mi}{0} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k4} \PY{n}{k4}\PY{p}{]} + \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{n}{m1}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m2}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m3}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m4}\PY{o}{*}\PY{n}{g}\PY{p}{]} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K = + + 15 -5 0 0 + -5 7 -2 0 + 0 -2 3 -1 + 0 0 -1 1 + +y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + \end{Verbatim} + + \subsection{Tridiagonal matrix}\label{tridiagonal-matrix} + +This matrix, K, could be rewritten as 3 vectors e, f and g + +\(e=\left[ \begin{array}{c} 0 \\ -5 \\ -2 \\ -1 \end{array} \right]\) + +\(f=\left[ \begin{array}{c} 15 \\ 7 \\ 3 \\ 1 \end{array} \right]\) + +\(g=\left[ \begin{array}{c} -5 \\ -2 \\ -1 \\ 0 \end{array} \right]\) + +Where all other components are 0 and the length of the vectors are n and +the first component of e and the last component of g are zero + +\texttt{e(1)=0} + +\texttt{g(end)=0} + +No need to pivot and number of calculations reduced enormously. + +\begin{longtable}[c]{@{}ll@{}} +\toprule +method & Number of Floating point operations for +n\(\times\)n-matrix\tabularnewline +\midrule +\endhead +Gauss & n-cubed\tabularnewline +Tridiagonal & n\tabularnewline +\bottomrule +\end{longtable} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}25}]:} \PY{n+nb}{e}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{5}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} + \PY{n}{g}\PY{p}{=}\PY{p}{[}\PY{o}{\PYZhy{}}\PY{l+m+mi}{5}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{f}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{15}\PY{p}{;}\PY{l+m+mi}{7}\PY{p}{;}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} + \PY{n}{Tridiag}\PY{p}{(}\PY{n+nb}{e}\PY{p}{,}\PY{n}{f}\PY{p}{,}\PY{n}{g}\PY{p}{,}\PY{n}{y}\PY{p}{)} + \PY{n}{K}\PY{o}{\PYZbs{}}\PY{n}{y} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 9.8100 27.4680 61.8030 101.0430 + +ans = + + 9.8100 + 27.4680 + 61.8030 + 101.0430 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}26}]:} \PY{c}{\PYZpc{} tic ... t=toc } + \PY{c}{\PYZpc{} is Matlab timer used for debugging programs} + \PY{n}{t\PYZus{}GE} \PY{p}{=} \PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}GE\PYZus{}tridiag} \PY{p}{=} \PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}TD} \PY{p}{=} \PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{p}{;} + \PY{c}{\PYZpc{}for n = 1:200} + \PY{k}{for} \PY{n}{n}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100} + \PY{n}{A} \PY{p}{=} \PY{n+nb}{rand}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{n}\PY{p}{)}\PY{p}{;} + \PY{n+nb}{e} \PY{p}{=} \PY{n+nb}{rand}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} \PY{n+nb}{e}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{p}{;} + \PY{n}{f} \PY{p}{=} \PY{n+nb}{rand}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{g} \PY{p}{=} \PY{n+nb}{rand}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} \PY{n}{g}\PY{p}{(}\PY{k}{end}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{p}{;} + \PY{n}{Atd}\PY{p}{=}\PY{n+nb}{diag}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{o}{\PYZhy{}} \PY{n+nb}{diag}\PY{p}{(}\PY{n+nb}{e}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{:}\PY{n}{n}\PY{p}{)}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)} \PY{o}{\PYZhy{}} \PY{n+nb}{diag}\PY{p}{(}\PY{n}{g}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{:}\PY{n}{n}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{b} \PY{p}{=} \PY{n+nb}{rand}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n+nb}{tic}\PY{p}{;} + \PY{n}{x} \PY{p}{=} \PY{n}{GaussPivot}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n}{b}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}GE}\PY{p}{(}\PY{n}{n}\PY{p}{)} \PY{p}{=} \PY{n+nb}{toc}\PY{p}{;} + \PY{n+nb}{tic}\PY{p}{;} + \PY{n}{x} \PY{p}{=} \PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{b}\PY{p}{;} + \PY{n}{t\PYZus{}GE\PYZus{}tridiag}\PY{p}{(}\PY{n}{n}\PY{p}{)} \PY{p}{=} \PY{n+nb}{toc}\PY{p}{;} + \PY{n+nb}{tic}\PY{p}{;} + \PY{n}{x} \PY{p}{=} \PY{n}{Tridiag}\PY{p}{(}\PY{n+nb}{e}\PY{p}{,}\PY{n}{f}\PY{p}{,}\PY{n}{g}\PY{p}{,}\PY{n}{b}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}TD}\PY{p}{(}\PY{n}{n}\PY{p}{)} \PY{p}{=} \PY{n+nb}{toc}\PY{p}{;} + \PY{k}{end} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}28}]:} \PY{n}{n}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100}\PY{p}{;} + \PY{n+nb}{loglog}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{t\PYZus{}GE}\PY{p}{,}\PY{n}{n}\PY{p}{,}\PY{n}{t\PYZus{}TD}\PY{p}{,}\PY{n}{n}\PY{p}{,}\PY{n}{t\PYZus{}GE\PYZus{}tridiag}\PY{p}{)} + \PY{n+nb}{legend}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{Gauss elim\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{Matlab \PYZbs{}\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{TriDiag\PYZsq{}}\PY{p}{)} + \PY{n+nb}{xlabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{number of elements\PYZsq{}}\PY{p}{)} + \PY{n+nb}{ylabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{time (s)\PYZsq{}}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_10_files/lecture_10_29_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}29}]:} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{Aug}\PY{p}{,}\PY{n}{npivots}\PY{p}{]}\PY{p}{=}\PY{n}{GaussPivot}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{n}{y}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x = + + 9.8100 + 27.4680 + 61.8030 + 101.0430 + +Aug = + + 15.00000 -5.00000 0.00000 0.00000 9.81000 + 0.00000 5.33333 -2.00000 0.00000 22.89000 + 0.00000 0.00000 2.25000 -1.00000 38.01375 + 0.00000 0.00000 0.00000 0.55556 56.13500 + +npivots = 0 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}30}]:} \PY{n}{A}\PY{p}{=}\PY{n}{Aug}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{4}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 15.00000 -5.00000 0.00000 0.00000 + 0.00000 5.33333 -2.00000 0.00000 + 0.00000 0.00000 2.25000 -1.00000 + 0.00000 0.00000 0.00000 0.55556 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}31}]:} \PY{n+nb}{det}\PY{p}{(}\PY{n}{A}\PY{p}{)} + \PY{n}{detA}\PY{p}{=}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = 100.00 +detA = 100.00 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor} }]:} +\end{Verbatim} + + + % Add a bibliography block to the postdoc + + + + \end{document} diff --git a/lecture_10/lecture_10_files/lecture_10_27_0.pdf b/lecture_10/lecture_10_files/lecture_10_27_0.pdf new file mode 100644 index 0000000..8606584 Binary files /dev/null and b/lecture_10/lecture_10_files/lecture_10_27_0.pdf differ diff --git a/lecture_10/lecture_10_files/lecture_10_27_0.svg b/lecture_10/lecture_10_files/lecture_10_27_0.svg new file mode 100644 index 0000000..ddf2410 --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_27_0.svg @@ -0,0 +1,129 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-4 + + + + + 10-3 + + + + + 10-2 + + + + + 10-1 + + + + + 100 + + + + + 100 + + + + + 101 + + + + + 102 + + + + + 103 + + + + + + + + + time (s) + + + + + number of elements + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_10/lecture_10_files/lecture_10_28_0.svg b/lecture_10/lecture_10_files/lecture_10_28_0.svg new file mode 100644 index 0000000..548cda9 --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_28_0.svg @@ -0,0 +1,123 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0034 + + + + + 0.0036 + + + + + 0.0038 + + + + + 0.004 + + + + + 0.0042 + + + + + 0.0044 + + + + + 0.9 + + + + + 0.95 + + + + + 1 + + + + + 1.05 + + + + + 1.1 + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_10/lecture_10_files/lecture_10_29_0.pdf b/lecture_10/lecture_10_files/lecture_10_29_0.pdf new file mode 100644 index 0000000..20bdd51 Binary files /dev/null and b/lecture_10/lecture_10_files/lecture_10_29_0.pdf differ diff --git a/lecture_10/lecture_10_files/lecture_10_29_0.svg b/lecture_10/lecture_10_files/lecture_10_29_0.svg new file mode 100644 index 0000000..eb8af2c --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_29_0.svg @@ -0,0 +1,148 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-5 + + + + + 10-4 + + + + + 10-3 + + + + + 10-2 + + + + + 10-1 + + + + + 100 + + + + + 100 + + + + + 101 + + + + + 102 + + + + + + + + + time (s) + + + + + number of elements + + + + + + + + + Gauss elim + + + + + Gauss elim + + + + + + Matlab \ + + + Matlab + + + + + + TriDiag + + + TriDiag + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_10/lecture_10_files/lecture_10_3_0.pdf b/lecture_10/lecture_10_files/lecture_10_3_0.pdf new file mode 100644 index 0000000..5ebf43a Binary files /dev/null and b/lecture_10/lecture_10_files/lecture_10_3_0.pdf differ diff --git a/lecture_10/lecture_10_files/lecture_10_3_0.svg b/lecture_10/lecture_10_files/lecture_10_3_0.svg new file mode 100644 index 0000000..62b5e17 --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_3_0.svg @@ -0,0 +1,140 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -4 + + + + + -2 + + + + + 0 + + + + + 2 + + + + + 4 + + + + + 6 + + + + + -6 + + + + + -4 + + + + + -2 + + + + + 0 + + + + + 2 + + + + + 4 + + + + + 6 + + + + + 8 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_10/lecture_10_files/lecture_10_5_0.svg b/lecture_10/lecture_10_files/lecture_10_5_0.svg new file mode 100644 index 0000000..9d2a214 --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_5_0.svg @@ -0,0 +1,377 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -2 + + + + + + + + + + + -1.5 + + + + + + + + + + + -1 + + + + + + + + + + + -0.5 + + + + + + + + + + + 0 + + + + + + + + + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 1.5 + + + + + + + + + + + 2 + + + + + + + + + + + -2 + + + + + + + + + + + -1.5 + + + + + + + + + + + -1 + + + + + + + + + + + -0.5 + + + + + + + + + + + 0 + + + + + + + + + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 1.5 + + + + + + + + + + + 2 + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + gnuplot_plot_4a + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_10/lecture_10_files/lecture_10_5_1.pdf b/lecture_10/lecture_10_files/lecture_10_5_1.pdf new file mode 100644 index 0000000..4da2561 Binary files /dev/null and b/lecture_10/lecture_10_files/lecture_10_5_1.pdf differ diff --git a/lecture_10/lecture_10_files/lecture_10_5_1.svg b/lecture_10/lecture_10_files/lecture_10_5_1.svg new file mode 100644 index 0000000..70e0f6a --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_5_1.svg @@ -0,0 +1,322 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -2 + + + + + + + + + -1.5 + + + + + + + + + -1 + + + + + + + + + -0.5 + + + + + + + + + 0 + + + + + + + + + 0.5 + + + + + + + + + 1 + + + + + + + + + 1.5 + + + + + + + + + 2 + + + + + + + + + -2 + + + + + + + + + -1.5 + + + + + + + + + -1 + + + + + + + + + -0.5 + + + + + + + + + 0 + + + + + + + + + 0.5 + + + + + + + + + 1 + + + + + + + + + 1.5 + + + + + + + + + 2 + + + + + + + -6 + + + + + + + + + -4 + + + + + + + + + -2 + + + + + + + + + 0 + + + + + + + + + 2 + + + + + + + + + 4 + + + + + + + + + 6 + + + + + + + + + 8 + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_10/lecture_10_files/lecture_10_6_0.pdf b/lecture_10/lecture_10_files/lecture_10_6_0.pdf new file mode 100644 index 0000000..53b6aa0 Binary files /dev/null and b/lecture_10/lecture_10_files/lecture_10_6_0.pdf differ diff --git a/lecture_10/lecture_10_files/lecture_10_6_0.svg b/lecture_10/lecture_10_files/lecture_10_6_0.svg new file mode 100644 index 0000000..73465c0 --- /dev/null +++ b/lecture_10/lecture_10_files/lecture_10_6_0.svg @@ -0,0 +1,397 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -2 + + + + + + + + + + + -1.5 + + + + + + + + + + + -1 + + + + + + + + + + + -0.5 + + + + + + + + + + + 0 + + + + + + + + + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 1.5 + + + + + + + + + + + 2 + + + + + + + + + + + -2 + + + + + + + + + + + -1.5 + + + + + + + + + + + -1 + + + + + + + + + + + -0.5 + + + + + + + + + + + 0 + + + + + + + + + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 1.5 + + + + + + + + + + + 2 + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + x3 + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + gnuplot_plot_4a + + + + + + + + + + + + + + + x1 + + + + + x2 + + + + + x3 + + + + + + \ No newline at end of file diff --git a/lecture_10/nohup.out b/lecture_10/nohup.out new file mode 100644 index 0000000..e69de29 diff --git a/lecture_10/octave-workspace b/lecture_10/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_10/octave-workspace differ diff --git a/lecture_11/.ipynb_checkpoints/lecture_11-checkpoint.ipynb b/lecture_11/.ipynb_checkpoints/lecture_11-checkpoint.ipynb new file mode 100644 index 0000000..e2aa425 --- /dev/null +++ b/lecture_11/.ipynb_checkpoints/lecture_11-checkpoint.ipynb @@ -0,0 +1,699 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What is the determinant of A?\n", + "\n", + "$A=\\left[ \\begin{array}{ccc}\n", + "10 & 2 & 1 \\\\\n", + "0 & 1 & 1 \\\\\n", + "0 & 0 & 10\\end{array} \\right]$\n", + "\n", + "![responses to determinant of A](det_A.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LU Decomposition\n", + "### efficient storage of matrices for solutions\n", + "\n", + "Considering the same solution set:\n", + "\n", + "$y=Ax$\n", + "\n", + "Assume that we can perform Gauss elimination and achieve this formula:\n", + "\n", + "$Ux=d$ \n", + "\n", + "Where, $U$ is an upper triangular matrix that we derived from Gauss elimination and $d$ is the set of dependent variables after Gauss elimination. \n", + "\n", + "Assume there is a lower triangular matrix, $L$, with ones on the diagonal and same dimensions of $U$ and the following is true:\n", + "\n", + "$L(Ux-d)=Ax-y=0$\n", + "\n", + "Now, $Ax=LUx$, so $A=LU$, and $y=Ld$.\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "f21=0.5\n", + "\n", + "A(2,1)=1-1 = 0 \n", + "\n", + "A(2,2)=3-0.5=2.5\n", + "\n", + "y(2)=1-0.5=0.5\n", + "\n", + "$L(Ux-d)=\n", + "\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0.5 & 1 \\end{array} \\right]\n", + "\\left(\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "0 & 2.5 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]-\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "0.5\\end{array}\\right]\\right)=0$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000\n", + " 0.50000 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 1.00000\n", + " 0.00000 2.50000\n", + "\n", + "ans =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "d =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + "\n", + "y =\n", + "\n", + " 1\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "L=[1,0;0.5,1]\n", + "U=[2,1;0,2.5]\n", + "L*U\n", + "\n", + "d=[1;0.5]\n", + "y=L*d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pivoting for LU factorization\n", + "\n", + "LU factorization uses the same method as Gauss elimination so it is also necessary to perform partial pivoting when creating the lower and upper triangular matrices. \n", + "\n", + "Matlab and Octave use pivoting in the command \n", + "\n", + "`[L,U,P]=lu(A)`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'lu' is a built-in function from the file libinterp/corefcn/lu.cc\n", + "\n", + " -- Built-in Function: [L, U] = lu (A)\n", + " -- Built-in Function: [L, U, P] = lu (A)\n", + " -- Built-in Function: [L, U, P, Q] = lu (S)\n", + " -- Built-in Function: [L, U, P, Q, R] = lu (S)\n", + " -- Built-in Function: [...] = lu (S, THRES)\n", + " -- Built-in Function: Y = lu (...)\n", + " -- Built-in Function: [...] = lu (..., \"vector\")\n", + " Compute the LU decomposition of A.\n", + "\n", + " If A is full subroutines from LAPACK are used and if A is sparse\n", + " then UMFPACK is used.\n", + "\n", + " The result is returned in a permuted form, according to the\n", + " optional return value P. For example, given the matrix 'a = [1, 2;\n", + " 3, 4]',\n", + "\n", + " [l, u, p] = lu (A)\n", + "\n", + " returns\n", + "\n", + " l =\n", + "\n", + " 1.00000 0.00000\n", + " 0.33333 1.00000\n", + "\n", + " u =\n", + "\n", + " 3.00000 4.00000\n", + " 0.00000 0.66667\n", + "\n", + " p =\n", + "\n", + " 0 1\n", + " 1 0\n", + "\n", + " The matrix is not required to be square.\n", + "\n", + " When called with two or three output arguments and a spare input\n", + " matrix, 'lu' does not attempt to perform sparsity preserving column\n", + " permutations. Called with a fourth output argument, the sparsity\n", + " preserving column transformation Q is returned, such that 'P * A *\n", + " Q = L * U'.\n", + "\n", + " Called with a fifth output argument and a sparse input matrix, 'lu'\n", + " attempts to use a scaling factor R on the input matrix such that 'P\n", + " * (R \\ A) * Q = L * U'. This typically leads to a sparser and more\n", + " stable factorization.\n", + "\n", + " An additional input argument THRES, that defines the pivoting\n", + " threshold can be given. THRES can be a scalar, in which case it\n", + " defines the UMFPACK pivoting tolerance for both symmetric and\n", + " unsymmetric cases. If THRES is a 2-element vector, then the first\n", + " element defines the pivoting tolerance for the unsymmetric UMFPACK\n", + " pivoting strategy and the second for the symmetric strategy. By\n", + " default, the values defined by 'spparms' are used ([0.1, 0.001]).\n", + "\n", + " Given the string argument \"vector\", 'lu' returns the values of P\n", + " and Q as vector values, such that for full matrix, 'A (P,:) = L *\n", + " U', and 'R(P,:) * A (:, Q) = L * U'.\n", + "\n", + " With two output arguments, returns the permuted forms of the upper\n", + " and lower triangular matrices, such that 'A = L * U'. With one\n", + " output argument Y, then the matrix returned by the LAPACK routines\n", + " is returned. If the input matrix is sparse then the matrix L is\n", + " embedded into U to give a return value similar to the full case.\n", + " For both full and sparse matrices, 'lu' loses the permutation\n", + " information.\n", + "\n", + " See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help lu" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5e-05\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.00015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.00025\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0003\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=L\\y; x=U\\d; t_lu(N)=toc;\n", + "\n", + " tic; x=A\\y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use,\n", + "\n", + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n" + ] + } + ], + "source": [ + "K" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000\n", + " -10.00000 20.00000 -10.00000 0.00000\n", + " 0.00000 -10.00000 20.00000 -10.00000\n", + " 0.00000 0.00000 -10.00000 10.00000\n", + "\n" + ] + } + ], + "source": [ + "U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.623154e-05+/-1.166726e-05\n", + "average time spent for backslash solution = 1.675844e-05+/-1.187234e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_11/LU_naive.m b/lecture_11/LU_naive.m new file mode 100644 index 0000000..92efde6 --- /dev/null +++ b/lecture_11/LU_naive.m @@ -0,0 +1,27 @@ +function [L, U] = LU_naive(A) +% GaussNaive: naive Gauss elimination +% x = GaussNaive(A,b): Gauss elimination without pivoting. +% input: +% A = coefficient matrix +% y = right hand side vector +% output: +% x = solution vector +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +nb = n; +L=diag(ones(n,1)); +U=A; +% forward elimination +for k = 1:n-1 + for i = k+1:n + fik = U(i,k)/U(k,k); + L(i,k)=fik; + U(i,k:nb) = U(i,k:nb)-fik*U(k,k:nb); + end +end +%% back substitution +%x = zeros(n,1); +%x(n) = Aug(n,nb)/Aug(n,n); +%for i = n-1:-1:1 +% x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +%end diff --git a/lecture_11/LU_pivot.m b/lecture_11/LU_pivot.m new file mode 100644 index 0000000..37abb26 --- /dev/null +++ b/lecture_11/LU_pivot.m @@ -0,0 +1,36 @@ +function [L,U,P] = LU_pivot(A) +% GaussPivot: Gauss elimination pivoting +% x = GaussPivot(A,b): Gauss elimination with pivoting. +% input: +% A = coefficient matrix +% b = right hand side vector +% output: +% x = solution vector +[m,n]=size(A); +if m~=n, error('Matrix A must be square'); end +nb = n; +L=diag(ones(n,1)); +U=A; +P=diag(ones(n,1)); +% forward elimination +for k = 1:n-1 + % partial pivoting + [big,i]=max(abs(U(k:n,k))); + ipr=i+k-1; + if ipr~=k + P([k,ipr],:)=P([ipr,k],:); % if the max is not the current index ipr, pivot count + %L([k,ipr],:)=L([ipr,k],:); + %U([k,ipr],:)=U([ipr,k],:); + end + for i = k+1:n + fik=U(i,k)/U(k,k); + L(i,k)=fik; + U(i,k:nb)=U(i,k:nb)-fik*U(k,k:nb); + end +end +% back substitution +%x=zeros(n,1); +%x(n)=Aug(n,nb)/Aug(n,n); +%for i = n-1:-1:1 +% x(i)=(Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +%end diff --git a/lecture_11/det_A.png b/lecture_11/det_A.png new file mode 100644 index 0000000..50f6ac1 Binary files /dev/null and b/lecture_11/det_A.png differ diff --git a/lecture_11/lecture_11.aux b/lecture_11/lecture_11.aux new file mode 100644 index 0000000..a9c4771 --- /dev/null +++ b/lecture_11/lecture_11.aux @@ -0,0 +1,38 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.1}My question from last class}{1}{subsection.0.1}} +\newlabel{my-question-from-last-class}{{0.1}{1}{My question from last class}{subsection.0.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces responses to determinant of A\relax }}{1}{figure.caption.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.2}Your questions from last class}{1}{subsection.0.2}} +\newlabel{your-questions-from-last-class}{{0.2}{1}{Your questions from last class}{subsection.0.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.3}Midterm preference}{2}{subsection.0.3}} +\newlabel{midterm-preference}{{0.3}{2}{Midterm preference}{subsection.0.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces responses to midterm date\relax }}{2}{figure.caption.2}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {0.3.1}Midterm Questions}{2}{subsubsection.0.3.1}} +\newlabel{midterm-questions}{{0.3.1}{2}{Midterm Questions}{subsubsection.0.3.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1}LU Decomposition}{2}{section.1}} +\newlabel{lu-decomposition}{{1}{2}{LU Decomposition}{section.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.0.1}efficient storage of matrices for solutions}{2}{subsubsection.1.0.1}} +\newlabel{efficient-storage-of-matrices-for-solutions}{{1.0.1}{2}{efficient storage of matrices for solutions}{subsubsection.1.0.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Pivoting for LU factorization}{4}{subsection.1.1}} +\newlabel{pivoting-for-lu-factorization}{{1.1}{4}{Pivoting for LU factorization}{subsection.1.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Springs-masses\relax }}{7}{figure.caption.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Cholesky Factorization}{8}{subsection.1.2}} +\newlabel{cholesky-factorization}{{1.2}{8}{Cholesky Factorization}{subsection.1.2}{}} diff --git a/lecture_11/lecture_11.bbl b/lecture_11/lecture_11.bbl new file mode 100644 index 0000000..e69de29 diff --git a/lecture_11/lecture_11.blg b/lecture_11/lecture_11.blg new file mode 100644 index 0000000..f6400af --- /dev/null +++ b/lecture_11/lecture_11.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2015/Debian) +Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 +The top-level auxiliary file: lecture_11.aux +I found no \citation commands---while reading file lecture_11.aux +I found no \bibdata command---while reading file lecture_11.aux +I found no \bibstyle command---while reading file lecture_11.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 494 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/lecture_11/lecture_11.ipynb b/lecture_11/lecture_11.ipynb new file mode 100644 index 0000000..41f1870 --- /dev/null +++ b/lecture_11/lecture_11.ipynb @@ -0,0 +1,758 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## My question from last class \n", + "\n", + "$A=\\left[ \\begin{array}{ccc}\n", + "10 & 2 & 1 \\\\\n", + "0 & 1 & 1 \\\\\n", + "0 & 0 & 10\\end{array} \\right]$\n", + "\n", + "![responses to determinant of A](det_A.png)\n", + "\n", + "## Your questions from last class\n", + "\n", + "1. Need more linear algebra review\n", + " \n", + " -We will keep doing Linear Algebra, try the practice problems in 'linear_algebra'\n", + "\n", + "2. How do I do HW3? \n", + " \n", + " -demo today\n", + "\n", + "3. For hw4 is the spring constant (K) suppose to be given? \n", + " \n", + " -yes, its 30 N/m\n", + " \n", + "4. Deapool or Joker?\n", + "\n", + "\n", + "## Midterm preference\n", + "\n", + "![responses to midterm date](midterm_date.png)\n", + "\n", + "### Midterm Questions\n", + "\n", + "1. Notes allowed\n", + " \n", + " -no\n", + "\n", + "2. Will there be a review/study sheet\n", + "\n", + " -yes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LU Decomposition\n", + "### efficient storage of matrices for solutions\n", + "\n", + "Considering the same solution set:\n", + "\n", + "$y=Ax$\n", + "\n", + "Assume that we can perform Gauss elimination and achieve this formula:\n", + "\n", + "$Ux=d$ \n", + "\n", + "Where, $U$ is an upper triangular matrix that we derived from Gauss elimination and $d$ is the set of dependent variables after Gauss elimination. \n", + "\n", + "Assume there is a lower triangular matrix, $L$, with ones on the diagonal and same dimensions of $U$ and the following is true:\n", + "\n", + "$L(Ux-d)=Ax-y=0$\n", + "\n", + "Now, $Ax=LUx$, so $A=LU$, and $y=Ld$.\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "f21=0.5\n", + "\n", + "A(2,1)=1-1 = 0 \n", + "\n", + "A(2,2)=3-0.5=2.5\n", + "\n", + "y(2)=1-0.5=0.5\n", + "\n", + "$L(Ux-d)=\n", + "\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0.5 & 1 \\end{array} \\right]\n", + "\\left(\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "0 & 2.5 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]-\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "0.5\\end{array}\\right]\\right)=0$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000\n", + " 0.50000 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 1.00000\n", + " 0.00000 2.50000\n", + "\n", + "ans =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "d =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + "\n", + "y =\n", + "\n", + " 1\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "L=[1,0;0.5,1]\n", + "U=[2,1;0,2.5]\n", + "L*U\n", + "\n", + "d=[1;0.5]\n", + "y=L*d" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 5.0000\n", + "ans = 1\n", + "ans = 5\n", + "ans = 5\n", + "ans = 5.0000\n" + ] + } + ], + "source": [ + "% what is the determinant of L, U and A?\n", + "\n", + "det(A)\n", + "det(L)\n", + "det(U)\n", + "det(L)*det(U)\n", + "det(L*U)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pivoting for LU factorization\n", + "\n", + "LU factorization uses the same method as Gauss elimination so it is also necessary to perform partial pivoting when creating the lower and upper triangular matrices. \n", + "\n", + "Matlab and Octave use pivoting in the command \n", + "\n", + "`[L,U,P]=lu(A)`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'lu' is a built-in function from the file libinterp/corefcn/lu.cc\n", + "\n", + " -- Built-in Function: [L, U] = lu (A)\n", + " -- Built-in Function: [L, U, P] = lu (A)\n", + " -- Built-in Function: [L, U, P, Q] = lu (S)\n", + " -- Built-in Function: [L, U, P, Q, R] = lu (S)\n", + " -- Built-in Function: [...] = lu (S, THRES)\n", + " -- Built-in Function: Y = lu (...)\n", + " -- Built-in Function: [...] = lu (..., \"vector\")\n", + " Compute the LU decomposition of A.\n", + "\n", + " If A is full subroutines from LAPACK are used and if A is sparse\n", + " then UMFPACK is used.\n", + "\n", + " The result is returned in a permuted form, according to the\n", + " optional return value P. For example, given the matrix 'a = [1, 2;\n", + " 3, 4]',\n", + "\n", + " [l, u, p] = lu (A)\n", + "\n", + " returns\n", + "\n", + " l =\n", + "\n", + " 1.00000 0.00000\n", + " 0.33333 1.00000\n", + "\n", + " u =\n", + "\n", + " 3.00000 4.00000\n", + " 0.00000 0.66667\n", + "\n", + " p =\n", + "\n", + " 0 1\n", + " 1 0\n", + "\n", + " The matrix is not required to be square.\n", + "\n", + " When called with two or three output arguments and a spare input\n", + " matrix, 'lu' does not attempt to perform sparsity preserving column\n", + " permutations. Called with a fourth output argument, the sparsity\n", + " preserving column transformation Q is returned, such that 'P * A *\n", + " Q = L * U'.\n", + "\n", + " Called with a fifth output argument and a sparse input matrix, 'lu'\n", + " attempts to use a scaling factor R on the input matrix such that 'P\n", + " * (R \\ A) * Q = L * U'. This typically leads to a sparser and more\n", + " stable factorization.\n", + "\n", + " An additional input argument THRES, that defines the pivoting\n", + " threshold can be given. THRES can be a scalar, in which case it\n", + " defines the UMFPACK pivoting tolerance for both symmetric and\n", + " unsymmetric cases. If THRES is a 2-element vector, then the first\n", + " element defines the pivoting tolerance for the unsymmetric UMFPACK\n", + " pivoting strategy and the second for the symmetric strategy. By\n", + " default, the values defined by 'spparms' are used ([0.1, 0.001]).\n", + "\n", + " Given the string argument \"vector\", 'lu' returns the values of P\n", + " and Q as vector values, such that for full matrix, 'A (P,:) = L *\n", + " U', and 'R(P,:) * A (:, Q) = L * U'.\n", + "\n", + " With two output arguments, returns the permuted forms of the upper\n", + " and lower triangular matrices, such that 'A = L * U'. With one\n", + " output argument Y, then the matrix returned by the LAPACK routines\n", + " is returned. If the input matrix is sparse then the matrix L is\n", + " embedded into U to give a return value similar to the full case.\n", + " For both full and sparse matrices, 'lu' loses the permutation\n", + " information.\n", + "\n", + " See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help lu" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=inv(L)*y; x=inv(U)*d; t_lu(N)=toc;\n", + "\n", + " tic; x=inv(A)*y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use,\n", + "\n", + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n" + ] + } + ], + "source": [ + "K" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "(U'*U)'==U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06\n", + "average time spent for backslash solution = 1.555967e-05+/-1.048561e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_11/lecture_11.log b/lecture_11/lecture_11.log new file mode 100644 index 0000000..981cd40 --- /dev/null +++ b/lecture_11/lecture_11.log @@ -0,0 +1,839 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2017.1.11) 27 FEB 2017 11:55 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**lecture_11.tex +(./lecture_11.tex +LaTeX2e <2016/02/01> +Babel <3.9q> and hyphenation patterns for 81 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def +File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 48. +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2016/01/03 v1.0q Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg +File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 95. + +(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) +) +\Gread@gobject=\count87 +)) +\Gin@req@height=\dimen103 +\Gin@req@width=\dimen104 +) +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2016/02/21 v3.3-144 Customizing captions (AR) + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2016/02/04 v1.7-139 caption3 kernel (AR) +Package caption3 Info: TeX engine: e-TeX on input line 67. +\captionmargin=\dimen105 +\captionmargin@=\dimen106 +\captionwidth=\dimen107 +\caption@tempdima=\dimen108 +\caption@indent=\dimen109 +\caption@parindent=\dimen110 +\caption@hangindent=\dimen111 +) +\c@ContinuedFloat=\count88 +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2012/05/21 v1.0 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks15 +\XKV@tempa@toks=\toks16 +) +\XKV@depth=\count89 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2012/05/16 v1.0 Trim and clip general TeX material + +(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box26 +) +\tc@llx=\dimen112 +\tc@lly=\dimen113 +\tc@urx=\dimen114 +\tc@ury=\dimen115 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2012/05/13 v1.0 Clipping driver for pdftex +)) +\adjbox@Width=\dimen116 +\adjbox@Height=\dimen117 +\adjbox@Depth=\dimen118 +\adjbox@Totalheight=\dimen119 + +(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2011/09/13 v1.0 Conditionals for odd/even page detection +\c@checkoddpage=\count90 +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box27 +\sift@deathcycles=\count91 +\@vwid@loff=\dimen120 +\@vwid@roff=\dimen121 +)) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1341. +Package xcolor Info: Model `RGB' extended on input line 1353. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks17 +) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2010/09/12 v5.6 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) +Package ifpdf Info: pdfTeX in PDF mode is detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty +Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) +Package ifvtex Info: VTeX not detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty +Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional +) +\Gm@cnth=\count92 +\Gm@cntv=\count93 +\c@Gm@tempcnt=\count94 +\Gm@bindingoffset=\dimen122 +\Gm@wd@mp=\dimen123 +\Gm@odd@mp=\dimen124 +\Gm@even@mp=\dimen125 +\Gm@layoutwidth=\dimen126 +\Gm@layoutheight=\dimen127 +\Gm@layouthoffset=\dimen128 +\Gm@layoutvoffset=\dimen129 +\Gm@dimlist=\toks18 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2016/03/03 v2.15a AMS math features +\@mathmargin=\skip43 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen130 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen131 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count95 +LaTeX Info: Redefining \frac on input line 199. +\uproot@=\count96 +\leftroot@=\count97 +LaTeX Info: Redefining \overline on input line 297. +\classnum@=\count98 +\DOTSCASE@=\count99 +LaTeX Info: Redefining \ldots on input line 394. +LaTeX Info: Redefining \dots on input line 397. +LaTeX Info: Redefining \cdots on input line 518. +\Mathstrutbox@=\box28 +\strutbox@=\box29 +\big@size=\dimen132 +LaTeX Font Info: Redeclaring font encoding OML on input line 630. +LaTeX Font Info: Redeclaring font encoding OMS on input line 631. +\macc@depth=\count100 +\c@MaxMatrixCols=\count101 +\dotsspace@=\muskip10 +\c@parentequation=\count102 +\dspbrk@lvl=\count103 +\tag@help=\toks20 +\row@=\count104 +\column@=\count105 +\maxfields@=\count106 +\andhelp@=\toks21 +\eqnshift@=\dimen133 +\alignsep@=\dimen134 +\tagshift@=\dimen135 +\tagwidth@=\dimen136 +\totwidth@=\dimen137 +\lineht@=\dimen138 +\@envbody=\toks22 +\multlinegap=\skip44 +\multlinetaggap=\skip45 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2735. +LaTeX Info: Redefining \] on input line 2736. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2005/09/27 v1.99g Standard LaTeX package +Package textcomp Info: Sub-encoding information: +(textcomp) 5 = only ISO-Adobe without \textcurrency +(textcomp) 4 = 5 + \texteuro +(textcomp) 3 = 4 + \textohm +(textcomp) 2 = 3 + \textestimated + \textcurrency +(textcomp) 1 = TS1 - \textcircled - \t +(textcomp) 0 = TS1 (full) +(textcomp) Font families with sub-encoding setting implement +(textcomp) only a restricted character set as indicated. +(textcomp) Family '?' is the default used for unknown fonts. +(textcomp) See the documentation for details. +Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 79. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +) +LaTeX Info: Redefining \oldstylenums on input line 334. +Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 349. +Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 350. +Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 351. +Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 352. +Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 353. +Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 354. +Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 355. +Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 356. +Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 357. +Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 358. +Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 359. +Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 360. +Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 361. +Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 362. +Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 363. +Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 364. +Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 365. +Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 366. +Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 367. +Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 368. +Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 369. +Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 370. +Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 371. +Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 372. + +Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 373. +Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 374. +Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 375. +Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 376. +Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 377. +Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 378. +Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 379. +Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 380. +Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 381. +Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 382. +Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 383. +Package textcomp Info: Setting lmtt sub-encoding to TS1/0 on input line 384. +Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 385. +Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 386. +Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 387. +Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 388. +Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 389. +Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 390. +Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 391. +Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 392. +Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 393. +Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 394. +Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 395. +Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 396. +Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 397. +Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 398. +Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 399. +Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 400. +Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 401. +Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 402. +Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 403. +Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 404. +Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 405. +Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 406. +Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 407. +Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 408. +Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 409. +) +(/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texlive/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box30 +) +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count107 +\uc@combtoks=\toks24 +\uc@combtoksb=\toks25 +\uc@temptokena=\toks26 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2015/03/17 v1.2c Input encoding file +\inpenc@prehook=\toks27 +\inpenc@posthook=\toks28 + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/utf8x.def +File: utf8x.def 2004/10/17 UCS: Input encoding UTF-8 +)) +(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2008/02/07 + +Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix +<2008/02/07> (tvz) +\FV@CodeLineNo=\count108 +\FV@InFile=\read1 +\FV@TabBox=\box31 +\c@FancyVerbLine=\count109 +\FV@StepNumber=\count110 +\FV@OutFile=\write3 +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grffile.sty +Package: grffile 2012/04/05 v1.16 Extended file name support for graphics (HO) + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty +Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty +Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +))) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty +Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +Package grffile Info: Option `multidot' is set to `true'. +Package grffile Info: Option `extendedchars' is set to `false'. +Package grffile Info: Option `space' is set to `true'. +Package grffile Info: \Gin@ii of package `graphicx' fixed on input line 486. +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty +Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) + + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty +Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) +Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) +Package hobsub Info: Skipping package `infwarerr' (already loaded). +Package hobsub Info: Skipping package `ltxcmds' (already loaded). +Package hobsub Info: Skipping package `ifluatex' (already loaded). +Package hobsub Info: Skipping package `ifvtex' (already loaded). +Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) +Package hobsub Info: Skipping package `ifpdf' (already loaded). +Package hobsub Info: Skipping package `etexcmds' (already loaded). +Package hobsub Info: Skipping package `kvsetkeys' (already loaded). +Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) +Package hobsub Info: Skipping package `pdftexcmds' (already loaded). +Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) +Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO +) +Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) +Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) +) +Package hobsub Info: Skipping package `hobsub' (already loaded). +Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) +Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) +Package: xcolor-patch 2011/01/30 xcolor patch +Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) +Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) +Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty +Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen139 +\Hy@linkcounter=\count111 +\Hy@pagecounter=\count112 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) +) +\Hy@SavedSpaceFactor=\count113 + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +) +Package hyperref Info: Hyper figures OFF on input line 4443. +Package hyperref Info: Link nesting OFF on input line 4448. +Package hyperref Info: Hyper index ON on input line 4451. +Package hyperref Info: Plain pages OFF on input line 4458. +Package hyperref Info: Backreferencing OFF on input line 4463. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4688. +\c@Hy@tempcnt=\count114 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip11 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5041. +\XeTeXLinkMargin=\dimen140 +\Fld@menulength=\count115 +\Field@Width=\dimen141 +\Fld@charsize=\dimen142 +Package hyperref Info: Hyper figures OFF on input line 6295. +Package hyperref Info: Link nesting OFF on input line 6300. +Package hyperref Info: Hyper index ON on input line 6303. +Package hyperref Info: backreferencing OFF on input line 6310. +Package hyperref Info: Link coloring OFF on input line 6315. +Package hyperref Info: Link coloring with OCG OFF on input line 6320. +Package hyperref Info: PDF/A mode OFF on input line 6325. +LaTeX Info: Redefining \ref on input line 6365. +LaTeX Info: Redefining \pageref on input line 6369. +\Hy@abspage=\count116 +\c@Item=\count117 +\c@Hfootnote=\count118 +) + +Package hyperref Message: Driver (autodetected): hpdftex. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX +\Fld@listcount=\count119 +\c@bookmark@seq@number=\count120 + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +82. +) +\Hy@SectionHShift=\skip46 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2014/10/28 v4.11 Multi-page Table package (DPC) +\LTleft=\skip47 +\LTright=\skip48 +\LTpre=\skip49 +\LTpost=\skip50 +\LTchunksize=\count121 +\LTcapwidth=\dimen143 +\LT@head=\box32 +\LT@firsthead=\box33 +\LT@foot=\box34 +\LT@lastfoot=\box35 +\LT@cols=\count122 +\LT@rows=\count123 +\c@LT@tables=\count124 +\c@LT@chunks=\count125 +\LT@p@ftn=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2005/04/14 v1.61803 publication quality tables +\heavyrulewidth=\dimen144 +\lightrulewidth=\dimen145 +\cmidrulewidth=\dimen146 +\belowrulesep=\dimen147 +\belowbottomsep=\dimen148 +\aboverulesep=\dimen149 +\abovetopsep=\dimen150 +\cmidrulesep=\dimen151 +\cmidrulekern=\dimen152 +\defaultaddspace=\dimen153 +\@cmidla=\count126 +\@cmidlb=\count127 +\@aboverulesep=\dimen154 +\@belowrulesep=\dimen155 +\@thisruleclass=\count128 +\@lastruleclass=\count129 +\@thisrulewidth=\dimen156 +) +(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2011/09/28 v3.5.2 Customized lists +\labelindent=\skip51 +\enit@outerparindent=\dimen157 +\enit@toks=\toks30 +\enit@inbox=\box36 +\enitdp@description=\count130 +) +(/usr/share/texlive/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box37 +\UL@hyphenbox=\box38 +\UL@skip=\skip52 +\UL@hook=\toks31 +\UL@height=\dimen158 +\UL@pe=\count131 +\UL@pixel=\dimen159 +\ULC@box=\box39 +Package: ulem 2012/05/18 +\ULdepth=\dimen160 +) +Package hyperref Info: Option `breaklinks' set `true' on input line 264. +Package hyperref Info: Option `colorlinks' set `true' on input line 264. + (./lecture_11.aux) +\openout1 = `lecture_11.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 271. +LaTeX Font Info: Try loading font information for TS1+cmr on input line 271. + + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Try loading font information for T1+ppl on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count132 +\scratchdimen=\dimen161 +\scratchbox=\box40 +\nofMPsegments=\count133 +\nofMParguments=\count134 +\everyMPshowfont=\toks32 +\MPscratchCnt=\count135 +\MPscratchDim=\dimen162 +\MPnumerator=\count136 +\makeMPintoPDFobject=\count137 +\everyMPtoPDFconversion=\toks33 +) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty +Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty +Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) +) +Package grfext Info: Graphics extension search list: +(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 452. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texlive/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2013/06/09 v1.4-94 longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +\AtBeginShipoutBox=\box41 +Package hyperref Info: Link coloring ON on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) +) +\c@section@level=\count138 +) +LaTeX Info: Redefining \ref on input line 271. +LaTeX Info: Redefining \pageref on input line 271. +LaTeX Info: Redefining \nameref on input line 271. + +(./lecture_11.out) (./lecture_11.out) +\@outlinefile=\write4 +\openout4 = `lecture_11.out'. + +LaTeX Font Info: Try loading font information for OT1+ppl on input line 275. + + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Try loading font information for OML+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Try loading font information for OMS+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Try loading font information for OMX+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Try loading font information for OT1+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. + + +LaTeX Warning: No \author given. + +LaTeX Font Info: Try loading font information for T1+cmtt on input line 279. + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <12> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 288. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 290. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 290. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 290. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 290. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 290. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 290. + + +File: det_A.png Graphic file (type png) + +Package pdftex.def Info: det_A.png used on input line 294. +(pdftex.def) Requested size: 375.80544pt x 202.3582pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./det_A.png>] + +File: midterm_date.png Graphic file (type png) + +Package pdftex.def Info: midterm_date.png used on input line 324. +(pdftex.def) Requested size: 375.80544pt x 171.71808pt. +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <10.95> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 328. +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <14.4> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 342. + + +Package hyperref Warning: Difference (2) between bookmark levels is greater +(hyperref) than one, level fixed on input line 345. + +[2 <./midterm_date.png>] [3] +LaTeX Font Info: Try loading font information for TS1+cmtt on input line 461 +. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) [4] [5] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 547. + + +File: lecture_11_files/lecture_11_8_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_11_files/lecture_11_8_0.pdf used on input line + 561. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + +Underfull \hbox (badness 10000) in paragraph at lines 563--564 + + [] + +<../lecture_09/mass_springs.png, id=80, 112.42pt x 190.7125pt> +File: ../lecture_09/mass_springs.png Graphic file (type png) + + +Package pdftex.def Info: ../lecture_09/mass_springs.png used on input line 571. + +(pdftex.def) Requested size: 89.93611pt x 152.576pt. + [6 <./lecture_11_files/lecture_11_8_0.pdf>] [7 <../lecture_09/mass_springs.png +>] [8] +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 734. + [9] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 734. + (./lecture_11.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 734. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 734. +Package rerunfilecheck Info: File `lecture_11.out' has not changed. +(rerunfilecheck) Checksum: 41743ED7C91140C56E53FBD51DB19D65;568. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 734. + ) +Here is how much of TeX's memory you used: + 10955 strings out of 493029 + 163773 string characters out of 6136234 + 268999 words of memory out of 5000000 + 14228 multiletter control sequences out of 15000+600000 + 39052 words of font info for 103 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 36i,9n,77p,460b,465s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/texli +ve/texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf/fonts/enc/dvips/cm- +super/cm-super-t1.enc} +Output written on lecture_11.pdf (9 pages, 191934 bytes). +PDF statistics: + 152 PDF objects out of 1000 (max. 8388607) + 121 compressed objects within 2 object streams + 27 named destinations out of 1000 (max. 500000) + 85 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/lecture_11/lecture_11.out b/lecture_11/lecture_11.out new file mode 100644 index 0000000..481e738 --- /dev/null +++ b/lecture_11/lecture_11.out @@ -0,0 +1,8 @@ +\BOOKMARK [2][-]{subsection.0.1}{My question from last class}{}% 1 +\BOOKMARK [2][-]{subsection.0.2}{Your questions from last class}{}% 2 +\BOOKMARK [2][-]{subsection.0.3}{Midterm preference}{}% 3 +\BOOKMARK [3][-]{subsubsection.0.3.1}{Midterm Questions}{subsection.0.3}% 4 +\BOOKMARK [1][-]{section.1}{LU Decomposition}{}% 5 +\BOOKMARK [2][-]{subsubsection.1.0.1}{efficient storage of matrices for solutions}{section.1}% 6 +\BOOKMARK [2][-]{subsection.1.1}{Pivoting for LU factorization}{section.1}% 7 +\BOOKMARK [2][-]{subsection.1.2}{Cholesky Factorization}{section.1}% 8 diff --git a/lecture_11/lecture_11.pdf b/lecture_11/lecture_11.pdf new file mode 100644 index 0000000..9fa1342 Binary files /dev/null and b/lecture_11/lecture_11.pdf differ diff --git a/lecture_11/lecture_11.tex b/lecture_11/lecture_11.tex new file mode 100644 index 0000000..318852d --- /dev/null +++ b/lecture_11/lecture_11.tex @@ -0,0 +1,734 @@ + +% Default to the notebook output style + + + + +% Inherit from the specified cell style. + + + + + +\documentclass[11pt]{article} + + + + \usepackage[T1]{fontenc} + % Nicer default font (+ math font) than Computer Modern for most use cases + \usepackage{mathpazo} + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % We will generate all images so they have a width \maxwidth. This means + % that they will get their normal width if they fit onto the page, but + % are scaled down if they would overflow the margins. + \makeatletter + \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth + \else\Gin@nat@width\fi} + \makeatother + \let\Oldincludegraphics\includegraphics + % Set max figure width to be 80% of text width, for now hardcoded. + \renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=.8\maxwidth]{#1}} + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionLabelFormat{nolabel}{} + \captionsetup{labelformat=nolabel} + + \usepackage{adjustbox} % Used to constrain images to a maximum size + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatability definitions + \def\gt{>} + \def\lt{<} + % Document parameters + \title{lecture\_11} + + + + + % Pygments definitions + +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % Exact colors from NB + \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} + \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} + + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + + \begin{document} + + + \maketitle + + + + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}1}]:} \PY{c}{\PYZpc{}plot \PYZhy{}\PYZhy{}format svg} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}2}]:} \PY{n}{setdefaults} +\end{Verbatim} + + \subsection{My question from last +class}\label{my-question-from-last-class} + +\(A=\left[ \begin{array}{ccc} 10 & 2 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 10\end{array} \right]\) + +\begin{figure}[htbp] +\centering +\includegraphics{det_A.png} +\caption{responses to determinant of A} +\end{figure} + +\subsection{Your questions from last +class}\label{your-questions-from-last-class} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + Need more linear algebra review + + -We will keep doing Linear Algebra, try the practice problems in + 'linear\_algebra' +\item + How do I do HW3? + + -demo today +\item + For hw4 is the spring constant (K) suppose to be given? + + -yes, its 30 N/m +\item + Deapool or Joker? +\end{enumerate} + +\subsection{Midterm preference}\label{midterm-preference} + +\begin{figure}[htbp] +\centering +\includegraphics{midterm_date.png} +\caption{responses to midterm date} +\end{figure} + +\subsubsection{Midterm Questions}\label{midterm-questions} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + Notes allowed + + -no +\item + Will there be a review/study sheet + + -yes +\end{enumerate} + + \section{LU Decomposition}\label{lu-decomposition} + +\subsubsection{efficient storage of matrices for +solutions}\label{efficient-storage-of-matrices-for-solutions} + +Considering the same solution set: + +\(y=Ax\) + +Assume that we can perform Gauss elimination and achieve this formula: + +\(Ux=d\) + +Where, \(U\) is an upper triangular matrix that we derived from Gauss +elimination and \(d\) is the set of dependent variables after Gauss +elimination. + +Assume there is a lower triangular matrix, \(L\), with ones on the +diagonal and same dimensions of \(U\) and the following is true: + +\(L(Ux-d)=Ax-y=0\) + +Now, \(Ax=LUx\), so \(A=LU\), and \(y=Ld\). + +\(2x_{1}+x_{2}=1\) + +\(x_{1}+3x_{2}=1\) + +\(\left[ \begin{array}{cc} 2 & 1 \\ 1 & 3 \end{array} \right] \left[\begin{array}{c} x_{1} \\ x_{2} \end{array}\right]= \left[\begin{array}{c} 1 \\ 1\end{array}\right]\) + +f21=0.5 + +A(2,1)=1-1 = 0 + +A(2,2)=3-0.5=2.5 + +y(2)=1-0.5=0.5 + +\(L(Ux-d)= \left[ \begin{array}{cc} 1 & 0 \\ 0.5 & 1 \end{array} \right] \left(\left[ \begin{array}{cc} 2 & 1 \\ 0 & 2.5 \end{array} \right] \left[\begin{array}{c} x_{1} \\ x_{2} \end{array}\right]- \left[\begin{array}{c} 1 \\ 0.5\end{array}\right]\right)=0\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}3}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{]} + \PY{n}{L}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mf}{0.5}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{]} + \PY{n}{U}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mf}{2.5}\PY{p}{]} + \PY{n}{L}\PY{o}{*}\PY{n}{U} + + \PY{n}{d}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mf}{0.5}\PY{p}{]} + \PY{n}{y}\PY{p}{=}\PY{n}{L}\PY{o}{*}\PY{n}{d} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 2 1 + 1 3 + +L = + + 1.00000 0.00000 + 0.50000 1.00000 + +U = + + 2.00000 1.00000 + 0.00000 2.50000 + +ans = + + 2 1 + 1 3 + +d = + + 1.00000 + 0.50000 + +y = + + 1 + 1 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}5}]:} \PY{c}{\PYZpc{} what is the determinant of L, U and A?} + + \PY{n+nb}{det}\PY{p}{(}\PY{n}{A}\PY{p}{)} + \PY{n+nb}{det}\PY{p}{(}\PY{n}{L}\PY{p}{)} + \PY{n+nb}{det}\PY{p}{(}\PY{n}{U}\PY{p}{)} + \PY{n+nb}{det}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{o}{*}\PY{n+nb}{det}\PY{p}{(}\PY{n}{U}\PY{p}{)} + \PY{n+nb}{det}\PY{p}{(}\PY{n}{L}\PY{o}{*}\PY{n}{U}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = 5.0000 +ans = 1 +ans = 5 +ans = 5 +ans = 5.0000 + + \end{Verbatim} + + \subsection{Pivoting for LU +factorization}\label{pivoting-for-lu-factorization} + +LU factorization uses the same method as Gauss elimination so it is also +necessary to perform partial pivoting when creating the lower and upper +triangular matrices. + +Matlab and Octave use pivoting in the command + +\texttt{{[}L,U,P{]}=lu(A)} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}4}]:} \PY{n}{help} \PY{n+nb}{lu} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +'lu' is a built-in function from the file libinterp/corefcn/lu.cc + + -- Built-in Function: [L, U] = lu (A) + -- Built-in Function: [L, U, P] = lu (A) + -- Built-in Function: [L, U, P, Q] = lu (S) + -- Built-in Function: [L, U, P, Q, R] = lu (S) + -- Built-in Function: [{\ldots}] = lu (S, THRES) + -- Built-in Function: Y = lu ({\ldots}) + -- Built-in Function: [{\ldots}] = lu ({\ldots}, "vector") + Compute the LU decomposition of A. + + If A is full subroutines from LAPACK are used and if A is sparse + then UMFPACK is used. + + The result is returned in a permuted form, according to the + optional return value P. For example, given the matrix 'a = [1, 2; + 3, 4]', + + [l, u, p] = lu (A) + + returns + + l = + + 1.00000 0.00000 + 0.33333 1.00000 + + u = + + 3.00000 4.00000 + 0.00000 0.66667 + + p = + + 0 1 + 1 0 + + The matrix is not required to be square. + + When called with two or three output arguments and a spare input + matrix, 'lu' does not attempt to perform sparsity preserving column + permutations. Called with a fourth output argument, the sparsity + preserving column transformation Q is returned, such that 'P * A * + Q = L * U'. + + Called with a fifth output argument and a sparse input matrix, 'lu' + attempts to use a scaling factor R on the input matrix such that 'P + * (R \textbackslash{} A) * Q = L * U'. This typically leads to a sparser and more + stable factorization. + + An additional input argument THRES, that defines the pivoting + threshold can be given. THRES can be a scalar, in which case it + defines the UMFPACK pivoting tolerance for both symmetric and + unsymmetric cases. If THRES is a 2-element vector, then the first + element defines the pivoting tolerance for the unsymmetric UMFPACK + pivoting strategy and the second for the symmetric strategy. By + default, the values defined by 'spparms' are used ([0.1, 0.001]). + + Given the string argument "vector", 'lu' returns the values of P + and Q as vector values, such that for full matrix, 'A (P,:) = L * + U', and 'R(P,:) * A (:, Q) = L * U'. + + With two output arguments, returns the permuted forms of the upper + and lower triangular matrices, such that 'A = L * U'. With one + output argument Y, then the matrix returned by the LAPACK routines + is returned. If the input matrix is sparse then the matrix L is + embedded into U to give a return value similar to the full case. + For both full and sparse matrices, 'lu' loses the permutation + information. + + See also: luupdate, ilu, chol, hess, qr, qz, schur, svd. + +Additional help for built-in functions and operators is +available in the online version of the manual. Use the command +'doc ' to search the manual index. + +Help and information about Octave is also available on the WWW +at http://www.octave.org and via the help@octave.org +mailing list. + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}9}]:} \PY{c}{\PYZpc{} time LU solution vs backslash} + \PY{n}{t\PYZus{}lu}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{100}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}bs}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{100}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{k}{for} \PY{n}{N}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100} + \PY{n}{A}\PY{p}{=}\PY{n+nb}{rand}\PY{p}{(}\PY{n}{N}\PY{p}{,}\PY{n}{N}\PY{p}{)}\PY{p}{;} + \PY{n}{y}\PY{p}{=}\PY{n+nb}{rand}\PY{p}{(}\PY{n}{N}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{p}{[}\PY{n}{L}\PY{p}{,}\PY{n}{U}\PY{p}{,}\PY{n}{P}\PY{p}{]}\PY{p}{=}\PY{n+nb}{lu}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{;} + + \PY{n+nb}{tic}\PY{p}{;} \PY{n}{d}\PY{p}{=}\PY{n+nb}{inv}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{o}{*}\PY{n}{y}\PY{p}{;} \PY{n}{x}\PY{p}{=}\PY{n+nb}{inv}\PY{p}{(}\PY{n}{U}\PY{p}{)}\PY{o}{*}\PY{n}{d}\PY{p}{;} \PY{n}{t\PYZus{}lu}\PY{p}{(}\PY{n}{N}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + + \PY{n+nb}{tic}\PY{p}{;} \PY{n}{x}\PY{p}{=}\PY{n+nb}{inv}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{o}{*}\PY{n}{y}\PY{p}{;} \PY{n}{t\PYZus{}bs}\PY{p}{(}\PY{n}{N}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + \PY{k}{end} + \PY{n+nb}{plot}\PY{p}{(}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100}\PY{p}{]}\PY{p}{,}\PY{n}{t\PYZus{}lu}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100}\PY{p}{]}\PY{p}{,}\PY{n}{t\PYZus{}bs}\PY{p}{)} + \PY{n+nb}{legend}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{LU decomp\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{Octave \PYZbs{}\PYZbs{}\PYZsq{}}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_11_files/lecture_11_8_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + Consider the problem again from the intro to Linear Algebra, 4 masses +are connected in series to 4 springs with K=10 N/m. What are the final +positions of the masses? + +\begin{figure}[htbp] +\centering +\includegraphics{../lecture_09/mass_springs.png} +\caption{Springs-masses} +\end{figure} + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses +1-4. Using a FBD for each mass: + +\(m_{1}g+k(x_{2}-x_{1})-kx_{1}=0\) + +\(m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0\) + +\(m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0\) + +\(m_{4}g-k(x_{4}-x_{3})=0\) + +in matrix form: + +\(\left[ \begin{array}{cccc} 2k & -k & 0 & 0 \\ -k & 2k & -k & 0 \\ 0 & -k & 2k & -k \\ 0 & 0 & -k & k \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{array} \right]= \left[ \begin{array}{c} m_{1}g \\ m_{2}g \\ m_{3}g \\ m_{4}g \end{array} \right]\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}10}]:} \PY{n}{k}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} + \PY{n}{m3}\PY{p}{=}\PY{l+m+mi}{3}\PY{p}{;} + \PY{n}{m4}\PY{p}{=}\PY{l+m+mi}{4}\PY{p}{;} + \PY{n}{g}\PY{p}{=}\PY{l+m+mf}{9.81}\PY{p}{;} \PY{c}{\PYZpc{} m/s\PYZca{}2} + \PY{n}{K}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{0} \PY{l+m+mi}{0}\PY{p}{;} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{0}\PY{p}{;} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{p}{;} \PY{l+m+mi}{0} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k} \PY{n}{k}\PY{p}{]} + \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{n}{m1}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m2}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m3}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m4}\PY{o}{*}\PY{n}{g}\PY{p}{]} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K = + + 20 -10 0 0 + -10 20 -10 0 + 0 -10 20 -10 + 0 0 -10 10 + +y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + \end{Verbatim} + + This matrix, K, is symmetric. + +\texttt{K(i,j)==K(j,i)} + +Now we can use, + +\subsection{Cholesky Factorization}\label{cholesky-factorization} + +We can decompose the matrix, K into two matrices, \(U\) and \(U^{T}\), +where + +\(K=U^{T}U\) + +each of the components of U can be calculated with the following +equations: + +\(u_{ii}=\sqrt{a_{ii}-\sum_{k=1}^{i-1}u_{ki}^{2}}\) + +\(u_{ij}=\frac{a_{ij}-\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}\) + +so for K + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}11}]:} \PY{n}{K} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K = + + 20 -10 0 0 + -10 20 -10 0 + 0 -10 20 -10 + 0 0 -10 10 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}12}]:} \PY{n}{u11}\PY{p}{=}\PY{n+nb}{sqrt}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{)} + \PY{n}{u12}\PY{p}{=}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}\PY{o}{/}\PY{n}{u11} + \PY{n}{u13}\PY{p}{=}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}\PY{o}{/}\PY{n}{u11} + \PY{n}{u14}\PY{p}{=}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{p}{)}\PY{o}{/}\PY{n}{u11} + \PY{n}{u22}\PY{p}{=}\PY{n+nb}{sqrt}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{u12}\PYZca{}\PY{l+m+mi}{2}\PY{p}{)} + \PY{n}{u23}\PY{p}{=}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{u12}\PY{o}{*}\PY{n}{u13}\PY{p}{)}\PY{o}{/}\PY{n}{u22} + \PY{n}{u24}\PY{p}{=}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{u12}\PY{o}{*}\PY{n}{u14}\PY{p}{)}\PY{o}{/}\PY{n}{u22} + \PY{n}{u33}\PY{p}{=}\PY{n+nb}{sqrt}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{u13}\PYZca{}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{n}{u23}\PYZca{}\PY{l+m+mi}{2}\PY{p}{)} + \PY{n}{u34}\PY{p}{=}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{u13}\PY{o}{*}\PY{n}{u14}\PY{o}{\PYZhy{}}\PY{n}{u23}\PY{o}{*}\PY{n}{u24}\PY{p}{)}\PY{o}{/}\PY{n}{u33} + \PY{n}{u44}\PY{p}{=}\PY{n+nb}{sqrt}\PY{p}{(}\PY{n}{K}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{u14}\PYZca{}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{n}{u24}\PYZca{}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{n}{u34}\PYZca{}\PY{l+m+mi}{2}\PY{p}{)} + \PY{n}{U}\PY{p}{=}\PY{p}{[}\PY{n}{u11}\PY{p}{,}\PY{n}{u12}\PY{p}{,}\PY{n}{u13}\PY{p}{,}\PY{n}{u14}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{,}\PY{n}{u22}\PY{p}{,}\PY{n}{u23}\PY{p}{,}\PY{n}{u24}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{,}\PY{n}{u33}\PY{p}{,}\PY{n}{u34}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{,}\PY{n}{u44}\PY{p}{]} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +u11 = 4.4721 +u12 = -2.2361 +u13 = 0 +u14 = 0 +u22 = 3.8730 +u23 = -2.5820 +u24 = 0 +u33 = 3.6515 +u34 = -2.7386 +u44 = 1.5811 +U = + + 4.47214 -2.23607 0.00000 0.00000 + 0.00000 3.87298 -2.58199 0.00000 + 0.00000 0.00000 3.65148 -2.73861 + 0.00000 0.00000 0.00000 1.58114 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}17}]:} \PY{p}{(}\PY{n}{U}\PY{o}{\PYZsq{}}\PY{o}{*}\PY{n}{U}\PY{p}{)}\PY{o}{\PYZsq{}}\PY{o}{==}\PY{n}{U}\PY{o}{\PYZsq{}}\PY{o}{*}\PY{n}{U} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 1 1 1 1 + 1 1 1 1 + 1 1 1 1 + 1 1 1 1 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}18}]:} \PY{c}{\PYZpc{} time solution for Cholesky vs backslash} + \PY{n}{t\PYZus{}chol}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{1000}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}bs}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{1000}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{k}{for} \PY{n}{i}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{1000} + \PY{n+nb}{tic}\PY{p}{;} \PY{n}{d}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZsq{}}\PY{o}{*}\PY{n}{y}\PY{p}{;} \PY{n}{x}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d}\PY{p}{;} \PY{n}{t\PYZus{}chol}\PY{p}{(}\PY{n}{i}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + \PY{n+nb}{tic}\PY{p}{;} \PY{n}{x}\PY{p}{=}\PY{n}{K}\PY{o}{\PYZbs{}}\PY{n}{y}\PY{p}{;} \PY{n}{t\PYZus{}bs}\PY{p}{(}\PY{n}{i}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + \PY{k}{end} + \PY{n+nb}{fprintf}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{average time spent for Cholesky factored solution = \PYZpc{}e+/\PYZhy{}\PYZpc{}e\PYZsq{}}\PY{p}{,}\PY{n+nb}{mean}\PY{p}{(}\PY{n}{t\PYZus{}chol}\PY{p}{)}\PY{p}{,}\PY{n+nb}{std}\PY{p}{(}\PY{n}{t\PYZus{}chol}\PY{p}{)}\PY{p}{)} + + \PY{n+nb}{fprintf}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{average time spent for backslash solution = \PYZpc{}e+/\PYZhy{}\PYZpc{}e\PYZsq{}}\PY{p}{,}\PY{n+nb}{mean}\PY{p}{(}\PY{n}{t\PYZus{}bs}\PY{p}{)}\PY{p}{,}\PY{n+nb}{std}\PY{p}{(}\PY{n}{t\PYZus{}bs}\PY{p}{)}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06 +average time spent for backslash solution = 1.555967e-05+/-1.048561e-05 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor} }]:} +\end{Verbatim} + + + % Add a bibliography block to the postdoc + + + + \end{document} diff --git a/lecture_11/lecture_11_files/lecture_11_6_0.pdf b/lecture_11/lecture_11_files/lecture_11_6_0.pdf new file mode 100644 index 0000000..40e3f28 Binary files /dev/null and b/lecture_11/lecture_11_files/lecture_11_6_0.pdf differ diff --git a/lecture_11/lecture_11_files/lecture_11_6_0.svg b/lecture_11/lecture_11_files/lecture_11_6_0.svg new file mode 100644 index 0000000..bb1f18d --- /dev/null +++ b/lecture_11/lecture_11_files/lecture_11_6_0.svg @@ -0,0 +1,149 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 5e-05 + + + + + 0.0001 + + + + + 0.00015 + + + + + 0.0002 + + + + + 0.00025 + + + + + 0.0003 + + + + + 0 + + + + + 20 + + + + + 40 + + + + + 60 + + + + + 80 + + + + + 100 + + + + + + + + + + + + + LU decomp + + + + + LU decomp + + + + + + Octave \\ + + + Octave \ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_11/lecture_11_files/lecture_11_8_0.pdf b/lecture_11/lecture_11_files/lecture_11_8_0.pdf new file mode 100644 index 0000000..7f562c6 Binary files /dev/null and b/lecture_11/lecture_11_files/lecture_11_8_0.pdf differ diff --git a/lecture_11/lecture_11_files/lecture_11_8_0.svg b/lecture_11/lecture_11_files/lecture_11_8_0.svg new file mode 100644 index 0000000..37a1c3f --- /dev/null +++ b/lecture_11/lecture_11_files/lecture_11_8_0.svg @@ -0,0 +1,139 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0.0005 + + + + + 0.001 + + + + + 0.0015 + + + + + 0.002 + + + + + 0 + + + + + 20 + + + + + 40 + + + + + 60 + + + + + 80 + + + + + 100 + + + + + + + + + + + + + LU decomp + + + + + LU decomp + + + + + + Octave \\ + + + Octave \ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_11/mass_springs.png b/lecture_11/mass_springs.png new file mode 100644 index 0000000..259a333 Binary files /dev/null and b/lecture_11/mass_springs.png differ diff --git a/lecture_11/mass_springs.svg b/lecture_11/mass_springs.svg new file mode 100644 index 0000000..2bec8a4 --- /dev/null +++ b/lecture_11/mass_springs.svg @@ -0,0 +1,214 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + m1 + m2 + m3 + + + m4 + + + + + + + + + diff --git a/lecture_11/midterm_date.png b/lecture_11/midterm_date.png new file mode 100644 index 0000000..4dd0663 Binary files /dev/null and b/lecture_11/midterm_date.png differ diff --git a/lecture_11/nohup.out b/lecture_11/nohup.out new file mode 100644 index 0000000..838862f --- /dev/null +++ b/lecture_11/nohup.out @@ -0,0 +1,2 @@ + +(evince:15386): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -71 and height 20 diff --git a/lecture_11/octave-workspace b/lecture_11/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_11/octave-workspace differ diff --git a/lecture_12/.ipynb_checkpoints/lecture_12-checkpoint.ipynb b/lecture_12/.ipynb_checkpoints/lecture_12-checkpoint.ipynb new file mode 100644 index 0000000..1332b29 --- /dev/null +++ b/lecture_12/.ipynb_checkpoints/lecture_12-checkpoint.ipynb @@ -0,0 +1,1483 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## My question from last class \n", + "\n", + "\n", + "## Your questions from last class\n", + "\n", + "1. Need more linear algebra review\n", + " \n", + " -We will keep doing Linear Algebra, try the practice problems in 'linear_algebra'\n", + "\n", + "2. How do I do HW3? \n", + " \n", + " -demo today\n", + "\n", + "3. For hw4 is the spring constant (K) suppose to be given? \n", + " \n", + " -yes, its 30 N/m\n", + " \n", + "4. Deapool or Joker?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrix Inverse and Condition\n", + "\n", + "\n", + "Considering the same solution set:\n", + "\n", + "$y=Ax$\n", + "\n", + "If we know that $A^{-1}A=I$, then \n", + "\n", + "$A^{-1}y=A^{-1}Ax=x$\n", + "\n", + "so \n", + "\n", + "$x=A^{-1}y$\n", + "\n", + "Where, $A^{-1}$ is the inverse of matrix $A$.\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "$Ax=y$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "$A^{-1}=\\frac{1}{2*3-1*1}\\left[ \\begin{array}{cc}\n", + "3 & 1 \\\\\n", + "-1 & 2 \\end{array} \\right]=\n", + "\\left[ \\begin{array}{cc}\n", + "3/5 & -1/5 \\\\\n", + "-1/5 & 2/5 \\end{array} \\right]$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "invA =\n", + "\n", + " 0.60000 -0.20000\n", + " -0.20000 0.40000\n", + "\n", + "ans =\n", + "\n", + " 1.00000 0.00000\n", + " 0.00000 1.00000\n", + "\n", + "ans =\n", + "\n", + " 1.00000 0.00000\n", + " 0.00000 1.00000\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "invA=1/5*[3,-1;-1,2]\n", + "\n", + "A*invA\n", + "invA*A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How did we know the inverse of A? \n", + "\n", + "for 2$\\times$2 matrices, it is always:\n", + "\n", + "$A=\\left[ \\begin{array}{cc}\n", + "A_{11} & A_{12} \\\\\n", + "A_{21} & A_{22} \\end{array} \\right]$\n", + "\n", + "$A^{-1}=\\frac{1}{det(A)}\\left[ \\begin{array}{cc}\n", + "A_{22} & -A_{12} \\\\\n", + "-A_{21} & A_{11} \\end{array} \\right]$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$AA^{-1}=\\frac{1}{A_{11}A_{22}-A_{21}A_{12}}\\left[ \\begin{array}{cc}\n", + "A_{11}A_{22}-A_{21}A_{12} & -A_{11}A_{12}+A_{12}A_{11} \\\\\n", + "A_{21}A_{22}-A_{22}A_{21} & -A_{21}A_{12}+A_{22}A_{11} \\end{array} \\right]\n", + "=\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0 & 1 \\end{array} \\right]$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about bigger matrices?\n", + "\n", + "We can use the LU-decomposition\n", + "\n", + "$A=LU$\n", + "\n", + "$A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$\n", + "\n", + "if we divide $A^{-1}$ into n-column vectors, $a_{n}$, then\n", + "\n", + "$Aa_{1}=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$Aa_{2}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "1 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$Aa_{n}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "1 \\end{array} \\right]$\n", + "\n", + "\n", + "Which we can solve for each $a_{n}$ with LU-decomposition, knowing the lower and upper triangular decompositions, then \n", + "\n", + "$A^{-1}=\\left[ \\begin{array}{cccc}\n", + "| & | & & | \\\\\n", + "a_{1} & a_{2} & \\cdots & a_{3} \\\\\n", + "| & | & & | \\end{array} \\right]$\n", + "\n", + "\n", + "$Ld_{1}=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$;~Ua_{1}=d_{1}$\n", + "\n", + "$Ld_{2}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "1 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$;~Ua_{2}=d_{2}$\n", + "\n", + "$Ld_{n}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "1 \\\\ \n", + "\\vdots \\\\\n", + "n \\end{array} \\right]$\n", + "$;~Ua_{n}=d_{n}$\n", + "\n", + "Consider the following matrix:\n", + "\n", + "$A=\\left[ \\begin{array}{ccc}\n", + "2 & -1 & 0\\\\\n", + "-1 & 2 & -1\\\\\n", + "0 & -1 & 1 \\end{array} \\right]$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 -1 0\n", + " -1 2 -1\n", + " 0 -1 1\n", + "\n", + "U =\n", + "\n", + " 2.00000 -1.00000 0.00000\n", + " 0.00000 1.50000 -1.00000\n", + " 0.00000 -1.00000 1.00000\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " -0.50000 1.00000 0.00000\n", + " 0.00000 0.00000 1.00000\n", + "\n" + ] + } + ], + "source": [ + "A=[2,-1,0;-1,2,-1;0,-1,1]\n", + "U=A;\n", + "L=eye(3,3);\n", + "U(2,:)=U(2,:)-U(2,1)/U(1,1)*U(1,:)\n", + "L(2,1)=A(2,1)/A(1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " -0.50000 1.00000 0.00000\n", + " 0.00000 -0.66667 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 -1.00000 0.00000\n", + " 0.00000 1.50000 -1.00000\n", + " 0.00000 0.00000 0.33333\n", + "\n" + ] + } + ], + "source": [ + "L(3,2)=U(3,2)/U(2,2)\n", + "U(3,:)=U(3,:)-U(3,2)/U(2,2)*U(2,:)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now solve for $d_1$ then $a_1$, $d_2$ then $a_2$, and $d_3$ then $a_{3}$\n", + "\n", + "$Ld_{1}=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$;~Ua_{1}=d_{1}$" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1 =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + " 0.33333\n", + "\n" + ] + } + ], + "source": [ + "d1=zeros(3,1);\n", + "d1(1)=1;\n", + "d1(2)=0-L(2,1)*d1(1);\n", + "d1(3)=0-L(3,1)*d1(1)-L(3,2)*d1(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a1 =\n", + "\n", + " 1.00000\n", + " 1.00000\n", + " 1.00000\n", + "\n" + ] + } + ], + "source": [ + "a1=zeros(3,1);\n", + "a1(3)=d1(3)/U(3,3);\n", + "a1(2)=1/U(2,2)*(d1(2)-U(2,3)*a1(3));\n", + "a1(1)=1/U(1,1)*(d1(1)-U(1,2)*a1(2)-U(1,3)*a1(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d2 =\n", + "\n", + " 0.00000\n", + " 1.00000\n", + " 0.66667\n", + "\n" + ] + } + ], + "source": [ + "d2=zeros(3,1);\n", + "d2(1)=0;\n", + "d2(2)=1-L(2,1)*d2(1);\n", + "d2(3)=0-L(3,1)*d2(1)-L(3,2)*d2(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a2 =\n", + "\n", + " 1.0000\n", + " 2.0000\n", + " 2.0000\n", + "\n" + ] + } + ], + "source": [ + "a2=zeros(3,1);\n", + "a2(3)=d2(3)/U(3,3);\n", + "a2(2)=1/U(2,2)*(d2(2)-U(2,3)*a2(3));\n", + "a2(1)=1/U(1,1)*(d2(1)-U(1,2)*a2(2)-U(1,3)*a2(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d3 =\n", + "\n", + " 0\n", + " 0\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "d3=zeros(3,1);\n", + "d3(1)=0;\n", + "d3(2)=0-L(2,1)*d3(1);\n", + "d3(3)=1-L(3,1)*d3(1)-L(3,2)*d3(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a3 =\n", + "\n", + " 1.00000\n", + " 2.00000\n", + " 3.00000\n", + "\n" + ] + } + ], + "source": [ + "a3=zeros(3,1);\n", + "a3(3)=d3(3)/U(3,3);\n", + "a3(2)=1/U(2,2)*(d3(2)-U(2,3)*a3(3));\n", + "a3(1)=1/U(1,1)*(d3(1)-U(1,2)*a3(2)-U(1,3)*a3(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Final solution for $A^{-1}$ is $[a_{1}~a_{2}~a_{3}]$" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invA =\n", + "\n", + " 1.00000 1.00000 1.00000\n", + " 1.00000 2.00000 2.00000\n", + " 1.00000 2.00000 3.00000\n", + "\n", + "ans =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " 0.00000 1.00000 -0.00000\n", + " -0.00000 -0.00000 1.00000\n", + "\n" + ] + } + ], + "source": [ + "invA=[a1,a2,a3]\n", + "A*invA" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the solution of $x$ to $Ax=y$ is $x=A^{-1}y$" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 1\n", + " 2\n", + " 3\n", + "\n", + "x =\n", + "\n", + " 6.0000\n", + " 11.0000\n", + " 14.0000\n", + "\n", + "xbs =\n", + "\n", + " 6.0000\n", + " 11.0000\n", + " 14.0000\n", + "\n", + "ans =\n", + "\n", + " -3.5527e-15\n", + " -8.8818e-15\n", + " -1.0658e-14\n", + "\n", + "ans = 2.2204e-16\n" + ] + } + ], + "source": [ + "y=[1;2;3]\n", + "x=invA*y\n", + "xbs=A\\y\n", + "x-xbs\n", + "eps" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tinversion\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tinversion\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbackslash\n", + "\n", + "\t\n", + "\t\tbackslash\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmultiplication\n", + "\n", + "\t\n", + "\t\tmultiplication\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=100;\n", + "n=[1:N];\n", + "t_inv=zeros(N,1);\n", + "t_bs=zeros(N,1);\n", + "t_mult=zeros(N,1);\n", + "for i=1:N\n", + " A=rand(i,i);\n", + " tic\n", + " invA=inv(A);\n", + " t_inv(i)=toc;\n", + " b=rand(i,1);\n", + " tic;\n", + " x=A\\b;\n", + " t_bs(i)=toc;\n", + " tic;\n", + " x=invA*b;\n", + " t_mult(i)=toc;\n", + "end\n", + "plot(n,t_inv,n,t_bs,n,t_mult)\n", + "axis([0 100 0 0.002])\n", + "legend('inversion','backslash','multiplication','Location','NorthWest')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Condition of a matrix \n", + "### *just checked in to see what condition my condition was in*\n", + "### Matrix norms\n", + "\n", + "The Euclidean norm of a vector is measure of the magnitude (in 3D this would be: $|x|=\\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}$) in general the equation is:\n", + "\n", + "$||x||_{e}=\\sqrt{\\sum_{i=1}^{n}x_{i}^{2}}$\n", + "\n", + "For a matrix, A, the same norm is called the Frobenius norm:\n", + "\n", + "$||A||_{f}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{2}}$\n", + "\n", + "In general we can calculate any $p$-norm where\n", + "\n", + "$||A||_{p}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{p}}$\n", + "\n", + "so the p=1, 1-norm is \n", + "\n", + "$||A||_{1}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{1}}=\\sum_{i=1}^{n}\\sum_{i=1}^{m}|A_{i,j}|$\n", + "\n", + "$||A||_{\\infty}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{\\infty}}=\\max_{1\\le i \\le n}\\sum_{j=1}^{m}|A_{i,j}|$\n", + "\n", + "### Condition of Matrix\n", + "\n", + "The matrix condition is the product of \n", + "\n", + "$Cond(A) = ||A||\\cdot||A^{-1}||$ \n", + "\n", + "So each norm will have a different condition number, but the limit is $Cond(A)\\ge 1$\n", + "\n", + "An estimate of the rounding error is based on the condition of A:\n", + "\n", + "$\\frac{||\\Delta x||}{x} \\le Cond(A) \\frac{||\\Delta A||}{||A||}$\n", + "\n", + "So if the coefficients of A have accuracy to $10^{-t}\n", + "\n", + "and the condition of A, $Cond(A)=10^{c}$\n", + "\n", + "then the solution for x can have rounding errors up to $10^{c-t}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 1.00000 0.50000 0.33333\n", + " 0.50000 0.33333 0.25000\n", + " 0.33333 0.25000 0.20000\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " 0.50000 1.00000 0.00000\n", + " 0.33333 1.00000 1.00000\n", + "\n", + "U =\n", + "\n", + " 1.00000 0.50000 0.33333\n", + " 0.00000 0.08333 0.08333\n", + " 0.00000 -0.00000 0.00556\n", + "\n" + ] + } + ], + "source": [ + "A=[1,1/2,1/3;1/2,1/3,1/4;1/3,1/4,1/5]\n", + "[L,U]=LU_naive(A)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "invA=" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000\n", + " 0.50000 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 1.00000\n", + " 0.00000 2.50000\n", + "\n", + "ans =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "d =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + "\n", + "y =\n", + "\n", + " 1\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "L=[1,0;0.5,1]\n", + "U=[2,1;0,2.5]\n", + "L*U\n", + "\n", + "d=[1;0.5]\n", + "y=L*d" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 5.0000\n", + "ans = 1\n", + "ans = 5\n", + "ans = 5\n", + "ans = 5.0000\n" + ] + } + ], + "source": [ + "% what is the determinant of L, U and A?\n", + "\n", + "det(A)\n", + "det(L)\n", + "det(U)\n", + "det(L)*det(U)\n", + "det(L*U)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pivoting for LU factorization\n", + "\n", + "LU factorization uses the same method as Gauss elimination so it is also necessary to perform partial pivoting when creating the lower and upper triangular matrices. \n", + "\n", + "Matlab and Octave use pivoting in the command \n", + "\n", + "`[L,U,P]=lu(A)`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'lu' is a built-in function from the file libinterp/corefcn/lu.cc\n", + "\n", + " -- Built-in Function: [L, U] = lu (A)\n", + " -- Built-in Function: [L, U, P] = lu (A)\n", + " -- Built-in Function: [L, U, P, Q] = lu (S)\n", + " -- Built-in Function: [L, U, P, Q, R] = lu (S)\n", + " -- Built-in Function: [...] = lu (S, THRES)\n", + " -- Built-in Function: Y = lu (...)\n", + " -- Built-in Function: [...] = lu (..., \"vector\")\n", + " Compute the LU decomposition of A.\n", + "\n", + " If A is full subroutines from LAPACK are used and if A is sparse\n", + " then UMFPACK is used.\n", + "\n", + " The result is returned in a permuted form, according to the\n", + " optional return value P. For example, given the matrix 'a = [1, 2;\n", + " 3, 4]',\n", + "\n", + " [l, u, p] = lu (A)\n", + "\n", + " returns\n", + "\n", + " l =\n", + "\n", + " 1.00000 0.00000\n", + " 0.33333 1.00000\n", + "\n", + " u =\n", + "\n", + " 3.00000 4.00000\n", + " 0.00000 0.66667\n", + "\n", + " p =\n", + "\n", + " 0 1\n", + " 1 0\n", + "\n", + " The matrix is not required to be square.\n", + "\n", + " When called with two or three output arguments and a spare input\n", + " matrix, 'lu' does not attempt to perform sparsity preserving column\n", + " permutations. Called with a fourth output argument, the sparsity\n", + " preserving column transformation Q is returned, such that 'P * A *\n", + " Q = L * U'.\n", + "\n", + " Called with a fifth output argument and a sparse input matrix, 'lu'\n", + " attempts to use a scaling factor R on the input matrix such that 'P\n", + " * (R \\ A) * Q = L * U'. This typically leads to a sparser and more\n", + " stable factorization.\n", + "\n", + " An additional input argument THRES, that defines the pivoting\n", + " threshold can be given. THRES can be a scalar, in which case it\n", + " defines the UMFPACK pivoting tolerance for both symmetric and\n", + " unsymmetric cases. If THRES is a 2-element vector, then the first\n", + " element defines the pivoting tolerance for the unsymmetric UMFPACK\n", + " pivoting strategy and the second for the symmetric strategy. By\n", + " default, the values defined by 'spparms' are used ([0.1, 0.001]).\n", + "\n", + " Given the string argument \"vector\", 'lu' returns the values of P\n", + " and Q as vector values, such that for full matrix, 'A (P,:) = L *\n", + " U', and 'R(P,:) * A (:, Q) = L * U'.\n", + "\n", + " With two output arguments, returns the permuted forms of the upper\n", + " and lower triangular matrices, such that 'A = L * U'. With one\n", + " output argument Y, then the matrix returned by the LAPACK routines\n", + " is returned. If the input matrix is sparse then the matrix L is\n", + " embedded into U to give a return value similar to the full case.\n", + " For both full and sparse matrices, 'lu' loses the permutation\n", + " information.\n", + "\n", + " See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help lu" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=inv(L)*y; x=inv(U)*d; t_lu(N)=toc;\n", + "\n", + " tic; x=inv(A)*y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use,\n", + "\n", + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n" + ] + } + ], + "source": [ + "K" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "(U'*U)'==U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06\n", + "average time spent for backslash solution = 1.555967e-05+/-1.048561e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_12/LU_naive.m b/lecture_12/LU_naive.m new file mode 100644 index 0000000..92efde6 --- /dev/null +++ b/lecture_12/LU_naive.m @@ -0,0 +1,27 @@ +function [L, U] = LU_naive(A) +% GaussNaive: naive Gauss elimination +% x = GaussNaive(A,b): Gauss elimination without pivoting. +% input: +% A = coefficient matrix +% y = right hand side vector +% output: +% x = solution vector +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +nb = n; +L=diag(ones(n,1)); +U=A; +% forward elimination +for k = 1:n-1 + for i = k+1:n + fik = U(i,k)/U(k,k); + L(i,k)=fik; + U(i,k:nb) = U(i,k:nb)-fik*U(k,k:nb); + end +end +%% back substitution +%x = zeros(n,1); +%x(n) = Aug(n,nb)/Aug(n,n); +%for i = n-1:-1:1 +% x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +%end diff --git a/lecture_12/chol_pre.png b/lecture_12/chol_pre.png new file mode 100644 index 0000000..67d2493 Binary files /dev/null and b/lecture_12/chol_pre.png differ diff --git a/lecture_12/det_L.png b/lecture_12/det_L.png new file mode 100644 index 0000000..aaac5a2 Binary files /dev/null and b/lecture_12/det_L.png differ diff --git a/lecture_12/lecture_12.aux b/lecture_12/lecture_12.aux new file mode 100644 index 0000000..4aa3a49 --- /dev/null +++ b/lecture_12/lecture_12.aux @@ -0,0 +1,38 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.1}My question from last class}{2}{subsection.0.1}} +\newlabel{my-question-from-last-class}{{0.1}{2}{My question from last class}{subsection.0.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces q1\relax }}{2}{figure.caption.1}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces q2\relax }}{3}{figure.caption.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.2}Your questions from last class}{3}{subsection.0.2}} +\newlabel{your-questions-from-last-class}{{0.2}{3}{Your questions from last class}{subsection.0.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1}Matrix Inverse and Condition}{3}{section.1}} +\newlabel{matrix-inverse-and-condition}{{1}{3}{Matrix Inverse and Condition}{section.1}{}} +\newlabel{note-on-solving-for-a-1-column-1}{{1}{5}{\texorpdfstring {Note on solving for \(A^{-1}\) column 1}{Note on solving for A\^{}\{-1\} column 1}}{section*.3}{}} +\@writefile{toc}{\contentsline {paragraph}{Note on solving for \(A^{-1}\) column 1}{5}{section*.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Condition of a matrix}{10}{subsection.1.1}} +\newlabel{condition-of-a-matrix}{{1.1}{10}{Condition of a matrix}{subsection.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}\emph {just checked in to see what condition my condition was in}}{10}{subsubsection.1.1.1}} +\newlabel{just-checked-in-to-see-what-condition-my-condition-was-in}{{1.1.1}{10}{\texorpdfstring {\emph {just checked in to see what condition my condition was in}}{just checked in to see what condition my condition was in}}{subsubsection.1.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Matrix norms}{10}{subsubsection.1.1.2}} +\newlabel{matrix-norms}{{1.1.2}{10}{Matrix norms}{subsubsection.1.1.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.3}Condition of Matrix}{11}{subsubsection.1.1.3}} +\newlabel{condition-of-matrix}{{1.1.3}{11}{Condition of Matrix}{subsubsection.1.1.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Springs-masses\relax }}{13}{figure.caption.4}} diff --git a/lecture_12/lecture_12.bbl b/lecture_12/lecture_12.bbl new file mode 100644 index 0000000..e69de29 diff --git a/lecture_12/lecture_12.blg b/lecture_12/lecture_12.blg new file mode 100644 index 0000000..beafcd1 --- /dev/null +++ b/lecture_12/lecture_12.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2015/Debian) +Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 +The top-level auxiliary file: lecture_12.aux +I found no \citation commands---while reading file lecture_12.aux +I found no \bibdata command---while reading file lecture_12.aux +I found no \bibstyle command---while reading file lecture_12.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 494 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/lecture_12/lecture_12.ipynb b/lecture_12/lecture_12.ipynb new file mode 100644 index 0000000..2937e47 --- /dev/null +++ b/lecture_12/lecture_12.ipynb @@ -0,0 +1,1248 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 0.447394 0.357071 0.720915 0.499926\n", + " 0.648313 0.323276 0.521677 0.288345\n", + " 0.084982 0.581513 0.466420 0.142342\n", + " 0.576580 0.658089 0.916987 0.923165\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000 0.00000 0.00000\n", + " 0.13108 1.00000 0.00000 0.00000\n", + " 0.69009 0.24851 1.00000 0.00000\n", + " 0.88935 0.68736 0.68488 1.00000\n", + "\n", + "U =\n", + "\n", + " 0.64831 0.32328 0.52168 0.28834\n", + " 0.00000 0.53914 0.39804 0.10455\n", + " 0.00000 0.00000 0.26199 0.27496\n", + " 0.00000 0.00000 0.00000 0.40655\n", + "\n", + "P =\n", + "\n", + "Permutation Matrix\n", + "\n", + " 0 1 0 0\n", + " 0 0 1 0\n", + " 1 0 0 0\n", + " 0 0 0 1\n", + "\n", + "ans = 1\n" + ] + } + ], + "source": [ + "A=rand(4,4)\n", + "\n", + "[L,U,P]=lu(A)\n", + "\n", + "det(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 4 4\n", + "\n", + "ans = 23.586\n", + "ans = 35.826\n", + "ans = 14.869\n", + "C =\n", + "\n", + " 5.98549 4.28555 4.35707 4.31359\n", + " 0.00000 3.63950 1.35005 1.45342\n", + " 0.00000 0.00000 3.62851 1.50580\n", + " 0.00000 0.00000 0.00000 3.21911\n", + "\n" + ] + } + ], + "source": [ + "A=rand(4,100)';\n", + "A=A'*A;\n", + "size(A)\n", + "min(min(A))\n", + "max(max(A))\n", + "cond(A)\n", + "C=chol(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## My question from last class \n", + "\n", + "![q1](det_L.png)\n", + "\n", + "![q2](chol_pre.png)\n", + "\n", + "\n", + "## Your questions from last class\n", + "\n", + "1. Will the exam be more theoretical or problem based?\n", + "\n", + "2. Writing code is difficult \n", + "\n", + "3. What format can we expect for the midterm? \n", + "\n", + "2. Could we go over some example questions for the exam?\n", + "\n", + "3. Will the use of GitHub be tested on the Midterm exam? Or is it more focused on linear algebra techniques/what was covered in the lectures?\n", + "\n", + "4. This is not my strong suit, getting a bit overwhelmed with matrix multiplication.\n", + "\n", + "5. I forgot how much I learned in linear algebra.\n", + "\n", + "6. What's the most exciting project you've ever worked on with Matlab/Octave?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrix Inverse and Condition\n", + "\n", + "\n", + "Considering the same solution set:\n", + "\n", + "$y=Ax$\n", + "\n", + "If we know that $A^{-1}A=I$, then \n", + "\n", + "$A^{-1}y=A^{-1}Ax=x$\n", + "\n", + "so \n", + "\n", + "$x=A^{-1}y$\n", + "\n", + "Where, $A^{-1}$ is the inverse of matrix $A$.\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "$Ax=y$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "$A^{-1}=\\frac{1}{2*3-1*1}\\left[ \\begin{array}{cc}\n", + "3 & -1 \\\\\n", + "-1 & 2 \\end{array} \\right]=\n", + "\\left[ \\begin{array}{cc}\n", + "3/5 & -1/5 \\\\\n", + "-1/5 & 2/5 \\end{array} \\right]$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "invA =\n", + "\n", + " 0.60000 -0.20000\n", + " -0.20000 0.40000\n", + "\n", + "ans =\n", + "\n", + " 1.00000 0.00000\n", + " 0.00000 1.00000\n", + "\n", + "ans =\n", + "\n", + " 1.00000 0.00000\n", + " 0.00000 1.00000\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "invA=1/5*[3,-1;-1,2]\n", + "\n", + "A*invA\n", + "invA*A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How did we know the inverse of A? \n", + "\n", + "for 2$\\times$2 matrices, it is always:\n", + "\n", + "$A=\\left[ \\begin{array}{cc}\n", + "A_{11} & A_{12} \\\\\n", + "A_{21} & A_{22} \\end{array} \\right]$\n", + "\n", + "$A^{-1}=\\frac{1}{det(A)}\\left[ \\begin{array}{cc}\n", + "A_{22} & -A_{12} \\\\\n", + "-A_{21} & A_{11} \\end{array} \\right]$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$AA^{-1}=\\frac{1}{A_{11}A_{22}-A_{21}A_{12}}\\left[ \\begin{array}{cc}\n", + "A_{11}A_{22}-A_{21}A_{12} & -A_{11}A_{12}+A_{12}A_{11} \\\\\n", + "A_{21}A_{22}-A_{22}A_{21} & -A_{21}A_{12}+A_{22}A_{11} \\end{array} \\right]\n", + "=\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0 & 1 \\end{array} \\right]$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about bigger matrices?\n", + "\n", + "We can use the LU-decomposition\n", + "\n", + "$A=LU$\n", + "\n", + "$A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$\n", + "\n", + "if we divide $A^{-1}$ into n-column vectors, $a_{n}$, then\n", + "\n", + "$Aa_{1}=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$Aa_{2}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "1 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$Aa_{n}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "1 \\end{array} \\right]$\n", + "\n", + "\n", + "Which we can solve for each $a_{n}$ with LU-decomposition, knowing the lower and upper triangular decompositions, then \n", + "\n", + "$A^{-1}=\\left[ \\begin{array}{cccc}\n", + "| & | & & | \\\\\n", + "a_{1} & a_{2} & \\cdots & a_{n} \\\\\n", + "| & | & & | \\end{array} \\right]$\n", + "\n", + "\n", + "$Ld_{1}=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$;~Ua_{1}=d_{1}$\n", + "\n", + "$Ld_{2}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "1 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]$\n", + "$;~Ua_{2}=d_{2}$\n", + "\n", + "$Ld_{n}=\\left[\\begin{array}{c} \n", + "0 \\\\ \n", + "1 \\\\ \n", + "\\vdots \\\\\n", + "n \\end{array} \\right]$\n", + "$;~Ua_{n}=d_{n}$\n", + "\n", + "Consider the following matrix:\n", + "\n", + "$A=\\left[ \\begin{array}{ccc}\n", + "2 & -1 & 0\\\\\n", + "-1 & 2 & -1\\\\\n", + "0 & -1 & 1 \\end{array} \\right]$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Note on solving for $A^{-1}$ column 1\n", + "\n", + "$Aa_1=I(:,1)$\n", + "\n", + "$LUa_1=I(:,1)$\n", + "\n", + "$(LUa_1-I(:,1))=0$\n", + "\n", + "$L(Ua_1-d_1)=0$\n", + "\n", + "$I(:,1)=Ld_1$" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 -1 0\n", + " -1 2 -1\n", + " 0 -1 1\n", + "\n", + "U =\n", + "\n", + " 2.00000 -1.00000 0.00000\n", + " 0.00000 1.50000 -1.00000\n", + " 0.00000 -1.00000 1.00000\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " -0.50000 1.00000 0.00000\n", + " 0.00000 0.00000 1.00000\n", + "\n" + ] + } + ], + "source": [ + "A=[2,-1,0;-1,2,-1;0,-1,1]\n", + "U=A;\n", + "L=eye(3,3);\n", + "U(2,:)=U(2,:)-U(2,1)/U(1,1)*U(1,:)\n", + "L(2,1)=A(2,1)/A(1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " -0.50000 1.00000 0.00000\n", + " 0.00000 -0.66667 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 -1.00000 0.00000\n", + " 0.00000 1.50000 -1.00000\n", + " 0.00000 0.00000 0.33333\n", + "\n" + ] + } + ], + "source": [ + "L(3,2)=U(3,2)/U(2,2)\n", + "U(3,:)=U(3,:)-U(3,2)/U(2,2)*U(2,:)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now solve for $d_1$ then $a_1$, $d_2$ then $a_2$, and $d_3$ then $a_{3}$\n", + "\n", + "$Ld_{1}=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "\\vdots \\\\\n", + "0 \\end{array} \\right]=\n", + "\\left[\\begin{array}{ccc} \n", + "1 & 0 & 0 \\\\ \n", + "-1/2 & 1 & 0 \\\\\n", + "0 & -2/3 & 1 \\end{array} \\right]\\left[\\begin{array}{c} \n", + "d1(1) \\\\ \n", + "d1(2) \\\\ \n", + "d1(3)\\end{array} \\right]=\\left[\\begin{array}{c} \n", + "1 \\\\ \n", + "0 \\\\ \n", + "0 \\end{array} \\right]\n", + ";~Ua_{1}=d_{1}$" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1 =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + " 0.33333\n", + "\n" + ] + } + ], + "source": [ + "d1=zeros(3,1);\n", + "d1(1)=1;\n", + "d1(2)=0-L(2,1)*d1(1);\n", + "d1(3)=0-L(3,1)*d1(1)-L(3,2)*d1(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a1 =\n", + "\n", + " 1.00000\n", + " 1.00000\n", + " 1.00000\n", + "\n" + ] + } + ], + "source": [ + "a1=zeros(3,1);\n", + "a1(3)=d1(3)/U(3,3);\n", + "a1(2)=1/U(2,2)*(d1(2)-U(2,3)*a1(3));\n", + "a1(1)=1/U(1,1)*(d1(1)-U(1,2)*a1(2)-U(1,3)*a1(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d2 =\n", + "\n", + " 0.00000\n", + " 1.00000\n", + " 0.66667\n", + "\n" + ] + } + ], + "source": [ + "d2=zeros(3,1);\n", + "d2(1)=0;\n", + "d2(2)=1-L(2,1)*d2(1);\n", + "d2(3)=0-L(3,1)*d2(1)-L(3,2)*d2(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a2 =\n", + "\n", + " 1.0000\n", + " 2.0000\n", + " 2.0000\n", + "\n" + ] + } + ], + "source": [ + "a2=zeros(3,1);\n", + "a2(3)=d2(3)/U(3,3);\n", + "a2(2)=1/U(2,2)*(d2(2)-U(2,3)*a2(3));\n", + "a2(1)=1/U(1,1)*(d2(1)-U(1,2)*a2(2)-U(1,3)*a2(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d3 =\n", + "\n", + " 0\n", + " 0\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "d3=zeros(3,1);\n", + "d3(1)=0;\n", + "d3(2)=0-L(2,1)*d3(1);\n", + "d3(3)=1-L(3,1)*d3(1)-L(3,2)*d3(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a3 =\n", + "\n", + " 1.00000\n", + " 2.00000\n", + " 3.00000\n", + "\n" + ] + } + ], + "source": [ + "a3=zeros(3,1);\n", + "a3(3)=d3(3)/U(3,3);\n", + "a3(2)=1/U(2,2)*(d3(2)-U(2,3)*a3(3));\n", + "a3(1)=1/U(1,1)*(d3(1)-U(1,2)*a3(2)-U(1,3)*a3(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Final solution for $A^{-1}$ is $[a_{1}~a_{2}~a_{3}]$" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invA =\n", + "\n", + " 1.00000 1.00000 1.00000\n", + " 1.00000 2.00000 2.00000\n", + " 1.00000 2.00000 3.00000\n", + "\n", + "I_app =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " 0.00000 1.00000 -0.00000\n", + " -0.00000 -0.00000 1.00000\n", + "\n", + "ans = -4.4409e-16\n", + "ans = 2.2204e-16\n", + "ans = 0.0039062\n" + ] + } + ], + "source": [ + "invA=[a1,a2,a3]\n", + "I_app=A*invA\n", + "I_app(2,3)\n", + "eps\n", + "\n", + "2^-8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the solution of $x$ to $Ax=y$ is $x=A^{-1}y$" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 1\n", + " 2\n", + " 3\n", + "\n", + "x =\n", + "\n", + " 6.0000\n", + " 11.0000\n", + " 14.0000\n", + "\n", + "xbs =\n", + "\n", + " 6.0000\n", + " 11.0000\n", + " 14.0000\n", + "\n", + "ans =\n", + "\n", + " -3.5527e-15\n", + " -8.8818e-15\n", + " -1.0658e-14\n", + "\n", + "ans = 2.2204e-16\n" + ] + } + ], + "source": [ + "y=[1;2;3]\n", + "x=invA*y\n", + "xbs=A\\y\n", + "x-xbs\n", + "eps" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tinversion\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tinversion\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbackslash\n", + "\n", + "\t\n", + "\t\tbackslash\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmultiplication\n", + "\n", + "\t\n", + "\t\tmultiplication\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=100;\n", + "n=[1:N];\n", + "t_inv=zeros(N,1);\n", + "t_bs=zeros(N,1);\n", + "t_mult=zeros(N,1);\n", + "for i=1:N\n", + " A=rand(i,i);\n", + " tic\n", + " invA=inv(A);\n", + " t_inv(i)=toc;\n", + " b=rand(i,1);\n", + " tic;\n", + " x=A\\b;\n", + " t_bs(i)=toc;\n", + " tic;\n", + " x=invA*b;\n", + " t_mult(i)=toc;\n", + "end\n", + "plot(n,t_inv,n,t_bs,n,t_mult)\n", + "axis([0 100 0 0.002])\n", + "legend('inversion','backslash','multiplication','Location','NorthWest')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Condition of a matrix \n", + "### *just checked in to see what condition my condition was in*\n", + "### Matrix norms\n", + "\n", + "The Euclidean norm of a vector is measure of the magnitude (in 3D this would be: $|x|=\\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}$) in general the equation is:\n", + "\n", + "$||x||_{e}=\\sqrt{\\sum_{i=1}^{n}x_{i}^{2}}$\n", + "\n", + "For a matrix, A, the same norm is called the Frobenius norm:\n", + "\n", + "$||A||_{f}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{2}}$\n", + "\n", + "In general we can calculate any $p$-norm where\n", + "\n", + "$||A||_{p}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{p}}$\n", + "\n", + "so the p=1, 1-norm is \n", + "\n", + "$||A||_{1}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{1}}=\\sum_{i=1}^{n}\\sum_{i=1}^{m}|A_{i,j}|$\n", + "\n", + "$||A||_{\\infty}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{\\infty}}=\\max_{1\\le i \\le n}\\sum_{j=1}^{m}|A_{i,j}|$\n", + "\n", + "### Condition of Matrix\n", + "\n", + "The matrix condition is the product of \n", + "\n", + "$Cond(A) = ||A||\\cdot||A^{-1}||$ \n", + "\n", + "So each norm will have a different condition number, but the limit is $Cond(A)\\ge 1$\n", + "\n", + "An estimate of the rounding error is based on the condition of A:\n", + "\n", + "$\\frac{||\\Delta x||}{x} \\le Cond(A) \\frac{||\\Delta A||}{||A||}$\n", + "\n", + "So if the coefficients of A have accuracy to $10^{-t}\n", + "\n", + "and the condition of A, $Cond(A)=10^{c}$\n", + "\n", + "then the solution for x can have rounding errors up to $10^{c-t}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 1.00000 0.50000 0.33333\n", + " 0.50000 0.33333 0.25000\n", + " 0.33333 0.25000 0.20000\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " 0.50000 1.00000 0.00000\n", + " 0.33333 1.00000 1.00000\n", + "\n", + "U =\n", + "\n", + " 1.00000 0.50000 0.33333\n", + " 0.00000 0.08333 0.08333\n", + " 0.00000 -0.00000 0.00556\n", + "\n" + ] + } + ], + "source": [ + "A=[1,1/2,1/3;1/2,1/3,1/4;1/3,1/4,1/5]\n", + "[L,U]=LU_naive(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Then, $A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$\n", + "\n", + "$Ld_{1}=\\left[\\begin{array}{c}\n", + "1 \\\\\n", + "0 \\\\\n", + "0 \\end{array}\\right]$, $Ux_{1}=d_{1}$ ..." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invA =\n", + "\n", + " 9.0000 -36.0000 30.0000\n", + " -36.0000 192.0000 -180.0000\n", + " 30.0000 -180.0000 180.0000\n", + "\n", + "ans =\n", + "\n", + " 1.0000e+00 3.5527e-15 2.9976e-15\n", + " -1.3249e-14 1.0000e+00 -9.1038e-15\n", + " 8.5117e-15 7.1054e-15 1.0000e+00\n", + "\n" + ] + } + ], + "source": [ + "invA=zeros(3,3);\n", + "d1=L\\[1;0;0];\n", + "d2=L\\[0;1;0];\n", + "d3=L\\[0;0;1];\n", + "invA(:,1)=U\\d1;\n", + "invA(:,2)=U\\d2;\n", + "invA(:,3)=U\\d3\n", + "invA*A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the condition of A, $cond(A)$" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "normf_A = 1.4136\n", + "normf_invA = 372.21\n", + "cond_f_A = 526.16\n", + "ans = 1.4136\n", + "norm1_A = 1.8333\n", + "norm1_invA = 30.000\n", + "ans = 1.8333\n", + "cond_1_A = 55.000\n", + "norminf_A = 1.8333\n", + "norminf_invA = 30.000\n", + "ans = 1.8333\n", + "cond_inf_A = 55.000\n" + ] + } + ], + "source": [ + "% Frobenius norm\n", + "normf_A = sqrt(sum(sum(A.^2)))\n", + "normf_invA = sqrt(sum(sum(invA.^2)))\n", + "\n", + "cond_f_A = normf_A*normf_invA\n", + "\n", + "norm(A,'fro')\n", + "\n", + "% p=1, column sum norm\n", + "norm1_A = max(sum(A,2))\n", + "norm1_invA = max(sum(invA,2))\n", + "norm(A,1)\n", + "\n", + "cond_1_A=norm1_A*norm1_invA\n", + "\n", + "% p=inf, row sum norm\n", + "norminf_A = max(sum(A,1))\n", + "norminf_invA = max(sum(invA,1))\n", + "norm(A,inf)\n", + "\n", + "cond_inf_A=norminf_A*norminf_invA\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with spring constants $K_{i}$. What does a high condition number mean for this problem? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.png)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$\n", + "\n", + "$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k_{4}(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "k_{1}+k_{2} & -k_{2} & 0 & 0 \\\\\n", + "-k_{2} & k_{2}+k_{3} & -k_{3} & 0 \\\\\n", + "0 & -k_{3} & k_{3}+k_{4} & -k_{4} \\\\\n", + "0 & 0 & -k_{4} & k_{4} \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 100010 -100000 0 0\n", + " -100000 100010 -10 0\n", + " 0 -10 11 -1\n", + " 0 0 -1 1\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k1=10; % N/m\n", + "k2=100000;\n", + "k3=10;\n", + "k4=1;\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[k1+k2 -k2 0 0; -k2 k2+k3 -k3 0; 0 -k3 k3+k4 -k4; 0 0 -k4 k4]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 3.2004e+05\n", + "ans = 3.2004e+05\n", + "ans = 2.5925e+05\n", + "ans = 2.5293e+05\n" + ] + } + ], + "source": [ + "cond(K,inf)\n", + "cond(K,1)\n", + "cond(K,'fro')\n", + "cond(K,2)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e =\n", + "\n", + " 7.9078e-01\n", + " 3.5881e+00\n", + " 1.7621e+01\n", + " 2.0001e+05\n", + "\n", + "ans = 2.5293e+05\n" + ] + } + ], + "source": [ + "e=eig(K)\n", + "max(e)/min(e)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_12/lecture_12.log b/lecture_12/lecture_12.log new file mode 100644 index 0000000..c4a5ed3 --- /dev/null +++ b/lecture_12/lecture_12.log @@ -0,0 +1,841 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2017.1.11) 28 FEB 2017 14:24 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**lecture_12.tex +(./lecture_12.tex +LaTeX2e <2016/02/01> +Babel <3.9q> and hyphenation patterns for 81 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def +File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 48. +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2016/01/03 v1.0q Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg +File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 95. + +(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) +) +\Gread@gobject=\count87 +)) +\Gin@req@height=\dimen103 +\Gin@req@width=\dimen104 +) +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2016/02/21 v3.3-144 Customizing captions (AR) + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2016/02/04 v1.7-139 caption3 kernel (AR) +Package caption3 Info: TeX engine: e-TeX on input line 67. +\captionmargin=\dimen105 +\captionmargin@=\dimen106 +\captionwidth=\dimen107 +\caption@tempdima=\dimen108 +\caption@indent=\dimen109 +\caption@parindent=\dimen110 +\caption@hangindent=\dimen111 +) +\c@ContinuedFloat=\count88 +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2012/05/21 v1.0 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks15 +\XKV@tempa@toks=\toks16 +) +\XKV@depth=\count89 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2012/05/16 v1.0 Trim and clip general TeX material + +(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box26 +) +\tc@llx=\dimen112 +\tc@lly=\dimen113 +\tc@urx=\dimen114 +\tc@ury=\dimen115 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2012/05/13 v1.0 Clipping driver for pdftex +)) +\adjbox@Width=\dimen116 +\adjbox@Height=\dimen117 +\adjbox@Depth=\dimen118 +\adjbox@Totalheight=\dimen119 + +(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2011/09/13 v1.0 Conditionals for odd/even page detection +\c@checkoddpage=\count90 +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box27 +\sift@deathcycles=\count91 +\@vwid@loff=\dimen120 +\@vwid@roff=\dimen121 +)) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1341. +Package xcolor Info: Model `RGB' extended on input line 1353. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks17 +) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2010/09/12 v5.6 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) +Package ifpdf Info: pdfTeX in PDF mode is detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty +Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) +Package ifvtex Info: VTeX not detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty +Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional +) +\Gm@cnth=\count92 +\Gm@cntv=\count93 +\c@Gm@tempcnt=\count94 +\Gm@bindingoffset=\dimen122 +\Gm@wd@mp=\dimen123 +\Gm@odd@mp=\dimen124 +\Gm@even@mp=\dimen125 +\Gm@layoutwidth=\dimen126 +\Gm@layoutheight=\dimen127 +\Gm@layouthoffset=\dimen128 +\Gm@layoutvoffset=\dimen129 +\Gm@dimlist=\toks18 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2016/03/03 v2.15a AMS math features +\@mathmargin=\skip43 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen130 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen131 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count95 +LaTeX Info: Redefining \frac on input line 199. +\uproot@=\count96 +\leftroot@=\count97 +LaTeX Info: Redefining \overline on input line 297. +\classnum@=\count98 +\DOTSCASE@=\count99 +LaTeX Info: Redefining \ldots on input line 394. +LaTeX Info: Redefining \dots on input line 397. +LaTeX Info: Redefining \cdots on input line 518. +\Mathstrutbox@=\box28 +\strutbox@=\box29 +\big@size=\dimen132 +LaTeX Font Info: Redeclaring font encoding OML on input line 630. +LaTeX Font Info: Redeclaring font encoding OMS on input line 631. +\macc@depth=\count100 +\c@MaxMatrixCols=\count101 +\dotsspace@=\muskip10 +\c@parentequation=\count102 +\dspbrk@lvl=\count103 +\tag@help=\toks20 +\row@=\count104 +\column@=\count105 +\maxfields@=\count106 +\andhelp@=\toks21 +\eqnshift@=\dimen133 +\alignsep@=\dimen134 +\tagshift@=\dimen135 +\tagwidth@=\dimen136 +\totwidth@=\dimen137 +\lineht@=\dimen138 +\@envbody=\toks22 +\multlinegap=\skip44 +\multlinetaggap=\skip45 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2735. +LaTeX Info: Redefining \] on input line 2736. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2005/09/27 v1.99g Standard LaTeX package +Package textcomp Info: Sub-encoding information: +(textcomp) 5 = only ISO-Adobe without \textcurrency +(textcomp) 4 = 5 + \texteuro +(textcomp) 3 = 4 + \textohm +(textcomp) 2 = 3 + \textestimated + \textcurrency +(textcomp) 1 = TS1 - \textcircled - \t +(textcomp) 0 = TS1 (full) +(textcomp) Font families with sub-encoding setting implement +(textcomp) only a restricted character set as indicated. +(textcomp) Family '?' is the default used for unknown fonts. +(textcomp) See the documentation for details. +Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 79. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +) +LaTeX Info: Redefining \oldstylenums on input line 334. +Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 349. +Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 350. +Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 351. +Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 352. +Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 353. +Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 354. +Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 355. +Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 356. +Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 357. +Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 358. +Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 359. +Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 360. +Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 361. +Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 362. +Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 363. +Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 364. +Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 365. +Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 366. +Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 367. +Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 368. +Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 369. +Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 370. +Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 371. +Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 372. + +Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 373. +Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 374. +Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 375. +Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 376. +Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 377. +Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 378. +Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 379. +Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 380. +Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 381. +Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 382. +Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 383. +Package textcomp Info: Setting lmtt sub-encoding to TS1/0 on input line 384. +Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 385. +Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 386. +Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 387. +Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 388. +Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 389. +Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 390. +Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 391. +Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 392. +Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 393. +Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 394. +Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 395. +Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 396. +Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 397. +Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 398. +Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 399. +Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 400. +Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 401. +Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 402. +Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 403. +Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 404. +Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 405. +Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 406. +Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 407. +Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 408. +Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 409. +) +(/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texlive/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box30 +) +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count107 +\uc@combtoks=\toks24 +\uc@combtoksb=\toks25 +\uc@temptokena=\toks26 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2015/03/17 v1.2c Input encoding file +\inpenc@prehook=\toks27 +\inpenc@posthook=\toks28 + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/utf8x.def +File: utf8x.def 2004/10/17 UCS: Input encoding UTF-8 +)) +(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2008/02/07 + +Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix +<2008/02/07> (tvz) +\FV@CodeLineNo=\count108 +\FV@InFile=\read1 +\FV@TabBox=\box31 +\c@FancyVerbLine=\count109 +\FV@StepNumber=\count110 +\FV@OutFile=\write3 +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grffile.sty +Package: grffile 2012/04/05 v1.16 Extended file name support for graphics (HO) + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty +Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty +Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +))) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty +Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +Package grffile Info: Option `multidot' is set to `true'. +Package grffile Info: Option `extendedchars' is set to `false'. +Package grffile Info: Option `space' is set to `true'. +Package grffile Info: \Gin@ii of package `graphicx' fixed on input line 486. +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty +Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) + + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty +Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) +Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) +Package hobsub Info: Skipping package `infwarerr' (already loaded). +Package hobsub Info: Skipping package `ltxcmds' (already loaded). +Package hobsub Info: Skipping package `ifluatex' (already loaded). +Package hobsub Info: Skipping package `ifvtex' (already loaded). +Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) +Package hobsub Info: Skipping package `ifpdf' (already loaded). +Package hobsub Info: Skipping package `etexcmds' (already loaded). +Package hobsub Info: Skipping package `kvsetkeys' (already loaded). +Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) +Package hobsub Info: Skipping package `pdftexcmds' (already loaded). +Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) +Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO +) +Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) +Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) +) +Package hobsub Info: Skipping package `hobsub' (already loaded). +Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) +Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) +Package: xcolor-patch 2011/01/30 xcolor patch +Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) +Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) +Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty +Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen139 +\Hy@linkcounter=\count111 +\Hy@pagecounter=\count112 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) +) +\Hy@SavedSpaceFactor=\count113 + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +) +Package hyperref Info: Hyper figures OFF on input line 4443. +Package hyperref Info: Link nesting OFF on input line 4448. +Package hyperref Info: Hyper index ON on input line 4451. +Package hyperref Info: Plain pages OFF on input line 4458. +Package hyperref Info: Backreferencing OFF on input line 4463. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4688. +\c@Hy@tempcnt=\count114 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip11 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5041. +\XeTeXLinkMargin=\dimen140 +\Fld@menulength=\count115 +\Field@Width=\dimen141 +\Fld@charsize=\dimen142 +Package hyperref Info: Hyper figures OFF on input line 6295. +Package hyperref Info: Link nesting OFF on input line 6300. +Package hyperref Info: Hyper index ON on input line 6303. +Package hyperref Info: backreferencing OFF on input line 6310. +Package hyperref Info: Link coloring OFF on input line 6315. +Package hyperref Info: Link coloring with OCG OFF on input line 6320. +Package hyperref Info: PDF/A mode OFF on input line 6325. +LaTeX Info: Redefining \ref on input line 6365. +LaTeX Info: Redefining \pageref on input line 6369. +\Hy@abspage=\count116 +\c@Item=\count117 +\c@Hfootnote=\count118 +) + +Package hyperref Message: Driver (autodetected): hpdftex. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX +\Fld@listcount=\count119 +\c@bookmark@seq@number=\count120 + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +82. +) +\Hy@SectionHShift=\skip46 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2014/10/28 v4.11 Multi-page Table package (DPC) +\LTleft=\skip47 +\LTright=\skip48 +\LTpre=\skip49 +\LTpost=\skip50 +\LTchunksize=\count121 +\LTcapwidth=\dimen143 +\LT@head=\box32 +\LT@firsthead=\box33 +\LT@foot=\box34 +\LT@lastfoot=\box35 +\LT@cols=\count122 +\LT@rows=\count123 +\c@LT@tables=\count124 +\c@LT@chunks=\count125 +\LT@p@ftn=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2005/04/14 v1.61803 publication quality tables +\heavyrulewidth=\dimen144 +\lightrulewidth=\dimen145 +\cmidrulewidth=\dimen146 +\belowrulesep=\dimen147 +\belowbottomsep=\dimen148 +\aboverulesep=\dimen149 +\abovetopsep=\dimen150 +\cmidrulesep=\dimen151 +\cmidrulekern=\dimen152 +\defaultaddspace=\dimen153 +\@cmidla=\count126 +\@cmidlb=\count127 +\@aboverulesep=\dimen154 +\@belowrulesep=\dimen155 +\@thisruleclass=\count128 +\@lastruleclass=\count129 +\@thisrulewidth=\dimen156 +) +(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2011/09/28 v3.5.2 Customized lists +\labelindent=\skip51 +\enit@outerparindent=\dimen157 +\enit@toks=\toks30 +\enit@inbox=\box36 +\enitdp@description=\count130 +) +(/usr/share/texlive/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box37 +\UL@hyphenbox=\box38 +\UL@skip=\skip52 +\UL@hook=\toks31 +\UL@height=\dimen158 +\UL@pe=\count131 +\UL@pixel=\dimen159 +\ULC@box=\box39 +Package: ulem 2012/05/18 +\ULdepth=\dimen160 +) +Package hyperref Info: Option `breaklinks' set `true' on input line 264. +Package hyperref Info: Option `colorlinks' set `true' on input line 264. + (./lecture_12.aux) +\openout1 = `lecture_12.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 271. +LaTeX Font Info: Try loading font information for TS1+cmr on input line 271. + + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Try loading font information for T1+ppl on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count132 +\scratchdimen=\dimen161 +\scratchbox=\box40 +\nofMPsegments=\count133 +\nofMParguments=\count134 +\everyMPshowfont=\toks32 +\MPscratchCnt=\count135 +\MPscratchDim=\dimen162 +\MPnumerator=\count136 +\makeMPintoPDFobject=\count137 +\everyMPtoPDFconversion=\toks33 +) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty +Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty +Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) +) +Package grfext Info: Graphics extension search list: +(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 452. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texlive/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2013/06/09 v1.4-94 longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +\AtBeginShipoutBox=\box41 +Package hyperref Info: Link coloring ON on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) +) +\c@section@level=\count138 +) +LaTeX Info: Redefining \ref on input line 271. +LaTeX Info: Redefining \pageref on input line 271. +LaTeX Info: Redefining \nameref on input line 271. + +(./lecture_12.out) (./lecture_12.out) +\@outlinefile=\write4 +\openout4 = `lecture_12.out'. + +LaTeX Font Info: Try loading font information for OT1+ppl on input line 275. + + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Try loading font information for OML+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Try loading font information for OMS+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Try loading font information for OMX+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Try loading font information for OT1+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. + + +LaTeX Warning: No \author given. + +LaTeX Font Info: Try loading font information for T1+cmtt on input line 279. + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Try loading font information for TS1+cmtt on input line 331 +. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <12> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 359. + + +File: det_L.png Graphic file (type png) + +Package pdftex.def Info: det_L.png used on input line 363. +(pdftex.def) Requested size: 375.80544pt x 183.64162pt. + + +File: chol_pre.png Graphic file (type png) + +Package pdftex.def Info: chol_pre.png used on input line 369. +(pdftex.def) Requested size: 375.80544pt x 183.9047pt. + [2 <./det_L.png>] +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <14.4> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 400. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 404. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 404. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 404. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 404. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 404. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 404. + [3 <./chol_pre.png>] [4] +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <10.95> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 503. + [5] [6] [7] [8] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 746. + + +File: lecture_12_files/lecture_12_24_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_12_files/lecture_12_24_0.pdf used on input lin +e 765. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + [9] +Underfull \hbox (badness 10000) in paragraph at lines 767--768 + + [] + +LaTeX Font Info: Font shape `T1/ppl/bx/it' in size <10.95> not available +(Font) Font shape `T1/ppl/b/it' tried instead on input line 773. +[10 <./lecture_12_files/lecture_12_24_0.pdf>] [11] [12] +<../lecture_09/mass_springs.png, id=118, 112.42pt x 190.7125pt> +File: ../lecture_09/mass_springs.png Graphic file (type png) + + +Package pdftex.def Info: ../lecture_09/mass_springs.png used on input line 923. + +(pdftex.def) Requested size: 89.93611pt x 152.576pt. + [13 <../lecture_09/mass_springs.png>] +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1015. + +[14] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 1015. + (./lecture_12.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1015. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1015. + +Package rerunfilecheck Info: File `lecture_12.out' has not changed. +(rerunfilecheck) Checksum: 2BDB89EC075D3A42B038A5DAC39843C7;535. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1015. + ) +Here is how much of TeX's memory you used: + 10955 strings out of 493029 + 163811 string characters out of 6136234 + 270140 words of memory out of 5000000 + 14229 multiletter control sequences out of 15000+600000 + 37652 words of font info for 95 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 36i,9n,77p,512b,465s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf/ +fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/texmf/fonts/enc/dvips/cm- +super/cm-super-t1.enc} +Output written on lecture_12.pdf (14 pages, 232410 bytes). +PDF statistics: + 177 PDF objects out of 1000 (max. 8388607) + 140 compressed objects within 2 object streams + 34 named destinations out of 1000 (max. 500000) + 77 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/lecture_12/lecture_12.md b/lecture_12/lecture_12.md new file mode 100644 index 0000000..82f9bea --- /dev/null +++ b/lecture_12/lecture_12.md @@ -0,0 +1,772 @@ + + +```octave +%plot --format svg +``` + + +```octave +setdefaults +``` + + +```octave +A=rand(4,4) + +[L,U,P]=lu(A) + +det(L) +``` + + A = + + 0.447394 0.357071 0.720915 0.499926 + 0.648313 0.323276 0.521677 0.288345 + 0.084982 0.581513 0.466420 0.142342 + 0.576580 0.658089 0.916987 0.923165 + + L = + + 1.00000 0.00000 0.00000 0.00000 + 0.13108 1.00000 0.00000 0.00000 + 0.69009 0.24851 1.00000 0.00000 + 0.88935 0.68736 0.68488 1.00000 + + U = + + 0.64831 0.32328 0.52168 0.28834 + 0.00000 0.53914 0.39804 0.10455 + 0.00000 0.00000 0.26199 0.27496 + 0.00000 0.00000 0.00000 0.40655 + + P = + + Permutation Matrix + + 0 1 0 0 + 0 0 1 0 + 1 0 0 0 + 0 0 0 1 + + ans = 1 + + + +```octave +A=rand(4,100)'; +A=A'*A; +size(A) +min(min(A)) +max(max(A)) +cond(A) +C=chol(A) +``` + + ans = + + 4 4 + + ans = 23.586 + ans = 35.826 + ans = 14.869 + C = + + 5.98549 4.28555 4.35707 4.31359 + 0.00000 3.63950 1.35005 1.45342 + 0.00000 0.00000 3.62851 1.50580 + 0.00000 0.00000 0.00000 3.21911 + + + +## My question from last class + +![q1](det_L.png) + +![q2](chol_pre.png) + + +## Your questions from last class + +1. Will the exam be more theoretical or problem based? + +2. Writing code is difficult + +3. What format can we expect for the midterm? + +2. Could we go over some example questions for the exam? + +3. Will the use of GitHub be tested on the Midterm exam? Or is it more focused on linear algebra techniques/what was covered in the lectures? + +4. This is not my strong suit, getting a bit overwhelmed with matrix multiplication. + +5. I forgot how much I learned in linear algebra. + +6. What's the most exciting project you've ever worked on with Matlab/Octave? + +# Matrix Inverse and Condition + + +Considering the same solution set: + +$y=Ax$ + +If we know that $A^{-1}A=I$, then + +$A^{-1}y=A^{-1}Ax=x$ + +so + +$x=A^{-1}y$ + +Where, $A^{-1}$ is the inverse of matrix $A$. + +$2x_{1}+x_{2}=1$ + +$x_{1}+3x_{2}=1$ + +$Ax=y$ + +$\left[ \begin{array}{cc} +2 & 1 \\ +1 & 3 \end{array} \right] +\left[\begin{array}{c} +x_{1} \\ +x_{2} \end{array}\right]= +\left[\begin{array}{c} +1 \\ +1\end{array}\right]$ + +$A^{-1}=\frac{1}{2*3-1*1}\left[ \begin{array}{cc} +3 & -1 \\ +-1 & 2 \end{array} \right]= +\left[ \begin{array}{cc} +3/5 & -1/5 \\ +-1/5 & 2/5 \end{array} \right]$ + + + +```octave +A=[2,1;1,3] +invA=1/5*[3,-1;-1,2] + +A*invA +invA*A +``` + + A = + + 2 1 + 1 3 + + invA = + + 0.60000 -0.20000 + -0.20000 0.40000 + + ans = + + 1.00000 0.00000 + 0.00000 1.00000 + + ans = + + 1.00000 0.00000 + 0.00000 1.00000 + + + +How did we know the inverse of A? + +for 2$\times$2 matrices, it is always: + +$A=\left[ \begin{array}{cc} +A_{11} & A_{12} \\ +A_{21} & A_{22} \end{array} \right]$ + +$A^{-1}=\frac{1}{det(A)}\left[ \begin{array}{cc} +A_{22} & -A_{12} \\ +-A_{21} & A_{11} \end{array} \right]$ + +$AA^{-1}=\frac{1}{A_{11}A_{22}-A_{21}A_{12}}\left[ \begin{array}{cc} +A_{11}A_{22}-A_{21}A_{12} & -A_{11}A_{12}+A_{12}A_{11} \\ +A_{21}A_{22}-A_{22}A_{21} & -A_{21}A_{12}+A_{22}A_{11} \end{array} \right] +=\left[ \begin{array}{cc} +1 & 0 \\ +0 & 1 \end{array} \right]$ + +What about bigger matrices? + +We can use the LU-decomposition + +$A=LU$ + +$A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$ + +if we divide $A^{-1}$ into n-column vectors, $a_{n}$, then + +$Aa_{1}=\left[\begin{array}{c} +1 \\ +0 \\ +\vdots \\ +0 \end{array} \right]$ +$Aa_{2}=\left[\begin{array}{c} +0 \\ +1 \\ +\vdots \\ +0 \end{array} \right]$ +$Aa_{n}=\left[\begin{array}{c} +0 \\ +0 \\ +\vdots \\ +1 \end{array} \right]$ + + +Which we can solve for each $a_{n}$ with LU-decomposition, knowing the lower and upper triangular decompositions, then + +$A^{-1}=\left[ \begin{array}{cccc} +| & | & & | \\ +a_{1} & a_{2} & \cdots & a_{n} \\ +| & | & & | \end{array} \right]$ + + +$Ld_{1}=\left[\begin{array}{c} +1 \\ +0 \\ +\vdots \\ +0 \end{array} \right]$ +$;~Ua_{1}=d_{1}$ + +$Ld_{2}=\left[\begin{array}{c} +0 \\ +1 \\ +\vdots \\ +0 \end{array} \right]$ +$;~Ua_{2}=d_{2}$ + +$Ld_{n}=\left[\begin{array}{c} +0 \\ +1 \\ +\vdots \\ +n \end{array} \right]$ +$;~Ua_{n}=d_{n}$ + +Consider the following matrix: + +$A=\left[ \begin{array}{ccc} +2 & -1 & 0\\ +-1 & 2 & -1\\ +0 & -1 & 1 \end{array} \right]$ + + +#### Note on solving for $A^{-1}$ column 1 + +$Aa_1=I(:,1)$ + +$LUa_1=I(:,1)$ + +$(LUa_1-I(:,1))=0$ + +$L(Ua_1-d_1)=0$ + +$I(:,1)=Ld_1$ + + +```octave +A=[2,-1,0;-1,2,-1;0,-1,1] +U=A; +L=eye(3,3); +U(2,:)=U(2,:)-U(2,1)/U(1,1)*U(1,:) +L(2,1)=A(2,1)/A(1,1) +``` + + A = + + 2 -1 0 + -1 2 -1 + 0 -1 1 + + U = + + 2.00000 -1.00000 0.00000 + 0.00000 1.50000 -1.00000 + 0.00000 -1.00000 1.00000 + + L = + + 1.00000 0.00000 0.00000 + -0.50000 1.00000 0.00000 + 0.00000 0.00000 1.00000 + + + + +```octave +L(3,2)=U(3,2)/U(2,2) +U(3,:)=U(3,:)-U(3,2)/U(2,2)*U(2,:) + +``` + + L = + + 1.00000 0.00000 0.00000 + -0.50000 1.00000 0.00000 + 0.00000 -0.66667 1.00000 + + U = + + 2.00000 -1.00000 0.00000 + 0.00000 1.50000 -1.00000 + 0.00000 0.00000 0.33333 + + + +Now solve for $d_1$ then $a_1$, $d_2$ then $a_2$, and $d_3$ then $a_{3}$ + +$Ld_{1}=\left[\begin{array}{c} +1 \\ +0 \\ +\vdots \\ +0 \end{array} \right]= +\left[\begin{array}{ccc} +1 & 0 & 0 \\ +-1/2 & 1 & 0 \\ +0 & -2/3 & 1 \end{array} \right]\left[\begin{array}{c} +d1(1) \\ +d1(2) \\ +d1(3)\end{array} \right]=\left[\begin{array}{c} +1 \\ +0 \\ +0 \end{array} \right] +;~Ua_{1}=d_{1}$ + + +```octave +d1=zeros(3,1); +d1(1)=1; +d1(2)=0-L(2,1)*d1(1); +d1(3)=0-L(3,1)*d1(1)-L(3,2)*d1(2) +``` + + d1 = + + 1.00000 + 0.50000 + 0.33333 + + + + +```octave +a1=zeros(3,1); +a1(3)=d1(3)/U(3,3); +a1(2)=1/U(2,2)*(d1(2)-U(2,3)*a1(3)); +a1(1)=1/U(1,1)*(d1(1)-U(1,2)*a1(2)-U(1,3)*a1(3)) +``` + + a1 = + + 1.00000 + 1.00000 + 1.00000 + + + + +```octave +d2=zeros(3,1); +d2(1)=0; +d2(2)=1-L(2,1)*d2(1); +d2(3)=0-L(3,1)*d2(1)-L(3,2)*d2(2) +``` + + d2 = + + 0.00000 + 1.00000 + 0.66667 + + + + +```octave +a2=zeros(3,1); +a2(3)=d2(3)/U(3,3); +a2(2)=1/U(2,2)*(d2(2)-U(2,3)*a2(3)); +a2(1)=1/U(1,1)*(d2(1)-U(1,2)*a2(2)-U(1,3)*a2(3)) +``` + + a2 = + + 1.0000 + 2.0000 + 2.0000 + + + + +```octave +d3=zeros(3,1); +d3(1)=0; +d3(2)=0-L(2,1)*d3(1); +d3(3)=1-L(3,1)*d3(1)-L(3,2)*d3(2) +``` + + d3 = + + 0 + 0 + 1 + + + + +```octave +a3=zeros(3,1); +a3(3)=d3(3)/U(3,3); +a3(2)=1/U(2,2)*(d3(2)-U(2,3)*a3(3)); +a3(1)=1/U(1,1)*(d3(1)-U(1,2)*a3(2)-U(1,3)*a3(3)) +``` + + a3 = + + 1.00000 + 2.00000 + 3.00000 + + + +Final solution for $A^{-1}$ is $[a_{1}~a_{2}~a_{3}]$ + + +```octave +invA=[a1,a2,a3] +I_app=A*invA +I_app(2,3) +eps + +2^-8 +``` + + invA = + + 1.00000 1.00000 1.00000 + 1.00000 2.00000 2.00000 + 1.00000 2.00000 3.00000 + + I_app = + + 1.00000 0.00000 0.00000 + 0.00000 1.00000 -0.00000 + -0.00000 -0.00000 1.00000 + + ans = -4.4409e-16 + ans = 2.2204e-16 + ans = 0.0039062 + + +Now the solution of $x$ to $Ax=y$ is $x=A^{-1}y$ + + +```octave +y=[1;2;3] +x=invA*y +xbs=A\y +x-xbs +eps +``` + + y = + + 1 + 2 + 3 + + x = + + 6.0000 + 11.0000 + 14.0000 + + xbs = + + 6.0000 + 11.0000 + 14.0000 + + ans = + + -3.5527e-15 + -8.8818e-15 + -1.0658e-14 + + ans = 2.2204e-16 + + + +```octave +N=100; +n=[1:N]; +t_inv=zeros(N,1); +t_bs=zeros(N,1); +t_mult=zeros(N,1); +for i=1:N + A=rand(i,i); + tic + invA=inv(A); + t_inv(i)=toc; + b=rand(i,1); + tic; + x=A\b; + t_bs(i)=toc; + tic; + x=invA*b; + t_mult(i)=toc; +end +plot(n,t_inv,n,t_bs,n,t_mult) +axis([0 100 0 0.002]) +legend('inversion','backslash','multiplication','Location','NorthWest') +``` + + +![svg](lecture_12_files/lecture_12_24_0.svg) + + +## Condition of a matrix +### *just checked in to see what condition my condition was in* +### Matrix norms + +The Euclidean norm of a vector is measure of the magnitude (in 3D this would be: $|x|=\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}$) in general the equation is: + +$||x||_{e}=\sqrt{\sum_{i=1}^{n}x_{i}^{2}}$ + +For a matrix, A, the same norm is called the Frobenius norm: + +$||A||_{f}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{2}}$ + +In general we can calculate any $p$-norm where + +$||A||_{p}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{p}}$ + +so the p=1, 1-norm is + +$||A||_{1}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{1}}=\sum_{i=1}^{n}\sum_{i=1}^{m}|A_{i,j}|$ + +$||A||_{\infty}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{\infty}}=\max_{1\le i \le n}\sum_{j=1}^{m}|A_{i,j}|$ + +### Condition of Matrix + +The matrix condition is the product of + +$Cond(A) = ||A||\cdot||A^{-1}||$ + +So each norm will have a different condition number, but the limit is $Cond(A)\ge 1$ + +An estimate of the rounding error is based on the condition of A: + +$\frac{||\Delta x||}{x} \le Cond(A) \frac{||\Delta A||}{||A||}$ + +So if the coefficients of A have accuracy to $10^{-t} + +and the condition of A, $Cond(A)=10^{c}$ + +then the solution for x can have rounding errors up to $10^{c-t}$ + + + +```octave +A=[1,1/2,1/3;1/2,1/3,1/4;1/3,1/4,1/5] +[L,U]=LU_naive(A) +``` + + A = + + 1.00000 0.50000 0.33333 + 0.50000 0.33333 0.25000 + 0.33333 0.25000 0.20000 + + L = + + 1.00000 0.00000 0.00000 + 0.50000 1.00000 0.00000 + 0.33333 1.00000 1.00000 + + U = + + 1.00000 0.50000 0.33333 + 0.00000 0.08333 0.08333 + 0.00000 -0.00000 0.00556 + + + +Then, $A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$ + +$Ld_{1}=\left[\begin{array}{c} +1 \\ +0 \\ +0 \end{array}\right]$, $Ux_{1}=d_{1}$ ... + + +```octave +invA=zeros(3,3); +d1=L\[1;0;0]; +d2=L\[0;1;0]; +d3=L\[0;0;1]; +invA(:,1)=U\d1; +invA(:,2)=U\d2; +invA(:,3)=U\d3 +invA*A +``` + + invA = + + 9.0000 -36.0000 30.0000 + -36.0000 192.0000 -180.0000 + 30.0000 -180.0000 180.0000 + + ans = + + 1.0000e+00 3.5527e-15 2.9976e-15 + -1.3249e-14 1.0000e+00 -9.1038e-15 + 8.5117e-15 7.1054e-15 1.0000e+00 + + + +Find the condition of A, $cond(A)$ + + +```octave +% Frobenius norm +normf_A = sqrt(sum(sum(A.^2))) +normf_invA = sqrt(sum(sum(invA.^2))) + +cond_f_A = normf_A*normf_invA + +norm(A,'fro') + +% p=1, column sum norm +norm1_A = max(sum(A,2)) +norm1_invA = max(sum(invA,2)) +norm(A,1) + +cond_1_A=norm1_A*norm1_invA + +% p=inf, row sum norm +norminf_A = max(sum(A,1)) +norminf_invA = max(sum(invA,1)) +norm(A,inf) + +cond_inf_A=norminf_A*norminf_invA + +``` + + normf_A = 1.4136 + normf_invA = 372.21 + cond_f_A = 526.16 + ans = 1.4136 + norm1_A = 1.8333 + norm1_invA = 30.000 + ans = 1.8333 + cond_1_A = 55.000 + norminf_A = 1.8333 + norminf_invA = 30.000 + ans = 1.8333 + cond_inf_A = 55.000 + + +Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with spring constants $K_{i}$. What does a high condition number mean for this problem? + +![Springs-masses](../lecture_09/mass_springs.png) + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass: + +$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$ + +$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$ + +$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$ + +$m_{4}g-k_{4}(x_{4}-x_{3})=0$ + +in matrix form: + +$\left[ \begin{array}{cccc} +k_{1}+k_{2} & -k_{2} & 0 & 0 \\ +-k_{2} & k_{2}+k_{3} & -k_{3} & 0 \\ +0 & -k_{3} & k_{3}+k_{4} & -k_{4} \\ +0 & 0 & -k_{4} & k_{4} \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \\ +x_{4} \end{array} \right]= +\left[ \begin{array}{c} +m_{1}g \\ +m_{2}g \\ +m_{3}g \\ +m_{4}g \end{array} \right]$ + + +```octave +k1=10; % N/m +k2=100000; +k3=10; +k4=1; +m1=1; % kg +m2=2; +m3=3; +m4=4; +g=9.81; % m/s^2 +K=[k1+k2 -k2 0 0; -k2 k2+k3 -k3 0; 0 -k3 k3+k4 -k4; 0 0 -k4 k4] +y=[m1*g;m2*g;m3*g;m4*g] +``` + + K = + + 100010 -100000 0 0 + -100000 100010 -10 0 + 0 -10 11 -1 + 0 0 -1 1 + + y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + + +```octave +cond(K,inf) +cond(K,1) +cond(K,'fro') +cond(K,2) +``` + + ans = 3.2004e+05 + ans = 3.2004e+05 + ans = 2.5925e+05 + ans = 2.5293e+05 + + + +```octave +e=eig(K) +max(e)/min(e) +``` + + e = + + 7.9078e-01 + 3.5881e+00 + 1.7621e+01 + 2.0001e+05 + + ans = 2.5293e+05 + + + +```octave + +``` diff --git a/lecture_12/lecture_12.out b/lecture_12/lecture_12.out new file mode 100644 index 0000000..e7b5af8 --- /dev/null +++ b/lecture_12/lecture_12.out @@ -0,0 +1,7 @@ +\BOOKMARK [2][-]{subsection.0.1}{My question from last class}{}% 1 +\BOOKMARK [2][-]{subsection.0.2}{Your questions from last class}{}% 2 +\BOOKMARK [1][-]{section.1}{Matrix Inverse and Condition}{}% 3 +\BOOKMARK [2][-]{subsection.1.1}{Condition of a matrix}{section.1}% 4 +\BOOKMARK [3][-]{subsubsection.1.1.1}{just checked in to see what condition my condition was in}{subsection.1.1}% 5 +\BOOKMARK [3][-]{subsubsection.1.1.2}{Matrix norms}{subsection.1.1}% 6 +\BOOKMARK [3][-]{subsubsection.1.1.3}{Condition of Matrix}{subsection.1.1}% 7 diff --git a/lecture_12/lecture_12.pdf b/lecture_12/lecture_12.pdf new file mode 100644 index 0000000..e0b4e6c Binary files /dev/null and b/lecture_12/lecture_12.pdf differ diff --git a/lecture_12/lecture_12.tex b/lecture_12/lecture_12.tex new file mode 100644 index 0000000..1265a06 --- /dev/null +++ b/lecture_12/lecture_12.tex @@ -0,0 +1,1015 @@ + +% Default to the notebook output style + + + + +% Inherit from the specified cell style. + + + + + +\documentclass[11pt]{article} + + + + \usepackage[T1]{fontenc} + % Nicer default font (+ math font) than Computer Modern for most use cases + \usepackage{mathpazo} + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % We will generate all images so they have a width \maxwidth. This means + % that they will get their normal width if they fit onto the page, but + % are scaled down if they would overflow the margins. + \makeatletter + \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth + \else\Gin@nat@width\fi} + \makeatother + \let\Oldincludegraphics\includegraphics + % Set max figure width to be 80% of text width, for now hardcoded. + \renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=.8\maxwidth]{#1}} + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionLabelFormat{nolabel}{} + \captionsetup{labelformat=nolabel} + + \usepackage{adjustbox} % Used to constrain images to a maximum size + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatability definitions + \def\gt{>} + \def\lt{<} + % Document parameters + \title{lecture\_12} + + + + + % Pygments definitions + +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % Exact colors from NB + \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} + \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} + + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + + \begin{document} + + + \maketitle + + + + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}27}]:} \PY{c}{\PYZpc{}plot \PYZhy{}\PYZhy{}format svg} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}28}]:} \PY{n}{setdefaults} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}29}]:} \PY{n}{A}\PY{p}{=}\PY{n+nb}{rand}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)} + + \PY{p}{[}\PY{n}{L}\PY{p}{,}\PY{n}{U}\PY{p}{,}\PY{n}{P}\PY{p}{]}\PY{p}{=}\PY{n+nb}{lu}\PY{p}{(}\PY{n}{A}\PY{p}{)} + + \PY{n+nb}{det}\PY{p}{(}\PY{n}{L}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 0.447394 0.357071 0.720915 0.499926 + 0.648313 0.323276 0.521677 0.288345 + 0.084982 0.581513 0.466420 0.142342 + 0.576580 0.658089 0.916987 0.923165 + +L = + + 1.00000 0.00000 0.00000 0.00000 + 0.13108 1.00000 0.00000 0.00000 + 0.69009 0.24851 1.00000 0.00000 + 0.88935 0.68736 0.68488 1.00000 + +U = + + 0.64831 0.32328 0.52168 0.28834 + 0.00000 0.53914 0.39804 0.10455 + 0.00000 0.00000 0.26199 0.27496 + 0.00000 0.00000 0.00000 0.40655 + +P = + +Permutation Matrix + + 0 1 0 0 + 0 0 1 0 + 1 0 0 0 + 0 0 0 1 + +ans = 1 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}44}]:} \PY{n}{A}\PY{p}{=}\PY{n+nb}{rand}\PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{o}{\PYZsq{}}\PY{p}{;} + \PY{n}{A}\PY{p}{=}\PY{n}{A}\PY{o}{\PYZsq{}}\PY{o}{*}\PY{n}{A}\PY{p}{;} + \PY{n+nb}{size}\PY{p}{(}\PY{n}{A}\PY{p}{)} + \PY{n+nb}{min}\PY{p}{(}\PY{n+nb}{min}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{)} + \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{max}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{A}\PY{p}{)} + \PY{n}{C}\PY{p}{=}\PY{n+nb}{chol}\PY{p}{(}\PY{n}{A}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 4 4 + +ans = 23.586 +ans = 35.826 +ans = 14.869 +C = + + 5.98549 4.28555 4.35707 4.31359 + 0.00000 3.63950 1.35005 1.45342 + 0.00000 0.00000 3.62851 1.50580 + 0.00000 0.00000 0.00000 3.21911 + + + \end{Verbatim} + + \subsection{My question from last +class}\label{my-question-from-last-class} + +\begin{figure}[htbp] +\centering +\includegraphics{det_L.png} +\caption{q1} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics{chol_pre.png} +\caption{q2} +\end{figure} + +\subsection{Your questions from last +class}\label{your-questions-from-last-class} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + Will the exam be more theoretical or problem based? +\item + Writing code is difficult +\item + What format can we expect for the midterm? +\item + Could we go over some example questions for the exam? +\item + Will the use of GitHub be tested on the Midterm exam? Or is it more + focused on linear algebra techniques/what was covered in the lectures? +\item + This is not my strong suit, getting a bit overwhelmed with matrix + multiplication. +\item + I forgot how much I learned in linear algebra. +\item + What's the most exciting project you've ever worked on with + Matlab/Octave? +\end{enumerate} + + \section{Matrix Inverse and +Condition}\label{matrix-inverse-and-condition} + +Considering the same solution set: + +\(y=Ax\) + +If we know that \(A^{-1}A=I\), then + +\(A^{-1}y=A^{-1}Ax=x\) + +so + +\(x=A^{-1}y\) + +Where, \(A^{-1}\) is the inverse of matrix \(A\). + +\(2x_{1}+x_{2}=1\) + +\(x_{1}+3x_{2}=1\) + +\(Ax=y\) + +\(\left[ \begin{array}{cc} 2 & 1 \\ 1 & 3 \end{array} \right] \left[\begin{array}{c} x_{1} \\ x_{2} \end{array}\right]= \left[\begin{array}{c} 1 \\ 1\end{array}\right]\) + +\(A^{-1}=\frac{1}{2*3-1*1}\left[ \begin{array}{cc} 3 & -1 \\ -1 & 2 \end{array} \right]= \left[ \begin{array}{cc} 3/5 & -1/5 \\ -1/5 & 2/5 \end{array} \right]\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}45}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{]} + \PY{n}{invA}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{5}\PY{o}{*}\PY{p}{[}\PY{l+m+mi}{3}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{]} + + \PY{n}{A}\PY{o}{*}\PY{n}{invA} + \PY{n}{invA}\PY{o}{*}\PY{n}{A} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 2 1 + 1 3 + +invA = + + 0.60000 -0.20000 + -0.20000 0.40000 + +ans = + + 1.00000 0.00000 + 0.00000 1.00000 + +ans = + + 1.00000 0.00000 + 0.00000 1.00000 + + + \end{Verbatim} + + How did we know the inverse of A? + +for 2$\times$2 matrices, it is always: + +$A=\left[ \begin{array}{cc} A_{11} & A_{12} \\ A_{21} & A_{22} \end{array} \right]$ + +$A^{-1}=\frac{1}{det(A)}\left[ \begin{array}{cc} A_{22} & -A_{12} \\ -A_{21} & A_{11} \end{array} \right]$ + + $AA^{-1}=\frac{1}{A_{11}A_{22}-A_{21}A_{12}}\left[ \begin{array}{cc} A_{11}A_{22}-A_{21}A_{12} & -A_{11}A_{12}+A_{12}A_{11} \\ A_{21}A_{22}-A_{22}A_{21} & -A_{21}A_{12}+A_{22}A_{11} \end{array} \right] =\left[ \begin{array}{cc} 1 & 0 \\ 0 & 1 \end{array} \right]$ + + What about bigger matrices? + +We can use the LU-decomposition + +\(A=LU\) + +\(A^{-1}=(LU)^{-1}=U^{-1}L^{-1}\) + +if we divide \(A^{-1}\) into n-column vectors, \(a_{n}\), then + +\(Aa_{1}=\left[\begin{array}{c} 1 \\ 0 \\ \vdots \\ 0 \end{array} \right]\) +\(Aa_{2}=\left[\begin{array}{c} 0 \\ 1 \\ \vdots \\ 0 \end{array} \right]\) +\(Aa_{n}=\left[\begin{array}{c} 0 \\ 0 \\ \vdots \\ 1 \end{array} \right]\) + +Which we can solve for each \(a_{n}\) with LU-decomposition, knowing the +lower and upper triangular decompositions, then + +\(A^{-1}=\left[ \begin{array}{cccc} | & | & & | \\ a_{1} & a_{2} & \cdots & a_{n} \\ | & | & & | \end{array} \right]\) + +\(Ld_{1}=\left[\begin{array}{c} 1 \\ 0 \\ \vdots \\ 0 \end{array} \right]\) +\(;~Ua_{1}=d_{1}\) + +\(Ld_{2}=\left[\begin{array}{c} 0 \\ 1 \\ \vdots \\ 0 \end{array} \right]\) +\(;~Ua_{2}=d_{2}\) + +\(Ld_{n}=\left[\begin{array}{c} 0 \\ 1 \\ \vdots \\ n \end{array} \right]\) +\(;~Ua_{n}=d_{n}\) + +Consider the following matrix: + +\(A=\left[ \begin{array}{ccc} 2 & -1 & 0\\ -1 & 2 & -1\\ 0 & -1 & 1 \end{array} \right]\) + + \paragraph{\texorpdfstring{Note on solving for \(A^{-1}\) column +1}{Note on solving for A\^{}\{-1\} column 1}}\label{note-on-solving-for-a-1-column-1} + +\(Aa_1=I(:,1)\) + +\(LUa_1=I(:,1)\) + +\((LUa_1-I(:,1))=0\) + +\(L(Ua_1-d_1)=0\) + +\(I(:,1)=Ld_1\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}56}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{]} + \PY{n}{U}\PY{p}{=}\PY{n}{A}\PY{p}{;} + \PY{n}{L}\PY{p}{=}\PY{n+nb}{eye}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{p}{:}\PY{p}{)} + \PY{n}{L}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 2 -1 0 + -1 2 -1 + 0 -1 1 + +U = + + 2.00000 -1.00000 0.00000 + 0.00000 1.50000 -1.00000 + 0.00000 -1.00000 1.00000 + +L = + + 1.00000 0.00000 0.00000 + -0.50000 1.00000 0.00000 + 0.00000 0.00000 1.00000 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}57}]:} \PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)} + \PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +L = + + 1.00000 0.00000 0.00000 + -0.50000 1.00000 0.00000 + 0.00000 -0.66667 1.00000 + +U = + + 2.00000 -1.00000 0.00000 + 0.00000 1.50000 -1.00000 + 0.00000 0.00000 0.33333 + + + \end{Verbatim} + + Now solve for \(d_1\) then \(a_1\), \(d_2\) then \(a_2\), and \(d_3\) +then \(a_{3}\) + +\(Ld_{1}=\left[\begin{array}{c} 1 \\ 0 \\ \vdots \\ 0 \end{array} \right]= \left[\begin{array}{ccc} 1 & 0 & 0 \\ -1/2 & 1 & 0 \\ 0 & -2/3 & 1 \end{array} \right]\left[\begin{array}{c} d1(1) \\ d1(2) \\ d1(3)\end{array} \right]=\left[\begin{array}{c} 1 \\ 0 \\ 0 \end{array} \right] ;~Ua_{1}=d_{1}\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}58}]:} \PY{n}{d1}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} + \PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +d1 = + + 1.00000 + 0.50000 + 0.33333 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}59}]:} \PY{n}{a1}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{a1}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{a1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{a1}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}\PY{p}{;} + \PY{n}{a1}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{d1}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{a1}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{a1}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +a1 = + + 1.00000 + 1.00000 + 1.00000 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}60}]:} \PY{n}{d2}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{p}{;} + \PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +d2 = + + 0.00000 + 1.00000 + 0.66667 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}61}]:} \PY{n}{a2}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{a2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{a2}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{a2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}\PY{p}{;} + \PY{n}{a2}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{d2}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{a2}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{a2}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +a2 = + + 1.0000 + 2.0000 + 2.0000 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}62}]:} \PY{n}{d3}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{p}{;} + \PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{0}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{L}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +d3 = + + 0 + 0 + 1 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}63}]:} \PY{n}{a3}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{a3}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{a3}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{a3}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}\PY{p}{;} + \PY{n}{a3}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{d3}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{*}\PY{n}{a3}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{U}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{*}\PY{n}{a3}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +a3 = + + 1.00000 + 2.00000 + 3.00000 + + + \end{Verbatim} + + Final solution for \(A^{-1}\) is \([a_{1}~a_{2}~a_{3}]\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}69}]:} \PY{n}{invA}\PY{p}{=}\PY{p}{[}\PY{n}{a1}\PY{p}{,}\PY{n}{a2}\PY{p}{,}\PY{n}{a3}\PY{p}{]} + \PY{n}{I\PYZus{}app}\PY{p}{=}\PY{n}{A}\PY{o}{*}\PY{n}{invA} + \PY{n}{I\PYZus{}app}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)} + \PY{n+nb}{eps} + + \PY{l+m+mi}{2}\PYZca{}\PY{o}{\PYZhy{}}\PY{l+m+mi}{8} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +invA = + + 1.00000 1.00000 1.00000 + 1.00000 2.00000 2.00000 + 1.00000 2.00000 3.00000 + +I\_app = + + 1.00000 0.00000 0.00000 + 0.00000 1.00000 -0.00000 + -0.00000 -0.00000 1.00000 + +ans = -4.4409e-16 +ans = 2.2204e-16 +ans = 0.0039062 + + \end{Verbatim} + + Now the solution of \(x\) to \(Ax=y\) is \(x=A^{-1}y\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}70}]:} \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{2}\PY{p}{;}\PY{l+m+mi}{3}\PY{p}{]} + \PY{n}{x}\PY{p}{=}\PY{n}{invA}\PY{o}{*}\PY{n}{y} + \PY{n}{xbs}\PY{p}{=}\PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{y} + \PY{n}{x}\PY{o}{\PYZhy{}}\PY{n}{xbs} + \PY{n+nb}{eps} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +y = + + 1 + 2 + 3 + +x = + + 6.0000 + 11.0000 + 14.0000 + +xbs = + + 6.0000 + 11.0000 + 14.0000 + +ans = + + -3.5527e-15 + -8.8818e-15 + -1.0658e-14 + +ans = 2.2204e-16 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}71}]:} \PY{n}{N}\PY{p}{=}\PY{l+m+mi}{100}\PY{p}{;} + \PY{n}{n}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{:}\PY{n}{N}\PY{p}{]}\PY{p}{;} + \PY{n}{t\PYZus{}inv}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{n}{N}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}bs}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{n}{N}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}mult}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{n}{N}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{k}{for} \PY{n}{i}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{n}{N} + \PY{n}{A}\PY{p}{=}\PY{n+nb}{rand}\PY{p}{(}\PY{n}{i}\PY{p}{,}\PY{n}{i}\PY{p}{)}\PY{p}{;} + \PY{n+nb}{tic} + \PY{n}{invA}\PY{p}{=}\PY{n+nb}{inv}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{;} + \PY{n}{t\PYZus{}inv}\PY{p}{(}\PY{n}{i}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + \PY{n}{b}\PY{p}{=}\PY{n+nb}{rand}\PY{p}{(}\PY{n}{i}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n+nb}{tic}\PY{p}{;} + \PY{n}{x}\PY{p}{=}\PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{b}\PY{p}{;} + \PY{n}{t\PYZus{}bs}\PY{p}{(}\PY{n}{i}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + \PY{n+nb}{tic}\PY{p}{;} + \PY{n}{x}\PY{p}{=}\PY{n}{invA}\PY{o}{*}\PY{n}{b}\PY{p}{;} + \PY{n}{t\PYZus{}mult}\PY{p}{(}\PY{n}{i}\PY{p}{)}\PY{p}{=}\PY{n+nb}{toc}\PY{p}{;} + \PY{k}{end} + \PY{n+nb}{plot}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{t\PYZus{}inv}\PY{p}{,}\PY{n}{n}\PY{p}{,}\PY{n}{t\PYZus{}bs}\PY{p}{,}\PY{n}{n}\PY{p}{,}\PY{n}{t\PYZus{}mult}\PY{p}{)} + \PY{n+nb}{axis}\PY{p}{(}\PY{p}{[}\PY{l+m+mi}{0} \PY{l+m+mi}{100} \PY{l+m+mi}{0} \PY{l+m+mf}{0.002}\PY{p}{]}\PY{p}{)} + \PY{n+nb}{legend}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{inversion\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{backslash\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{multiplication\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{Location\PYZsq{}}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{NorthWest\PYZsq{}}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_12_files/lecture_12_24_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + \subsection{Condition of a matrix}\label{condition-of-a-matrix} + +\subsubsection{\texorpdfstring{\emph{just checked in to see what +condition my condition was +in}}{just checked in to see what condition my condition was in}}\label{just-checked-in-to-see-what-condition-my-condition-was-in} + +\subsubsection{Matrix norms}\label{matrix-norms} + +The Euclidean norm of a vector is measure of the magnitude (in 3D this +would be: \(|x|=\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}\)) in general the +equation is: + +\(||x||_{e}=\sqrt{\sum_{i=1}^{n}x_{i}^{2}}\) + +For a matrix, A, the same norm is called the Frobenius norm: + +\(||A||_{f}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{2}}\) + +In general we can calculate any \(p\)-norm where + +\(||A||_{p}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{p}}\) + +so the p=1, 1-norm is + +\(||A||_{1}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{1}}=\sum_{i=1}^{n}\sum_{i=1}^{m}|A_{i,j}|\) + +\(||A||_{\infty}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{\infty}}=\max_{1\le i \le n}\sum_{j=1}^{m}|A_{i,j}|\) + +\subsubsection{Condition of Matrix}\label{condition-of-matrix} + +The matrix condition is the product of + +\(Cond(A) = ||A||\cdot||A^{-1}||\) + +So each norm will have a different condition number, but the limit is +\(Cond(A)\ge 1\) + +An estimate of the rounding error is based on the condition of A: + +\(\frac{||\Delta x||}{x} \le Cond(A) \frac{||\Delta A||}{||A||}\) + +So if the coefficients of A have accuracy to \$10\^{}\{-t\} + +and the condition of A, \(Cond(A)=10^{c}\) + +then the solution for x can have rounding errors up to \(10^{c-t}\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}72}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{4}\PY{p}{;}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{5}\PY{p}{]} + \PY{p}{[}\PY{n}{L}\PY{p}{,}\PY{n}{U}\PY{p}{]}\PY{p}{=}\PY{n}{LU\PYZus{}naive}\PY{p}{(}\PY{n}{A}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 1.00000 0.50000 0.33333 + 0.50000 0.33333 0.25000 + 0.33333 0.25000 0.20000 + +L = + + 1.00000 0.00000 0.00000 + 0.50000 1.00000 0.00000 + 0.33333 1.00000 1.00000 + +U = + + 1.00000 0.50000 0.33333 + 0.00000 0.08333 0.08333 + 0.00000 -0.00000 0.00556 + + + \end{Verbatim} + + Then, \(A^{-1}=(LU)^{-1}=U^{-1}L^{-1}\) + +\(Ld_{1}=\left[\begin{array}{c} 1 \\ 0 \\ 0 \end{array}\right]\), +\(Ux_{1}=d_{1}\) ... + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}75}]:} \PY{n}{invA}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{d1}\PY{p}{=}\PY{n}{L}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{d2}\PY{p}{=}\PY{n}{L}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{d3}\PY{p}{=}\PY{n}{L}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} + \PY{n}{invA}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d1}\PY{p}{;} + \PY{n}{invA}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d2}\PY{p}{;} + \PY{n}{invA}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d3} + \PY{n}{invA}\PY{o}{*}\PY{n}{A} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +invA = + + 9.0000 -36.0000 30.0000 + -36.0000 192.0000 -180.0000 + 30.0000 -180.0000 180.0000 + +ans = + + 1.0000e+00 3.5527e-15 2.9976e-15 + -1.3249e-14 1.0000e+00 -9.1038e-15 + 8.5117e-15 7.1054e-15 1.0000e+00 + + + \end{Verbatim} + + Find the condition of A, \(cond(A)\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}74}]:} \PY{c}{\PYZpc{} Frobenius norm} + \PY{n}{normf\PYZus{}A} \PY{p}{=} \PY{n+nb}{sqrt}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{A}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}\PY{p}{)} + \PY{n}{normf\PYZus{}invA} \PY{p}{=} \PY{n+nb}{sqrt}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{invA}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}\PY{p}{)} + + \PY{n}{cond\PYZus{}f\PYZus{}A} \PY{p}{=} \PY{n}{normf\PYZus{}A}\PY{o}{*}\PY{n}{normf\PYZus{}invA} + + \PY{n+nb}{norm}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{fro\PYZsq{}}\PY{p}{)} + + \PY{c}{\PYZpc{} p=1, column sum norm} + \PY{n}{norm1\PYZus{}A} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} + \PY{n}{norm1\PYZus{}invA} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{invA}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} + \PY{n+nb}{norm}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)} + + \PY{n}{cond\PYZus{}1\PYZus{}A}\PY{p}{=}\PY{n}{norm1\PYZus{}A}\PY{o}{*}\PY{n}{norm1\PYZus{}invA} + + \PY{c}{\PYZpc{} p=inf, row sum norm} + \PY{n}{norminf\PYZus{}A} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{)} + \PY{n}{norminf\PYZus{}invA} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{invA}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{)} + \PY{n+nb}{norm}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n+nb}{inf}\PY{p}{)} + + \PY{n}{cond\PYZus{}inf\PYZus{}A}\PY{p}{=}\PY{n}{norminf\PYZus{}A}\PY{o}{*}\PY{n}{norminf\PYZus{}invA} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +normf\_A = 1.4136 +normf\_invA = 372.21 +cond\_f\_A = 526.16 +ans = 1.4136 +norm1\_A = 1.8333 +norm1\_invA = 30.000 +ans = 1.8333 +cond\_1\_A = 55.000 +norminf\_A = 1.8333 +norminf\_invA = 30.000 +ans = 1.8333 +cond\_inf\_A = 55.000 + + \end{Verbatim} + + Consider the problem again from the intro to Linear Algebra, 4 masses +are connected in series to 4 springs with spring constants \(K_{i}\). +What does a high condition number mean for this problem? + +\begin{figure}[htbp] +\centering +\includegraphics{../lecture_09/mass_springs.png} +\caption{Springs-masses} +\end{figure} + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses +1-4. Using a FBD for each mass: + +\(m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0\) + +\(m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0\) + +\(m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0\) + +\(m_{4}g-k_{4}(x_{4}-x_{3})=0\) + +in matrix form: + +\(\left[ \begin{array}{cccc} k_{1}+k_{2} & -k_{2} & 0 & 0 \\ -k_{2} & k_{2}+k_{3} & -k_{3} & 0 \\ 0 & -k_{3} & k_{3}+k_{4} & -k_{4} \\ 0 & 0 & -k_{4} & k_{4} \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{array} \right]= \left[ \begin{array}{c} m_{1}g \\ m_{2}g \\ m_{3}g \\ m_{4}g \end{array} \right]\) + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}21}]:} \PY{n}{k1}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{k2}\PY{p}{=}\PY{l+m+mi}{100000}\PY{p}{;} + \PY{n}{k3}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} + \PY{n}{k4}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} + \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} + \PY{n}{m3}\PY{p}{=}\PY{l+m+mi}{3}\PY{p}{;} + \PY{n}{m4}\PY{p}{=}\PY{l+m+mi}{4}\PY{p}{;} + \PY{n}{g}\PY{p}{=}\PY{l+m+mf}{9.81}\PY{p}{;} \PY{c}{\PYZpc{} m/s\PYZca{}2} + \PY{n}{K}\PY{p}{=}\PY{p}{[}\PY{n}{k1}\PY{o}{+}\PY{n}{k2} \PY{o}{\PYZhy{}}\PY{n}{k2} \PY{l+m+mi}{0} \PY{l+m+mi}{0}\PY{p}{;} \PY{o}{\PYZhy{}}\PY{n}{k2} \PY{n}{k2}\PY{o}{+}\PY{n}{k3} \PY{o}{\PYZhy{}}\PY{n}{k3} \PY{l+m+mi}{0}\PY{p}{;} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k3} \PY{n}{k3}\PY{o}{+}\PY{n}{k4} \PY{o}{\PYZhy{}}\PY{n}{k4}\PY{p}{;} \PY{l+m+mi}{0} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k4} \PY{n}{k4}\PY{p}{]} + \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{n}{m1}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m2}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m3}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m4}\PY{o}{*}\PY{n}{g}\PY{p}{]} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K = + + 100010 -100000 0 0 + -100000 100010 -10 0 + 0 -10 11 -1 + 0 0 -1 1 + +y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}25}]:} \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{n+nb}{inf}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{fro\PYZsq{}}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = 3.2004e+05 +ans = 3.2004e+05 +ans = 2.5925e+05 +ans = 2.5293e+05 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}26}]:} \PY{n+nb}{e}\PY{p}{=}\PY{n+nb}{eig}\PY{p}{(}\PY{n}{K}\PY{p}{)} + \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{e}\PY{p}{)}\PY{o}{/}\PY{n+nb}{min}\PY{p}{(}\PY{n+nb}{e}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +e = + + 7.9078e-01 + 3.5881e+00 + 1.7621e+01 + 2.0001e+05 + +ans = 2.5293e+05 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor} }]:} +\end{Verbatim} + + + % Add a bibliography block to the postdoc + + + + \end{document} diff --git a/lecture_12/lecture_12_files/lecture_12_21_0.pdf b/lecture_12/lecture_12_files/lecture_12_21_0.pdf new file mode 100644 index 0000000..6480131 Binary files /dev/null and b/lecture_12/lecture_12_files/lecture_12_21_0.pdf differ diff --git a/lecture_12/lecture_12_files/lecture_12_21_0.png b/lecture_12/lecture_12_files/lecture_12_21_0.png new file mode 100644 index 0000000..2633731 Binary files /dev/null and b/lecture_12/lecture_12_files/lecture_12_21_0.png differ diff --git a/lecture_12/lecture_12_files/lecture_12_21_0.svg b/lecture_12/lecture_12_files/lecture_12_21_0.svg new file mode 100644 index 0000000..44ef608 --- /dev/null +++ b/lecture_12/lecture_12_files/lecture_12_21_0.svg @@ -0,0 +1,148 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0.0005 + + + + + 0.001 + + + + + 0.0015 + + + + + 0.002 + + + + + 0 + + + + + 20 + + + + + 40 + + + + + 60 + + + + + 80 + + + + + 100 + + + + + + + + + + + + + inversion + + + + + inversion + + + + + + backslash + + + backslash + + + + + + multiplication + + + multiplication + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_12/lecture_12_files/lecture_12_24_0.pdf b/lecture_12/lecture_12_files/lecture_12_24_0.pdf new file mode 100644 index 0000000..e2d1d9b Binary files /dev/null and b/lecture_12/lecture_12_files/lecture_12_24_0.pdf differ diff --git a/lecture_12/lecture_12_files/lecture_12_24_0.png b/lecture_12/lecture_12_files/lecture_12_24_0.png new file mode 100644 index 0000000..c8959a7 Binary files /dev/null and b/lecture_12/lecture_12_files/lecture_12_24_0.png differ diff --git a/lecture_12/lecture_12_files/lecture_12_24_0.svg b/lecture_12/lecture_12_files/lecture_12_24_0.svg new file mode 100644 index 0000000..4705883 --- /dev/null +++ b/lecture_12/lecture_12_files/lecture_12_24_0.svg @@ -0,0 +1,148 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0.0005 + + + + + 0.001 + + + + + 0.0015 + + + + + 0.002 + + + + + 0 + + + + + 20 + + + + + 40 + + + + + 60 + + + + + 80 + + + + + 100 + + + + + + + + + + + + + inversion + + + + + inversion + + + + + + backslash + + + backslash + + + + + + multiplication + + + multiplication + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_12/nohup.out b/lecture_12/nohup.out new file mode 100644 index 0000000..f0d30e1 --- /dev/null +++ b/lecture_12/nohup.out @@ -0,0 +1,2 @@ + +(evince:8926): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -71 and height 20 diff --git a/lecture_12/octave-workspace b/lecture_12/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_12/octave-workspace differ diff --git a/lecture_13/.GS_rel.m.swp b/lecture_13/.GS_rel.m.swp new file mode 100644 index 0000000..58db6b3 Binary files /dev/null and b/lecture_13/.GS_rel.m.swp differ diff --git a/lecture_13/.GaussSeidel.m.swp b/lecture_13/.GaussSeidel.m.swp new file mode 100644 index 0000000..43abe04 Binary files /dev/null and b/lecture_13/.GaussSeidel.m.swp differ diff --git a/lecture_13/.Jacobi_rel.m.swp b/lecture_13/.Jacobi_rel.m.swp new file mode 100644 index 0000000..8f17e8f Binary files /dev/null and b/lecture_13/.Jacobi_rel.m.swp differ diff --git a/lecture_13/.ipynb_checkpoints/lecture_13-checkpoint.ipynb b/lecture_13/.ipynb_checkpoints/lecture_13-checkpoint.ipynb new file mode 100644 index 0000000..6a5dc68 --- /dev/null +++ b/lecture_13/.ipynb_checkpoints/lecture_13-checkpoint.ipynb @@ -0,0 +1,737 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## My question from last class \n", + "\n", + "\n", + "## Your questions from last class\n", + "\n", + "1. Need more linear algebra review\n", + " \n", + " -We will keep doing Linear Algebra, try the practice problems in 'linear_algebra'\n", + "\n", + "2. How do I do HW3? \n", + " \n", + " -demo today\n", + "\n", + "3. For hw4 is the spring constant (K) suppose to be given? \n", + " \n", + " -yes, its 30 N/m\n", + " \n", + "4. Deapool or Joker?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LU Decomposition\n", + "### efficient storage of matrices for solutions\n", + "\n", + "Considering the same solution set:\n", + "\n", + "$y=Ax$\n", + "\n", + "Assume that we can perform Gauss elimination and achieve this formula:\n", + "\n", + "$Ux=d$ \n", + "\n", + "Where, $U$ is an upper triangular matrix that we derived from Gauss elimination and $d$ is the set of dependent variables after Gauss elimination. \n", + "\n", + "Assume there is a lower triangular matrix, $L$, with ones on the diagonal and same dimensions of $U$ and the following is true:\n", + "\n", + "$L(Ux-d)=Ax-y=0$\n", + "\n", + "Now, $Ax=LUx$, so $A=LU$, and $y=Ld$.\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "f21=0.5\n", + "\n", + "A(2,1)=1-1 = 0 \n", + "\n", + "A(2,2)=3-0.5=2.5\n", + "\n", + "y(2)=1-0.5=0.5\n", + "\n", + "$L(Ux-d)=\n", + "\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0.5 & 1 \\end{array} \\right]\n", + "\\left(\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "0 & 2.5 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]-\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "0.5\\end{array}\\right]\\right)=0$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000\n", + " 0.50000 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 1.00000\n", + " 0.00000 2.50000\n", + "\n", + "ans =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "d =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + "\n", + "y =\n", + "\n", + " 1\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "L=[1,0;0.5,1]\n", + "U=[2,1;0,2.5]\n", + "L*U\n", + "\n", + "d=[1;0.5]\n", + "y=L*d" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 5.0000\n", + "ans = 1\n", + "ans = 5\n", + "ans = 5\n", + "ans = 5.0000\n" + ] + } + ], + "source": [ + "% what is the determinant of L, U and A?\n", + "\n", + "det(A)\n", + "det(L)\n", + "det(U)\n", + "det(L)*det(U)\n", + "det(L*U)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pivoting for LU factorization\n", + "\n", + "LU factorization uses the same method as Gauss elimination so it is also necessary to perform partial pivoting when creating the lower and upper triangular matrices. \n", + "\n", + "Matlab and Octave use pivoting in the command \n", + "\n", + "`[L,U,P]=lu(A)`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'lu' is a built-in function from the file libinterp/corefcn/lu.cc\n", + "\n", + " -- Built-in Function: [L, U] = lu (A)\n", + " -- Built-in Function: [L, U, P] = lu (A)\n", + " -- Built-in Function: [L, U, P, Q] = lu (S)\n", + " -- Built-in Function: [L, U, P, Q, R] = lu (S)\n", + " -- Built-in Function: [...] = lu (S, THRES)\n", + " -- Built-in Function: Y = lu (...)\n", + " -- Built-in Function: [...] = lu (..., \"vector\")\n", + " Compute the LU decomposition of A.\n", + "\n", + " If A is full subroutines from LAPACK are used and if A is sparse\n", + " then UMFPACK is used.\n", + "\n", + " The result is returned in a permuted form, according to the\n", + " optional return value P. For example, given the matrix 'a = [1, 2;\n", + " 3, 4]',\n", + "\n", + " [l, u, p] = lu (A)\n", + "\n", + " returns\n", + "\n", + " l =\n", + "\n", + " 1.00000 0.00000\n", + " 0.33333 1.00000\n", + "\n", + " u =\n", + "\n", + " 3.00000 4.00000\n", + " 0.00000 0.66667\n", + "\n", + " p =\n", + "\n", + " 0 1\n", + " 1 0\n", + "\n", + " The matrix is not required to be square.\n", + "\n", + " When called with two or three output arguments and a spare input\n", + " matrix, 'lu' does not attempt to perform sparsity preserving column\n", + " permutations. Called with a fourth output argument, the sparsity\n", + " preserving column transformation Q is returned, such that 'P * A *\n", + " Q = L * U'.\n", + "\n", + " Called with a fifth output argument and a sparse input matrix, 'lu'\n", + " attempts to use a scaling factor R on the input matrix such that 'P\n", + " * (R \\ A) * Q = L * U'. This typically leads to a sparser and more\n", + " stable factorization.\n", + "\n", + " An additional input argument THRES, that defines the pivoting\n", + " threshold can be given. THRES can be a scalar, in which case it\n", + " defines the UMFPACK pivoting tolerance for both symmetric and\n", + " unsymmetric cases. If THRES is a 2-element vector, then the first\n", + " element defines the pivoting tolerance for the unsymmetric UMFPACK\n", + " pivoting strategy and the second for the symmetric strategy. By\n", + " default, the values defined by 'spparms' are used ([0.1, 0.001]).\n", + "\n", + " Given the string argument \"vector\", 'lu' returns the values of P\n", + " and Q as vector values, such that for full matrix, 'A (P,:) = L *\n", + " U', and 'R(P,:) * A (:, Q) = L * U'.\n", + "\n", + " With two output arguments, returns the permuted forms of the upper\n", + " and lower triangular matrices, such that 'A = L * U'. With one\n", + " output argument Y, then the matrix returned by the LAPACK routines\n", + " is returned. If the input matrix is sparse then the matrix L is\n", + " embedded into U to give a return value similar to the full case.\n", + " For both full and sparse matrices, 'lu' loses the permutation\n", + " information.\n", + "\n", + " See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help lu" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=inv(L)*y; x=inv(U)*d; t_lu(N)=toc;\n", + "\n", + " tic; x=inv(A)*y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use,\n", + "\n", + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n" + ] + } + ], + "source": [ + "K" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "(U'*U)'==U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06\n", + "average time spent for backslash solution = 1.555967e-05+/-1.048561e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_13/.lambda_fcn.m.swp b/lecture_13/.lambda_fcn.m.swp new file mode 100644 index 0000000..5031365 Binary files /dev/null and b/lecture_13/.lambda_fcn.m.swp differ diff --git a/lecture_13/GS_rel.m b/lecture_13/GS_rel.m new file mode 100644 index 0000000..4a6daf4 --- /dev/null +++ b/lecture_13/GS_rel.m @@ -0,0 +1,36 @@ +function [x,ea,iter] = GS_rel(A,b,lambda,es,maxit) +% GaussSeidel: Gauss Seidel method +% x = GaussSeidel(A,b): Gauss Seidel without relaxation +% input: +% A = coefficient matrix +% b = right hand side vector +% es = stop criterion (default = 0.00001%) +% maxit = max iterations (default = 50) +% output: +% x = solution vector +if nargin<3,error('at least 2 input arguments required'),end +if nargin<5|isempty(maxit),maxit=50;end +if nargin<4|isempty(es),es=0.00001;end +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +C = A-diag(diag(A)); +x=zeros(n,1); +for i = 1:n + C(i,1:n) = C(i,1:n)/A(i,i); +end + +d = b./diag(A); + +iter = 0; +while (1) + xold = x; + for i = 1:n + x(i) = d(i)-C(i,:)*x; + x(i) = lambda*x(i)+(1-lambda)*xold(i); + if x(i) ~= 0 + ea(i) = abs((x(i) - xold(i))/x(i)) * 100; + end + end + iter = iter+1; + if max(ea)<=es | iter >= maxit, break, end +end diff --git a/lecture_13/GaussSeidel.m b/lecture_13/GaussSeidel.m new file mode 100644 index 0000000..2be52e1 --- /dev/null +++ b/lecture_13/GaussSeidel.m @@ -0,0 +1,35 @@ +function x = GaussSeidel(A,b,es,maxit) +% GaussSeidel: Gauss Seidel method +% x = GaussSeidel(A,b): Gauss Seidel without relaxation +% input: +% A = coefficient matrix +% b = right hand side vector +% es = stop criterion (default = 0.00001%) +% maxit = max iterations (default = 50) +% output: +% x = solution vector +if nargin<2,error('at least 2 input arguments required'),end +if nargin<4|isempty(maxit),maxit=50;end +if nargin<3|isempty(es),es=0.00001;end +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +C = A-diag(diag(A)); +x=zeros(n,1); +for i = 1:n + C(i,1:n) = C(i,1:n)/A(i,i); +end + +d = b./diag(A); + +iter = 0; +while (1) + xold = x; + for i = 1:n + x(i) = d(i)-C(i,:)*x; + if x(i) ~= 0 + ea(i) = abs((x(i) - xold(i))/x(i)) * 100; + end + end + iter = iter+1; + if max(ea)<=es | iter >= maxit, break, end +end diff --git a/lecture_13/Jacobi.m b/lecture_13/Jacobi.m new file mode 100644 index 0000000..8a7b4ae --- /dev/null +++ b/lecture_13/Jacobi.m @@ -0,0 +1,39 @@ +function x = Jacobi(A,b,es,maxit) +% GaussSeidel: Gauss Seidel method +% x = GaussSeidel(A,b): Gauss Seidel without relaxation +% input: +% A = coefficient matrix +% b = right hand side vector +% es = stop criterion (default = 0.00001%) +% maxit = max iterations (default = 50) +% output: +% x = solution vector +if nargin<2,error('at least 2 input arguments required'),end +if nargin<4|isempty(maxit),maxit=50;end +if nargin<3|isempty(es),es=0.00001;end +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +C = A-diag(diag(A)); +x=zeros(n,1); +for i = 1:n + C(i,1:n) = C(i,1:n)/A(i,i); +end + +d = b./diag(A); + +iter = 0; +while (1) + xold = x; + x = d-C*x; + % if any values of x are zero, we add 1 to denominator so error is well-behaved + i_zero=find(x==0); + i=find(x~=0); + if length(i_zero)>0 + ea(i_zero)=abs((x-xold)./(1+x)*100); + ea(i) = abs((x(i) - xold(i))./x(i)) * 100; + else + ea = abs((x - xold)./x) * 100; + end + iter = iter+1; + if max(ea)<=es | iter >= maxit, break, end +end diff --git a/lecture_13/Jacobi_rel.m b/lecture_13/Jacobi_rel.m new file mode 100644 index 0000000..5cdec33 --- /dev/null +++ b/lecture_13/Jacobi_rel.m @@ -0,0 +1,41 @@ +function [x,ea,iter]= Jacobi_rel(A,b,lambda,es,maxit) +% GaussSeidel: Gauss Seidel method +% x = GaussSeidel(A,b): Gauss Seidel without relaxation +% input: +% A = coefficient matrix +% b = right hand side vector +% es = stop criterion (default = 0.00001%) +% maxit = max iterations (default = 50) +% output: +% x = solution vector +if nargin<3,error('at least 2 input arguments required'),end +if nargin<5|isempty(maxit),maxit=50;end +if nargin<4|isempty(es),es=0.00001;end +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +C = A-diag(diag(A)); +x=zeros(n,1); +for i = 1:n + C(i,1:n) = C(i,1:n)/A(i,i); +end + +d = b./diag(A); + +iter = 0; +while (1) + xold = x; + x = d-C*x; + % Add relaxation parameter lambda to current iteration + x = lambda*x+(1-lambda)*xold; + % if any values of x are zero, we add 1 to denominator so error is well-behaved + i_zero=find(x==0); + i=find(x~=0); + if length(i_zero)>0 + ea(i_zero)=abs((x-xold)./(1+x)*100); + ea(i) = abs((x(i) - xold(i))./x(i)) * 100; + else + ea = abs((x - xold)./x) * 100; + end + iter = iter+1; + if max(ea)<=es | iter >= maxit, break, end +end diff --git a/lecture_13/LU_naive.m b/lecture_13/LU_naive.m new file mode 100644 index 0000000..92efde6 --- /dev/null +++ b/lecture_13/LU_naive.m @@ -0,0 +1,27 @@ +function [L, U] = LU_naive(A) +% GaussNaive: naive Gauss elimination +% x = GaussNaive(A,b): Gauss elimination without pivoting. +% input: +% A = coefficient matrix +% y = right hand side vector +% output: +% x = solution vector +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +nb = n; +L=diag(ones(n,1)); +U=A; +% forward elimination +for k = 1:n-1 + for i = k+1:n + fik = U(i,k)/U(k,k); + L(i,k)=fik; + U(i,k:nb) = U(i,k:nb)-fik*U(k,k:nb); + end +end +%% back substitution +%x = zeros(n,1); +%x(n) = Aug(n,nb)/Aug(n,n); +%for i = n-1:-1:1 +% x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +%end diff --git a/lecture_13/efficient_soln.png b/lecture_13/efficient_soln.png new file mode 100644 index 0000000..ef24ece Binary files /dev/null and b/lecture_13/efficient_soln.png differ diff --git a/lecture_13/gp_image_01.png b/lecture_13/gp_image_01.png new file mode 100644 index 0000000..ef291b5 Binary files /dev/null and b/lecture_13/gp_image_01.png differ diff --git a/lecture_13/lambda_fcn.m b/lecture_13/lambda_fcn.m new file mode 100644 index 0000000..435f9e9 --- /dev/null +++ b/lecture_13/lambda_fcn.m @@ -0,0 +1,8 @@ +function iters = lambda_fcn(A,b,lambda) + % function to minimize the number of iterations for a given Ax=b solution + % using default Jacobi_rel parameters of es=0.00001 and maxit=50 + + [x,ea,iters]= Jacobi_rel(A,b,lambda,1e-8); +end + + diff --git a/lecture_13/lecture_13.aux b/lecture_13/lecture_13.aux new file mode 100644 index 0000000..30cf1b4 --- /dev/null +++ b/lecture_13/lecture_13.aux @@ -0,0 +1,63 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.1}My question from last class}{1}{subsection.0.1}} +\newlabel{my-question-from-last-class}{{0.1}{1}{My question from last class}{subsection.0.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces q1\relax }}{1}{figure.caption.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {0.2}Your questions from last class}{1}{subsection.0.2}} +\newlabel{your-questions-from-last-class}{{0.2}{1}{Your questions from last class}{subsection.0.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces q2\relax }}{2}{figure.caption.2}} +\@writefile{toc}{\contentsline {section}{\numberline {1}Markdown examples}{2}{section.1}} +\newlabel{markdown-examples}{{1}{2}{Markdown examples}{section.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Condition of a matrix}{3}{subsection.1.1}} +\newlabel{condition-of-a-matrix}{{1.1}{3}{Condition of a matrix}{subsection.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}\emph {just checked in to see what condition my condition was in}}{3}{subsubsection.1.1.1}} +\newlabel{just-checked-in-to-see-what-condition-my-condition-was-in}{{1.1.1}{3}{\texorpdfstring {\emph {just checked in to see what condition my condition was in}}{just checked in to see what condition my condition was in}}{subsubsection.1.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Matrix norms}{3}{subsubsection.1.1.2}} +\newlabel{matrix-norms}{{1.1.2}{3}{Matrix norms}{subsubsection.1.1.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.3}Condition of Matrix}{3}{subsubsection.1.1.3}} +\newlabel{condition-of-matrix}{{1.1.3}{3}{Condition of Matrix}{subsubsection.1.1.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Springs-masses\relax }}{5}{figure.caption.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}P=2 norm is ratio of biggest eigenvalue to smallest eigenvalue!}{7}{subsection.1.2}} +\newlabel{p2-norm-is-ratio-of-biggest-eigenvalue-to-smallest-eigenvalue}{{1.2}{7}{P=2 norm is ratio of biggest eigenvalue to smallest eigenvalue!}{subsection.1.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Iterative Methods}{7}{section.2}} +\newlabel{iterative-methods}{{2}{7}{Iterative Methods}{section.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Gauss-Seidel method}{7}{subsection.2.1}} +\newlabel{gauss-seidel-method}{{2.1}{7}{Gauss-Seidel method}{subsection.2.1}{}} +\gdef \LT@i {\LT@entry + {1}{52.97838pt}\LT@entry + {1}{181.1121pt}\LT@entry + {1}{35.4892pt}\LT@entry + {1}{179.80707pt}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.1.1}Gauss-Seidel Iterative approach}{8}{subsubsection.2.1.1}} +\newlabel{gauss-seidel-iterative-approach}{{2.1.1}{8}{Gauss-Seidel Iterative approach}{subsubsection.2.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.1.2}Jacobi method}{8}{subsubsection.2.1.2}} +\newlabel{jacobi-method}{{2.1.2}{8}{Jacobi method}{subsubsection.2.1.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Gauss-Seidel with Relaxation}{11}{subsection.2.2}} +\newlabel{gauss-seidel-with-relaxation}{{2.2}{11}{Gauss-Seidel with Relaxation}{subsection.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Nonlinear Systems}{13}{subsection.2.3}} +\newlabel{nonlinear-systems}{{2.3}{13}{Nonlinear Systems}{subsection.2.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Newton-Raphson part II}{14}{subsection.2.4}} +\newlabel{newton-raphson-part-ii}{{2.4}{14}{Newton-Raphson part II}{subsection.2.4}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}Solution is again in the form Ax=b}{15}{subsubsection.2.4.1}} +\newlabel{solution-is-again-in-the-form-axb}{{2.4.1}{15}{Solution is again in the form Ax=b}{subsubsection.2.4.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}Example of Jacobian calculation}{15}{subsection.2.5}} +\newlabel{example-of-jacobian-calculation}{{2.5}{15}{Example of Jacobian calculation}{subsection.2.5}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.1}Nonlinear springs supporting two masses in series}{15}{subsubsection.2.5.1}} +\newlabel{nonlinear-springs-supporting-two-masses-in-series}{{2.5.1}{15}{Nonlinear springs supporting two masses in series}{subsubsection.2.5.1}{}} diff --git a/lecture_13/lecture_13.bbl b/lecture_13/lecture_13.bbl new file mode 100644 index 0000000..e69de29 diff --git a/lecture_13/lecture_13.blg b/lecture_13/lecture_13.blg new file mode 100644 index 0000000..fb66ca0 --- /dev/null +++ b/lecture_13/lecture_13.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2015/Debian) +Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 +The top-level auxiliary file: lecture_13.aux +I found no \citation commands---while reading file lecture_13.aux +I found no \bibdata command---while reading file lecture_13.aux +I found no \bibstyle command---while reading file lecture_13.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 494 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/lecture_13/lecture_13.ipynb b/lecture_13/lecture_13.ipynb new file mode 100644 index 0000000..913f44f --- /dev/null +++ b/lecture_13/lecture_13.ipynb @@ -0,0 +1,5325 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## My question from last class \n", + "\n", + "![q1](efficient_soln.png)\n", + "\n", + "![A](https://lh4.googleusercontent.com/fmG7EnFxpvvjSgijOuwz8osuiH3cBDgOzTE64KnfQeeDDSG2oE86-BzcpYIQMVkkAgRRGEDEGi6-Nkr8qmEMeaAk-gcjEmXe42WFYUdOa5XoUaBkXRakkA77_XrkRjArCGZIFhjjDRoO7x0)\n", + "\n", + "![q2](norm_A.png)\n", + "\n", + "\n", + "## Your questions from last class\n", + "\n", + "1. Do we have to submit a link for HW #4 somewhere or is uploading to Github sufficient?\n", + " \n", + " -no, your submission from HW 3 is sufficient\n", + "\n", + "2. How do I get the formulas/formatting in markdown files to show up on github?\n", + " \n", + " -no luck for markdown equations in github, this is an ongoing request\n", + " \n", + "3. Confused about the p=1 norm part and ||A||_1\n", + "\n", + "4. When's the exam?\n", + " \n", + " -next week (3/9)\n", + "\n", + "5. What do you recommend doing to get better at figuring out the homeworks?\n", + "\n", + " -time and experimenting (try going through the lecture examples, verify my work)\n", + " \n", + "6. Could we have an hw or extra credit with a video lecture to learn some simple python?\n", + " \n", + " -Sounds great! how simple? \n", + " \n", + " -[Installing Python and Jupyter Notebook (via Anaconda) - https://www.continuum.io/downloads](https://www.continuum.io/downloads)\n", + " \n", + " -[Running Matlab kernel in Jupyter - https://anneurai.net/2015/11/12/matlab-based-ipython-notebooks/](https://anneurai.net/2015/11/12/matlab-based-ipython-notebooks/)\n", + " \n", + " -[Running Octave kernel in Jupyter - https://anaconda.org/pypi/octave_kernel](https://anaconda.org/pypi/octave_kernel)\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Markdown examples\n", + "\n", + "` \" ' ` `\n", + "\n", + "```matlab\n", + "x=linspace(0,1);\n", + "y=x.^2;\n", + "plot(x,y)\n", + "for i = 1:10\n", + " fprintf('markdown is pretty')\n", + "end\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Condition of a matrix \n", + "### *just checked in to see what condition my condition was in*\n", + "### Matrix norms\n", + "\n", + "The Euclidean norm of a vector is measure of the magnitude (in 3D this would be: $|x|=\\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}$) in general the equation is:\n", + "\n", + "$||x||_{e}=\\sqrt{\\sum_{i=1}^{n}x_{i}^{2}}$\n", + "\n", + "For a matrix, A, the same norm is called the Frobenius norm:\n", + "\n", + "$||A||_{f}=\\sqrt{\\sum_{i=1}^{n}\\sum_{j=1}^{m}A_{i,j}^{2}}$\n", + "\n", + "In general we can calculate any $p$-norm where\n", + "\n", + "$||A||_{p}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{p}}$\n", + "\n", + "so the p=1, 1-norm is \n", + "\n", + "$||A||_{1}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{1}}=\\sum_{i=1}^{n}\\sum_{i=1}^{m}|A_{i,j}|$\n", + "\n", + "$||A||_{\\infty}=\\sqrt{\\sum_{i=1}^{n}\\sum_{i=1}^{m}A_{i,j}^{\\infty}}=\\max_{1\\le i \\le n}\\sum_{j=1}^{m}|A_{i,j}|$\n", + "\n", + "### Condition of Matrix\n", + "\n", + "The matrix condition is the product of \n", + "\n", + "$Cond(A) = ||A||\\cdot||A^{-1}||$ \n", + "\n", + "So each norm will have a different condition number, but the limit is $Cond(A)\\ge 1$\n", + "\n", + "An estimate of the rounding error is based on the condition of A:\n", + "\n", + "$\\frac{||\\Delta x||}{x} \\le Cond(A) \\frac{||\\Delta A||}{||A||}$\n", + "\n", + "So if the coefficients of A have accuracy to $10^{-t}\n", + "\n", + "and the condition of A, $Cond(A)=10^{c}$\n", + "\n", + "then the solution for x can have rounding errors up to $10^{c-t}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 1.00000 0.50000 0.33333\n", + " 0.50000 0.33333 0.25000\n", + " 0.33333 0.25000 0.20000\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000 0.00000\n", + " 0.50000 1.00000 0.00000\n", + " 0.33333 1.00000 1.00000\n", + "\n", + "U =\n", + "\n", + " 1.00000 0.50000 0.33333\n", + " 0.00000 0.08333 0.08333\n", + " 0.00000 -0.00000 0.00556\n", + "\n" + ] + } + ], + "source": [ + "A=[1,1/2,1/3;1/2,1/3,1/4;1/3,1/4,1/5]\n", + "[L,U]=LU_naive(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Then, $A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$\n", + "\n", + "$Ld_{1}=\\left[\\begin{array}{c}\n", + "1 \\\\\n", + "0 \\\\\n", + "0 \\end{array}\\right]$, $Ux_{1}=d_{1}$ ..." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invA =\n", + "\n", + " 9.0000 -36.0000 30.0000\n", + " -36.0000 192.0000 -180.0000\n", + " 30.0000 -180.0000 180.0000\n", + "\n", + "ans =\n", + "\n", + " 1.0000e+00 3.5527e-15 2.9976e-15\n", + " -1.3249e-14 1.0000e+00 -9.1038e-15\n", + " 8.5117e-15 7.1054e-15 1.0000e+00\n", + "\n" + ] + } + ], + "source": [ + "invA=zeros(3,3);\n", + "d1=L\\[1;0;0];\n", + "d2=L\\[0;1;0];\n", + "d3=L\\[0;0;1];\n", + "invA(:,1)=U\\d1; % shortcut invA(:,1)=A\\[1;0;0]\n", + "invA(:,2)=U\\d2;\n", + "invA(:,3)=U\\d3\n", + "invA*A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find the condition of A, $cond(A)$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "normf_A = 1.4136\n", + "normf_invA = 372.21\n", + "cond_f_A = 526.16\n", + "ans = 1.4136\n", + "norm1_A = 1.8333\n", + "norm1_invA = 30.000\n", + "ans = 1.8333\n", + "cond_1_A = 55.000\n", + "norminf_A = 1.8333\n", + "norminf_invA = 30.000\n", + "ans = 1.8333\n", + "cond_inf_A = 55.000\n" + ] + } + ], + "source": [ + "% Frobenius norm\n", + "normf_A = sqrt(sum(sum(A.^2)))\n", + "normf_invA = sqrt(sum(sum(invA.^2)))\n", + "\n", + "cond_f_A = normf_A*normf_invA\n", + "\n", + "norm(A,'fro')\n", + "\n", + "% p=1, column sum norm\n", + "norm1_A = max(sum(A,2))\n", + "norm1_invA = max(sum(invA,2))\n", + "norm(A,1)\n", + "\n", + "cond_1_A=norm1_A*norm1_invA\n", + "\n", + "% p=inf, row sum norm\n", + "norminf_A = max(sum(A,1))\n", + "norminf_invA = max(sum(invA,1))\n", + "norm(A,inf)\n", + "\n", + "cond_inf_A=norminf_A*norminf_invA\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with spring constants $K_{i}$. What does a high condition number mean for this problem? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.png)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$\n", + "\n", + "$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k_{4}(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "k_{1}+k_{2} & -k_{2} & 0 & 0 \\\\\n", + "-k_{2} & k_{2}+k_{3} & -k_{3} & 0 \\\\\n", + "0 & -k_{3} & k_{3}+k_{4} & -k_{4} \\\\\n", + "0 & 0 & -k_{4} & k_{4} \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 100010 -100000 0 0\n", + " -100000 100010 -10 0\n", + " 0 -10 11 -1\n", + " 0 0 -1 1\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k1=10; % N/m\n", + "k2=100000;\n", + "k3=10;\n", + "k4=1;\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[k1+k2 -k2 0 0; -k2 k2+k3 -k3 0; 0 -k3 k3+k4 -k4; 0 0 -k4 k4]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 3.2004e+05\n", + "ans = 3.2004e+05\n", + "ans = 2.5925e+05\n", + "ans = 2.5293e+05\n" + ] + } + ], + "source": [ + "cond(K,inf)\n", + "cond(K,1)\n", + "cond(K,'fro')\n", + "cond(K,2)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e =\n", + "\n", + " 7.9078e-01\n", + " 3.5881e+00\n", + " 1.7621e+01\n", + " 2.0001e+05\n", + "\n", + "ans = 2.5293e+05\n" + ] + } + ], + "source": [ + "e=eig(K)\n", + "max(e)/min(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## P=2 norm is ratio of biggest eigenvalue to smallest eigenvalue!\n", + "\n", + "no need to calculate the inv(K)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Iterative Methods\n", + "\n", + "## Gauss-Seidel method\n", + "\n", + "If we have an intial guess for each value of a vector $x$ that we are trying to solve, then it is easy enough to solve for one component given the others. \n", + "\n", + "Take a 3$\\times$3 matrix \n", + "\n", + "$Ax=b$\n", + "\n", + "$\\left[ \\begin{array}{ccc}\n", + "3 & -0.1 & -0.2 \\\\\n", + "0.1 & 7 & -0.3 \\\\\n", + "0.3 & -0.2 & 10 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "7.85 \\\\\n", + "-19.3 \\\\\n", + "71.4\\end{array} \\right]$\n", + "\n", + "$x_{1}=\\frac{7.85+0.1x_{2}+0.2x_{3}}{3}$\n", + "\n", + "$x_{2}=\\frac{-19.3-0.1x_{1}+0.3x_{3}}{7}$\n", + "\n", + "$x_{3}=\\frac{71.4+0.1x_{1}+0.2x_{2}}{10}$" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 3.00000 -0.10000 -0.20000\n", + " 0.10000 7.00000 -0.30000\n", + " 0.30000 -0.20000 10.00000\n", + "\n", + "b =\n", + "\n", + " 7.8500\n", + " -19.3000\n", + " 71.4000\n", + "\n", + "x =\n", + "\n", + " 3.0000\n", + " -2.5000\n", + " 7.0000\n", + "\n" + ] + } + ], + "source": [ + "A=[3 -0.1 -0.2;0.1 7 -0.3;0.3 -0.2 10]\n", + "b=[7.85;-19.3;71.4]\n", + "\n", + "x=A\\b" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### Gauss-Seidel Iterative approach\n", + "\n", + "As a first guess, we can use $x_{1}=x_{2}=x_{3}=0$\n", + "\n", + "$x_{1}=\\frac{7.85+0.1(0)+0.3(0)}{3}=2.6167$\n", + "\n", + "$x_{2}=\\frac{-19.3-0.1(2.6167)+0.3(0)}{7}=-2.7945$\n", + "\n", + "$x_{3}=\\frac{71.4+0.1(2.6167)+0.2(-2.7945)}{10}=7.0056$\n", + "\n", + "Then, we update the guess:\n", + "\n", + "$x_{1}=\\frac{7.85+0.1(-2.7945)+0.3(7.0056)}{3}=2.9906$\n", + "\n", + "$x_{2}=\\frac{-19.3-0.1(2.9906)+0.3(7.0056)}{7}=-2.4996$\n", + "\n", + "$x_{3}=\\frac{71.4+0.1(2.9906)+0.2(-2.4966)}{10}=7.00029$\n", + "\n", + "The results are conveerging to the solution we found with `\\` of $x_{1}=3,~x_{2}=-2.5,~x_{3}=7$\n", + "\n", + "We could also use an iterative method that solves for all of the x-components in one step:\n", + "\n", + "### Jacobi method\n", + "\n", + "$x_{1}^{i}=\\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$\n", + "\n", + "$x_{2}^{i}=\\frac{-19.3-0.1x_{1}^{i-1}+0.3x_{3}^{i-1}}{7}$\n", + "\n", + "$x_{3}^{i}=\\frac{71.4+0.1x_{1}^{i-1}+0.2x_{2}^{i-1}}{10}$\n", + "\n", + "Here the solution is a matrix multiplication and vector addition\n", + "\n", + "$\\left[ \\begin{array}{c}\n", + "x_{1}^{i} \\\\\n", + "x_{2}^{i} \\\\\n", + "x_{3}^{i} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "7.85/3 \\\\\n", + "-19.3/7 \\\\\n", + "71.4/10\\end{array} \\right]-\n", + "\\left[ \\begin{array}{ccc}\n", + "0 & 0.1/3 & 0.2/3 \\\\\n", + "0.1/7 & 0 & -0.3/7 \\\\\n", + "0.3/10 & -0.2/10 & 0 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1}^{i-1} \\\\\n", + "x_{2}^{i-1} \\\\\n", + "x_{3}^{i-1} \\end{array} \\right]$\n", + "\n", + "|x_{j}|Jacobi method |vs| Gauss-Seidel |\n", + "|--------|------------------------------|---|-------------------------------|\n", + "|$x_{1}^{i}=$ | $\\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$ | | $\\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$|\n", + "|$x_{2}^{i}=$ | $\\frac{-19.3-0.1x_{1}^{i-1}+0.3x_{3}^{i-1}}{7}$ | | $\\frac{-19.3-0.1x_{1}^{i}+0.3x_{3}^{i-1}}{7}$ |\n", + "|$x_{3}^{i}=$ | $\\frac{71.4+0.1x_{1}^{i-1}+0.2x_{2}^{i-1}}{10}$ | | $\\frac{71.4+0.1x_{1}^{i}+0.2x_{2}^{i}}{10}$|" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ba =\n", + "\n", + " 2.6167\n", + " -2.7571\n", + " 7.1400\n", + "\n", + "sA =\n", + "\n", + " 0.00000 -0.10000 -0.20000\n", + " 0.10000 0.00000 -0.30000\n", + " 0.30000 -0.20000 0.00000\n", + "\n", + "sA =\n", + "\n", + " 0.000000 -0.033333 -0.066667\n", + " 0.014286 0.000000 -0.042857\n", + " 0.030000 -0.020000 0.000000\n", + "\n", + "x1 =\n", + "\n", + " 2.6167\n", + " -2.7571\n", + " 7.1400\n", + "\n", + "x2 =\n", + "\n", + " 3.0008\n", + " -2.4885\n", + " 7.0064\n", + "\n", + "x3 =\n", + "\n", + " 3.0008\n", + " -2.4997\n", + " 7.0002\n", + "\n", + "solution is converging to [3,-2.5,7]]\n" + ] + } + ], + "source": [ + "ba=b./diag(A) % or ba=b./[A(1,1);A(2,2);A(3,3)]\n", + "sA=A-diag(diag(A)) % A with zeros on diagonal\n", + "sA(1,:)=sA(1,:)/A(1,1);\n", + "sA(2,:)=sA(2,:)/A(2,2);\n", + "sA(3,:)=sA(3,:)/A(3,3)\n", + "x0=[0;0;0];\n", + "x1=ba-sA*x0\n", + "x2=ba-sA*x1\n", + "x3=ba-sA*x2\n", + "fprintf('solution is converging to [3,-2.5,7]]\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 3\n", + " 7\n", + " 10\n", + "\n", + "ans =\n", + "\n", + "Diagonal Matrix\n", + "\n", + " 3 0 0\n", + " 0 7 0\n", + " 0 0 10\n", + "\n" + ] + } + ], + "source": [ + "diag(A)\n", + "diag(diag(A))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This method works if problem is diagonally dominant, \n", + "\n", + "$|a_{ii}|>\\sum_{j=1,j\\ne i}^{n}|a_{ij}|$\n", + "\n", + "If this condition is true, then Jacobi or Gauss-Seidel should converge\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 0.10000 1.00000 3.00000\n", + " 1.00000 0.20000 3.00000\n", + " 5.00000 2.00000 0.30000\n", + "\n", + "b =\n", + "\n", + " 12\n", + " 2\n", + " 4\n", + "\n", + "ans =\n", + "\n", + " -2.9393\n", + " 9.1933\n", + " 1.0336\n", + "\n" + ] + } + ], + "source": [ + "A=[0.1,1,3;1,0.2,3;5,2,0.3]\n", + "b=[12;2;4]\n", + "A\\b" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ba =\n", + "\n", + " 120.000\n", + " 10.000\n", + " 13.333\n", + "\n", + "sA =\n", + "\n", + " 0 1 3\n", + " 1 0 3\n", + " 5 2 0\n", + "\n", + "sA =\n", + "\n", + " 0.00000 10.00000 30.00000\n", + " 5.00000 0.00000 15.00000\n", + " 16.66667 6.66667 0.00000\n", + "\n", + "x1 =\n", + "\n", + " 120.000\n", + " 10.000\n", + " 13.333\n", + "\n", + "x2 =\n", + "\n", + " -380.00\n", + " -790.00\n", + " -2053.33\n", + "\n", + "x3 =\n", + "\n", + " 6.9620e+04\n", + " 3.2710e+04\n", + " 1.1613e+04\n", + "\n", + "solution is not converging to [-2.93,9.19,1.03]\n" + ] + } + ], + "source": [ + "ba=b./diag(A) % or ba=b./[A(1,1);A(2,2);A(3,3)]\n", + "sA=A-diag(diag(A)) % A with zeros on diagonal\n", + "sA(1,:)=sA(1,:)/A(1,1);\n", + "sA(2,:)=sA(2,:)/A(2,2);\n", + "sA(3,:)=sA(3,:)/A(3,3)\n", + "x0=[0;0;0];\n", + "x1=ba-sA*x0\n", + "x2=ba-sA*x1\n", + "x3=ba-sA*x2\n", + "fprintf('solution is not converging to [-2.93,9.19,1.03]\\n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gauss-Seidel with Relaxation\n", + "\n", + "In order to force the solution to converge faster, we can introduce a relaxation term $\\lambda$. \n", + "\n", + "where the new x values are weighted between the old and new:\n", + "\n", + "$x^{i}=\\lambda x^{i}+(1-\\lambda)x^{i-1}$\n", + "\n", + "after solving for x, lambda weights the current approximation with the previous approximation for the updated x\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 3.00000 -0.10000 -0.20000\n", + " 0.10000 7.00000 -0.30000\n", + " 0.30000 -0.20000 10.00000\n", + "\n", + "b =\n", + "\n", + " 7.8500\n", + " -19.3000\n", + " 71.4000\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% rearrange A and b\n", + "A=[3 -0.1 -0.2;0.1 7 -0.3;0.3 -0.2 10]\n", + "b=[7.85;-19.3;71.4]\n", + "\n", + "iters=zeros(100,1);\n", + "for i=1:100\n", + " lambda=2/100*i;\n", + " [x,ea,iters(i)]=Jacobi_rel(A,b,lambda);\n", + "end\n", + "plot([1:100]*2/100,iters) " + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "l = 0.99158\r\n" + ] + } + ], + "source": [ + "l=fminbnd(@(l) lambda_fcn(A,b,l),0.5,1.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 3.0000\n", + " -2.5000\n", + " 7.0000\n", + "\n" + ] + } + ], + "source": [ + "A\\b" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 3.0000\n", + " -2.5000\n", + " 7.0000\n", + "\n", + "ea =\n", + "\n", + " 1.8289e-07\n", + " 2.1984e-08\n", + " 2.3864e-08\n", + "\n", + "iter = 8\n", + "x =\n", + "\n", + " 3.0000\n", + " -2.5000\n", + " 7.0000\n", + "\n", + "ea =\n", + "\n", + " 1.9130e-08\n", + " 7.6449e-08\n", + " 3.3378e-08\n", + "\n", + "iter = 8\n" + ] + } + ], + "source": [ + "[x,ea,iter]=Jacobi_rel(A,b,l,0.000001)\n", + "[x,ea,iter]=Jacobi_rel(A,b,1,0.000001)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Nonlinear Systems\n", + "\n", + "Consider two simultaneous nonlinear equations with two unknowns:\n", + "\n", + "$x_{1}^{2}+x_{1}x_{2}=10$\n", + "\n", + "$x_{2}+3x_{1}x_{2}^{2}=57$\n", + "\n", + "Graphically, we are looking for the solution:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x11=linspace(0.5,3);\n", + "x12=(10-x11.^2)./x11;\n", + "\n", + "x22=linspace(2,8);\n", + "x21=(57-x22).*x22.^-2/3;\n", + "\n", + "plot(x11,x12,x21,x22)\n", + "% Solution at x_1=2, x_2=3\n", + "hold on;\n", + "plot(2,3,'o')\n", + "xlabel('x_1')\n", + "ylabel('x_2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Newton-Raphson part II\n", + "\n", + "Remember the first order approximation for the next point in a function is:\n", + "\n", + "$f(x_{i+1})=f(x_{i})+(x_{i+1}-x_{i})f'(x_{i})$\n", + "\n", + "then, $f(x_{i+1})=0$ so we are left with:\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "We can use the same formula, but now we have multiple dimensions so we need to determine the Jacobian\n", + "\n", + "$[J]=\\left[ \\begin{array}{cccc}\n", + "\\frac{\\partial f_{1,i}}{\\partial x_{1}} & \\frac{\\partial f_{1,i}}{\\partial x_{2}} & \n", + "\\cdots & \\frac{\\partial f_{1,i}}{\\partial x_{n}} \\\\\n", + "\\frac{\\partial f_{2,i}}{\\partial x_{1}} & \\frac{\\partial f_{2,i}}{\\partial x_{2}} & \n", + "\\cdots & \\frac{\\partial f_{2,i}}{\\partial x_{n}} \\\\\n", + "\\vdots & \\vdots & & \\vdots \\\\\n", + "\\frac{\\partial f_{n,i}}{\\partial x_{1}} & \\frac{\\partial f_{n,i}}{\\partial x_{2}} & \n", + "\\cdots & \\frac{\\partial f_{n,i}}{\\partial x_{n}} \\\\\n", + "\\end{array} \\right]$\n", + "\n", + "$\\left[ \\begin{array}{c}\n", + "f_{1,i+1} \\\\\n", + "f_{2,i+1} \\\\\n", + "\\vdots \\\\\n", + "f_{n,i+1}\\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "f_{1,i} \\\\\n", + "f_{2,i} \\\\\n", + "\\vdots \\\\\n", + "f_{n,i}\\end{array} \\right]+\n", + "\\left[ \\begin{array}{cccc}\n", + "\\frac{\\partial f_{1,i}}{\\partial x_{1}} & \\frac{\\partial f_{1,i}}{\\partial x_{2}} & \n", + "\\cdots & \\frac{\\partial f_{1,i}}{\\partial x_{n}} \\\\\n", + "\\frac{\\partial f_{2,i}}{\\partial x_{1}} & \\frac{\\partial f_{2,i}}{\\partial x_{2}} & \n", + "\\cdots & \\frac{\\partial f_{2,i}}{\\partial x_{n}} \\\\\n", + "\\vdots & \\vdots & & \\vdots \\\\\n", + "\\frac{\\partial f_{n,i}}{\\partial x_{1}} & \\frac{\\partial f_{n,i}}{\\partial x_{2}} & \n", + "\\cdots & \\frac{\\partial f_{n,i}}{\\partial x_{n}} \\\\\n", + "\\end{array} \\right]\n", + "\\left( \\left[ \\begin{array}{c}\n", + "x_{i+1} \\\\\n", + "x_{i+1} \\\\\n", + "\\vdots \\\\\n", + "x_{i+1}\\end{array} \\right]-\n", + "\\left[ \\begin{array}{c}\n", + "x_{1,i} \\\\\n", + "x_{2,i} \\\\\n", + "\\vdots \\\\\n", + "x_{n,i}\\end{array} \\right]\\right)$\n", + "\n", + "### Solution is again in the form Ax=b\n", + "\n", + "$[J]([x_{i+1}]-[x_{i}])=-[f]$\n", + "\n", + "so\n", + "\n", + "$[x_{i+1}]= [x_{i}]-[J]^{-1}[f]$\n", + "\n", + "## Example of Jacobian calculation\n", + "\n", + "### Nonlinear springs supporting two masses in series\n", + "\n", + "Two springs are connected to two masses, with $m_1$=1 kg and $m_{2}$=2 kg. The springs are identical, but they have nonlinear spring constants, of $k_1$=100 N/m and $k_2$=-10 N/m\n", + "\n", + "We want to solve for the final position of the masses ($x_1$ and $x_2$)\n", + "\n", + "$m_{1}g+k_{1}(x_{2}-x_{1})+k_{2}(x_{2}-x_{1})^{2}+k_{1}x_{1}+k_{2}x_{1}^{2}=0$\n", + "\n", + "$m_{2}g-k_{1}(x_{2}-x_{1})-k_{2}(x_2-x_1)^{2}=0$\n", + "\n", + "$J(1,1)=\\frac{\\partial f_{1}}{\\partial x_{1}}=-k_{1}-2k_{2}(x_{2}-x_{1})+k_{1}+2k_{2}x_{1}$\n", + "\n", + "$J(1,2)=\\frac{\\partial f_1}{\\partial x_{2}}=k_{1}+2k_{2}(x_{2}-x_{1})$\n", + "\n", + "$J(2,1)=\\frac{\\partial f_2}{\\partial x_{1}}=k_{1}+2k_{2}(x_{2}-x_{1})$\n", + "\n", + "$J(2,2)=\\frac{\\partial f_2}{\\partial x_{2}}=-k_{1}-2k_{2}(x_{2}-x_{1})$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "m1=1; % kg \n", + "m2=2; % kg\n", + "k1=100; % N/m\n", + "k2=-10; % N/m^2" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function [f,J]=mass_spring(x)\n", + " % Function to calculate function values f1 and f2 as well as Jacobian \n", + " % for 2 masses and 2 identical nonlinear springs\n", + " m1=1; % kg \n", + " m2=2; % kg\n", + " k1=100; % N/m\n", + " k2=-10; % N/m^2\n", + " g=9.81; % m/s^2\n", + " x1=x(1);\n", + " x2=x(2);\n", + " J=[-k1-2*k2*(x2-x1)-k1-2*k2*x1,k1+2*k2*(x2-x1);\n", + " k1+2*k2*(x2-x1),-k1-2*k2*(x2-x1)];\n", + " f=[m1*g+k1*(x2-x1)+k2*(x2-x1).^2-k1*x1-k2*x1^2;\n", + " m2*g-k1*(x2-x1)-k2*(x2-x1).^2];\n", + "end\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f =\n", + "\n", + " -190.19\n", + " 129.62\n", + "\n", + "J =\n", + "\n", + " -200 120\n", + " 120 -120\n", + "\n" + ] + } + ], + "source": [ + "[f,J]=mass_spring([1,0])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x1 =\n", + "\n", + " -1.5142\n", + " -1.4341\n", + "\n", + "ea =\n", + "\n", + " 2.9812\n", + " 2.3946\n", + "\n", + "x2 =\n", + "\n", + " 0.049894\n", + " 0.248638\n", + "\n", + "ea =\n", + "\n", + " 31.3492\n", + " 6.7678\n", + "\n", + "x3 =\n", + "\n", + " 0.29701\n", + " 0.49722\n", + "\n", + "ea =\n", + "\n", + " 0.83201\n", + " 0.49995\n", + "\n", + "x =\n", + "\n", + " 0.29701\n", + " 0.49722\n", + "\n", + "ea =\n", + "\n", + " 0.021392\n", + " 0.012890\n", + "\n", + "ea =\n", + "\n", + " 1.4786e-05\n", + " 8.9091e-06\n", + "\n", + "ea =\n", + "\n", + " 7.0642e-12\n", + " 4.2565e-12\n", + "\n" + ] + } + ], + "source": [ + "x0=[3;2];\n", + "[f0,J0]=mass_spring(x0);\n", + "x1=x0-J0\\f0\n", + "ea=(x1-x0)./x1\n", + "[f1,J1]=mass_spring(x1);\n", + "x2=x1-J1\\f1\n", + "ea=(x2-x1)./x2\n", + "[f2,J2]=mass_spring(x2);\n", + "x3=x2-J2\\f2\n", + "ea=(x3-x2)./x3\n", + "x=x3\n", + "for i=1:3\n", + " xold=x;\n", + " [f,J]=mass_spring(x);\n", + " x=x-J\\f;\n", + " ea=(x-xold)./x\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.30351\n", + " 0.50372\n", + "\n", + "X0 =\n", + "\n", + " 0.30351\n", + " 0.50372\n", + "\n" + ] + } + ], + "source": [ + "x\n", + "X0=fsolve(@(x) mass_spring(x),[3;5])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2000\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1b\n", + "\n", + "\n", + "\n", + ";\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2000\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2000\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1000\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1b\n", + "\n", + "\n", + "\n", + ";\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[X,Y]=meshgrid(linspace(0,10,20),linspace(0,10,20));\n", + "[N,M]=size(X);\n", + "F=zeros(size(X));\n", + "for i=1:N\n", + " for j=1:M\n", + " [f,~]=mass_spring([X(i,j),Y(i,j)]);\n", + " F1(i,j)=f(1);\n", + " F2(i,j)=f(2);\n", + " end\n", + "end\n", + "mesh(X,Y,F1)\n", + "xlabel('x_1')\n", + "ylabel('x_2')\n", + "colorbar()\n", + "figure()\n", + "mesh(X,Y,F2)\n", + "xlabel('x_1')\n", + "ylabel('x_2')\n", + "colorbar()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_13/lecture_13.log b/lecture_13/lecture_13.log new file mode 100644 index 0000000..a86b4c3 --- /dev/null +++ b/lecture_13/lecture_13.log @@ -0,0 +1,889 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2017.1.11) 2 MAR 2017 11:41 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**lecture_13.tex +(./lecture_13.tex +LaTeX2e <2016/02/01> +Babel <3.9q> and hyphenation patterns for 81 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def +File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 48. +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2016/01/03 v1.0q Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg +File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 95. + +(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) +) +\Gread@gobject=\count87 +)) +\Gin@req@height=\dimen103 +\Gin@req@width=\dimen104 +) +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2016/02/21 v3.3-144 Customizing captions (AR) + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2016/02/04 v1.7-139 caption3 kernel (AR) +Package caption3 Info: TeX engine: e-TeX on input line 67. +\captionmargin=\dimen105 +\captionmargin@=\dimen106 +\captionwidth=\dimen107 +\caption@tempdima=\dimen108 +\caption@indent=\dimen109 +\caption@parindent=\dimen110 +\caption@hangindent=\dimen111 +) +\c@ContinuedFloat=\count88 +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2012/05/21 v1.0 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks15 +\XKV@tempa@toks=\toks16 +) +\XKV@depth=\count89 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2012/05/16 v1.0 Trim and clip general TeX material + +(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box26 +) +\tc@llx=\dimen112 +\tc@lly=\dimen113 +\tc@urx=\dimen114 +\tc@ury=\dimen115 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2012/05/13 v1.0 Clipping driver for pdftex +)) +\adjbox@Width=\dimen116 +\adjbox@Height=\dimen117 +\adjbox@Depth=\dimen118 +\adjbox@Totalheight=\dimen119 + +(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2011/09/13 v1.0 Conditionals for odd/even page detection +\c@checkoddpage=\count90 +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box27 +\sift@deathcycles=\count91 +\@vwid@loff=\dimen120 +\@vwid@roff=\dimen121 +)) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1341. +Package xcolor Info: Model `RGB' extended on input line 1353. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks17 +) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2010/09/12 v5.6 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) +Package ifpdf Info: pdfTeX in PDF mode is detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty +Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) +Package ifvtex Info: VTeX not detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty +Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional +) +\Gm@cnth=\count92 +\Gm@cntv=\count93 +\c@Gm@tempcnt=\count94 +\Gm@bindingoffset=\dimen122 +\Gm@wd@mp=\dimen123 +\Gm@odd@mp=\dimen124 +\Gm@even@mp=\dimen125 +\Gm@layoutwidth=\dimen126 +\Gm@layoutheight=\dimen127 +\Gm@layouthoffset=\dimen128 +\Gm@layoutvoffset=\dimen129 +\Gm@dimlist=\toks18 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2016/03/03 v2.15a AMS math features +\@mathmargin=\skip43 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen130 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen131 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count95 +LaTeX Info: Redefining \frac on input line 199. +\uproot@=\count96 +\leftroot@=\count97 +LaTeX Info: Redefining \overline on input line 297. +\classnum@=\count98 +\DOTSCASE@=\count99 +LaTeX Info: Redefining \ldots on input line 394. +LaTeX Info: Redefining \dots on input line 397. +LaTeX Info: Redefining \cdots on input line 518. +\Mathstrutbox@=\box28 +\strutbox@=\box29 +\big@size=\dimen132 +LaTeX Font Info: Redeclaring font encoding OML on input line 630. +LaTeX Font Info: Redeclaring font encoding OMS on input line 631. +\macc@depth=\count100 +\c@MaxMatrixCols=\count101 +\dotsspace@=\muskip10 +\c@parentequation=\count102 +\dspbrk@lvl=\count103 +\tag@help=\toks20 +\row@=\count104 +\column@=\count105 +\maxfields@=\count106 +\andhelp@=\toks21 +\eqnshift@=\dimen133 +\alignsep@=\dimen134 +\tagshift@=\dimen135 +\tagwidth@=\dimen136 +\totwidth@=\dimen137 +\lineht@=\dimen138 +\@envbody=\toks22 +\multlinegap=\skip44 +\multlinetaggap=\skip45 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2735. +LaTeX Info: Redefining \] on input line 2736. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2005/09/27 v1.99g Standard LaTeX package +Package textcomp Info: Sub-encoding information: +(textcomp) 5 = only ISO-Adobe without \textcurrency +(textcomp) 4 = 5 + \texteuro +(textcomp) 3 = 4 + \textohm +(textcomp) 2 = 3 + \textestimated + \textcurrency +(textcomp) 1 = TS1 - \textcircled - \t +(textcomp) 0 = TS1 (full) +(textcomp) Font families with sub-encoding setting implement +(textcomp) only a restricted character set as indicated. +(textcomp) Family '?' is the default used for unknown fonts. +(textcomp) See the documentation for details. +Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 79. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +) +LaTeX Info: Redefining \oldstylenums on input line 334. +Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 349. +Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 350. +Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 351. +Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 352. +Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 353. +Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 354. +Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 355. +Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 356. +Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 357. +Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 358. +Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 359. +Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 360. +Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 361. +Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 362. +Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 363. +Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 364. +Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 365. +Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 366. +Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 367. +Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 368. +Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 369. +Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 370. +Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 371. +Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 372. + +Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 373. +Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 374. +Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 375. +Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 376. +Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 377. +Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 378. +Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 379. +Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 380. +Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 381. +Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 382. +Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 383. +Package textcomp Info: Setting lmtt sub-encoding to TS1/0 on input line 384. +Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 385. +Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 386. +Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 387. +Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 388. +Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 389. +Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 390. +Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 391. +Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 392. +Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 393. +Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 394. +Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 395. +Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 396. +Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 397. +Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 398. +Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 399. +Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 400. +Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 401. +Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 402. +Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 403. +Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 404. +Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 405. +Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 406. +Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 407. +Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 408. +Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 409. +) +(/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texlive/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box30 +) +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count107 +\uc@combtoks=\toks24 +\uc@combtoksb=\toks25 +\uc@temptokena=\toks26 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2015/03/17 v1.2c Input encoding file +\inpenc@prehook=\toks27 +\inpenc@posthook=\toks28 + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/utf8x.def +File: utf8x.def 2004/10/17 UCS: Input encoding UTF-8 +)) +(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2008/02/07 + +Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix +<2008/02/07> (tvz) +\FV@CodeLineNo=\count108 +\FV@InFile=\read1 +\FV@TabBox=\box31 +\c@FancyVerbLine=\count109 +\FV@StepNumber=\count110 +\FV@OutFile=\write3 +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grffile.sty +Package: grffile 2012/04/05 v1.16 Extended file name support for graphics (HO) + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty +Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty +Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +))) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty +Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +Package grffile Info: Option `multidot' is set to `true'. +Package grffile Info: Option `extendedchars' is set to `false'. +Package grffile Info: Option `space' is set to `true'. +Package grffile Info: \Gin@ii of package `graphicx' fixed on input line 486. +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty +Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) + + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty +Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) +Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) +Package hobsub Info: Skipping package `infwarerr' (already loaded). +Package hobsub Info: Skipping package `ltxcmds' (already loaded). +Package hobsub Info: Skipping package `ifluatex' (already loaded). +Package hobsub Info: Skipping package `ifvtex' (already loaded). +Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) +Package hobsub Info: Skipping package `ifpdf' (already loaded). +Package hobsub Info: Skipping package `etexcmds' (already loaded). +Package hobsub Info: Skipping package `kvsetkeys' (already loaded). +Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) +Package hobsub Info: Skipping package `pdftexcmds' (already loaded). +Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) +Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO +) +Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) +Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) +) +Package hobsub Info: Skipping package `hobsub' (already loaded). +Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) +Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) +Package: xcolor-patch 2011/01/30 xcolor patch +Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) +Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) +Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty +Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen139 +\Hy@linkcounter=\count111 +\Hy@pagecounter=\count112 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) +) +\Hy@SavedSpaceFactor=\count113 + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +) +Package hyperref Info: Hyper figures OFF on input line 4443. +Package hyperref Info: Link nesting OFF on input line 4448. +Package hyperref Info: Hyper index ON on input line 4451. +Package hyperref Info: Plain pages OFF on input line 4458. +Package hyperref Info: Backreferencing OFF on input line 4463. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4688. +\c@Hy@tempcnt=\count114 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip11 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5041. +\XeTeXLinkMargin=\dimen140 +\Fld@menulength=\count115 +\Field@Width=\dimen141 +\Fld@charsize=\dimen142 +Package hyperref Info: Hyper figures OFF on input line 6295. +Package hyperref Info: Link nesting OFF on input line 6300. +Package hyperref Info: Hyper index ON on input line 6303. +Package hyperref Info: backreferencing OFF on input line 6310. +Package hyperref Info: Link coloring OFF on input line 6315. +Package hyperref Info: Link coloring with OCG OFF on input line 6320. +Package hyperref Info: PDF/A mode OFF on input line 6325. +LaTeX Info: Redefining \ref on input line 6365. +LaTeX Info: Redefining \pageref on input line 6369. +\Hy@abspage=\count116 +\c@Item=\count117 +\c@Hfootnote=\count118 +) + +Package hyperref Message: Driver (autodetected): hpdftex. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX +\Fld@listcount=\count119 +\c@bookmark@seq@number=\count120 + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +82. +) +\Hy@SectionHShift=\skip46 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2014/10/28 v4.11 Multi-page Table package (DPC) +\LTleft=\skip47 +\LTright=\skip48 +\LTpre=\skip49 +\LTpost=\skip50 +\LTchunksize=\count121 +\LTcapwidth=\dimen143 +\LT@head=\box32 +\LT@firsthead=\box33 +\LT@foot=\box34 +\LT@lastfoot=\box35 +\LT@cols=\count122 +\LT@rows=\count123 +\c@LT@tables=\count124 +\c@LT@chunks=\count125 +\LT@p@ftn=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2005/04/14 v1.61803 publication quality tables +\heavyrulewidth=\dimen144 +\lightrulewidth=\dimen145 +\cmidrulewidth=\dimen146 +\belowrulesep=\dimen147 +\belowbottomsep=\dimen148 +\aboverulesep=\dimen149 +\abovetopsep=\dimen150 +\cmidrulesep=\dimen151 +\cmidrulekern=\dimen152 +\defaultaddspace=\dimen153 +\@cmidla=\count126 +\@cmidlb=\count127 +\@aboverulesep=\dimen154 +\@belowrulesep=\dimen155 +\@thisruleclass=\count128 +\@lastruleclass=\count129 +\@thisrulewidth=\dimen156 +) +(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2011/09/28 v3.5.2 Customized lists +\labelindent=\skip51 +\enit@outerparindent=\dimen157 +\enit@toks=\toks30 +\enit@inbox=\box36 +\enitdp@description=\count130 +) +(/usr/share/texlive/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box37 +\UL@hyphenbox=\box38 +\UL@skip=\skip52 +\UL@hook=\toks31 +\UL@height=\dimen158 +\UL@pe=\count131 +\UL@pixel=\dimen159 +\ULC@box=\box39 +Package: ulem 2012/05/18 +\ULdepth=\dimen160 +) +Package hyperref Info: Option `breaklinks' set `true' on input line 264. +Package hyperref Info: Option `colorlinks' set `true' on input line 264. + (./lecture_13.aux) +\openout1 = `lecture_13.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 271. +LaTeX Font Info: Try loading font information for TS1+cmr on input line 271. + + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 271. +LaTeX Font Info: ... okay on input line 271. +LaTeX Font Info: Try loading font information for T1+ppl on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count132 +\scratchdimen=\dimen161 +\scratchbox=\box40 +\nofMPsegments=\count133 +\nofMParguments=\count134 +\everyMPshowfont=\toks32 +\MPscratchCnt=\count135 +\MPscratchDim=\dimen162 +\MPnumerator=\count136 +\makeMPintoPDFobject=\count137 +\everyMPtoPDFconversion=\toks33 +) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty +Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty +Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) +) +Package grfext Info: Graphics extension search list: +(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 452. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texlive/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2013/06/09 v1.4-94 longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +\AtBeginShipoutBox=\box41 +Package hyperref Info: Link coloring ON on input line 271. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) +) +\c@section@level=\count138 +) +LaTeX Info: Redefining \ref on input line 271. +LaTeX Info: Redefining \pageref on input line 271. +LaTeX Info: Redefining \nameref on input line 271. + +(./lecture_13.out) (./lecture_13.out) +\@outlinefile=\write4 +\openout4 = `lecture_13.out'. + +LaTeX Font Info: Try loading font information for OT1+ppl on input line 275. + + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Try loading font information for OML+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Try loading font information for OMS+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Try loading font information for OMX+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Try loading font information for OT1+zplm on input line 275 +. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 275. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 275. + + +LaTeX Warning: No \author given. + +LaTeX Font Info: Try loading font information for T1+cmtt on input line 279. + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <12> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 288. + + +File: efficient_soln.png Graphic file (type png) + +Package pdftex.def Info: efficient_soln.png used on input line 292. +(pdftex.def) Requested size: 375.80544pt x 201.02519pt. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 297. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 297. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 297. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 297. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 297. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 297. + + +File: norm_A.png Graphic file (type png) + +Package pdftex.def Info: norm_A.png used on input line 305. +(pdftex.def) Requested size: 375.80544pt x 177.55602pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./efficient_soln.png>] +Underfull \hbox (badness 10000) in paragraph at lines 343--345 +[]\T1/ppl/m/n/10.95 -[][]Installing Python and Jupyter Note-book (via Ana-conda +) - + [] + + +Underfull \hbox (badness 1681) in paragraph at lines 346--349 +[]\T1/ppl/m/n/10.95 -[][]Running Mat-lab ker-nel in Jupyter - https://anneurai. +net/2015/11/12/matlab-based- + [] + +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <14.4> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 354. +LaTeX Font Info: Try loading font information for TS1+cmtt on input line 356 +. +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <10.95> not available +(Font) Font shape `T1/ppl/b/n' tried instead on input line 373. +LaTeX Font Info: Font shape `T1/ppl/bx/it' in size <10.95> not available +(Font) Font shape `T1/ppl/b/it' tried instead on input line 373. + [2 <./norm_A.png>] +[3] [4] <../lecture_09/mass_springs.png, id=122, 112.42pt x 190.7125pt> +File: ../lecture_09/mass_springs.png Graphic file (type png) + + +Package pdftex.def Info: ../lecture_09/mass_springs.png used on input line 523. + +(pdftex.def) Requested size: 89.93611pt x 152.576pt. + [5 <../lecture_09/mass_springs.png>] +[6] [7] [8] [9] [10] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 933. + [11] + +File: lecture_13_files/lecture_13_24_1.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_13_files/lecture_13_24_1.pdf used on input lin +e 957. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + +Underfull \hbox (badness 10000) in paragraph at lines 959--960 + + [] + +[12 <./lecture_13_files/lecture_13_24_1.pdf>] [13] + +File: lecture_13_files/lecture_13_29_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_13_files/lecture_13_29_0.pdf used on input lin +e 1045. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + +Underfull \hbox (badness 10000) in paragraph at lines 1047--1048 + + [] + +[14 <./lecture_13_files/lecture_13_29_0.pdf>] [15] [16] [17] + +File: lecture_13_files/lecture_13_36_0.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_13_files/lecture_13_36_0.pdf used on input lin +e 1260. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + [18] +Underfull \hbox (badness 10000) in paragraph at lines 1262--1263 + + [] + + +File: lecture_13_files/lecture_13_36_1.pdf Graphic file (type pdf) + + +Package pdftex.def Info: lecture_13_files/lecture_13_36_1.pdf used on input lin +e 1265. +(pdftex.def) Requested size: 449.6789pt x 337.25917pt. + [19 <./lecture_13_files/lecture_13_36_0.pdf>] +Underfull \hbox (badness 10000) in paragraph at lines 1267--1268 + + [] + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1278. +[20 <./lecture_13_files/lecture_13_36_1.pdf>] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 1278. + (./lecture_13.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1278. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1278. + +Package rerunfilecheck Info: File `lecture_13.out' has not changed. +(rerunfilecheck) Checksum: 5887D69934ACBC48543EBFE830C6564B;1422. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1278. + ) +Here is how much of TeX's memory you used: + 11009 strings out of 493029 + 165053 string characters out of 6136234 + 275769 words of memory out of 5000000 + 14263 multiletter control sequences out of 15000+600000 + 39435 words of font info for 100 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 36i,10n,77p,878b,465s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf/ +fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/texmf/fonts/enc/dvips/cm- +super/cm-super-t1.enc} +Output written on lecture_13.pdf (20 pages, 274185 bytes). +PDF statistics: + 294 PDF objects out of 1000 (max. 8388607) + 237 compressed objects within 3 object streams + 49 named destinations out of 1000 (max. 500000) + 180 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/lecture_13/lecture_13.md b/lecture_13/lecture_13.md new file mode 100644 index 0000000..88716ad --- /dev/null +++ b/lecture_13/lecture_13.md @@ -0,0 +1,962 @@ + + +```octave +%plot --format svg +``` + + +```octave +setdefaults +``` + +## My question from last class + +![q1](efficient_soln.png) + +![A](https://lh4.googleusercontent.com/fmG7EnFxpvvjSgijOuwz8osuiH3cBDgOzTE64KnfQeeDDSG2oE86-BzcpYIQMVkkAgRRGEDEGi6-Nkr8qmEMeaAk-gcjEmXe42WFYUdOa5XoUaBkXRakkA77_XrkRjArCGZIFhjjDRoO7x0) + +![q2](norm_A.png) + + +## Your questions from last class + +1. Do we have to submit a link for HW #4 somewhere or is uploading to Github sufficient? + + -no, your submission from HW 3 is sufficient + +2. How do I get the formulas/formatting in markdown files to show up on github? + + -no luck for markdown equations in github, this is an ongoing request + +3. Confused about the p=1 norm part and ||A||_1 + +4. When's the exam? + + -next week (3/9) + +5. What do you recommend doing to get better at figuring out the homeworks? + + -time and experimenting (try going through the lecture examples, verify my work) + +6. Could we have an hw or extra credit with a video lecture to learn some simple python? + + -Sounds great! how simple? + + -[Installing Python and Jupyter Notebook (via Anaconda) - https://www.continuum.io/downloads](https://www.continuum.io/downloads) + + -[Running Matlab kernel in Jupyter - https://anneurai.net/2015/11/12/matlab-based-ipython-notebooks/](https://anneurai.net/2015/11/12/matlab-based-ipython-notebooks/) + + -[Running Octave kernel in Jupyter - https://anaconda.org/pypi/octave_kernel](https://anaconda.org/pypi/octave_kernel) + + + +# Markdown examples + +` " ' ` ` + +```matlab +x=linspace(0,1); +y=x.^2; +plot(x,y) +for i = 1:10 + fprintf('markdown is pretty') +end +``` + +## Condition of a matrix +### *just checked in to see what condition my condition was in* +### Matrix norms + +The Euclidean norm of a vector is measure of the magnitude (in 3D this would be: $|x|=\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}$) in general the equation is: + +$||x||_{e}=\sqrt{\sum_{i=1}^{n}x_{i}^{2}}$ + +For a matrix, A, the same norm is called the Frobenius norm: + +$||A||_{f}=\sqrt{\sum_{i=1}^{n}\sum_{j=1}^{m}A_{i,j}^{2}}$ + +In general we can calculate any $p$-norm where + +$||A||_{p}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{p}}$ + +so the p=1, 1-norm is + +$||A||_{1}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{1}}=\sum_{i=1}^{n}\sum_{i=1}^{m}|A_{i,j}|$ + +$||A||_{\infty}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{\infty}}=\max_{1\le i \le n}\sum_{j=1}^{m}|A_{i,j}|$ + +### Condition of Matrix + +The matrix condition is the product of + +$Cond(A) = ||A||\cdot||A^{-1}||$ + +So each norm will have a different condition number, but the limit is $Cond(A)\ge 1$ + +An estimate of the rounding error is based on the condition of A: + +$\frac{||\Delta x||}{x} \le Cond(A) \frac{||\Delta A||}{||A||}$ + +So if the coefficients of A have accuracy to $10^{-t} + +and the condition of A, $Cond(A)=10^{c}$ + +then the solution for x can have rounding errors up to $10^{c-t}$ + + + +```octave +A=[1,1/2,1/3;1/2,1/3,1/4;1/3,1/4,1/5] +[L,U]=LU_naive(A) +``` + + A = + + 1.00000 0.50000 0.33333 + 0.50000 0.33333 0.25000 + 0.33333 0.25000 0.20000 + + L = + + 1.00000 0.00000 0.00000 + 0.50000 1.00000 0.00000 + 0.33333 1.00000 1.00000 + + U = + + 1.00000 0.50000 0.33333 + 0.00000 0.08333 0.08333 + 0.00000 -0.00000 0.00556 + + + +Then, $A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$ + +$Ld_{1}=\left[\begin{array}{c} +1 \\ +0 \\ +0 \end{array}\right]$, $Ux_{1}=d_{1}$ ... + + +```octave +invA=zeros(3,3); +d1=L\[1;0;0]; +d2=L\[0;1;0]; +d3=L\[0;0;1]; +invA(:,1)=U\d1; % shortcut invA(:,1)=A\[1;0;0] +invA(:,2)=U\d2; +invA(:,3)=U\d3 +invA*A +``` + + invA = + + 9.0000 -36.0000 30.0000 + -36.0000 192.0000 -180.0000 + 30.0000 -180.0000 180.0000 + + ans = + + 1.0000e+00 3.5527e-15 2.9976e-15 + -1.3249e-14 1.0000e+00 -9.1038e-15 + 8.5117e-15 7.1054e-15 1.0000e+00 + + + +Find the condition of A, $cond(A)$ + + +```octave +% Frobenius norm +normf_A = sqrt(sum(sum(A.^2))) +normf_invA = sqrt(sum(sum(invA.^2))) + +cond_f_A = normf_A*normf_invA + +norm(A,'fro') + +% p=1, column sum norm +norm1_A = max(sum(A,2)) +norm1_invA = max(sum(invA,2)) +norm(A,1) + +cond_1_A=norm1_A*norm1_invA + +% p=inf, row sum norm +norminf_A = max(sum(A,1)) +norminf_invA = max(sum(invA,1)) +norm(A,inf) + +cond_inf_A=norminf_A*norminf_invA + +``` + + normf_A = 1.4136 + normf_invA = 372.21 + cond_f_A = 526.16 + ans = 1.4136 + norm1_A = 1.8333 + norm1_invA = 30.000 + ans = 1.8333 + cond_1_A = 55.000 + norminf_A = 1.8333 + norminf_invA = 30.000 + ans = 1.8333 + cond_inf_A = 55.000 + + +Consider the problem again from the intro to Linear Algebra, 4 masses are connected in series to 4 springs with spring constants $K_{i}$. What does a high condition number mean for this problem? + +![Springs-masses](../lecture_09/mass_springs.png) + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass: + +$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$ + +$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$ + +$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$ + +$m_{4}g-k_{4}(x_{4}-x_{3})=0$ + +in matrix form: + +$\left[ \begin{array}{cccc} +k_{1}+k_{2} & -k_{2} & 0 & 0 \\ +-k_{2} & k_{2}+k_{3} & -k_{3} & 0 \\ +0 & -k_{3} & k_{3}+k_{4} & -k_{4} \\ +0 & 0 & -k_{4} & k_{4} \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \\ +x_{4} \end{array} \right]= +\left[ \begin{array}{c} +m_{1}g \\ +m_{2}g \\ +m_{3}g \\ +m_{4}g \end{array} \right]$ + + +```octave +k1=10; % N/m +k2=100000; +k3=10; +k4=1; +m1=1; % kg +m2=2; +m3=3; +m4=4; +g=9.81; % m/s^2 +K=[k1+k2 -k2 0 0; -k2 k2+k3 -k3 0; 0 -k3 k3+k4 -k4; 0 0 -k4 k4] +y=[m1*g;m2*g;m3*g;m4*g] +``` + + K = + + 100010 -100000 0 0 + -100000 100010 -10 0 + 0 -10 11 -1 + 0 0 -1 1 + + y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + + +```octave +cond(K,inf) +cond(K,1) +cond(K,'fro') +cond(K,2) +``` + + ans = 3.2004e+05 + ans = 3.2004e+05 + ans = 2.5925e+05 + ans = 2.5293e+05 + + + +```octave +e=eig(K) +max(e)/min(e) +``` + + e = + + 7.9078e-01 + 3.5881e+00 + 1.7621e+01 + 2.0001e+05 + + ans = 2.5293e+05 + + +## P=2 norm is ratio of biggest eigenvalue to smallest eigenvalue! + +no need to calculate the inv(K) + +# Iterative Methods + +## Gauss-Seidel method + +If we have an intial guess for each value of a vector $x$ that we are trying to solve, then it is easy enough to solve for one component given the others. + +Take a 3$\times$3 matrix + +$Ax=b$ + +$\left[ \begin{array}{ccc} +3 & -0.1 & -0.2 \\ +0.1 & 7 & -0.3 \\ +0.3 & -0.2 & 10 \end{array} \right] +\left[ \begin{array}{c} +x_{1} \\ +x_{2} \\ +x_{3} \end{array} \right]= +\left[ \begin{array}{c} +7.85 \\ +-19.3 \\ +71.4\end{array} \right]$ + +$x_{1}=\frac{7.85+0.1x_{2}+0.2x_{3}}{3}$ + +$x_{2}=\frac{-19.3-0.1x_{1}+0.3x_{3}}{7}$ + +$x_{3}=\frac{71.4+0.1x_{1}+0.2x_{2}}{10}$ + + +```octave +A=[3 -0.1 -0.2;0.1 7 -0.3;0.3 -0.2 10] +b=[7.85;-19.3;71.4] + +x=A\b +``` + + A = + + 3.00000 -0.10000 -0.20000 + 0.10000 7.00000 -0.30000 + 0.30000 -0.20000 10.00000 + + b = + + 7.8500 + -19.3000 + 71.4000 + + x = + + 3.0000 + -2.5000 + 7.0000 + + + +### Gauss-Seidel Iterative approach + +As a first guess, we can use $x_{1}=x_{2}=x_{3}=0$ + +$x_{1}=\frac{7.85+0.1(0)+0.3(0)}{3}=2.6167$ + +$x_{2}=\frac{-19.3-0.1(2.6167)+0.3(0)}{7}=-2.7945$ + +$x_{3}=\frac{71.4+0.1(2.6167)+0.2(-2.7945)}{10}=7.0056$ + +Then, we update the guess: + +$x_{1}=\frac{7.85+0.1(-2.7945)+0.3(7.0056)}{3}=2.9906$ + +$x_{2}=\frac{-19.3-0.1(2.9906)+0.3(7.0056)}{7}=-2.4996$ + +$x_{3}=\frac{71.4+0.1(2.9906)+0.2(-2.4966)}{10}=7.00029$ + +The results are conveerging to the solution we found with `\` of $x_{1}=3,~x_{2}=-2.5,~x_{3}=7$ + +We could also use an iterative method that solves for all of the x-components in one step: + +### Jacobi method + +$x_{1}^{i}=\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$ + +$x_{2}^{i}=\frac{-19.3-0.1x_{1}^{i-1}+0.3x_{3}^{i-1}}{7}$ + +$x_{3}^{i}=\frac{71.4+0.1x_{1}^{i-1}+0.2x_{2}^{i-1}}{10}$ + +Here the solution is a matrix multiplication and vector addition + +$\left[ \begin{array}{c} +x_{1}^{i} \\ +x_{2}^{i} \\ +x_{3}^{i} \end{array} \right]= +\left[ \begin{array}{c} +7.85/3 \\ +-19.3/7 \\ +71.4/10\end{array} \right]- +\left[ \begin{array}{ccc} +0 & 0.1/3 & 0.2/3 \\ +0.1/7 & 0 & -0.3/7 \\ +0.3/10 & -0.2/10 & 0 \end{array} \right] +\left[ \begin{array}{c} +x_{1}^{i-1} \\ +x_{2}^{i-1} \\ +x_{3}^{i-1} \end{array} \right]$ + +|x_{j}|Jacobi method |vs| Gauss-Seidel | +|--------|------------------------------|---|-------------------------------| +|$x_{1}^{i}=$ | $\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$ | | $\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$| +|$x_{2}^{i}=$ | $\frac{-19.3-0.1x_{1}^{i-1}+0.3x_{3}^{i-1}}{7}$ | | $\frac{-19.3-0.1x_{1}^{i}+0.3x_{3}^{i-1}}{7}$ | +|$x_{3}^{i}=$ | $\frac{71.4+0.1x_{1}^{i-1}+0.2x_{2}^{i-1}}{10}$ | | $\frac{71.4+0.1x_{1}^{i}+0.2x_{2}^{i}}{10}$| + + +```octave +ba=b./diag(A) % or ba=b./[A(1,1);A(2,2);A(3,3)] +sA=A-diag(diag(A)) % A with zeros on diagonal +sA(1,:)=sA(1,:)/A(1,1); +sA(2,:)=sA(2,:)/A(2,2); +sA(3,:)=sA(3,:)/A(3,3) +x0=[0;0;0]; +x1=ba-sA*x0 +x2=ba-sA*x1 +x3=ba-sA*x2 +fprintf('solution is converging to [3,-2.5,7]]\n') +``` + + ba = + + 2.6167 + -2.7571 + 7.1400 + + sA = + + 0.00000 -0.10000 -0.20000 + 0.10000 0.00000 -0.30000 + 0.30000 -0.20000 0.00000 + + sA = + + 0.000000 -0.033333 -0.066667 + 0.014286 0.000000 -0.042857 + 0.030000 -0.020000 0.000000 + + x1 = + + 2.6167 + -2.7571 + 7.1400 + + x2 = + + 3.0008 + -2.4885 + 7.0064 + + x3 = + + 3.0008 + -2.4997 + 7.0002 + + solution is converging to [3,-2.5,7]] + + + +```octave +diag(A) +diag(diag(A)) +``` + + ans = + + 3 + 7 + 10 + + ans = + + Diagonal Matrix + + 3 0 0 + 0 7 0 + 0 0 10 + + + +This method works if problem is diagonally dominant, + +$|a_{ii}|>\sum_{j=1,j\ne i}^{n}|a_{ij}|$ + +If this condition is true, then Jacobi or Gauss-Seidel should converge + + + + +```octave +A=[0.1,1,3;1,0.2,3;5,2,0.3] +b=[12;2;4] +A\b +``` + + A = + + 0.10000 1.00000 3.00000 + 1.00000 0.20000 3.00000 + 5.00000 2.00000 0.30000 + + b = + + 12 + 2 + 4 + + ans = + + -2.9393 + 9.1933 + 1.0336 + + + + +```octave +ba=b./diag(A) % or ba=b./[A(1,1);A(2,2);A(3,3)] +sA=A-diag(diag(A)) % A with zeros on diagonal +sA(1,:)=sA(1,:)/A(1,1); +sA(2,:)=sA(2,:)/A(2,2); +sA(3,:)=sA(3,:)/A(3,3) +x0=[0;0;0]; +x1=ba-sA*x0 +x2=ba-sA*x1 +x3=ba-sA*x2 +fprintf('solution is not converging to [-2.93,9.19,1.03]\n') +``` + + ba = + + 120.000 + 10.000 + 13.333 + + sA = + + 0 1 3 + 1 0 3 + 5 2 0 + + sA = + + 0.00000 10.00000 30.00000 + 5.00000 0.00000 15.00000 + 16.66667 6.66667 0.00000 + + x1 = + + 120.000 + 10.000 + 13.333 + + x2 = + + -380.00 + -790.00 + -2053.33 + + x3 = + + 6.9620e+04 + 3.2710e+04 + 1.1613e+04 + + solution is not converging to [-2.93,9.19,1.03] + + +## Gauss-Seidel with Relaxation + +In order to force the solution to converge faster, we can introduce a relaxation term $\lambda$. + +where the new x values are weighted between the old and new: + +$x^{i}=\lambda x^{i}+(1-\lambda)x^{i-1}$ + +after solving for x, lambda weights the current approximation with the previous approximation for the updated x + + + +```octave +% rearrange A and b +A=[3 -0.1 -0.2;0.1 7 -0.3;0.3 -0.2 10] +b=[7.85;-19.3;71.4] + +iters=zeros(100,1); +for i=1:100 + lambda=2/100*i; + [x,ea,iters(i)]=Jacobi_rel(A,b,lambda); +end +plot([1:100]*2/100,iters) +``` + + A = + + 3.00000 -0.10000 -0.20000 + 0.10000 7.00000 -0.30000 + 0.30000 -0.20000 10.00000 + + b = + + 7.8500 + -19.3000 + 71.4000 + + + + +![svg](lecture_13_files/lecture_13_24_1.svg) + + + +```octave +l=fminbnd(@(l) lambda_fcn(A,b,l),0.5,1.5) +``` + + l = 0.99158 + + + +```octave +A\b +``` + + ans = + + 3.0000 + -2.5000 + 7.0000 + + + + +```octave +[x,ea,iter]=Jacobi_rel(A,b,l,0.000001) +[x,ea,iter]=Jacobi_rel(A,b,1,0.000001) + +``` + + x = + + 3.0000 + -2.5000 + 7.0000 + + ea = + + 1.8289e-07 + 2.1984e-08 + 2.3864e-08 + + iter = 8 + x = + + 3.0000 + -2.5000 + 7.0000 + + ea = + + 1.9130e-08 + 7.6449e-08 + 3.3378e-08 + + iter = 8 + + +## Nonlinear Systems + +Consider two simultaneous nonlinear equations with two unknowns: + +$x_{1}^{2}+x_{1}x_{2}=10$ + +$x_{2}+3x_{1}x_{2}^{2}=57$ + +Graphically, we are looking for the solution: + + + +```octave +x11=linspace(0.5,3); +x12=(10-x11.^2)./x11; + +x22=linspace(2,8); +x21=(57-x22).*x22.^-2/3; + +plot(x11,x12,x21,x22) +% Solution at x_1=2, x_2=3 +hold on; +plot(2,3,'o') +xlabel('x_1') +ylabel('x_2') +``` + + +![svg](lecture_13_files/lecture_13_29_0.svg) + + +## Newton-Raphson part II + +Remember the first order approximation for the next point in a function is: + +$f(x_{i+1})=f(x_{i})+(x_{i+1}-x_{i})f'(x_{i})$ + +then, $f(x_{i+1})=0$ so we are left with: + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$ + +We can use the same formula, but now we have multiple dimensions so we need to determine the Jacobian + +$[J]=\left[ \begin{array}{cccc} +\frac{\partial f_{1,i}}{\partial x_{1}} & \frac{\partial f_{1,i}}{\partial x_{2}} & +\cdots & \frac{\partial f_{1,i}}{\partial x_{n}} \\ +\frac{\partial f_{2,i}}{\partial x_{1}} & \frac{\partial f_{2,i}}{\partial x_{2}} & +\cdots & \frac{\partial f_{2,i}}{\partial x_{n}} \\ +\vdots & \vdots & & \vdots \\ +\frac{\partial f_{n,i}}{\partial x_{1}} & \frac{\partial f_{n,i}}{\partial x_{2}} & +\cdots & \frac{\partial f_{n,i}}{\partial x_{n}} \\ +\end{array} \right]$ + +$\left[ \begin{array}{c} +f_{1,i+1} \\ +f_{2,i+1} \\ +\vdots \\ +f_{n,i+1}\end{array} \right]= +\left[ \begin{array}{c} +f_{1,i} \\ +f_{2,i} \\ +\vdots \\ +f_{n,i}\end{array} \right]+ +\left[ \begin{array}{cccc} +\frac{\partial f_{1,i}}{\partial x_{1}} & \frac{\partial f_{1,i}}{\partial x_{2}} & +\cdots & \frac{\partial f_{1,i}}{\partial x_{n}} \\ +\frac{\partial f_{2,i}}{\partial x_{1}} & \frac{\partial f_{2,i}}{\partial x_{2}} & +\cdots & \frac{\partial f_{2,i}}{\partial x_{n}} \\ +\vdots & \vdots & & \vdots \\ +\frac{\partial f_{n,i}}{\partial x_{1}} & \frac{\partial f_{n,i}}{\partial x_{2}} & +\cdots & \frac{\partial f_{n,i}}{\partial x_{n}} \\ +\end{array} \right] +\left( \left[ \begin{array}{c} +x_{i+1} \\ +x_{i+1} \\ +\vdots \\ +x_{i+1}\end{array} \right]- +\left[ \begin{array}{c} +x_{1,i} \\ +x_{2,i} \\ +\vdots \\ +x_{n,i}\end{array} \right]\right)$ + +### Solution is again in the form Ax=b + +$[J]([x_{i+1}]-[x_{i}])=-[f]$ + +so + +$[x_{i+1}]= [x_{i}]-[J]^{-1}[f]$ + +## Example of Jacobian calculation + +### Nonlinear springs supporting two masses in series + +Two springs are connected to two masses, with $m_1$=1 kg and $m_{2}$=2 kg. The springs are identical, but they have nonlinear spring constants, of $k_1$=100 N/m and $k_2$=-10 N/m + +We want to solve for the final position of the masses ($x_1$ and $x_2$) + +$m_{1}g+k_{1}(x_{2}-x_{1})+k_{2}(x_{2}-x_{1})^{2}+k_{1}x_{1}+k_{2}x_{1}^{2}=0$ + +$m_{2}g-k_{1}(x_{2}-x_{1})-k_{2}(x_2-x_1)^{2}=0$ + +$J(1,1)=\frac{\partial f_{1}}{\partial x_{1}}=-k_{1}-2k_{2}(x_{2}-x_{1})+k_{1}+2k_{2}x_{1}$ + +$J(1,2)=\frac{\partial f_1}{\partial x_{2}}=k_{1}+2k_{2}(x_{2}-x_{1})$ + +$J(2,1)=\frac{\partial f_2}{\partial x_{1}}=k_{1}+2k_{2}(x_{2}-x_{1})$ + +$J(2,2)=\frac{\partial f_2}{\partial x_{2}}=-k_{1}-2k_{2}(x_{2}-x_{1})$ + + + + +```octave +m1=1; % kg +m2=2; % kg +k1=100; % N/m +k2=-10; % N/m^2 +``` + + +```octave +function [f,J]=mass_spring(x) + % Function to calculate function values f1 and f2 as well as Jacobian + % for 2 masses and 2 identical nonlinear springs + m1=1; % kg + m2=2; % kg + k1=100; % N/m + k2=-10; % N/m^2 + g=9.81; % m/s^2 + x1=x(1); + x2=x(2); + J=[-k1-2*k2*(x2-x1)-k1-2*k2*x1,k1+2*k2*(x2-x1); + k1+2*k2*(x2-x1),-k1-2*k2*(x2-x1)]; + f=[m1*g+k1*(x2-x1)+k2*(x2-x1).^2-k1*x1-k2*x1^2; + m2*g-k1*(x2-x1)-k2*(x2-x1).^2]; +end + +``` + + +```octave +[f,J]=mass_spring([1,0]) +``` + + f = + + -190.19 + 129.62 + + J = + + -200 120 + 120 -120 + + + + +```octave +x0=[3;2]; +[f0,J0]=mass_spring(x0); +x1=x0-J0\f0 +ea=(x1-x0)./x1 +[f1,J1]=mass_spring(x1); +x2=x1-J1\f1 +ea=(x2-x1)./x2 +[f2,J2]=mass_spring(x2); +x3=x2-J2\f2 +ea=(x3-x2)./x3 +x=x3 +for i=1:3 + xold=x; + [f,J]=mass_spring(x); + x=x-J\f; + ea=(x-xold)./x +end +``` + + x1 = + + -1.5142 + -1.4341 + + ea = + + 2.9812 + 2.3946 + + x2 = + + 0.049894 + 0.248638 + + ea = + + 31.3492 + 6.7678 + + x3 = + + 0.29701 + 0.49722 + + ea = + + 0.83201 + 0.49995 + + x = + + 0.29701 + 0.49722 + + ea = + + 0.021392 + 0.012890 + + ea = + + 1.4786e-05 + 8.9091e-06 + + ea = + + 7.0642e-12 + 4.2565e-12 + + + + +```octave +x +X0=fsolve(@(x) mass_spring(x),[3;5]) +``` + + x = + + 0.30351 + 0.50372 + + X0 = + + 0.30351 + 0.50372 + + + + +```octave +[X,Y]=meshgrid(linspace(0,10,20),linspace(0,10,20)); +[N,M]=size(X); +F=zeros(size(X)); +for i=1:N + for j=1:M + [f,~]=mass_spring([X(i,j),Y(i,j)]); + F1(i,j)=f(1); + F2(i,j)=f(2); + end +end +mesh(X,Y,F1) +xlabel('x_1') +ylabel('x_2') +colorbar() +figure() +mesh(X,Y,F2) +xlabel('x_1') +ylabel('x_2') +colorbar() +``` + + +![svg](lecture_13_files/lecture_13_36_0.svg) + + + +![svg](lecture_13_files/lecture_13_36_1.svg) + + + +```octave + +``` diff --git a/lecture_13/lecture_13.out b/lecture_13/lecture_13.out new file mode 100644 index 0000000..f10cd22 --- /dev/null +++ b/lecture_13/lecture_13.out @@ -0,0 +1,18 @@ +\BOOKMARK [2][-]{subsection.0.1}{My question from last class}{}% 1 +\BOOKMARK [2][-]{subsection.0.2}{Your questions from last class}{}% 2 +\BOOKMARK [1][-]{section.1}{Markdown examples}{}% 3 +\BOOKMARK [2][-]{subsection.1.1}{Condition of a matrix}{section.1}% 4 +\BOOKMARK [3][-]{subsubsection.1.1.1}{just checked in to see what condition my condition was in}{subsection.1.1}% 5 +\BOOKMARK [3][-]{subsubsection.1.1.2}{Matrix norms}{subsection.1.1}% 6 +\BOOKMARK [3][-]{subsubsection.1.1.3}{Condition of Matrix}{subsection.1.1}% 7 +\BOOKMARK [2][-]{subsection.1.2}{P=2 norm is ratio of biggest eigenvalue to smallest eigenvalue!}{section.1}% 8 +\BOOKMARK [1][-]{section.2}{Iterative Methods}{}% 9 +\BOOKMARK [2][-]{subsection.2.1}{Gauss-Seidel method}{section.2}% 10 +\BOOKMARK [3][-]{subsubsection.2.1.1}{Gauss-Seidel Iterative approach}{subsection.2.1}% 11 +\BOOKMARK [3][-]{subsubsection.2.1.2}{Jacobi method}{subsection.2.1}% 12 +\BOOKMARK [2][-]{subsection.2.2}{Gauss-Seidel with Relaxation}{section.2}% 13 +\BOOKMARK [2][-]{subsection.2.3}{Nonlinear Systems}{section.2}% 14 +\BOOKMARK [2][-]{subsection.2.4}{Newton-Raphson part II}{section.2}% 15 +\BOOKMARK [3][-]{subsubsection.2.4.1}{Solution is again in the form Ax=b}{subsection.2.4}% 16 +\BOOKMARK [2][-]{subsection.2.5}{Example of Jacobian calculation}{section.2}% 17 +\BOOKMARK [3][-]{subsubsection.2.5.1}{Nonlinear springs supporting two masses in series}{subsection.2.5}% 18 diff --git a/lecture_13/lecture_13.pdf b/lecture_13/lecture_13.pdf new file mode 100644 index 0000000..5a45770 Binary files /dev/null and b/lecture_13/lecture_13.pdf differ diff --git a/lecture_13/lecture_13.tex b/lecture_13/lecture_13.tex new file mode 100644 index 0000000..72647e9 --- /dev/null +++ b/lecture_13/lecture_13.tex @@ -0,0 +1,1278 @@ + +% Default to the notebook output style + + + + +% Inherit from the specified cell style. + + + + + +\documentclass[11pt]{article} + + + + \usepackage[T1]{fontenc} + % Nicer default font (+ math font) than Computer Modern for most use cases + \usepackage{mathpazo} + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % We will generate all images so they have a width \maxwidth. This means + % that they will get their normal width if they fit onto the page, but + % are scaled down if they would overflow the margins. + \makeatletter + \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth + \else\Gin@nat@width\fi} + \makeatother + \let\Oldincludegraphics\includegraphics + % Set max figure width to be 80% of text width, for now hardcoded. + \renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=.8\maxwidth]{#1}} + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionLabelFormat{nolabel}{} + \captionsetup{labelformat=nolabel} + + \usepackage{adjustbox} % Used to constrain images to a maximum size + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatability definitions + \def\gt{>} + \def\lt{<} + % Document parameters + \title{lecture\_13} + + + + + % Pygments definitions + +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % Exact colors from NB + \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} + \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} + + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + + \begin{document} + + + \maketitle + + + + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}1}]:} \PY{c}{\PYZpc{}plot \PYZhy{}\PYZhy{}format svg} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}2}]:} \PY{n}{setdefaults} +\end{Verbatim} + + \subsection{My question from last +class}\label{my-question-from-last-class} + +\begin{figure}[htbp] +\centering +\includegraphics{efficient_soln.png} +\caption{q1} +\end{figure} + + + $A=\left[\begin{array}{ccc} + 2 & -2 & 0\\ + -1& 5 & 1 \\ + 3 &4 & 5 \end{array}\right]$ + + +\begin{figure}[htbp] +\centering +\includegraphics{norm_A.png} +\caption{q2} +\end{figure} + +\subsection{Your questions from last +class}\label{your-questions-from-last-class} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + Do we have to submit a link for HW \#4 somewhere or is uploading to + Github sufficient? + + -no, your submission from HW 3 is sufficient +\item + How do I get the formulas/formatting in markdown files to show up on + github? + + -no luck for markdown equations in github, this is an ongoing request +\item + Confused about the p=1 norm part and + \textbar{}\textbar{}A\textbar{}\textbar{}\_1 +\item + When's the exam? + + -next week (3/9) +\item + What do you recommend doing to get better at figuring out the + homeworks? + + -time and experimenting (try going through the lecture examples, + verify my work) +\item + Could we have an hw or extra credit with a video lecture to learn some + simple python? + + -Sounds great! how simple? + + -\href{https://www.continuum.io/downloads}{Installing Python and + Jupyter Notebook (via Anaconda) - https://www.continuum.io/downloads} + + -\href{https://anneurai.net/2015/11/12/matlab-based-ipython-notebooks/}{Running + Matlab kernel in Jupyter - + https://anneurai.net/2015/11/12/matlab-based-ipython-notebooks/} + + -\href{https://anaconda.org/pypi/octave_kernel}{Running Octave kernel + in Jupyter - https://anaconda.org/pypi/octave\_kernel} +\end{enumerate} + + \section{Markdown examples}\label{markdown-examples} + +\texttt{"\ \textquotesingle{}} ` + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{x=linspace(}\FloatTok{0}\NormalTok{,}\FloatTok{1}\NormalTok{);} +\NormalTok{y=x.^}\FloatTok{2}\NormalTok{;} +\NormalTok{plot(x,y)} +\NormalTok{for i = }\FloatTok{1}\NormalTok{:}\FloatTok{10} + \NormalTok{fprintf(}\StringTok{'markdown is pretty'}\NormalTok{)} +\NormalTok{end} +\end{Highlighting} +\end{Shaded} + + \subsection{Condition of a matrix}\label{condition-of-a-matrix} + +\subsubsection{\texorpdfstring{\emph{just checked in to see what +condition my condition was +in}}{just checked in to see what condition my condition was in}}\label{just-checked-in-to-see-what-condition-my-condition-was-in} + +\subsubsection{Matrix norms}\label{matrix-norms} + +The Euclidean norm of a vector is measure of the magnitude (in 3D this +would be: $|x|=\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}}$) in general the +equation is: + +$||x||_{e}=\sqrt{\sum_{i=1}^{n}x_{i}^{2}}$ + +For a matrix, A, the same norm is called the Frobenius norm: + +$||A||_{f}=\sqrt{\sum_{i=1}^{n}\sum_{j=1}^{m}A_{i,j}^{2}}$ + +In general we can calculate any $p$-norm where + +$||A||_{p}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{p}}$ + +so the p=1, 1-norm is + +$||A||_{1}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{1}}=\sum_{i=1}^{n}\sum_{i=1}^{m}|A_{i,j}|$ + +$||A||_{\infty}=\sqrt{\sum_{i=1}^{n}\sum_{i=1}^{m}A_{i,j}^{\infty}}=\max_{1\le i \le n}\sum_{j=1}^{m}|A_{i,j}|$ + +\subsubsection{Condition of Matrix}\label{condition-of-matrix} + +The matrix condition is the product of + +$Cond(A) = ||A||\cdot||A^{-1}||$ + +So each norm will have a different condition number, but the limit is +$Cond(A)\ge 1$ + +An estimate of the rounding error is based on the condition of A: + +$\frac{||\Delta x||}{x} \le Cond(A) \frac{||\Delta A||}{||A||}$ + +So if the coefficients of A have accuracy to $10^{-t}$ + +and the condition of A, $Cond(A)=10^{c}$ + +then the solution for x can have rounding errors up to $10^{c-t}$ + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}7}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{4}\PY{p}{;}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{5}\PY{p}{]} + \PY{p}{[}\PY{n}{L}\PY{p}{,}\PY{n}{U}\PY{p}{]}\PY{p}{=}\PY{n}{LU\PYZus{}naive}\PY{p}{(}\PY{n}{A}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 1.00000 0.50000 0.33333 + 0.50000 0.33333 0.25000 + 0.33333 0.25000 0.20000 + +L = + + 1.00000 0.00000 0.00000 + 0.50000 1.00000 0.00000 + 0.33333 1.00000 1.00000 + +U = + + 1.00000 0.50000 0.33333 + 0.00000 0.08333 0.08333 + 0.00000 -0.00000 0.00556 + + + \end{Verbatim} + + Then, $A^{-1}=(LU)^{-1}=U^{-1}L^{-1}$ + +$Ld_{1}=\left[\begin{array}{c} 1 \\ 0 \\ 0 \end{array}\right]$, +$Ux_{1}=d_{1}$ ... + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}8}]:} \PY{n}{invA}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{d1}\PY{p}{=}\PY{n}{L}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{d2}\PY{p}{=}\PY{n}{L}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{d3}\PY{p}{=}\PY{n}{L}\PY{o}{\PYZbs{}}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{;} + \PY{n}{invA}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d1}\PY{p}{;} \PY{c}{\PYZpc{} shortcut invA(:,1)=A\PYZbs{}[1;0;0]} + \PY{n}{invA}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d2}\PY{p}{;} + \PY{n}{invA}\PY{p}{(}\PY{p}{:}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{=}\PY{n}{U}\PY{o}{\PYZbs{}}\PY{n}{d3} + \PY{n}{invA}\PY{o}{*}\PY{n}{A} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +invA = + + 9.0000 -36.0000 30.0000 + -36.0000 192.0000 -180.0000 + 30.0000 -180.0000 180.0000 + +ans = + + 1.0000e+00 3.5527e-15 2.9976e-15 + -1.3249e-14 1.0000e+00 -9.1038e-15 + 8.5117e-15 7.1054e-15 1.0000e+00 + + + \end{Verbatim} + + Find the condition of A, $cond(A)$ + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}9}]:} \PY{c}{\PYZpc{} Frobenius norm} + \PY{n}{normf\PYZus{}A} \PY{p}{=} \PY{n+nb}{sqrt}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{A}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}\PY{p}{)} + \PY{n}{normf\PYZus{}invA} \PY{p}{=} \PY{n+nb}{sqrt}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{invA}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}\PY{p}{)} + + \PY{n}{cond\PYZus{}f\PYZus{}A} \PY{p}{=} \PY{n}{normf\PYZus{}A}\PY{o}{*}\PY{n}{normf\PYZus{}invA} + + \PY{n+nb}{norm}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{fro\PYZsq{}}\PY{p}{)} + + \PY{c}{\PYZpc{} p=1, column sum norm} + \PY{n}{norm1\PYZus{}A} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} + \PY{n}{norm1\PYZus{}invA} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{invA}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} + \PY{n+nb}{norm}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)} + + \PY{n}{cond\PYZus{}1\PYZus{}A}\PY{p}{=}\PY{n}{norm1\PYZus{}A}\PY{o}{*}\PY{n}{norm1\PYZus{}invA} + + \PY{c}{\PYZpc{} p=inf, row sum norm} + \PY{n}{norminf\PYZus{}A} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{)} + \PY{n}{norminf\PYZus{}invA} \PY{p}{=} \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{sum}\PY{p}{(}\PY{n}{invA}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{)} + \PY{n+nb}{norm}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n+nb}{inf}\PY{p}{)} + + \PY{n}{cond\PYZus{}inf\PYZus{}A}\PY{p}{=}\PY{n}{norminf\PYZus{}A}\PY{o}{*}\PY{n}{norminf\PYZus{}invA} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +normf\_A = 1.4136 +normf\_invA = 372.21 +cond\_f\_A = 526.16 +ans = 1.4136 +norm1\_A = 1.8333 +norm1\_invA = 30.000 +ans = 1.8333 +cond\_1\_A = 55.000 +norminf\_A = 1.8333 +norminf\_invA = 30.000 +ans = 1.8333 +cond\_inf\_A = 55.000 + + \end{Verbatim} + + Consider the problem again from the intro to Linear Algebra, 4 masses +are connected in series to 4 springs with spring constants $K_{i}$. +What does a high condition number mean for this problem? + +\begin{figure}[htbp] +\centering +\includegraphics{../lecture_09/mass_springs.png} +\caption{Springs-masses} +\end{figure} + +The masses haves the following amounts, 1, 2, 3, and 4 kg for masses +1-4. Using a FBD for each mass: + +$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$ + +$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$ + +$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$ + +$m_{4}g-k_{4}(x_{4}-x_{3})=0$ + +in matrix form: + +$\left[ \begin{array}{cccc} k_{1}+k_{2} & -k_{2} & 0 & 0 \\ -k_{2} & k_{2}+k_{3} & -k_{3} & 0 \\ 0 & -k_{3} & k_{3}+k_{4} & -k_{4} \\ 0 & 0 & -k_{4} & k_{4} \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{array} \right]= \left[ \begin{array}{c} m_{1}g \\ m_{2}g \\ m_{3}g \\ m_{4}g \end{array} \right]$ + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}10}]:} \PY{n}{k1}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{k2}\PY{p}{=}\PY{l+m+mi}{100000}\PY{p}{;} + \PY{n}{k3}\PY{p}{=}\PY{l+m+mi}{10}\PY{p}{;} + \PY{n}{k4}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} + \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} + \PY{n}{m3}\PY{p}{=}\PY{l+m+mi}{3}\PY{p}{;} + \PY{n}{m4}\PY{p}{=}\PY{l+m+mi}{4}\PY{p}{;} + \PY{n}{g}\PY{p}{=}\PY{l+m+mf}{9.81}\PY{p}{;} \PY{c}{\PYZpc{} m/s\PYZca{}2} + \PY{n}{K}\PY{p}{=}\PY{p}{[}\PY{n}{k1}\PY{o}{+}\PY{n}{k2} \PY{o}{\PYZhy{}}\PY{n}{k2} \PY{l+m+mi}{0} \PY{l+m+mi}{0}\PY{p}{;} \PY{o}{\PYZhy{}}\PY{n}{k2} \PY{n}{k2}\PY{o}{+}\PY{n}{k3} \PY{o}{\PYZhy{}}\PY{n}{k3} \PY{l+m+mi}{0}\PY{p}{;} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k3} \PY{n}{k3}\PY{o}{+}\PY{n}{k4} \PY{o}{\PYZhy{}}\PY{n}{k4}\PY{p}{;} \PY{l+m+mi}{0} \PY{l+m+mi}{0} \PY{o}{\PYZhy{}}\PY{n}{k4} \PY{n}{k4}\PY{p}{]} + \PY{n}{y}\PY{p}{=}\PY{p}{[}\PY{n}{m1}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m2}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m3}\PY{o}{*}\PY{n}{g}\PY{p}{;}\PY{n}{m4}\PY{o}{*}\PY{n}{g}\PY{p}{]} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +K = + + 100010 -100000 0 0 + -100000 100010 -10 0 + 0 -10 11 -1 + 0 0 -1 1 + +y = + + 9.8100 + 19.6200 + 29.4300 + 39.2400 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}11}]:} \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{n+nb}{inf}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{fro\PYZsq{}}\PY{p}{)} + \PY{n+nb}{cond}\PY{p}{(}\PY{n}{K}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = 3.2004e+05 +ans = 3.2004e+05 +ans = 2.5925e+05 +ans = 2.5293e+05 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}26}]:} \PY{n+nb}{e}\PY{p}{=}\PY{n+nb}{eig}\PY{p}{(}\PY{n}{K}\PY{p}{)} + \PY{n+nb}{max}\PY{p}{(}\PY{n+nb}{e}\PY{p}{)}\PY{o}{/}\PY{n+nb}{min}\PY{p}{(}\PY{n+nb}{e}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +e = + + 7.9078e-01 + 3.5881e+00 + 1.7621e+01 + 2.0001e+05 + +ans = 2.5293e+05 + + \end{Verbatim} + + \subsection{P=2 norm is ratio of biggest eigenvalue to smallest +eigenvalue!}\label{p2-norm-is-ratio-of-biggest-eigenvalue-to-smallest-eigenvalue} + +no need to calculate the inv(K) + + \section{Iterative Methods}\label{iterative-methods} + +\subsection{Gauss-Seidel method}\label{gauss-seidel-method} + +If we have an intial guess for each value of a vector $x$ that we are +trying to solve, then it is easy enough to solve for one component given +the others. + +Take a 3$\times$3 matrix + +$Ax=b$ + +$\left[ \begin{array}{ccc} 3 & -0.1 & -0.2 \\ 0.1 & 7 & -0.3 \\ 0.3 & -0.2 & 10 \end{array} \right] \left[ \begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \end{array} \right]= \left[ \begin{array}{c} 7.85 \\ -19.3 \\ 71.4\end{array} \right]$ + +$x_{1}=\frac{7.85+0.1x_{2}+0.2x_{3}}{3}$ + +$x_{2}=\frac{-19.3-0.1x_{1}+0.3x_{3}}{7}$ + +$x_{3}=\frac{71.4+0.1x_{1}+0.2x_{2}}{10}$ + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}12}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{3} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.1} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.2}\PY{p}{;}\PY{l+m+mf}{0.1} \PY{l+m+mi}{7} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.3}\PY{p}{;}\PY{l+m+mf}{0.3} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.2} \PY{l+m+mi}{10}\PY{p}{]} + \PY{n}{b}\PY{p}{=}\PY{p}{[}\PY{l+m+mf}{7.85}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mf}{19.3}\PY{p}{;}\PY{l+m+mf}{71.4}\PY{p}{]} + + \PY{n}{x}\PY{p}{=}\PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{b} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 3.00000 -0.10000 -0.20000 + 0.10000 7.00000 -0.30000 + 0.30000 -0.20000 10.00000 + +b = + + 7.8500 + -19.3000 + 71.4000 + +x = + + 3.0000 + -2.5000 + 7.0000 + + + \end{Verbatim} + + \subsubsection{Gauss-Seidel Iterative +approach}\label{gauss-seidel-iterative-approach} + +As a first guess, we can use $x_{1}=x_{2}=x_{3}=0$ + +$x_{1}=\frac{7.85+0.1(0)+0.3(0)}{3}=2.6167$ + +$x_{2}=\frac{-19.3-0.1(2.6167)+0.3(0)}{7}=-2.7945$ + +$x_{3}=\frac{71.4+0.1(2.6167)+0.2(-2.7945)}{10}=7.0056$ + +Then, we update the guess: + +$x_{1}=\frac{7.85+0.1(-2.7945)+0.3(7.0056)}{3}=2.9906$ + +$x_{2}=\frac{-19.3-0.1(2.9906)+0.3(7.0056)}{7}=-2.4996$ + +$x_{3}=\frac{71.4+0.1(2.9906)+0.2(-2.4966)}{10}=7.00029$ + +The results are conveerging to the solution we found with +\texttt{\textbackslash{}} of $x_{1}=3,~x_{2}=-2.5,~x_{3}=7$ + +We could also use an iterative method that solves for all of the +x-components in one step: + +\subsubsection{Jacobi method}\label{jacobi-method} + +$x_{1}^{i}=\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$ + +$x_{2}^{i}=\frac{-19.3-0.1x_{1}^{i-1}+0.3x_{3}^{i-1}}{7}$ + +$x_{3}^{i}=\frac{71.4+0.1x_{1}^{i-1}+0.2x_{2}^{i-1}}{10}$ + +Here the solution is a matrix multiplication and vector addition + +$\left[ \begin{array}{c} x_{1}^{i} \\ x_{2}^{i} \\ x_{3}^{i} \end{array} \right]= \left[ \begin{array}{c} 7.85/3 \\ -19.3/7 \\ 71.4/10\end{array} \right]- \left[ \begin{array}{ccc} 0 & 0.1/3 & 0.2/3 \\ 0.1/7 & 0 & -0.3/7 \\ 0.3/10 & -0.2/10 & 0 \end{array} \right] \left[ \begin{array}{c} x_{1}^{i-1} \\ x_{2}^{i-1} \\ x_{3}^{i-1} \end{array} \right]$ + +\begin{longtable}[c]{@{}llll@{}} +\toprule +\begin{minipage}[b]{0.10\columnwidth}\raggedright\strut +x\_\{j\} +\strut\end{minipage} & +\begin{minipage}[b]{0.36\columnwidth}\raggedright\strut +Jacobi method +\strut\end{minipage} & +\begin{minipage}[b]{0.05\columnwidth}\raggedright\strut +vs +\strut\end{minipage} & +\begin{minipage}[b]{0.37\columnwidth}\raggedright\strut +Gauss-Seidel +\strut\end{minipage}\tabularnewline +\midrule +\endhead +\begin{minipage}[t]{0.10\columnwidth}\raggedright\strut +$x_{1}^{i}=$ +\strut\end{minipage} & +\begin{minipage}[t]{0.36\columnwidth}\raggedright\strut +$\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$ +\strut\end{minipage} & +\begin{minipage}[t]{0.05\columnwidth}\raggedright\strut +\strut\end{minipage} & +\begin{minipage}[t]{0.37\columnwidth}\raggedright\strut +$\frac{7.85+0.1x_{2}^{i-1}+0.3x_{3}^{i-1}}{3}$ +\strut\end{minipage}\tabularnewline +\begin{minipage}[t]{0.10\columnwidth}\raggedright\strut +$x_{2}^{i}=$ +\strut\end{minipage} & +\begin{minipage}[t]{0.36\columnwidth}\raggedright\strut +$\frac{-19.3-0.1x_{1}^{i-1}+0.3x_{3}^{i-1}}{7}$ +\strut\end{minipage} & +\begin{minipage}[t]{0.05\columnwidth}\raggedright\strut +\strut\end{minipage} & +\begin{minipage}[t]{0.37\columnwidth}\raggedright\strut +$\frac{-19.3-0.1x_{1}^{i}+0.3x_{3}^{i-1}}{7}$ +\strut\end{minipage}\tabularnewline +\begin{minipage}[t]{0.10\columnwidth}\raggedright\strut +$x_{3}^{i}=$ +\strut\end{minipage} & +\begin{minipage}[t]{0.36\columnwidth}\raggedright\strut +$\frac{71.4+0.1x_{1}^{i-1}+0.2x_{2}^{i-1}}{10}$ +\strut\end{minipage} & +\begin{minipage}[t]{0.05\columnwidth}\raggedright\strut +\strut\end{minipage} & +\begin{minipage}[t]{0.37\columnwidth}\raggedright\strut +$\frac{71.4+0.1x_{1}^{i}+0.2x_{2}^{i}}{10}$ +\strut\end{minipage}\tabularnewline +\bottomrule +\end{longtable} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}14}]:} \PY{n}{ba}\PY{p}{=}\PY{n}{b}\PY{o}{./}\PY{n+nb}{diag}\PY{p}{(}\PY{n}{A}\PY{p}{)} \PY{c}{\PYZpc{} or ba=b./[A(1,1);A(2,2);A(3,3)]} + \PY{n}{sA}\PY{p}{=}\PY{n}{A}\PY{o}{\PYZhy{}}\PY{n+nb}{diag}\PY{p}{(}\PY{n+nb}{diag}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{)} \PY{c}{\PYZpc{} A with zeros on diagonal} + \PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{;} + \PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)} + \PY{n}{x0}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{x1}\PY{p}{=}\PY{n}{ba}\PY{o}{\PYZhy{}}\PY{n}{sA}\PY{o}{*}\PY{n}{x0} + \PY{n}{x2}\PY{p}{=}\PY{n}{ba}\PY{o}{\PYZhy{}}\PY{n}{sA}\PY{o}{*}\PY{n}{x1} + \PY{n}{x3}\PY{p}{=}\PY{n}{ba}\PY{o}{\PYZhy{}}\PY{n}{sA}\PY{o}{*}\PY{n}{x2} + \PY{n+nb}{fprintf}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{solution is converging to [3,\PYZhy{}2.5,7]]\PYZbs{}n\PYZsq{}}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ba = + + 2.6167 + -2.7571 + 7.1400 + +sA = + + 0.00000 -0.10000 -0.20000 + 0.10000 0.00000 -0.30000 + 0.30000 -0.20000 0.00000 + +sA = + + 0.000000 -0.033333 -0.066667 + 0.014286 0.000000 -0.042857 + 0.030000 -0.020000 0.000000 + +x1 = + + 2.6167 + -2.7571 + 7.1400 + +x2 = + + 3.0008 + -2.4885 + 7.0064 + +x3 = + + 3.0008 + -2.4997 + 7.0002 + +solution is converging to [3,-2.5,7]] + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}16}]:} \PY{n+nb}{diag}\PY{p}{(}\PY{n}{A}\PY{p}{)} + \PY{n+nb}{diag}\PY{p}{(}\PY{n+nb}{diag}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 3 + 7 + 10 + +ans = + +Diagonal Matrix + + 3 0 0 + 0 7 0 + 0 0 10 + + + \end{Verbatim} + + This method works if problem is diagonally dominant, + +$|a_{ii}|>\sum_{j=1,j\ne i}^{n}|a_{ij}|$ + +If this condition is true, then Jacobi or Gauss-Seidel should converge + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}15}]:} \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mf}{0.1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mf}{0.2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{5}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mf}{0.3}\PY{p}{]} + \PY{n}{b}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{12}\PY{p}{;}\PY{l+m+mi}{2}\PY{p}{;}\PY{l+m+mi}{4}\PY{p}{]} + \PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{b} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 0.10000 1.00000 3.00000 + 1.00000 0.20000 3.00000 + 5.00000 2.00000 0.30000 + +b = + + 12 + 2 + 4 + +ans = + + -2.9393 + 9.1933 + 1.0336 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}16}]:} \PY{n}{ba}\PY{p}{=}\PY{n}{b}\PY{o}{./}\PY{n+nb}{diag}\PY{p}{(}\PY{n}{A}\PY{p}{)} \PY{c}{\PYZpc{} or ba=b./[A(1,1);A(2,2);A(3,3)]} + \PY{n}{sA}\PY{p}{=}\PY{n}{A}\PY{o}{\PYZhy{}}\PY{n+nb}{diag}\PY{p}{(}\PY{n+nb}{diag}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{)} \PY{c}{\PYZpc{} A with zeros on diagonal} + \PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{;} + \PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{p}{=}\PY{n}{sA}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{p}{:}\PY{p}{)}\PY{o}{/}\PY{n}{A}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)} + \PY{n}{x0}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{;}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{;} + \PY{n}{x1}\PY{p}{=}\PY{n}{ba}\PY{o}{\PYZhy{}}\PY{n}{sA}\PY{o}{*}\PY{n}{x0} + \PY{n}{x2}\PY{p}{=}\PY{n}{ba}\PY{o}{\PYZhy{}}\PY{n}{sA}\PY{o}{*}\PY{n}{x1} + \PY{n}{x3}\PY{p}{=}\PY{n}{ba}\PY{o}{\PYZhy{}}\PY{n}{sA}\PY{o}{*}\PY{n}{x2} + \PY{n+nb}{fprintf}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{solution is not converging to [\PYZhy{}2.93,9.19,1.03]\PYZbs{}n\PYZsq{}}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ba = + + 120.000 + 10.000 + 13.333 + +sA = + + 0 1 3 + 1 0 3 + 5 2 0 + +sA = + + 0.00000 10.00000 30.00000 + 5.00000 0.00000 15.00000 + 16.66667 6.66667 0.00000 + +x1 = + + 120.000 + 10.000 + 13.333 + +x2 = + + -380.00 + -790.00 + -2053.33 + +x3 = + + 6.9620e+04 + 3.2710e+04 + 1.1613e+04 + +solution is not converging to [-2.93,9.19,1.03] + + \end{Verbatim} + + \subsection{Gauss-Seidel with +Relaxation}\label{gauss-seidel-with-relaxation} + +In order to force the solution to converge faster, we can introduce a +relaxation term $\lambda$. + +where the new x values are weighted between the old and new: + +$x^{i}=\lambda x^{i}+(1-\lambda)x^{i-1}$ + +after solving for x, lambda weights the current approximation with the +previous approximation for the updated x + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}17}]:} \PY{c}{\PYZpc{} rearrange A and b} + \PY{n}{A}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{3} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.1} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.2}\PY{p}{;}\PY{l+m+mf}{0.1} \PY{l+m+mi}{7} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.3}\PY{p}{;}\PY{l+m+mf}{0.3} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.2} \PY{l+m+mi}{10}\PY{p}{]} + \PY{n}{b}\PY{p}{=}\PY{p}{[}\PY{l+m+mf}{7.85}\PY{p}{;}\PY{o}{\PYZhy{}}\PY{l+m+mf}{19.3}\PY{p}{;}\PY{l+m+mf}{71.4}\PY{p}{]} + + \PY{n}{iters}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{l+m+mi}{100}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{k}{for} \PY{n}{i}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100} + \PY{n}{lambda}\PY{p}{=}\PY{l+m+mi}{2}\PY{o}{/}\PY{l+m+mi}{100}\PY{o}{*}\PY{n}{i}\PY{p}{;} + \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{ea}\PY{p}{,}\PY{n}{iters}\PY{p}{(}\PY{n}{i}\PY{p}{)}\PY{p}{]}\PY{p}{=}\PY{n}{Jacobi\PYZus{}rel}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n}{b}\PY{p}{,}\PY{n}{lambda}\PY{p}{)}\PY{p}{;} + \PY{k}{end} + \PY{n+nb}{plot}\PY{p}{(}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{100}\PY{p}{]}\PY{o}{*}\PY{l+m+mi}{2}\PY{o}{/}\PY{l+m+mi}{100}\PY{p}{,}\PY{n}{iters}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +A = + + 3.00000 -0.10000 -0.20000 + 0.10000 7.00000 -0.30000 + 0.30000 -0.20000 10.00000 + +b = + + 7.8500 + -19.3000 + 71.4000 + + + \end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_13_files/lecture_13_24_1.pdf} + \end{center} + { \hspace*{\fill} \\} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}107}]:} \PY{n}{l}\PY{p}{=}\PY{n}{fminbnd}\PY{p}{(}\PY{p}{@}\PY{p}{(}\PY{n}{l}\PY{p}{)} \PY{n}{lambda\PYZus{}fcn}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n}{b}\PY{p}{,}\PY{n}{l}\PY{p}{)}\PY{p}{,}\PY{l+m+mf}{0.5}\PY{p}{,}\PY{l+m+mf}{1.5}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +l = 0.99158 + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}108}]:} \PY{n}{A}\PY{o}{\PYZbs{}}\PY{n}{b} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +ans = + + 3.0000 + -2.5000 + 7.0000 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}109}]:} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{ea}\PY{p}{,}\PY{n}{iter}\PY{p}{]}\PY{p}{=}\PY{n}{Jacobi\PYZus{}rel}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n}{b}\PY{p}{,}\PY{n}{l}\PY{p}{,}\PY{l+m+mf}{0.000001}\PY{p}{)} + \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{ea}\PY{p}{,}\PY{n}{iter}\PY{p}{]}\PY{p}{=}\PY{n}{Jacobi\PYZus{}rel}\PY{p}{(}\PY{n}{A}\PY{p}{,}\PY{n}{b}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mf}{0.000001}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x = + + 3.0000 + -2.5000 + 7.0000 + +ea = + + 1.8289e-07 + 2.1984e-08 + 2.3864e-08 + +iter = 8 +x = + + 3.0000 + -2.5000 + 7.0000 + +ea = + + 1.9130e-08 + 7.6449e-08 + 3.3378e-08 + +iter = 8 + + \end{Verbatim} + + \subsection{Nonlinear Systems}\label{nonlinear-systems} + +Consider two simultaneous nonlinear equations with two unknowns: + +$x_{1}^{2}+x_{1}x_{2}=10$ + +$x_{2}+3x_{1}x_{2}^{2}=57$ + +Graphically, we are looking for the solution: + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}19}]:} \PY{n}{x11}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{l+m+mf}{0.5}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{;} + \PY{n}{x12}\PY{p}{=}\PY{p}{(}\PY{l+m+mi}{10}\PY{o}{\PYZhy{}}\PY{n}{x11}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{./}\PY{n}{x11}\PY{p}{;} + + \PY{n}{x22}\PY{p}{=}\PY{n+nb}{linspace}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{;} + \PY{n}{x21}\PY{p}{=}\PY{p}{(}\PY{l+m+mi}{57}\PY{o}{\PYZhy{}}\PY{n}{x22}\PY{p}{)}\PY{o}{.*}\PY{n}{x22}\PY{o}{.\PYZca{}}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{/}\PY{l+m+mi}{3}\PY{p}{;} + + \PY{n+nb}{plot}\PY{p}{(}\PY{n}{x11}\PY{p}{,}\PY{n}{x12}\PY{p}{,}\PY{n}{x21}\PY{p}{,}\PY{n}{x22}\PY{p}{)} + \PY{c}{\PYZpc{} Solution at x\PYZus{}1=2, x\PYZus{}2=3} + \PY{n+nb}{hold} \PY{n}{on}\PY{p}{;} + \PY{n+nb}{plot}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+s}{\PYZsq{}}\PY{l+s}{o\PYZsq{}}\PY{p}{)} + \PY{n+nb}{xlabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x\PYZus{}1\PYZsq{}}\PY{p}{)} + \PY{n+nb}{ylabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x\PYZus{}2\PYZsq{}}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_13_files/lecture_13_29_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + \subsection{Newton-Raphson part II}\label{newton-raphson-part-ii} + +Remember the first order approximation for the next point in a function +is: + +$f(x_{i+1})=f(x_{i})+(x_{i+1}-x_{i})f'(x_{i})$ + +then, $f(x_{i+1})=0$ so we are left with: + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$ + +We can use the same formula, but now we have multiple dimensions so we +need to determine the Jacobian + +$[J]=\left[ \begin{array}{cccc} \frac{\partial f_{1,i}}{\partial x_{1}} & \frac{\partial f_{1,i}}{\partial x_{2}} & \cdots & \frac{\partial f_{1,i}}{\partial x_{n}} \\ \frac{\partial f_{2,i}}{\partial x_{1}} & \frac{\partial f_{2,i}}{\partial x_{2}} & \cdots & \frac{\partial f_{2,i}}{\partial x_{n}} \\ \vdots & \vdots & & \vdots \\ \frac{\partial f_{n,i}}{\partial x_{1}} & \frac{\partial f_{n,i}}{\partial x_{2}} & \cdots & \frac{\partial f_{n,i}}{\partial x_{n}} \\ \end{array} \right]$ + +$\left[ \begin{array}{c} f_{1,i+1} \\ f_{2,i+1} \\ \vdots \\ f_{n,i+1}\end{array} \right]= \left[ \begin{array}{c} f_{1,i} \\ f_{2,i} \\ \vdots \\ f_{n,i}\end{array} \right]+ \left[ \begin{array}{cccc} \frac{\partial f_{1,i}}{\partial x_{1}} & \frac{\partial f_{1,i}}{\partial x_{2}} & \cdots & \frac{\partial f_{1,i}}{\partial x_{n}} \\ \frac{\partial f_{2,i}}{\partial x_{1}} & \frac{\partial f_{2,i}}{\partial x_{2}} & \cdots & \frac{\partial f_{2,i}}{\partial x_{n}} \\ \vdots & \vdots & & \vdots \\ \frac{\partial f_{n,i}}{\partial x_{1}} & \frac{\partial f_{n,i}}{\partial x_{2}} & \cdots & \frac{\partial f_{n,i}}{\partial x_{n}} \\ \end{array} \right] \left( \left[ \begin{array}{c} x_{i+1} \\ x_{i+1} \\ \vdots \\ x_{i+1}\end{array} \right]- \left[ \begin{array}{c} x_{1,i} \\ x_{2,i} \\ \vdots \\ x_{n,i}\end{array} \right]\right)$ + +\subsubsection{Solution is again in the form +Ax=b}\label{solution-is-again-in-the-form-axb} + +$[J]([x_{i+1}]-[x_{i}])=-[f]$ + +so + +$[x_{i+1}]= [x_{i}]-[J]^{-1}[f]$ + +\subsection{Example of Jacobian +calculation}\label{example-of-jacobian-calculation} + +\subsubsection{Nonlinear springs supporting two masses in +series}\label{nonlinear-springs-supporting-two-masses-in-series} + +Two springs are connected to two masses, with $m_1$=1 kg and +$m_{2}$=2 kg. The springs are identical, but they have nonlinear +spring constants, of $k_1$=100 N/m and $k_2$=-10 N/m + +We want to solve for the final position of the masses ($x_1$ and +$x_2$) + +$m_{1}g+k_{1}(x_{2}-x_{1})+k_{2}(x_{2}-x_{1})^{2}+k_{1}x_{1}+k_{2}x_{1}^{2}=0$ + +$m_{2}g-k_{1}(x_{2}-x_{1})-k_{2}(x_2-x_1)^{2}=0$ + +$J(1,1)=\frac{\partial f_{1}}{\partial x_{1}}=-k_{1}-2k_{2}(x_{2}-x_{1})+k_{1}+2k_{2}x_{1}$ + +$J(1,2)=\frac{\partial f_1}{\partial x_{2}}=k_{1}+2k_{2}(x_{2}-x_{1})$ + +$J(2,1)=\frac{\partial f_2}{\partial x_{1}}=k_{1}+2k_{2}(x_{2}-x_{1})$ + +$J(2,2)=\frac{\partial f_2}{\partial x_{2}}=-k_{1}-2k_{2}(x_{2}-x_{1})$ + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor} }]:} \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg } + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{k1}\PY{p}{=}\PY{l+m+mi}{100}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{k2}\PY{p}{=}\PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{;} \PY{c}{\PYZpc{} N/m\PYZca{}2} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}20}]:} \PY{k}{function}\PY{+w}{ }[f,J]\PY{p}{=}\PY{n+nf}{mass\PYZus{}spring}\PY{p}{(}x\PY{p}{)} + \PY{+w}{ }\PY{c}{\PYZpc{} Function to calculate function values f1 and f2 as well as Jacobian } + \PY{c}{\PYZpc{} for 2 masses and 2 identical nonlinear springs} + \PY{n}{m1}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{;} \PY{c}{\PYZpc{} kg } + \PY{n}{m2}\PY{p}{=}\PY{l+m+mi}{2}\PY{p}{;} \PY{c}{\PYZpc{} kg} + \PY{n}{k1}\PY{p}{=}\PY{l+m+mi}{100}\PY{p}{;} \PY{c}{\PYZpc{} N/m} + \PY{n}{k2}\PY{p}{=}\PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{;} \PY{c}{\PYZpc{} N/m\PYZca{}2} + \PY{n}{g}\PY{p}{=}\PY{l+m+mf}{9.81}\PY{p}{;} \PY{c}{\PYZpc{} m/s\PYZca{}2} + \PY{n}{x1}\PY{p}{=}\PY{n}{x}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{x2}\PY{p}{=}\PY{n}{x}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{;} + \PY{n}{J}\PY{p}{=}\PY{p}{[}\PY{o}{\PYZhy{}}\PY{n}{k1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k2}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{k1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k2}\PY{o}{*}\PY{n}{x1}\PY{p}{,}\PY{n}{k1}\PY{o}{+}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k2}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{p}{;} + \PY{n}{k1}\PY{o}{+}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k2}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{n}{k1}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{k2}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{p}{]}\PY{p}{;} + \PY{n}{f}\PY{p}{=}\PY{p}{[}\PY{n}{m1}\PY{o}{*}\PY{n}{g}\PY{o}{+}\PY{n}{k1}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{o}{+}\PY{n}{k2}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{n}{k1}\PY{o}{*}\PY{n}{x1}\PY{o}{\PYZhy{}}\PY{n}{k2}\PY{o}{*}\PY{n}{x1}\PYZca{}\PY{l+m+mi}{2}\PY{p}{;} + \PY{n}{m2}\PY{o}{*}\PY{n}{g}\PY{o}{\PYZhy{}}\PY{n}{k1}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{o}{\PYZhy{}}\PY{n}{k2}\PY{o}{*}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{o}{.\PYZca{}}\PY{l+m+mi}{2}\PY{p}{]}\PY{p}{;} + \PY{k}{end} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}21}]:} \PY{p}{[}\PY{n}{f}\PY{p}{,}\PY{n}{J}\PY{p}{]}\PY{p}{=}\PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +f = + + -190.19 + 129.62 + +J = + + -200 120 + 120 -120 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}22}]:} \PY{n}{x0}\PY{p}{=}\PY{p}{[}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{2}\PY{p}{]}\PY{p}{;} + \PY{p}{[}\PY{n}{f0}\PY{p}{,}\PY{n}{J0}\PY{p}{]}\PY{p}{=}\PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{n}{x0}\PY{p}{)}\PY{p}{;} + \PY{n}{x1}\PY{p}{=}\PY{n}{x0}\PY{o}{\PYZhy{}}\PY{n}{J0}\PY{o}{\PYZbs{}}\PY{n}{f0} + \PY{n}{ea}\PY{p}{=}\PY{p}{(}\PY{n}{x1}\PY{o}{\PYZhy{}}\PY{n}{x0}\PY{p}{)}\PY{o}{./}\PY{n}{x1} + \PY{p}{[}\PY{n}{f1}\PY{p}{,}\PY{n}{J1}\PY{p}{]}\PY{p}{=}\PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{n}{x1}\PY{p}{)}\PY{p}{;} + \PY{n}{x2}\PY{p}{=}\PY{n}{x1}\PY{o}{\PYZhy{}}\PY{n}{J1}\PY{o}{\PYZbs{}}\PY{n}{f1} + \PY{n}{ea}\PY{p}{=}\PY{p}{(}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{x1}\PY{p}{)}\PY{o}{./}\PY{n}{x2} + \PY{p}{[}\PY{n}{f2}\PY{p}{,}\PY{n}{J2}\PY{p}{]}\PY{p}{=}\PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{n}{x2}\PY{p}{)}\PY{p}{;} + \PY{n}{x3}\PY{p}{=}\PY{n}{x2}\PY{o}{\PYZhy{}}\PY{n}{J2}\PY{o}{\PYZbs{}}\PY{n}{f2} + \PY{n}{ea}\PY{p}{=}\PY{p}{(}\PY{n}{x3}\PY{o}{\PYZhy{}}\PY{n}{x2}\PY{p}{)}\PY{o}{./}\PY{n}{x3} + \PY{n}{x}\PY{p}{=}\PY{n}{x3} + \PY{k}{for} \PY{n}{i}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{3} + \PY{n}{xold}\PY{p}{=}\PY{n}{x}\PY{p}{;} + \PY{p}{[}\PY{n}{f}\PY{p}{,}\PY{n}{J}\PY{p}{]}\PY{p}{=}\PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{;} + \PY{n}{x}\PY{p}{=}\PY{n}{x}\PY{o}{\PYZhy{}}\PY{n}{J}\PY{o}{\PYZbs{}}\PY{n}{f}\PY{p}{;} + \PY{n}{ea}\PY{p}{=}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZhy{}}\PY{n}{xold}\PY{p}{)}\PY{o}{./}\PY{n}{x} + \PY{k}{end} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x1 = + + -1.5142 + -1.4341 + +ea = + + 2.9812 + 2.3946 + +x2 = + + 0.049894 + 0.248638 + +ea = + + 31.3492 + 6.7678 + +x3 = + + 0.29701 + 0.49722 + +ea = + + 0.83201 + 0.49995 + +x = + + 0.29701 + 0.49722 + +ea = + + 0.021392 + 0.012890 + +ea = + + 1.4786e-05 + 8.9091e-06 + +ea = + + 7.0642e-12 + 4.2565e-12 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}23}]:} \PY{n}{x} + \PY{n}{X0}\PY{p}{=}\PY{n+nb}{fsolve}\PY{p}{(}\PY{p}{@}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{3}\PY{p}{;}\PY{l+m+mi}{5}\PY{p}{]}\PY{p}{)} +\end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +x = + + 0.30351 + 0.50372 + +X0 = + + 0.30351 + 0.50372 + + + \end{Verbatim} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor}26}]:} \PY{p}{[}\PY{n}{X}\PY{p}{,}\PY{n}{Y}\PY{p}{]}\PY{p}{=}\PY{n+nb}{meshgrid}\PY{p}{(}\PY{n+nb}{linspace}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{20}\PY{p}{)}\PY{p}{,}\PY{n+nb}{linspace}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{20}\PY{p}{)}\PY{p}{)}\PY{p}{;} + \PY{p}{[}\PY{n}{N}\PY{p}{,}\PY{n}{M}\PY{p}{]}\PY{p}{=}\PY{n+nb}{size}\PY{p}{(}\PY{n}{X}\PY{p}{)}\PY{p}{;} + \PY{n}{F}\PY{p}{=}\PY{n+nb}{zeros}\PY{p}{(}\PY{n+nb}{size}\PY{p}{(}\PY{n}{X}\PY{p}{)}\PY{p}{)}\PY{p}{;} + \PY{k}{for} \PY{n}{i}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{n}{N} + \PY{k}{for} \PY{n}{j}\PY{p}{=}\PY{l+m+mi}{1}\PY{p}{:}\PY{n}{M} + \PY{p}{[}\PY{n}{f}\PY{p}{,}\PY{o}{\PYZti{}}\PY{p}{]}\PY{p}{=}\PY{n}{mass\PYZus{}spring}\PY{p}{(}\PY{p}{[}\PY{n}{X}\PY{p}{(}\PY{n}{i}\PY{p}{,}\PY{n}{j}\PY{p}{)}\PY{p}{,}\PY{n}{Y}\PY{p}{(}\PY{n}{i}\PY{p}{,}\PY{n}{j}\PY{p}{)}\PY{p}{]}\PY{p}{)}\PY{p}{;} + \PY{n}{F1}\PY{p}{(}\PY{n}{i}\PY{p}{,}\PY{n}{j}\PY{p}{)}\PY{p}{=}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{;} + \PY{n}{F2}\PY{p}{(}\PY{n}{i}\PY{p}{,}\PY{n}{j}\PY{p}{)}\PY{p}{=}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{;} + \PY{k}{end} + \PY{k}{end} + \PY{n+nb}{mesh}\PY{p}{(}\PY{n}{X}\PY{p}{,}\PY{n}{Y}\PY{p}{,}\PY{n}{F1}\PY{p}{)} + \PY{n+nb}{xlabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x\PYZus{}1\PYZsq{}}\PY{p}{)} + \PY{n+nb}{ylabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x\PYZus{}2\PYZsq{}}\PY{p}{)} + \PY{n+nb}{colorbar}\PY{p}{(}\PY{p}{)} + \PY{n+nb}{figure}\PY{p}{(}\PY{p}{)} + \PY{n+nb}{mesh}\PY{p}{(}\PY{n}{X}\PY{p}{,}\PY{n}{Y}\PY{p}{,}\PY{n}{F2}\PY{p}{)} + \PY{n+nb}{xlabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x\PYZus{}1\PYZsq{}}\PY{p}{)} + \PY{n+nb}{ylabel}\PY{p}{(}\PY{l+s}{\PYZsq{}}\PY{l+s}{x\PYZus{}2\PYZsq{}}\PY{p}{)} + \PY{n+nb}{colorbar}\PY{p}{(}\PY{p}{)} +\end{Verbatim} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_13_files/lecture_13_36_0.pdf} + \end{center} + { \hspace*{\fill} \\} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{lecture_13_files/lecture_13_36_1.pdf} + \end{center} + { \hspace*{\fill} \\} + + \begin{Verbatim}[commandchars=\\\{\}] +{\color{incolor}In [{\color{incolor} }]:} +\end{Verbatim} + + + % Add a bibliography block to the postdoc + + + + \end{document} diff --git a/lecture_13/lecture_13_files/lecture_13_22_1.pdf b/lecture_13/lecture_13_files/lecture_13_22_1.pdf new file mode 100644 index 0000000..292be46 Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_22_1.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_22_1.svg b/lecture_13/lecture_13_files/lecture_13_22_1.svg new file mode 100644 index 0000000..c8482cc --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_22_1.svg @@ -0,0 +1,121 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 10 + + + + + 20 + + + + + 30 + + + + + 40 + + + + + 50 + + + + + 0 + + + + + 0.5 + + + + + 1 + + + + + 1.5 + + + + + 2 + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_24_1.pdf b/lecture_13/lecture_13_files/lecture_13_24_1.pdf new file mode 100644 index 0000000..292be46 Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_24_1.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_24_1.svg b/lecture_13/lecture_13_files/lecture_13_24_1.svg new file mode 100644 index 0000000..c8482cc --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_24_1.svg @@ -0,0 +1,121 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 10 + + + + + 20 + + + + + 30 + + + + + 40 + + + + + 50 + + + + + 0 + + + + + 0.5 + + + + + 1 + + + + + 1.5 + + + + + 2 + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_27_0.pdf b/lecture_13/lecture_13_files/lecture_13_27_0.pdf new file mode 100644 index 0000000..45aaf4e Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_27_0.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_27_0.svg b/lecture_13/lecture_13_files/lecture_13_27_0.svg new file mode 100644 index 0000000..acc1eeb --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_27_0.svg @@ -0,0 +1,131 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_29_0.pdf b/lecture_13/lecture_13_files/lecture_13_29_0.pdf new file mode 100644 index 0000000..5394e08 Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_29_0.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_29_0.svg b/lecture_13/lecture_13_files/lecture_13_29_0.svg new file mode 100644 index 0000000..31dbf03 --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_29_0.svg @@ -0,0 +1,141 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + + x2 + + + + + x1 + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + gnuplot_plot_3a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_34_0.pdf b/lecture_13/lecture_13_files/lecture_13_34_0.pdf new file mode 100644 index 0000000..d9bb774 Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_34_0.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_34_0.svg b/lecture_13/lecture_13_files/lecture_13_34_0.svg new file mode 100644 index 0000000..5163d90 --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_34_0.svg @@ -0,0 +1,2040 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + 0.2 + + + + + + + + + 0.4 + + + + + + + + + 0.6 + + + + + + + + + 0.8 + + + + + + + + + 1 + + + + + + + + + + + 0 + + + + + + + + + 0.2 + + + + + + + + + 0.4 + + + + + + + + + 0.6 + + + + + + + + + 0.8 + + + + + + + + + 1 + + + + + x2 + + + + + + + + + + + + + + + + + + gnuplot_plot_1b + + + +; + + + + + + + -150 + + + + + -100 + + + + + -50 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_34_1.pdf b/lecture_13/lecture_13_files/lecture_13_34_1.pdf new file mode 100644 index 0000000..d9bb774 Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_34_1.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_34_1.svg b/lecture_13/lecture_13_files/lecture_13_34_1.svg new file mode 100644 index 0000000..5163d90 --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_34_1.svg @@ -0,0 +1,2040 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + 0.2 + + + + + + + + + 0.4 + + + + + + + + + 0.6 + + + + + + + + + 0.8 + + + + + + + + + 1 + + + + + + + + + + + 0 + + + + + + + + + 0.2 + + + + + + + + + 0.4 + + + + + + + + + 0.6 + + + + + + + + + 0.8 + + + + + + + + + 1 + + + + + x2 + + + + + + + + + + + + + + + + + + gnuplot_plot_1b + + + +; + + + + + + + -150 + + + + + -100 + + + + + -50 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_36_0.pdf b/lecture_13/lecture_13_files/lecture_13_36_0.pdf new file mode 100644 index 0000000..eca271a Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_36_0.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_36_0.svg b/lecture_13/lecture_13_files/lecture_13_36_0.svg new file mode 100644 index 0000000..3d836e3 --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_36_0.svg @@ -0,0 +1,1887 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + 2 + + + + + + + + + 4 + + + + + + + + + 6 + + + + + + + + + 8 + + + + + + + + + 10 + + + + + x1 + + + + + + + + + + + 0 + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + 8 + + + + + + + + + 10 + + + + + x2 + + + + + + + + + + + -500 + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + 500 + + + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + + + 1500 + + + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + + + + + + + + gnuplot_plot_1b + + + +; + + + + + + + 0 + + + + + 500 + + + + + 1000 + + + + + 1500 + + + + + 2000 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/lecture_13_files/lecture_13_36_1.pdf b/lecture_13/lecture_13_files/lecture_13_36_1.pdf new file mode 100644 index 0000000..da00267 Binary files /dev/null and b/lecture_13/lecture_13_files/lecture_13_36_1.pdf differ diff --git a/lecture_13/lecture_13_files/lecture_13_36_1.svg b/lecture_13/lecture_13_files/lecture_13_36_1.svg new file mode 100644 index 0000000..92ee787 --- /dev/null +++ b/lecture_13/lecture_13_files/lecture_13_36_1.svg @@ -0,0 +1,1857 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + 2 + + + + + + + + + + + 4 + + + + + + + + + + + 6 + + + + + + + + + + + 8 + + + + + + + + + 10 + + + + + x1 + + + + + + + + + + + 0 + + + + + + + + + 2 + + + + + + + + + 4 + + + + + + + + + 6 + + + + + + + + + 8 + + + + + + + + + 10 + + + + + x2 + + + + + + + + + + + -2000 + + + + + + + + + + + + + -1500 + + + + + + + + + + + + + -1000 + + + + + + + + + + + + + -500 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + + + + + + + + gnuplot_plot_1b + + + +; + + + + + + + -1500 + + + + + -1000 + + + + + -500 + + + + + 0 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_13/nohup.out b/lecture_13/nohup.out new file mode 100644 index 0000000..ee0677e --- /dev/null +++ b/lecture_13/nohup.out @@ -0,0 +1,2 @@ + +(evince:3288): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -71 and height 20 diff --git a/lecture_13/norm_A.png b/lecture_13/norm_A.png new file mode 100644 index 0000000..5f2d273 Binary files /dev/null and b/lecture_13/norm_A.png differ diff --git a/lecture_13/octave-workspace b/lecture_13/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_13/octave-workspace differ diff --git a/lecture_14/fx.png b/lecture_14/fx.png new file mode 100644 index 0000000..618e565 Binary files /dev/null and b/lecture_14/fx.png differ diff --git a/lecture_14/lecture_14.pdf b/lecture_14/lecture_14.pdf new file mode 100755 index 0000000..8c74cc6 Binary files /dev/null and b/lecture_14/lecture_14.pdf differ diff --git a/lecture_15/.ipynb_checkpoints/lecture_15-checkpoint.ipynb b/lecture_15/.ipynb_checkpoints/lecture_15-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_15/.ipynb_checkpoints/lecture_15-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_15/animate_eig.m b/lecture_15/animate_eig.m new file mode 100644 index 0000000..a4721a5 --- /dev/null +++ b/lecture_15/animate_eig.m @@ -0,0 +1,56 @@ +function [v,e]=animate_eig(k,m) + % create a series of png's for use in an animation based on + % spring constants [k1,k2,k3]=k + % and + % masses + % [m1,m2]=m + + % check inputs for m and k + if length(m)==1 + m1=m; + m2=m; + else + m1=m(1); + m2=m(2); + end + if length(k)==1 + k1=k; k2=k; k3=k; + else + k1=k(1); + k2=k(2); + k3=k(3); + end + setdefaults + K=[k1/m1+k2/m1,-k2/m1;-k3/m2,k2/m2+k3/m2]; + [v,e]=eig(K); + w1=e(1,1); w2=e(2,2); + scale = 0.5; % the magnitude of oscillations is not important for vibrational modes + % just set scale to 1/2 for nice plots + % the eigenvector magnitude is independent of the solution + X11=v(1,1)*scale; X12=v(2,1)*scale; + X21=v(1,2)*scale; X22=v(2,2)*scale; + f11=@(t) X11*sin(w1*t); f12=@(t) X12*sin(w1*t); + f21=@(t) X21*sin(w2*t); f22=@(t) X22*sin(w2*t); + f=figure(); + time=linspace(-1,4); + % create a loop to plot the position over time where mass 1 and 2 start at x=1 and x=2 m + % then for the next vibrational mode, mass 1 and 2 start at x=3 and x=4 m + + for i=1:length(time) + t=time(i); + plot(f11(t)+1,0,'rs',f11(time+t)+1,-time,... + f12(t)+2,0,'rs',f12(time+t)+2,-time,... + f21(t)+3,0,'bo',f21(time+t)+3,-time,... + f22(t)+4,0,'bo',f22(time+t)+4,-time) + axis([0 6 -4 1]) + title('Vibration Modes') + xlabel('position (m)') + ylabel('time (s)') + filename=sprintf('output/%05d.png',i); + % another option for saving a plot to a png is the 'print' command + print(filename) + end + % this is a system command to use ImageMagick's cli 'convert' to create an animated gif + % if you don't have ImageMagick installed, comment this next line + system ("convert -delay 10 -loop 0 output/*png eigenvalues.gif") +end diff --git a/lecture_15/eig_200_100_40_20.gif b/lecture_15/eig_200_100_40_20.gif new file mode 100644 index 0000000..1b583a7 Binary files /dev/null and b/lecture_15/eig_200_100_40_20.gif differ diff --git a/lecture_15/eig_200_100_40_50.gif b/lecture_15/eig_200_100_40_50.gif new file mode 100644 index 0000000..ba05f59 Binary files /dev/null and b/lecture_15/eig_200_100_40_50.gif differ diff --git a/lecture_15/eig_200_40.gif b/lecture_15/eig_200_40.gif new file mode 100644 index 0000000..f29f27e Binary files /dev/null and b/lecture_15/eig_200_40.gif differ diff --git a/lecture_15/eigenvalues.gif b/lecture_15/eigenvalues.gif new file mode 100644 index 0000000..1286762 Binary files /dev/null and b/lecture_15/eigenvalues.gif differ diff --git a/lecture_15/lecture_15.ipynb b/lecture_15/lecture_15.ipynb new file mode 100644 index 0000000..49e4b52 --- /dev/null +++ b/lecture_15/lecture_15.ipynb @@ -0,0 +1,618 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## UConn Hackathon Mar 24-25\n", + "\n", + "[https://www.hackuconn.org/](https://www.hackuconn.org/)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Final Project\n", + "\n", + "1. Will be a team project (select team of 2-3 students)\n", + "\n", + "2. You will create a repository and each of you will contribute code and documentation\n", + "\n", + "3. If you have an idea feel free to suggest it, otherwise I will come up with a project, possible topics include:\n", + "\n", + " a. Conduction of heat through simple geometry\n", + " \n", + " b. Plate or beam mechanics (1-D and 2-D geometries)\n", + " \n", + " c. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Eigenvalues\n", + "\n", + "Eigenvalues and eigen vectors are the solution to the set of equations where\n", + "\n", + "$Ax=\\lambda x$\n", + "\n", + "or \n", + "\n", + "$A-I \\lambda=0$\n", + "\n", + "Where A is the description of the system and I is the identity matrix with the same dimensions as A and $\\lambda$ is an eigenvalue of A. \n", + "\n", + "These problems are seen in a number of engineering practices:\n", + "\n", + "1. Determining vibrational modes in structural devices\n", + "\n", + "2. Material science - vibrational modes of crystal lattices (phonons)\n", + "\n", + "3. [Google searches - http://www.rose-hulman.edu/~bryan/googleFinalVersionFixed.pdf](http://www.rose-hulman.edu/~bryan/googleFinalVersionFixed.pdf)\n", + "\n", + "4. Quantum mechanics - many solutions are eigenvalue problems\n", + "\n", + "5. Solid mechanics, principle stresses and principle stress directions are eigenvalues and eigenvectors\n", + "\n", + "One way of determining the eigenvalues is taking the determinant:\n", + "\n", + "$|A-\\lambda I|=0$\n", + "\n", + "This will result in an $n^{th}$-order polynomial where A is $n \\times n$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Take, A\n", + "\n", + "$A=\\left[\\begin{array}{ccc}\n", + "2 & 1 & 0 \\\\\n", + "1 & 3 & 1 \\\\\n", + "0 & 1 & 4 \\end{array}\\right]$\n", + "\n", + "$|A-\\lambda I| = \\left|\\begin{array}{ccc}\n", + "2-\\lambda & 1 & 0 \\\\\n", + "1 & 3-\\lambda & 1 \\\\\n", + "0 & 1 & 4-\\lambda \\end{array}\\right|=0$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$(2-\\lambda)(3-\\lambda)(4-\\lambda)-(4-\\lambda)-(2-\\lambda)=0$\n", + "\n", + "$-\\lambda^{3}+9\\lambda^{2}-24\\lambda+18 =0$\n", + "\n", + "$\\lambda = 3,~\\sqrt{3}+3,-\\sqrt{3}+3$\n", + "\n", + "in Matlab/Octave:\n", + "\n", + "```matlab\n", + "A=[2,1,0;1,3,1;0,1,4];\n", + "pA=poly(A);\n", + "lambda = roots(pA)\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "lambda =\n", + "\n", + " 4.7321\n", + " 3.0000\n", + " 1.2679\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1,0;1,3,1;0,1,4];\n", + "pA=poly(A); % characteristic polynomial of A, e.g. l^3-9*l^2+24*l-18=0\n", + "lambda = roots(pA)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Applications of Eigenvalue analysis\n", + "\n", + "Consider the 2-mass, 3-spring system shown below\n", + "\n", + "![masses and springs in series](springs_masses.png)\n", + "\n", + "It might not be immediately obvious, but there are two resonant frequencies for these masses connected in series. \n", + "\n", + "Take the two FBD solutions:\n", + "\n", + "$m_{1}\\frac{d^{2}x_{1}}{dt^{2}}=-kx_{1}+k(x_{2}-x_{1})$\n", + "\n", + "$m_{2}\\frac{d^{2}x_{2}}{dt^{2}}=-k(x_{2}-x_{1})-kx_{2}$\n", + "\n", + "we know that $x_{i}(t)\\propto sin(\\omega t)$ so we can substitute\n", + "\n", + "$x_{i}=X_{i}sin(\\omega t)$\n", + "\n", + "$-m_{1}X_{1}\\omega^{2}sin(\\omega t) = -kX_{1}sin(\\omega t) +k(X_{2}-X_{1})sin(\\omega t)$\n", + "\n", + "$-m_{2}X_{2}\\omega^{2}sin(\\omega t) = -kX_{2}sin(\\omega t) - k(X_{2}-X_{1})sin(\\omega t)$\n", + "\n", + "where $X_{1}$ and $X_{2}$ are the amplitude of oscillations and $\\omega$ is the frequency of oscillations. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now, \n", + "\n", + "$\\left(\\frac{2k}{m_{1}}-\\omega^{2}\\right)X_{1}-\\frac{k}{m_{1}}X_{2} = 0$\n", + "\n", + "\n", + "$-\\frac{k}{m_{2}}X_{1}+\\left(\\frac{2k}{m_{2}}-\\omega^{2}\\right)X_{2} = 0$\n", + "\n", + "or\n", + "\n", + "$|K-\\lambda I| = \\left|\\begin{array}{cc}\n", + "\\left(\\frac{2k}{m_{1}}-\\omega^{2}\\right) & -\\frac{k}{m_{1}} \\\\\n", + "-\\frac{k}{m_{2}} & \\left(\\frac{2k}{m_{2}}-\\omega^{2}\\right)\n", + "\\end{array}\\right|=0$\n", + "\n", + "where $\\lambda = \\omega^{2}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'eig' is a built-in function from the file libinterp/corefcn/eig.cc\n", + "\n", + " -- Built-in Function: LAMBDA = eig (A)\n", + " -- Built-in Function: LAMBDA = eig (A, B)\n", + " -- Built-in Function: [V, LAMBDA] = eig (A)\n", + " -- Built-in Function: [V, LAMBDA] = eig (A, B)\n", + " Compute the eigenvalues (and optionally the eigenvectors) of a\n", + " matrix or a pair of matrices\n", + "\n", + " The algorithm used depends on whether there are one or two input\n", + " matrices, if they are real or complex, and if they are symmetric\n", + " (Hermitian if complex) or non-symmetric.\n", + "\n", + " The eigenvalues returned by 'eig' are not ordered.\n", + "\n", + " See also: eigs, svd.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help eig" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 10 -5\n", + " -5 10\n", + "\n", + "v =\n", + "\n", + " -0.70711 -0.70711\n", + " -0.70711 0.70711\n", + "\n", + "e =\n", + "\n", + "Diagonal Matrix\n", + "\n", + " 5 0\n", + " 0 15\n", + "\n" + ] + } + ], + "source": [ + "m=40; % mass in kg\n", + "k=200; % spring constant in N/m\n", + "\n", + "K=[2*k/m,-k/m;-k/m,2*k/m]\n", + "\n", + "[v,e]=eig(K)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " -10.607\n", + " 10.607\n", + "\n", + "ans =\n", + "\n", + " -10.607\n", + " 10.607\n", + "\n" + ] + } + ], + "source": [ + "K*v(:,2)\n", + "e(2,2)*v(:,2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### $m_{1}=m_{2}=$40 kg and $k_{1}=k_{2}=k_{3}=$200 N/m\n", + "![animation](./eig_200_40.gif)\n", + "\n", + "### $m_{1}=$40 kg, $m_{2}=$50 kg, $k_{1}=$200 N/m, and $k_{2}=k_{3}=$100 N/m\n", + "![animation](./eig_200_100_40_50.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solid Mechanics\n", + "\n", + "Many times you want to know the \"principle\" components of stress or strain. \n", + "\n", + "stress and strain are second order tensors:\n", + "\n", + "$\\sigma_{ij} =\\frac{F_{i}}{A_{j}}$ (engineering stress)\n", + "\n", + "$\\epsilon_{ij}=\\frac{\\Delta l_{i}}{l_{j}}$ (engineering strain)\n", + "\n", + "Imagine you can apply a force in two directions normal to each other, could you create a shear stress? \n", + "\n", + "![Desired stress state and with unknown applied stresses](stress.svg)\n", + "\n", + "Let's try to create the stress state of 10 MPa shear stress with two normal stresses. \n", + "\n", + "that means, $\\sigma_{12}=\\sigma_{21}=$10 MPa, and $\\sigma_{11}=\\sigma_{22}=\\sigma_{33}=\\sigma_{23}=\\sigma_{13}=0$ MPa\n", + "\n", + "in matrix form:\n", + "\n", + "$[\\sigma]=\\left[\\begin{array}{ccc}\n", + "0 & 10 & 0 \\\\\n", + "10 & 0 & 0 \\\\\n", + "0 & 0 & 0 \\end{array} \\right]$ MPa" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "v =\n", + "\n", + " -0.70711 0.00000 0.70711\n", + " 0.70711 0.00000 0.70711\n", + " 0.00000 1.00000 0.00000\n", + "\n", + "e =\n", + "\n", + "Diagonal Matrix\n", + "\n", + " -10 0 0\n", + " 0 0 0\n", + " 0 0 10\n", + "\n", + "v1 =\n", + "\n", + " 7.07107\n", + " -7.07107\n", + " 0.00000\n", + "\n", + "v2 =\n", + "\n", + " 7.07107\n", + " 7.07107\n", + " 0.00000\n", + "\n" + ] + } + ], + "source": [ + "s=[0,10,0;10,0,0;0,0,0];\n", + "[v,e]=eig(s)\n", + "v1=s*v(:,1)\n", + "v2=s*v(:,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v1=s*v(:,1);\n", + "v2=s*v(:,3);\n", + "%quiver([0,0],[0,0],v(1,[1,3]),v(2,[1,3]))\n", + "quiver([0,0],[0,0],[v1(1),v2(1)],[v1(2),v2(2)])\n", + "axis([-10,10,-10,10])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![solution to principle stresses](stress_soln.svg)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e =\n", + "\n", + " -10\n", + " 0\n", + " 10\n", + "\n" + ] + } + ], + "source": [ + "e=eig(s)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_15/lecture_15.pdf b/lecture_15/lecture_15.pdf new file mode 100644 index 0000000..94d5f8c Binary files /dev/null and b/lecture_15/lecture_15.pdf differ diff --git a/lecture_15/octave-workspace b/lecture_15/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_15/octave-workspace differ diff --git a/lecture_15/output/00001.png b/lecture_15/output/00001.png new file mode 100644 index 0000000..44210b6 Binary files /dev/null and b/lecture_15/output/00001.png differ diff --git a/lecture_15/output/00002.png b/lecture_15/output/00002.png new file mode 100644 index 0000000..31a03bb Binary files /dev/null and b/lecture_15/output/00002.png differ diff --git a/lecture_15/output/00003.png b/lecture_15/output/00003.png new file mode 100644 index 0000000..08cd507 Binary files /dev/null and b/lecture_15/output/00003.png differ diff --git a/lecture_15/output/00004.png b/lecture_15/output/00004.png new file mode 100644 index 0000000..590a413 Binary files /dev/null and b/lecture_15/output/00004.png differ diff --git a/lecture_15/output/00005.png b/lecture_15/output/00005.png new file mode 100644 index 0000000..240744a Binary files /dev/null and b/lecture_15/output/00005.png differ diff --git a/lecture_15/output/00006.png b/lecture_15/output/00006.png new file mode 100644 index 0000000..e31a3c7 Binary files /dev/null and b/lecture_15/output/00006.png differ diff --git a/lecture_15/output/00007.png b/lecture_15/output/00007.png new file mode 100644 index 0000000..7ad26e6 Binary files /dev/null and b/lecture_15/output/00007.png differ diff --git a/lecture_15/output/00008.png b/lecture_15/output/00008.png new file mode 100644 index 0000000..10bcf68 Binary files /dev/null and b/lecture_15/output/00008.png differ diff --git a/lecture_15/output/00009.png b/lecture_15/output/00009.png new file mode 100644 index 0000000..53e6f1c Binary files /dev/null and b/lecture_15/output/00009.png differ diff --git a/lecture_15/output/00010.png b/lecture_15/output/00010.png new file mode 100644 index 0000000..c78c8ca Binary files /dev/null and b/lecture_15/output/00010.png differ diff --git a/lecture_15/output/00011.png b/lecture_15/output/00011.png new file mode 100644 index 0000000..430a933 Binary files /dev/null and b/lecture_15/output/00011.png differ diff --git a/lecture_15/output/00012.png b/lecture_15/output/00012.png new file mode 100644 index 0000000..c708dd3 Binary files /dev/null and b/lecture_15/output/00012.png differ diff --git a/lecture_15/output/00013.png b/lecture_15/output/00013.png new file mode 100644 index 0000000..4a25731 Binary files /dev/null and b/lecture_15/output/00013.png differ diff --git a/lecture_15/output/00014.png b/lecture_15/output/00014.png new file mode 100644 index 0000000..ea02a38 Binary files /dev/null and b/lecture_15/output/00014.png differ diff --git a/lecture_15/output/00015.png b/lecture_15/output/00015.png new file mode 100644 index 0000000..f0f640e Binary files /dev/null and b/lecture_15/output/00015.png differ diff --git a/lecture_15/output/00016.png b/lecture_15/output/00016.png new file mode 100644 index 0000000..44f338f Binary files /dev/null and b/lecture_15/output/00016.png differ diff --git a/lecture_15/output/00017.png b/lecture_15/output/00017.png new file mode 100644 index 0000000..056a85b Binary files /dev/null and b/lecture_15/output/00017.png differ diff --git a/lecture_15/output/00018.png b/lecture_15/output/00018.png new file mode 100644 index 0000000..2bab623 Binary files /dev/null and b/lecture_15/output/00018.png differ diff --git a/lecture_15/output/00019.png b/lecture_15/output/00019.png new file mode 100644 index 0000000..9dac5a7 Binary files /dev/null and b/lecture_15/output/00019.png differ diff --git a/lecture_15/output/00020.png b/lecture_15/output/00020.png new file mode 100644 index 0000000..1d4ab40 Binary files /dev/null and b/lecture_15/output/00020.png differ diff --git a/lecture_15/output/00021.png b/lecture_15/output/00021.png new file mode 100644 index 0000000..66eb44d Binary files /dev/null and b/lecture_15/output/00021.png differ diff --git a/lecture_15/output/00022.png b/lecture_15/output/00022.png new file mode 100644 index 0000000..fa6fdc8 Binary files /dev/null and b/lecture_15/output/00022.png differ diff --git a/lecture_15/output/00023.png b/lecture_15/output/00023.png new file mode 100644 index 0000000..aa755e1 Binary files /dev/null and b/lecture_15/output/00023.png differ diff --git a/lecture_15/output/00024.png b/lecture_15/output/00024.png new file mode 100644 index 0000000..4e64252 Binary files /dev/null and b/lecture_15/output/00024.png differ diff --git a/lecture_15/output/00025.png b/lecture_15/output/00025.png new file mode 100644 index 0000000..a2fc1b3 Binary files /dev/null and b/lecture_15/output/00025.png differ diff --git a/lecture_15/output/00026.png b/lecture_15/output/00026.png new file mode 100644 index 0000000..041a839 Binary files /dev/null and b/lecture_15/output/00026.png differ diff --git a/lecture_15/output/00027.png b/lecture_15/output/00027.png new file mode 100644 index 0000000..41a54ff Binary files /dev/null and b/lecture_15/output/00027.png differ diff --git a/lecture_15/output/00028.png b/lecture_15/output/00028.png new file mode 100644 index 0000000..b6cc8c8 Binary files /dev/null and b/lecture_15/output/00028.png differ diff --git a/lecture_15/output/00029.png b/lecture_15/output/00029.png new file mode 100644 index 0000000..4c665b8 Binary files /dev/null and b/lecture_15/output/00029.png differ diff --git a/lecture_15/output/00030.png b/lecture_15/output/00030.png new file mode 100644 index 0000000..71801e9 Binary files /dev/null and b/lecture_15/output/00030.png differ diff --git a/lecture_15/output/00031.png b/lecture_15/output/00031.png new file mode 100644 index 0000000..a30c5b9 Binary files /dev/null and b/lecture_15/output/00031.png differ diff --git a/lecture_15/output/00032.png b/lecture_15/output/00032.png new file mode 100644 index 0000000..8ef9b30 Binary files /dev/null and b/lecture_15/output/00032.png differ diff --git a/lecture_15/output/00033.png b/lecture_15/output/00033.png new file mode 100644 index 0000000..79f8e85 Binary files /dev/null and b/lecture_15/output/00033.png differ diff --git a/lecture_15/output/00034.png b/lecture_15/output/00034.png new file mode 100644 index 0000000..075d85e Binary files /dev/null and b/lecture_15/output/00034.png differ diff --git a/lecture_15/output/00035.png b/lecture_15/output/00035.png new file mode 100644 index 0000000..bc73c87 Binary files /dev/null and b/lecture_15/output/00035.png differ diff --git a/lecture_15/output/00036.png b/lecture_15/output/00036.png new file mode 100644 index 0000000..48b5fae Binary files /dev/null and b/lecture_15/output/00036.png differ diff --git a/lecture_15/output/00037.png b/lecture_15/output/00037.png new file mode 100644 index 0000000..7107cfc Binary files /dev/null and b/lecture_15/output/00037.png differ diff --git a/lecture_15/output/00038.png b/lecture_15/output/00038.png new file mode 100644 index 0000000..c9c09b2 Binary files /dev/null and b/lecture_15/output/00038.png differ diff --git a/lecture_15/output/00039.png b/lecture_15/output/00039.png new file mode 100644 index 0000000..8755cf3 Binary files /dev/null and b/lecture_15/output/00039.png differ diff --git a/lecture_15/output/00040.png b/lecture_15/output/00040.png new file mode 100644 index 0000000..9503926 Binary files /dev/null and b/lecture_15/output/00040.png differ diff --git a/lecture_15/output/00041.png b/lecture_15/output/00041.png new file mode 100644 index 0000000..4311d25 Binary files /dev/null and b/lecture_15/output/00041.png differ diff --git a/lecture_15/output/00042.png b/lecture_15/output/00042.png new file mode 100644 index 0000000..3ce55af Binary files /dev/null and b/lecture_15/output/00042.png differ diff --git a/lecture_15/output/00043.png b/lecture_15/output/00043.png new file mode 100644 index 0000000..8c619cf Binary files /dev/null and b/lecture_15/output/00043.png differ diff --git a/lecture_15/output/00044.png b/lecture_15/output/00044.png new file mode 100644 index 0000000..2d91fd9 Binary files /dev/null and b/lecture_15/output/00044.png differ diff --git a/lecture_15/output/00045.png b/lecture_15/output/00045.png new file mode 100644 index 0000000..92e9720 Binary files /dev/null and b/lecture_15/output/00045.png differ diff --git a/lecture_15/output/00046.png b/lecture_15/output/00046.png new file mode 100644 index 0000000..62dfa75 Binary files /dev/null and b/lecture_15/output/00046.png differ diff --git a/lecture_15/output/00047.png b/lecture_15/output/00047.png new file mode 100644 index 0000000..b62ac38 Binary files /dev/null and b/lecture_15/output/00047.png differ diff --git a/lecture_15/output/00048.png b/lecture_15/output/00048.png new file mode 100644 index 0000000..0b90065 Binary files /dev/null and b/lecture_15/output/00048.png differ diff --git a/lecture_15/output/00049.png b/lecture_15/output/00049.png new file mode 100644 index 0000000..f7510c0 Binary files /dev/null and b/lecture_15/output/00049.png differ diff --git a/lecture_15/output/00050.png b/lecture_15/output/00050.png new file mode 100644 index 0000000..2c74c37 Binary files /dev/null and b/lecture_15/output/00050.png differ diff --git a/lecture_15/output/00051.png b/lecture_15/output/00051.png new file mode 100644 index 0000000..daabdee Binary files /dev/null and b/lecture_15/output/00051.png differ diff --git a/lecture_15/output/00052.png b/lecture_15/output/00052.png new file mode 100644 index 0000000..15fb10c Binary files /dev/null and b/lecture_15/output/00052.png differ diff --git a/lecture_15/output/00053.png b/lecture_15/output/00053.png new file mode 100644 index 0000000..07fb58c Binary files /dev/null and b/lecture_15/output/00053.png differ diff --git a/lecture_15/output/00054.png b/lecture_15/output/00054.png new file mode 100644 index 0000000..7bc6b82 Binary files /dev/null and b/lecture_15/output/00054.png differ diff --git a/lecture_15/output/00055.png b/lecture_15/output/00055.png new file mode 100644 index 0000000..52df944 Binary files /dev/null and b/lecture_15/output/00055.png differ diff --git a/lecture_15/output/00056.png b/lecture_15/output/00056.png new file mode 100644 index 0000000..1677817 Binary files /dev/null and b/lecture_15/output/00056.png differ diff --git a/lecture_15/output/00057.png b/lecture_15/output/00057.png new file mode 100644 index 0000000..c4032a1 Binary files /dev/null and b/lecture_15/output/00057.png differ diff --git a/lecture_15/output/00058.png b/lecture_15/output/00058.png new file mode 100644 index 0000000..3afae58 Binary files /dev/null and b/lecture_15/output/00058.png differ diff --git a/lecture_15/output/00059.png b/lecture_15/output/00059.png new file mode 100644 index 0000000..9e18362 Binary files /dev/null and b/lecture_15/output/00059.png differ diff --git a/lecture_15/output/00060.png b/lecture_15/output/00060.png new file mode 100644 index 0000000..47af589 Binary files /dev/null and b/lecture_15/output/00060.png differ diff --git a/lecture_15/output/00061.png b/lecture_15/output/00061.png new file mode 100644 index 0000000..b12af4a Binary files /dev/null and b/lecture_15/output/00061.png differ diff --git a/lecture_15/output/00062.png b/lecture_15/output/00062.png new file mode 100644 index 0000000..0999e97 Binary files /dev/null and b/lecture_15/output/00062.png differ diff --git a/lecture_15/output/00063.png b/lecture_15/output/00063.png new file mode 100644 index 0000000..5287e29 Binary files /dev/null and b/lecture_15/output/00063.png differ diff --git a/lecture_15/output/00064.png b/lecture_15/output/00064.png new file mode 100644 index 0000000..bbad872 Binary files /dev/null and b/lecture_15/output/00064.png differ diff --git a/lecture_15/output/00065.png b/lecture_15/output/00065.png new file mode 100644 index 0000000..61d2fe1 Binary files /dev/null and b/lecture_15/output/00065.png differ diff --git a/lecture_15/output/00066.png b/lecture_15/output/00066.png new file mode 100644 index 0000000..a1b9eeb Binary files /dev/null and b/lecture_15/output/00066.png differ diff --git a/lecture_15/output/00067.png b/lecture_15/output/00067.png new file mode 100644 index 0000000..67ccce3 Binary files /dev/null and b/lecture_15/output/00067.png differ diff --git a/lecture_15/output/00068.png b/lecture_15/output/00068.png new file mode 100644 index 0000000..50c4da5 Binary files /dev/null and b/lecture_15/output/00068.png differ diff --git a/lecture_15/output/00069.png b/lecture_15/output/00069.png new file mode 100644 index 0000000..790f009 Binary files /dev/null and b/lecture_15/output/00069.png differ diff --git a/lecture_15/output/00070.png b/lecture_15/output/00070.png new file mode 100644 index 0000000..350e64a Binary files /dev/null and b/lecture_15/output/00070.png differ diff --git a/lecture_15/output/00071.png b/lecture_15/output/00071.png new file mode 100644 index 0000000..d4d54b0 Binary files /dev/null and b/lecture_15/output/00071.png differ diff --git a/lecture_15/output/00072.png b/lecture_15/output/00072.png new file mode 100644 index 0000000..146d82f Binary files /dev/null and b/lecture_15/output/00072.png differ diff --git a/lecture_15/output/00073.png b/lecture_15/output/00073.png new file mode 100644 index 0000000..cee2012 Binary files /dev/null and b/lecture_15/output/00073.png differ diff --git a/lecture_15/output/00074.png b/lecture_15/output/00074.png new file mode 100644 index 0000000..b762ee1 Binary files /dev/null and b/lecture_15/output/00074.png differ diff --git a/lecture_15/output/00075.png b/lecture_15/output/00075.png new file mode 100644 index 0000000..59f5ee9 Binary files /dev/null and b/lecture_15/output/00075.png differ diff --git a/lecture_15/output/00076.png b/lecture_15/output/00076.png new file mode 100644 index 0000000..59c0066 Binary files /dev/null and b/lecture_15/output/00076.png differ diff --git a/lecture_15/output/00077.png b/lecture_15/output/00077.png new file mode 100644 index 0000000..6048a1c Binary files /dev/null and b/lecture_15/output/00077.png differ diff --git a/lecture_15/output/00078.png b/lecture_15/output/00078.png new file mode 100644 index 0000000..4473c93 Binary files /dev/null and b/lecture_15/output/00078.png differ diff --git a/lecture_15/output/00079.png b/lecture_15/output/00079.png new file mode 100644 index 0000000..7a6335a Binary files /dev/null and b/lecture_15/output/00079.png differ diff --git a/lecture_15/output/00080.png b/lecture_15/output/00080.png new file mode 100644 index 0000000..821076d Binary files /dev/null and b/lecture_15/output/00080.png differ diff --git a/lecture_15/output/00081.png b/lecture_15/output/00081.png new file mode 100644 index 0000000..d36a35c Binary files /dev/null and b/lecture_15/output/00081.png differ diff --git a/lecture_15/output/00082.png b/lecture_15/output/00082.png new file mode 100644 index 0000000..bde9280 Binary files /dev/null and b/lecture_15/output/00082.png differ diff --git a/lecture_15/output/00083.png b/lecture_15/output/00083.png new file mode 100644 index 0000000..1691529 Binary files /dev/null and b/lecture_15/output/00083.png differ diff --git a/lecture_15/output/00084.png b/lecture_15/output/00084.png new file mode 100644 index 0000000..5adfef2 Binary files /dev/null and b/lecture_15/output/00084.png differ diff --git a/lecture_15/output/00085.png b/lecture_15/output/00085.png new file mode 100644 index 0000000..02067f8 Binary files /dev/null and b/lecture_15/output/00085.png differ diff --git a/lecture_15/output/00086.png b/lecture_15/output/00086.png new file mode 100644 index 0000000..2dfc5ac Binary files /dev/null and b/lecture_15/output/00086.png differ diff --git a/lecture_15/output/00087.png b/lecture_15/output/00087.png new file mode 100644 index 0000000..a955fd7 Binary files /dev/null and b/lecture_15/output/00087.png differ diff --git a/lecture_15/output/00088.png b/lecture_15/output/00088.png new file mode 100644 index 0000000..7b38164 Binary files /dev/null and b/lecture_15/output/00088.png differ diff --git a/lecture_15/output/00089.png b/lecture_15/output/00089.png new file mode 100644 index 0000000..2c75b0f Binary files /dev/null and b/lecture_15/output/00089.png differ diff --git a/lecture_15/output/00090.png b/lecture_15/output/00090.png new file mode 100644 index 0000000..e4489e6 Binary files /dev/null and b/lecture_15/output/00090.png differ diff --git a/lecture_15/output/00091.png b/lecture_15/output/00091.png new file mode 100644 index 0000000..af5d877 Binary files /dev/null and b/lecture_15/output/00091.png differ diff --git a/lecture_15/output/00092.png b/lecture_15/output/00092.png new file mode 100644 index 0000000..ab960d1 Binary files /dev/null and b/lecture_15/output/00092.png differ diff --git a/lecture_15/output/00093.png b/lecture_15/output/00093.png new file mode 100644 index 0000000..81c02c0 Binary files /dev/null and b/lecture_15/output/00093.png differ diff --git a/lecture_15/output/00094.png b/lecture_15/output/00094.png new file mode 100644 index 0000000..850739f Binary files /dev/null and b/lecture_15/output/00094.png differ diff --git a/lecture_15/output/00095.png b/lecture_15/output/00095.png new file mode 100644 index 0000000..41d354d Binary files /dev/null and b/lecture_15/output/00095.png differ diff --git a/lecture_15/output/00096.png b/lecture_15/output/00096.png new file mode 100644 index 0000000..7149da5 Binary files /dev/null and b/lecture_15/output/00096.png differ diff --git a/lecture_15/output/00097.png b/lecture_15/output/00097.png new file mode 100644 index 0000000..a7bc3f4 Binary files /dev/null and b/lecture_15/output/00097.png differ diff --git a/lecture_15/output/00098.png b/lecture_15/output/00098.png new file mode 100644 index 0000000..119aaef Binary files /dev/null and b/lecture_15/output/00098.png differ diff --git a/lecture_15/output/00099.png b/lecture_15/output/00099.png new file mode 100644 index 0000000..f6f7b8a Binary files /dev/null and b/lecture_15/output/00099.png differ diff --git a/lecture_15/output/00100.png b/lecture_15/output/00100.png new file mode 100644 index 0000000..8d37137 Binary files /dev/null and b/lecture_15/output/00100.png differ diff --git a/lecture_15/springs_masses.png b/lecture_15/springs_masses.png new file mode 100644 index 0000000..9a01154 Binary files /dev/null and b/lecture_15/springs_masses.png differ diff --git a/lecture_15/stress.svg b/lecture_15/stress.svg new file mode 100644 index 0000000..dbbd0b7 --- /dev/null +++ b/lecture_15/stress.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + 𝞃=10 MPa + + + + + 𝞼1 + 𝞼2 + + diff --git a/lecture_15/stress_soln.svg b/lecture_15/stress_soln.svg new file mode 100644 index 0000000..5366d11 --- /dev/null +++ b/lecture_15/stress_soln.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + 𝞃=10 MPa + + + + + 𝞼1=-10 MPa + 𝞼2=10 MPa + + diff --git "a/lecture_15/\340\244\267\001" "b/lecture_15/\340\244\267\001" new file mode 100644 index 0000000..e69de29 diff --git "a/lecture_15/\360&\341\001" "b/lecture_15/\360&\341\001" new file mode 100644 index 0000000..e69de29 diff --git a/lecture_16/.ipynb_checkpoints/lecture_16-checkpoint.ipynb b/lecture_16/.ipynb_checkpoints/lecture_16-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_16/.ipynb_checkpoints/lecture_16-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_16/MonteCarloPi.gif b/lecture_16/MonteCarloPi.gif new file mode 100644 index 0000000..8ffb745 Binary files /dev/null and b/lecture_16/MonteCarloPi.gif differ diff --git a/lecture_16/MonteCarloPi_rand.gif b/lecture_16/MonteCarloPi_rand.gif new file mode 100644 index 0000000..aaa31d7 Binary files /dev/null and b/lecture_16/MonteCarloPi_rand.gif differ diff --git a/lecture_16/compiled_data.csv b/lecture_16/compiled_data.csv new file mode 100644 index 0000000..ea6a99a --- /dev/null +++ b/lecture_16/compiled_data.csv @@ -0,0 +1,233 @@ +7.8,62,1 +12.3,61,1 +5.2,35,1 +12.4,44,1 +5.2,294,1 +3.3,73,2 +1.4,30,2 +11,10,2 +6.3,39,3 +6.9,60,3 +6.3,100,3 +7.8,249,3 +3.3,282,3 +7,96,4 +3.9,186,4 +2.95,166,4 +8.6,262,4 +2.5,355,4 +20,155,5 +18.5,225,5 +14,45,5 +8.5,340,5 +5.25,95,5 +10,20,5 +6.5,62,5 +8.75,36,5 +3,190,5 +4.5,280,5 +2.25,62,6 +3.9,312,6 +9.3,36,6 +1.9,154,6 +7.3,115,6 +4.75,298,6 +4.6,306,7 +2.3,282,7 +10.1,138,7 +3.3,180,7 +8.5,242,7 +5,10,8 +2.5,350,8 +11,30,8 +4,272,8 +17,38,8 +3.75,85,9 +4.5,102,9 +1.36,118,9 +0.78,157,9 +3.41,198,9 +3,27,10 +1,88,10 +2,20,10 +2.5,155,10 +4.5,281,10 +1.5,75,10 +6.32,70,10 +2.85,135,10 +3.71,250,10 +5.45,60,10 +6.1,95,10 +5.5,92,11 +15,266,11 +12.5,14,11 +7,120,11 +4,132,11 +9,30,12 +5,90,12 +6,350,12 +8,330,12 +5,60,12 +3.81,140,12 +6.35,116,12 +0.635,88,12 +7.62,12,12 +1.27,180,12 +4.2,292,13 +0.8,165,13 +2.5,0,13 +6,43,13 +6.65,317,13 +1,0,13 +2.9,50,13 +7.4,302,13 +16.6,246,13 +2.4,234,13 +0.8,100,14 +3.6,62,14 +3.5,260,14 +4.4,168,14 +5.7,178,14 +3.6,143,14 +1.75,37,14 +1.95,62,14 +2.27,48,14 +4.26,69,14 +4,182,15 +5.8,100,15 +8.3,45,15 +10.2,30,15 +4,278,15 +3.81,120,16 +7.62,77,16 +1.59,212,16 +3.73,265,16 +4.84,259,16 +3.45,243,16 +2.1,186,16 +4.6,24,16 +0.7,343,16 +1.7,211,16 +12.4,33,17 +13.9,103,17 +4.5,307,17 +6.7,313,17 +11.4,328,17 +3,240,18 +4,330,18 +2,90,18 +3.5,315,18 +1,15,18 +4.6,98,19 +3.8,326,19 +3.4,184,19 +4,48,19 +2.6,83,19 +2.75,88,20 +1.33,93,20 +1.5,12,20 +3,280,20 +0.5,24,20 +1.2,130,21 +2.6,122,21 +0.8,296,21 +1.4,100,21 +1.2,290,21 +3,90,22 +2,30,22 +10,90,22 +3,15,22 +7,90,22 +3.3,170,23 +8.8,95,23 +8.1,71,23 +7.7,48,23 +9.6,301,23 +3,70,24 +1.2,10,24 +2.1,15,24 +6,260,24 +0.7,30,24 +12.5,10,25 +11,35,25 +7,320,25 +7.5,292,25 +3.5,134,25 +1,4,26 +2,3.9,26 +3,5.25,26 +4,3.2,26 +5,3,26 +4.5,27,27 +1.1,80,27 +2.6,155,27 +1.9,200,27 +2.8,325,27 +4.3,15,28 +7,145,28 +3.5,80,28 +9,210,28 +5.2,175,28 +1,54,29 +3.5,128,29 +4.5,140,29 +2,54,29 +11,274,29 +3.175,98,30 +1.5875,30,30 +3.175,282,30 +5.08,318,30 +10.795,316,30 +11.2,19,31 +14.5,232,31 +12.3,271,31 +16.9,120,31 +9,177,31 +7.4,276,32 +11.5,321,32 +1.5,36,32 +7.5,22,32 +10.1,66,32 +1.75,10,33 +2.5,123,33 +2,64,33 +1.8,271,33 +4,308,33 +4.5,39,34 +3.25,68,34 +2.5,282,34 +1.25,108,34 +2,122,34 +3.97,18,35 +8.29,196,35 +15.52,232,35 +4.79,93,35 +6.43,153,35 +7.5,74,36 +10.75,86,36 +3.5,96,36 +6.25,172,36 +5.5,38,36 +3.25,192,37 +4.5,88,37 +5,336,37 +4,176,37 +2.5,194,37 +1.5,73,38 +1.33,265,38 +2.15,92,38 +3.5,130,38 +0.9,65,38 +3.75,-2,39 +1.66,89,39 +5.43,76,39 +4.12,54,39 +6.87,63,39 +10,85,40 +9,30,40 +7,180,40 +4.3,22,40 +5.8,281,40 +2.9,1,40 +3.31,29,40 +1.5,10,40 diff --git a/lecture_16/gen_examples.m b/lecture_16/gen_examples.m new file mode 100644 index 0000000..c5d6890 --- /dev/null +++ b/lecture_16/gen_examples.m @@ -0,0 +1,5 @@ +x1=linspace(0,1,1000)'; +y1=0*x1+0.1*rand(length(x1),1); + +x2=linspace(0,1,10)'; +y2=1*x2; diff --git a/lecture_16/lecture_16.ipynb b/lecture_16/lecture_16.ipynb new file mode 100644 index 0000000..206e84c --- /dev/null +++ b/lecture_16/lecture_16.ipynb @@ -0,0 +1,21234 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![question 1](q1.png)\n", + "\n", + "![question 2](q2.png)\n", + "\n", + "### Project Ideas so far\n", + "\n", + "- Nothing yet...probably something heat transfer related\n", + "\n", + "- Modeling Propulsion or Propagation of Sound Waves\n", + "\n", + "- Low Thrust Orbital Transfer\n", + "\n", + "- Tracking motion of a satellite entering orbit until impact\n", + "\n", + "- What ever you think is best.\n", + "\n", + "- You had heat transfer project as an option; that sounded cool\n", + "\n", + "- Heat transfer through a pipe\n", + "\n", + "- I would prefer to do something with beam/plate mechanics or vibrations than a heat transfer or thermo problem\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questions from you:\n", + "\n", + "- Is attempting to divide by zero an acceptable project idea?\n", + "\n", + "- Would it be alright if we worked in a group of 4?\n", + "\n", + "- What are acceptable project topics?\n", + "\n", + "- How do the exams look? \n", + "\n", + "- Is there no pdf for the lecture today?\n", + "\n", + "- Thank you for making the formatted lectures available!\n", + "\n", + "- did you do anything cool over spring break?\n", + "\n", + "- Could we have a group of 4? We don't want to have to choose which one of us is on their own.\n", + "\n", + "- In HW 5 should there be 4 vectors as an input?\n", + "\n", + "- Would it be possible for me to join a group of 3? I seem to be the odd man out in two 3 member groups that my friends are in." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Statistics and Curve-Fitting\n", + "## Linear Regression\n", + "\n", + "Often, we have a model with empirical parameters. (e.g. Young's modulus, Poisson's ratio, drag coefficient, coefficient of restitution, spring constant)\n", + "\n", + "Experimental measurements are prone to a number of stochastic (random) factors:\n", + "\n", + "- Environmental noise\n", + " \n", + "- Measurement Uncertainty\n", + " \n", + "- Factors not accounted in model (e.g. 2D effects of 1D approximation)\n", + "\n", + "These can lead to **noise** (lack of precision) and **bias** (lack of accuracy)\n", + "\n", + "Consider a piece of glass being stretched. \n", + "\n", + "![movie of stretching glass in microtensile machine](sgs_strain.gif)\n", + "\n", + "It is clear that a straight line is a \"good\" fit, but how good and what line?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Statistics\n", + "\n", + "How do we describe *precision* and *accuracy*?\n", + "\n", + "- mean\n", + "\n", + "- standard deviation\n", + "\n", + "Take our class dart problem\n" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ty position (cm)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx position (cm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "darts=dlmread('compiled_data.csv',',');\n", + "x_darts=darts(:,1).*cosd(darts(:,2));\n", + "y_darts=darts(:,1).*sind(darts(:,2));\n", + "\n", + "colormap(colorcube(length(darts(:,3))))\n", + "\n", + "scatter(x_darts, y_darts, [], darts(:,3))\n", + "xlabel('x position (cm)')\n", + "ylabel('y position (cm)')" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mu_x = 0.90447\r\n" + ] + } + ], + "source": [ + "mu_x=mean(x_darts)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s_x = 4.2747\r\n" + ] + } + ], + "source": [ + "s_x=std(x_darts)" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mu_y = 0.88450\r\n" + ] + } + ], + "source": [ + "mu_y=mean(y_darts)" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s_y = 4.6834\r\n" + ] + } + ], + "source": [ + "s_y=std(y_darts)" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_41a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_42a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_43a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_44a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_45a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_46a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_47a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_48a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_49a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_50a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_51a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_52a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_53a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_54a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_55a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_56a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_57a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_58a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_59a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_60a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_61a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hist(x_darts,30,100)" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.05\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\trelative counts\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx position (cm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_41a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_42a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_43a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_44a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_45a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_46a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_47a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_48a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_49a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_50a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_51a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_52a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_53a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_54a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_55a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_56a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_57a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_58a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_59a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_60a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_61a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_62a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_63a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_64a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x_vals=linspace(-15,20,30);\n", + "hist(x_darts,x_vals,1);\n", + "[histFreq, histXout] = hist(x_darts, 30);\n", + "binWidth = histXout(2)-histXout(1);\n", + "bar(histXout, histFreq/binWidth/sum(histFreq));\n", + "pdfnorm = @(x) 1/sqrt(2*s_x^2*pi).*exp(-(x-mu_x).^2/2/s_x^2);\n", + "%cdfnorm = @(x) 1/2*(1+erf((x-mu_x)./sqrt(2*s_x^2)));\n", + "%hist(x_darts,x_vals,trapz(x,f))%,cdfnorm(max(x_darts))/2)\n", + "hold on;\n", + "plot(x_vals,pdfnorm(x_vals))\n", + "n=2; % n=1, 68% confidence, n=2, 95% confidence, n=3, 99% conf\n", + " plot([mu_x+n*s_x,mu_x+n*s_x],[0,0.1],'r-')\n", + " plot([mu_x-n*s_x,mu_x-n*s_x],[0,0.1],'r-')\n", + "\n", + "xlabel('x position (cm)')\n", + "ylabel('relative counts')" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.05\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\trelative counts\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx position (cm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_41a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_42a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_43a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_44a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_45a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_46a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_47a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_48a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_49a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_50a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_51a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_52a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_53a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_54a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_55a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_56a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_57a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_58a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_59a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_60a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_61a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_62a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_63a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_64a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "y_vals=linspace(-15,20,30);\n", + "hist(y_darts,y_vals,1);\n", + "[histFreq, histXout] = hist(y_darts, 30);\n", + "binWidth = histXout(2)-histXout(1);\n", + "bar(histXout, histFreq/binWidth/sum(histFreq));\n", + "pdfnorm = @(x) 1/sqrt(2*s_y^2*pi).*exp(-(x-mu_y).^2/2/s_y^2);\n", + "%cdfnorm = @(x) 1/2*(1+erf((x-mu_x)./sqrt(2*s_x^2)));\n", + "%hist(x_darts,x_vals,trapz(x,f))%,cdfnorm(max(x_darts))/2)\n", + "hold on;\n", + "plot(y_vals,pdfnorm(y_vals))\n", + "n=2; % n=1, 68% confidence, n=2, 95% confidence, n=3, 99% conf\n", + " plot([mu_y+n*s_y,mu_y+n*s_y],[0,0.1],'r-')\n", + " plot([mu_y-n*s_y,mu_y-n*s_y],[0,0.1],'r-')\n", + "\n", + "xlabel('x position (cm)')\n", + "ylabel('relative counts')" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\texperimental CDF\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\texperimental CDF\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tNormal CDF\n", + "\n", + "\t\n", + "\t\tNormal CDF\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x_exp=empirical_cdf(x_vals,x_darts);\n", + "plot(x_vals,x_exp)\n", + "hold on;\n", + "plot(x_vals,normcdf(x_vals,mu_x,s_x),'k-')\n", + "legend('experimental CDF','Normal CDF','Location','SouthEast')" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tgnuplot_plot_1a\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tx position (cm)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ty position (cm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% plot the distribution in x- and y-directions\n", + "gauss2d = @(x,y) exp(-((x-mu_x).^2/2/s_x^2+(y-mu_y).^2/2/s_y^2));\n", + "\n", + "x=linspace(-20,20,31);\n", + "y=linspace(-20,20,31);\n", + "scatter3(x_darts, y_darts,ones(length(x_darts),1))\n", + "xlabel('x position (cm)')\n", + "ylabel('y position (cm)')\n", + "hold on\n", + "[X,Y]=meshgrid(x,y);\n", + "view([1,1,1])\n", + "\n", + "surf(X,Y,gauss2d(X,Y))" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tgnuplot_plot_1a\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tx position (cm)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ty position (cm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gauss2d = @(x,y) exp(-((x-0).^2/2/1^2+(y-0).^2/2/5^2));\n", + "\n", + "x=linspace(-20,20,71);\n", + "y=linspace(-20,20,31);\n", + "scatter3(x_darts, y_darts,ones(length(x_darts),1))\n", + "xlabel('x position (cm)')\n", + "ylabel('y position (cm)')\n", + "hold on\n", + "[X,Y]=meshgrid(x,y);\n", + "view([1,1,1])\n", + "\n", + "surf(X,Y,gauss2d(X,Y))" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t400\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hist(darts(:,2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Monte Carlo Simulations\n", + "\n", + "Monte Carlo models use random numbers to either understand statistics or generate a solution. \n", + "\n", + "### Example 1:\n", + "#### Calculate $\\pi$ with random numbers. \n", + "\n", + "Assuming we can actually generate random numbers (a topic of philosophical and heated debates) we can populate a unit square with random points and determine the ratio of points inside and outside of a circle.\n", + "\n", + "![Unit circle and unit square](MonteCarloPi.gif)\n", + "\n", + "![1/4 Unit circle and 1/4 unit square](MonteCarloPi_rand.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ratio of the area of the circle to the square is:\n", + "\n", + "$\\frac{\\pi r^{2}}{4r^{2}}=\\frac{\\pi}{4}$\n", + "\n", + "So if we know the fraction of random points that are within the unit circle, then we can calculate $\\pi$\n", + "\n", + "(number of points in circle)/(total number of points)=$\\pi/4$" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function our_pi=montecarlopi(N)\n", + " % Create random x-y-coordinates\n", + "\n", + " x=rand(N,1);\n", + " y=rand(N,1);\n", + " R=sqrt(x.^2+y.^2); % compute radius\n", + " num_in_circle=sum(R<1);\n", + " total_num_pts =length(R);\n", + " our_pi = 4*num_in_circle/total_num_pts;\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mean value for pi = 3.138880\n", + "standard deviation is 0.009956\n" + ] + } + ], + "source": [ + "test_pi=zeros(10,1);\n", + "for i=1:10\n", + " test_pi(i)=montecarlopi(10000);\n", + "end\n", + "fprintf('mean value for pi = %f\\n',mean(test_pi))\n", + "fprintf('standard deviation is %f',std(test_pi))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example 2\n", + "#### Determine uncertainty in failure stress based on geometry\n", + "\n", + "In this example, we know that a steel bar will break under 940 MPa tensile stress. The bar is 1 mm by 2 mm with a tolerance of 1 %. What is the range of tensile loads that can be safely applied to the beam?\n", + "\n", + "$\\sigma_{UTS}=\\frac{F_{fail}}{wh}$\n", + "\n", + "$F_{fail}=\\sigma_{UTS}wh$" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.01\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.03\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.05\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.07\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.84\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.85\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.86\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.87\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.88\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.89\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.9\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.91\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.92\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\trelative counts\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tfailure load (kN)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_41a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=1000;\n", + "r=rand(N,1);\n", + "wmean=1; % in mm\n", + "wmin=wmean-wmean*0.01;\n", + "wmax=wmean+wmean*0.01;\n", + "hmean=2; % in mm\n", + "hmin=hmean-hmean*0.01;\n", + "hmax=hmean+hmean*0.01;\n", + "\n", + "wrand=wmin+(wmax-wmin)*r;\n", + "hrand=hmin+(hmax-hmin)*r;\n", + "\n", + "uts=940; % in N/mm^2=MPa\n", + "\n", + "Ffail=uts.*wrand.*hrand*1e-3; % force in kN\n", + "hist(Ffail,20,1)\n", + "xlabel('failure load (kN)')\n", + "ylabel('relative counts')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Normally, the tolerance is not a maximum/minimum specification, but instead a normal distribution that describes the standard deviation, or the 68 % confidence interval.\n", + "\n", + "So instead, we should generate normally distributed dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.02\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.04\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.06\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.08\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.16\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.75\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.85\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.9\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.95\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\trelative counts\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tfailure load (kN)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_41a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=1000;\n", + "wmean=1; % in mm\n", + "wstd=wmean*0.01; % standard deviation in mm\n", + "hmean=2; % in mm\n", + "hstd=hmean*0.01; % standard deviation in mm\n", + "\n", + "\n", + "wrand=normrnd(wmean,wstd,[N,1]);\n", + "hrand=normrnd(hmean,hstd,[N,1]);\n", + "uts=940; % in N/mm^2=MPa\n", + "\n", + "Ffail=uts.*wrand.*hrand*1e-3; % force in kN\n", + "hist(Ffail,20,1)\n", + "xlabel('failure load (kN)')\n", + "ylabel('relative counts')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Linear Least Squares Regression\n", + "\n", + "When approximating a set of data as a polynomial, there will always be error introduced (except in 2 cases). \n", + "\n", + "For a straight line, the actual data points, $y_{i}$ as a function of the independent variable, $x_{i}$, is:\n", + "\n", + "$y_{i}=a_{0}+a_{1}x_{i}+e_{i}$\n", + "\n", + "where $a_{0}$ and $a_{1}$ are the intercept and slope of the line and $e_{i}$ is the error between the approximate function and the recorded data point. \n", + "\n", + "We make the following assumptions in this analysis:\n", + "\n", + "1. Each x has a fixed value; it is not random and is known without error.\n", + "\n", + "2. The y values are independent random variables and all have the same variance.\n", + "\n", + "3. The y values for a given x must be normally distributed.\n", + "\n", + "The total error is \n", + "\n", + "$\\sum_{i=1}^{n}e_{i}=\\sum_{i=1}^{n}(y_{i}-a_{0}-a_{1}x_{i})$\n", + "\n", + "we don't care about the sign though. One approach has been demonstrated to provide a unique solution is minimizing the sum of squares error or\n", + "\n", + "$S_{r}=\\sum_{i=1}^{n}e_{i}^{2}=\\sum_{i=1}^{n}(y_{i}-a_{0}-a_{1}x_{i})^{2}$\n", + "\n", + "Where, $S_{r}$ is the sum of squares error (SSE). \n", + "\n", + "$\\frac{\\partial S_{r}}{\\partial a_{0}}=-2\\sum(y_{i}-a_{0}-a_{1}x_{i})$\n", + "\n", + "$\\frac{\\partial S_{r}}{\\partial a_{1}}=-2\\sum(y_{i}-a_{0}-a_{1}x_{i})x_{i}$\n", + "\n", + "The minimum $S_{r}$ occurrs when the partial derivatives are 0. \n", + "\n", + "$\\sum y_{i}= \\sum a_{0}+\\sum a_{1}x_{i}$\n", + "\n", + "$\\sum x_{i}y_{i}= \\sum a_{0}x_{i}+\\sum a_{1}x_{i}^{2}$\n", + "\n", + "$\\left[\\begin{array}{c}\n", + "\\sum y_{i}\\\\\n", + "\\sum x_{i}y_{i}\\end{array}\\right]=\n", + "\\left[\\begin{array}{cc}\n", + "n & \\sum x_{i}\\\\\n", + "\\sum x_{i} & \\sum x_{i}^{2}\\end{array}\\right]\n", + "\\left[\\begin{array}{c}\n", + "a_{0}\\\\\n", + "a_{1}\\end{array}\\right]$\n", + "\n", + "\n", + "$b=Ax$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example \n", + "\n", + "Find drag coefficient with best-fit line to experimental data\n", + "\n", + "|i | v (m/s) | F (N) |\n", + "|---|---|---|\n", + "|1 | 10 | 25 |\n", + "|2 | 20 | 70 |\n", + "|3 | 30 | 380|\n", + "|4 | 40 | 550|\n", + "|5 | 50 | 610|\n", + "|6 | 60 | 1220|\n", + "|7 | 70 | 830 |\n", + "|8 |80 | 1450|" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a =\n", + "\n", + " -234.286\n", + " 19.470\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tvelocity (m/s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tForce (N)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tbest-fit\n", + "\n", + "\t\n", + "\t\tbest-fit\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drag_data=[...\n", + "1 , 10 , 25 \n", + "2 , 20 , 70 \n", + "3 , 30 , 380\n", + "4 , 40 , 550\n", + "5 , 50 , 610\n", + "6 , 60 , 1220\n", + "7 , 70 , 830 \n", + "8 ,80 , 1450];\n", + "x=drag_data(:,2);\n", + "y=drag_data(:,3);\n", + "\n", + "b=[sum(y);sum(x.*y)];\n", + "A=[length(x),sum(x);\n", + " sum(x), sum(x.^2)];\n", + " \n", + "a=A\\b\n", + "\n", + "plot(x,y,'o',x,a(1)+a(2)*x)\n", + "legend('data','best-fit','Location','NorthWest')\n", + "xlabel('Force (N)')\n", + "ylabel('velocity (m/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How do we know its a \"good\" fit? \n", + "\n", + "Can compare the sum of squares error to the total sum of squares of the dependent variable (here F). \n", + "\n", + "$S_{r}=\\sum(y_{i}-a_{0}-a_{1}x_{i})^{2}$\n", + "\n", + "$S_{t}=\\sum(y_{i}-\\bar{y})^{2}$\n", + "\n", + "Then, we can calculate the *coefficient of determination*, $r^{2}$ or *correlation coefficient*, r. \n", + "\n", + "$r^{2}=\\frac{S_{t}-S_{r}}{S_{t}}$\n", + "\n", + "This represents the relative improvement of assuming that y is a function of x (if the x-values are not random and the y-values are random)\n", + "\n", + "For further information regarding statistical work on regression, look at \n", + "[NIST Statistics Handbook](http://www.itl.nist.gov/div898/handbook/pmd/section4/pmd44.htm)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "St = 1.8083e+06\n", + "St = 1.8083e+06\n" + ] + } + ], + "source": [ + "Sr=sum((y-a(1)-a(2)*x).^2);\n", + "St=std(y)^2*(length(y)-1)\n", + "St=sum((y-mean(y)).^2)" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "r2 = 0.88049\n", + "r = 0.93834\n" + ] + } + ], + "source": [ + "r2=(St-Sr)/St\n", + "r=sqrt(r2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Limiting cases \n", + "\n", + "#### $r^{2}=0$ $S_{r}=S{t}$\n", + "\n", + "#### $r^{2}=1$ $S_{r}=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tCase 1\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tCase 1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tCase 2\n", + "\n", + "\t\n", + "\t\tCase 2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gen_examples\n", + "plot(x1(1:50:end),y1(1:50:end),'s',x2,y2,'o')\n", + "legend('Case 1','Case 2','Location','NorthWest')" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a1 =\n", + "\n", + " 0.0497269\n", + " 0.0016818\n", + "\n", + "a2 =\n", + "\n", + " 0\n", + " 1\n", + "\n", + "Sr1 = 0.82607\n", + "St1 = 0.82631\n", + "coefficient of determination in Case 1 is 0.000286\n", + "Sr2 = 0\n", + "St2 = 1.0185\n", + "coefficient of determination in Case 2 is 1.000000\n" + ] + } + ], + "source": [ + "b1=[sum(y1);sum(x1.*y1)];\n", + "A1=[length(x1),sum(x1);\n", + " sum(x1), sum(x1.^2)];\n", + " \n", + "a1=A1\\b1\n", + "\n", + "b2=[sum(y2);sum(x2.*y2)];\n", + "A2=[length(x2),sum(x2);\n", + " sum(x2), sum(x2.^2)];\n", + " \n", + "a2=A2\\b2\n", + "\n", + "Sr1=sum((y1-a1(1)-a1(2)*x1).^2)\n", + "St1=sum((y1-mean(y1)).^2)\n", + "fprintf('coefficient of determination in Case 1 is %f\\n',1-Sr1/St1)\n", + "\n", + "Sr2=sum((y2-a2(1)-a2(2)*x2).^2)\n", + "St2=sum((y2-mean(y2)).^2)\n", + "\n", + "fprintf('coefficient of determination in Case 2 is %f\\n',1-Sr2/St2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_16/octave-workspace b/lecture_16/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_16/octave-workspace differ diff --git a/lecture_16/q1.png b/lecture_16/q1.png new file mode 100644 index 0000000..f086fc8 Binary files /dev/null and b/lecture_16/q1.png differ diff --git a/lecture_16/q2.png b/lecture_16/q2.png new file mode 100644 index 0000000..6f91d19 Binary files /dev/null and b/lecture_16/q2.png differ diff --git a/lecture_16/sgs_strain.avi b/lecture_16/sgs_strain.avi new file mode 100755 index 0000000..625d925 Binary files /dev/null and b/lecture_16/sgs_strain.avi differ diff --git a/lecture_16/sgs_strain.gif b/lecture_16/sgs_strain.gif new file mode 100644 index 0000000..8fa0038 Binary files /dev/null and b/lecture_16/sgs_strain.gif differ diff --git a/lecture_17/.ipynb_checkpoints/lecture_16-checkpoint.ipynb b/lecture_17/.ipynb_checkpoints/lecture_16-checkpoint.ipynb new file mode 100644 index 0000000..37443ae --- /dev/null +++ b/lecture_17/.ipynb_checkpoints/lecture_16-checkpoint.ipynb @@ -0,0 +1,754 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![question 1](q1.png)\n", + "\n", + "![question 2](q2.png)\n", + "\n", + "### Project Ideas so far\n", + "\n", + "- Nothing yet...probably something heat transfer related\n", + "\n", + "- Modeling Propulsion or Propagation of Sound Waves\n", + "\n", + "- Low Thrust Orbital Transfer\n", + "\n", + "- Tracking motion of a satellite entering orbit until impact\n", + "\n", + "- What ever you think is best.\n", + "\n", + "- You had heat transfer project as an option; that sounded cool\n", + "\n", + "- Heat transfer through a pipe\n", + "\n", + "- I would prefer to do something with beam/plate mechanics or vibrations than a heat transfer or thermo problem\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questions from you:\n", + "\n", + "- Is attempting to divide by zero an acceptable project idea?\n", + "\n", + "- Would it be alright if we worked in a group of 4?\n", + "\n", + "- What are acceptable project topics?\n", + "\n", + "- How do the exams look? \n", + "\n", + "- Is there no pdf for the lecture today?\n", + "\n", + "- Thank you for making the formatted lectures available!\n", + "\n", + "- did you do anything cool over spring break?\n", + "\n", + "- Could we have a group of 4? We don't want to have to choose which one of us is on their own.\n", + "\n", + "- In HW 5 should there be 4 vectors as an input?\n", + "\n", + "- Would it be possible for me to join a group of 3? I seem to be the odd man out in two 3 member groups that my friends are in." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear Least Squares Regression\n", + "\n", + "When approximating a set of data as a polynomial, there will always be error introduced (except in 2 cases). \n", + "\n", + "For a straight line, the actual data points, $y_{i}$ as a function of the independent variable, $x_{i}$, is:\n", + "\n", + "$y_{i}=a_{0}+a_{1}x_{i}+e_{i}$\n", + "\n", + "where $a_{0}$ and $a_{1}$ are the intercept and slope of the line and $e_{i}$ is the error between the approximate function and the recorded data point. \n", + "\n", + "We make the following assumptions in this analysis:\n", + "\n", + "1. Each x has a fixed value; it is not random and is known without error.\n", + "\n", + "2. The y values are independent random variables and all have the same variance.\n", + "\n", + "3. The y values for a given x must be normally distributed.\n", + "\n", + "The total error is \n", + "\n", + "$\\sum_{i=1}^{n}e_{i}=\\sum_{i=1}^{n}(y_{i}-a_{0}-a_{1}x_{i})$\n", + "\n", + "we don't care about the sign though. One approach has been demonstrated to provide a unique solution is minimizing the sum of squares error or\n", + "\n", + "$S_{r}=\\sum_{i=1}^{n}e_{i}^{2}=\\sum_{i=1}^{n}(y_{i}-a_{0}-a_{1}x_{i})^{2}$\n", + "\n", + "Where, $S_{r}$ is the sum of squares error (SSE). \n", + "\n", + "$\\frac{\\partial S_{r}}{\\partial a_{0}}=-2\\sum(y_{i}-a_{0}-a_{1}x_{i})$\n", + "\n", + "$\\frac{\\partial S_{r}}{\\partial a_{1}}=-2\\sum(y_{i}-a_{0}-a_{1}x_{i})x_{i}$\n", + "\n", + "The minimum $S_{r}$ occurrs when the partial derivatives are 0. \n", + "\n", + "$\\sum y_{i}= \\sum a_{0}+\\sum a_{1}x_{i}$\n", + "\n", + "$\\sum x_{i}y_{i}= \\sum a_{0}x_{i}+\\sum a_{1}x_{i}^{2}$\n", + "\n", + "$\\left[\\begin{array}{c}\n", + "\\sum y_{i}\\\\\n", + "\\sum x_{i}y_{i}\\end{array}\\right]=\n", + "\\left[\\begin{array}{cc}\n", + "n & \\sum x_{i}\\\\\n", + "\\sum x_{i} & \\sum x_{i}^{2}\\end{array}\\right]\n", + "\\left[\\begin{array}{c}\n", + "a_{0}\\\\\n", + "a_{1}\\end{array}\\right]$\n", + "\n", + "\n", + "$b=Ax$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example \n", + "\n", + "Find drag coefficient with best-fit line to experimental data\n", + "\n", + "|i | v (m/s) | F (N) |\n", + "|---|---|---|\n", + "|1 | 10 | 25 |\n", + "|2 | 20 | 70 |\n", + "|3 | 30 | 380|\n", + "|4 | 40 | 550|\n", + "|5 | 50 | 610|\n", + "|6 | 60 | 1220|\n", + "|7 | 70 | 830 |\n", + "|8 |80 | 1450|" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a =\n", + "\n", + " -234.286\n", + " 19.470\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tvelocity (m/s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tForce (N)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tbest-fit\n", + "\n", + "\t\n", + "\t\tbest-fit\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drag_data=[...\n", + "1 , 10 , 25 \n", + "2 , 20 , 70 \n", + "3 , 30 , 380\n", + "4 , 40 , 550\n", + "5 , 50 , 610\n", + "6 , 60 , 1220\n", + "7 , 70 , 830 \n", + "8 ,80 , 1450];\n", + "x=drag_data(:,2);\n", + "y=drag_data(:,3);\n", + "\n", + "b=[sum(y);sum(x.*y)];\n", + "A=[length(x),sum(x);\n", + " sum(x), sum(x.^2)];\n", + " \n", + "a=A\\b\n", + "\n", + "plot(x,y,'o',x,a(1)+a(2)*x)\n", + "legend('data','best-fit','Location','NorthWest')\n", + "xlabel('Force (N)')\n", + "ylabel('velocity (m/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How do we know its a \"good\" fit? \n", + "\n", + "Can compare the sum of squares error to the total sum of squares of the dependent variable (here F). \n", + "\n", + "$S_{r}=\\sum(y_{i}-a_{0}-a_{1}x_{i})^{2}$\n", + "\n", + "$S_{t}=\\sum(y_{i}-\\bar{y})^{2}$\n", + "\n", + "Then, we can calculate the *coefficient of determination*, $r^{2}$ or *correlation coefficient*, r. \n", + "\n", + "$r^{2}=\\frac{S_{t}-S_{r}}{S_{t}}$\n", + "\n", + "This represents the relative improvement of assuming that y is a function of x (if the x-values are not random and the y-values are random)\n", + "\n", + "For further information regarding statistical work on regression, look at \n", + "[NIST Statistics Handbook](http://www.itl.nist.gov/div898/handbook/pmd/section4/pmd44.htm)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "St = 1.8083e+06\n", + "St = 1.8083e+06\n" + ] + } + ], + "source": [ + "Sr=sum((y-a(1)-a(2)*x).^2);\n", + "St=std(y)^2*(length(y)-1)\n", + "St=sum((y-mean(y)).^2)" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "r2 = 0.88049\n", + "r = 0.93834\n" + ] + } + ], + "source": [ + "r2=(St-Sr)/St\n", + "r=sqrt(r2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Limiting cases \n", + "\n", + "#### $r^{2}=0$ $S_{r}=S{t}$\n", + "\n", + "#### $r^{2}=1$ $S_{r}=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tCase 1\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tCase 1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tCase 2\n", + "\n", + "\t\n", + "\t\tCase 2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gen_examples\n", + "plot(x1(1:50:end),y1(1:50:end),'s',x2,y2,'o')\n", + "legend('Case 1','Case 2','Location','NorthWest')" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a1 =\n", + "\n", + " 0.0497269\n", + " 0.0016818\n", + "\n", + "a2 =\n", + "\n", + " 0\n", + " 1\n", + "\n", + "Sr1 = 0.82607\n", + "St1 = 0.82631\n", + "coefficient of determination in Case 1 is 0.000286\n", + "Sr2 = 0\n", + "St2 = 1.0185\n", + "coefficient of determination in Case 2 is 1.000000\n" + ] + } + ], + "source": [ + "b1=[sum(y1);sum(x1.*y1)];\n", + "A1=[length(x1),sum(x1);\n", + " sum(x1), sum(x1.^2)];\n", + " \n", + "a1=A1\\b1\n", + "\n", + "b2=[sum(y2);sum(x2.*y2)];\n", + "A2=[length(x2),sum(x2);\n", + " sum(x2), sum(x2.^2)];\n", + " \n", + "a2=A2\\b2\n", + "\n", + "Sr1=sum((y1-a1(1)-a1(2)*x1).^2)\n", + "St1=sum((y1-mean(y1)).^2)\n", + "fprintf('coefficient of determination in Case 1 is %f\\n',1-Sr1/St1)\n", + "\n", + "Sr2=sum((y2-a2(1)-a2(2)*x2).^2)\n", + "St2=sum((y2-mean(y2)).^2)\n", + "\n", + "fprintf('coefficient of determination in Case 2 is %f\\n',1-Sr2/St2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# General Regression (Linear and nonlinear)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_17/.ipynb_checkpoints/lecture_17-checkpoint.ipynb b/lecture_17/.ipynb_checkpoints/lecture_17-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_17/.ipynb_checkpoints/lecture_17-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_17/gen_examples.m b/lecture_17/gen_examples.m new file mode 100644 index 0000000..c5d6890 --- /dev/null +++ b/lecture_17/gen_examples.m @@ -0,0 +1,5 @@ +x1=linspace(0,1,1000)'; +y1=0*x1+0.1*rand(length(x1),1); + +x2=linspace(0,1,10)'; +y2=1*x2; diff --git a/lecture_17/in-class_regression.pdf b/lecture_17/in-class_regression.pdf new file mode 100644 index 0000000..628b495 Binary files /dev/null and b/lecture_17/in-class_regression.pdf differ diff --git a/lecture_17/lecture_17.ipynb b/lecture_17/lecture_17.ipynb new file mode 100644 index 0000000..35e61da --- /dev/null +++ b/lecture_17/lecture_17.ipynb @@ -0,0 +1,2710 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![question 1](q1.png)\n", + "\n", + "![question 2](q2.png)\n", + "\n", + "### Project Ideas so far\n", + "\n", + "- Nothing yet...probably something heat transfer related\n", + "\n", + "- Modeling Propulsion or Propagation of Sound Waves\n", + "\n", + "- Low Thrust Orbital Transfer\n", + "\n", + "- Tracking motion of a satellite entering orbit until impact\n", + "\n", + "- What ever you think is best.\n", + "\n", + "- You had heat transfer project as an option; that sounded cool\n", + "\n", + "- Heat transfer through a pipe\n", + "\n", + "- I would prefer to do something with beam/plate mechanics or vibrations than a heat transfer or thermo problem\n", + "\n", + "- Modeling Couette flow with a pressure gradient using a discretized form of the Navier-Stokes equation and comparing it to the analytical solution\n", + "\n", + "- Software to instruct a robotic arm to orient itself based on input from a gyroscope" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questions from you:\n", + "\n", + "How was your spring break\n", + "\n", + "Are grades for hw 3 and 4 going to be posted?\n", + "\n", + "For class occasionally switching to doc cam and working through problems by hand might help get ideas across.\n", + "\n", + "Are you assigning those who do not have groups to groups?\n", + "\n", + "How do you graph a standard distribution in Matlab?\n", + "\n", + "What is the longest code you have written?\n", + "\n", + "how to approach probability for hw 5?\n", + "??\n", + "\n", + "Will you be assigning groups to people who do not currently have one? \n", + "\n", + "what are some basic guidelines we should use to brainstorm project ideas?\n", + "\n", + "Are you a fan of bananas?\n", + "\n", + "Going through code isn't the most helpful, because you can easily lose interest. But I am not sure what else you can do.\n", + "\n", + "Has lecture 15 been posted yet? Looking in the repository I can't seem to find it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear Least Squares Regression\n", + "\n", + "When approximating a set of data as a polynomial, there will always be error introduced (except in 2 cases). \n", + "\n", + "For a straight line, the actual data points, $y_{i}$ as a function of the independent variable, $x_{i}$, is:\n", + "\n", + "$y_{i}=a_{0}+a_{1}x_{i}+e_{i}$\n", + "\n", + "where $a_{0}$ and $a_{1}$ are the intercept and slope of the line and $e_{i}$ is the error between the approximate function and the recorded data point. \n", + "\n", + "We make the following assumptions in this analysis:\n", + "\n", + "1. Each x has a fixed value; it is not random and is known without error.\n", + "\n", + "2. The y values are independent random variables and all have the same variance.\n", + "\n", + "3. The y values for a given x must be normally distributed.\n", + "\n", + "The total error is \n", + "\n", + "$\\sum_{i=1}^{n}e_{i}=\\sum_{i=1}^{n}(y_{i}-a_{0}-a_{1}x_{i})$\n", + "\n", + "we don't care about the sign though. One approach has been demonstrated to provide a unique solution is minimizing the sum of squares error or\n", + "\n", + "$S_{r}=\\sum_{i=1}^{n}e_{i}^{2}=\\sum_{i=1}^{n}(y_{i}-a_{0}-a_{1}x_{i})^{2}$\n", + "\n", + "Where, $S_{r}$ is the sum of squares error (SSE). \n", + "\n", + "$\\frac{\\partial S_{r}}{\\partial a_{0}}=-2\\sum(y_{i}-a_{0}-a_{1}x_{i})$\n", + "\n", + "$\\frac{\\partial S_{r}}{\\partial a_{1}}=-2\\sum(y_{i}-a_{0}-a_{1}x_{i})x_{i}$\n", + "\n", + "The minimum $S_{r}$ occurrs when the partial derivatives are 0. \n", + "\n", + "$\\sum y_{i}= \\sum a_{0}+\\sum a_{1}x_{i}$\n", + "\n", + "$\\sum x_{i}y_{i}= \\sum a_{0}x_{i}+\\sum a_{1}x_{i}^{2}$\n", + "\n", + "$\\left[\\begin{array}{c}\n", + "\\sum y_{i}\\\\\n", + "\\sum x_{i}y_{i}\\end{array}\\right]=\n", + "\\left[\\begin{array}{cc}\n", + "n & \\sum x_{i}\\\\\n", + "\\sum x_{i} & \\sum x_{i}^{2}\\end{array}\\right]\n", + "\\left[\\begin{array}{c}\n", + "a_{0}\\\\\n", + "a_{1}\\end{array}\\right]$\n", + "\n", + "\n", + "$b=Ax$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example \n", + "\n", + "Find drag coefficient with best-fit line to experimental data\n", + "\n", + "|i | v (m/s) | F (N) |\n", + "|---|---|---|\n", + "|1 | 10 | 25 |\n", + "|2 | 20 | 70 |\n", + "|3 | 30 | 380|\n", + "|4 | 40 | 550|\n", + "|5 | 50 | 610|\n", + "|6 | 60 | 1220|\n", + "|7 | 70 | 830 |\n", + "|8 |80 | 1450|" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a =\n", + "\n", + " -234.286\n", + " 19.470\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tvelocity (m/s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tForce (N)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tbest-fit\n", + "\n", + "\t\n", + "\t\tbest-fit\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drag_data=[...\n", + "1 , 10 , 25 \n", + "2 , 20 , 70 \n", + "3 , 30 , 380\n", + "4 , 40 , 550\n", + "5 , 50 , 610\n", + "6 , 60 , 1220\n", + "7 , 70 , 830 \n", + "8 ,80 , 1450];\n", + "x=drag_data(:,2);\n", + "y=drag_data(:,3);\n", + "\n", + "b=[sum(y);sum(x.*y)];\n", + "A=[length(x),sum(x);\n", + " sum(x), sum(x.^2)];\n", + " \n", + "a=A\\b\n", + "\n", + "plot(x,y,'o',x,a(1)+a(2)*x)\n", + "legend('data','best-fit','Location','NorthWest')\n", + "xlabel('Force (N)')\n", + "ylabel('velocity (m/s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tresiduals (N)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tvelocity (m/s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tModel does not capture measurements\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(x,y-a(1)-40*x)\n", + "legend('data','best-fit','Location','NorthWest')\n", + "ylabel('residuals (N)')\n", + "xlabel('velocity (m/s)')\n", + "title('Model does not capture measurements')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How do we know its a \"good\" fit? \n", + "\n", + "Can compare the sum of squares error to the total sum of squares of the dependent variable (here F). \n", + "\n", + "$S_{r}=\\sum(y_{i}-a_{0}-a_{1}x_{i})^{2}$\n", + "\n", + "$S_{t}=\\sum(y_{i}-\\bar{y})^{2}$\n", + "\n", + "Then, we can calculate the *coefficient of determination*, $r^{2}$ or *correlation coefficient*, r. \n", + "\n", + "$r^{2}=\\frac{S_{t}-S_{r}}{S_{t}}$\n", + "\n", + "This represents the relative improvement of assuming that y is a function of x (if the x-values are not random and the y-values are random)\n", + "\n", + "For further information regarding statistical work on regression, look at \n", + "[NIST Statistics Handbook](http://www.itl.nist.gov/div898/handbook/pmd/section4/pmd44.htm)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "St = 1.8083e+06\n", + "St = 1.8083e+06\n" + ] + } + ], + "source": [ + "Sr=sum((y-a(1)-a(2)*x).^2);\n", + "St=std(y)^2*(length(y)-1)\n", + "St=sum((y-mean(y)).^2)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "r2 = 0.88049\n", + "r = 0.93834\n" + ] + } + ], + "source": [ + "r2=(St-Sr)/St\n", + "r=sqrt(r2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Limiting cases \n", + "\n", + "#### $r^{2}=0$ $S_{r}=S{t}$\n", + "\n", + "#### $r^{2}=1$ $S_{r}=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tCase 1\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tCase 1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tCase 2\n", + "\n", + "\t\n", + "\t\tCase 2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gen_examples\n", + "plot(x1(1:50:end),y1(1:50:end),'s',x2,y2,'o')\n", + "legend('Case 1','Case 2','Location','NorthWest')" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a1 =\n", + "\n", + " 0.0482496\n", + " 0.0017062\n", + "\n", + "a2 =\n", + "\n", + " 0\n", + " 1\n", + "\n", + "Sr1 = 0.83505\n", + "St1 = 0.83529\n", + "coefficient of determination in Case 1 is 0.000291\n", + "Sr2 = 0\n", + "St2 = 1.0185\n", + "coefficient of determination in Case 2 is 1.000000\n" + ] + } + ], + "source": [ + "b1=[sum(y1);sum(x1.*y1)];\n", + "A1=[length(x1),sum(x1);\n", + " sum(x1), sum(x1.^2)];\n", + " \n", + "a1=A1\\b1\n", + "\n", + "b2=[sum(y2);sum(x2.*y2)];\n", + "A2=[length(x2),sum(x2);\n", + " sum(x2), sum(x2.^2)];\n", + " \n", + "a2=A2\\b2\n", + "\n", + "Sr1=sum((y1-a1(1)-a1(2)*x1).^2)\n", + "St1=sum((y1-mean(y1)).^2)\n", + "fprintf('coefficient of determination in Case 1 is %f\\n',1-Sr1/St1)\n", + "\n", + "Sr2=sum((y2-a2(1)-a2(2)*x2).^2)\n", + "St2=sum((y2-mean(y2)).^2)\n", + "\n", + "fprintf('coefficient of determination in Case 2 is %f\\n',1-Sr2/St2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# General Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In general, you may want to fit other polynomials besides degree-1 (straight-lines)\n", + "\n", + "$y=a_{0}+a_{1}x+a_{2}x^{2}+\\cdots+a_{m}x^{m}+e$\n", + "\n", + "Now, the solution for $a_{0},~a_{1},...a_{m}$ is the minimization of m+1-dependent linear equations. \n", + "\n", + "Consider the following data:\n", + "\n", + "| x | y |\n", + "|---|---|\n", + "| 0.00 | 21.50 |\n", + "| 2.00 | 20.84 |\n", + "| 4.00 | 23.19 |\n", + "| 6.00 | 22.69 |\n", + "| 8.00 | 30.27 |\n", + "| 10.00 | 40.11 |\n", + "| 12.00 | 43.31 |\n", + "| 14.00 | 54.79 |\n", + "| 16.00 | 70.88 |\n", + "| 18.00 | 89.48 |\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t90\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "load xy_data.csv\n", + "x=xy_data(1,:)';\n", + "y=xy_data(2,:)';\n", + "plot(x,y,'o')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "xy_data =\n", + "\n", + " Columns 1 through 7:\n", + "\n", + " 0.00000 2.00000 4.00000 6.00000 8.00000 10.00000 12.00000\n", + " 21.50114 20.84153 23.19201 22.69498 30.26687 40.11075 43.30543\n", + "\n", + " Columns 8 through 11:\n", + "\n", + " 14.00000 16.00000 18.00000 20.00000\n", + " 54.78730 70.88443 89.48368 97.28135\n", + "\n" + ] + } + ], + "source": [ + "xy_data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model can be rewritten as \n", + "\n", + "$y=\\left[Z\\right]a+e$\n", + "\n", + "where $a=\\left[\\begin{array}{c}\n", + " a_{0}\\\\\n", + " a_{1}\\\\\n", + " a_{2}\\end{array}\\right]$\n", + " \n", + "$[Z]=\\left[\\begin{array} \n", + "1 & x_{1} & x_{1}^{2} \\\\\n", + "1 & x_{2} & x_{2}^{2} \\\\\n", + "1 & x_{3} & x_{3}^{2} \\\\\n", + "1 & x_{4} & x_{4}^{2} \\\\\n", + "1 & x_{5} & x_{5}^{2} \\\\\n", + "1 & x_{6} & x_{6}^{2} \\\\\n", + "1 & x_{7} & x_{7}^{2} \\\\\n", + "1 & x_{8} & x_{8}^{2} \\\\\n", + "1 & x_{9} & x_{9}^{2} \\\\\n", + "1 & x_{10} & x_{10}^{2} \\end{array}\\right]$\n", + "\n", + "The sum of squares residuals for this model is\n", + "\n", + "$S_{r}=\\sum_{i=1}^{n}\\left(y_{i}-\\sum_{j=0}^{m}a_{j}z_{ji}\\right)$\n", + "\n", + "Minimizing this function results in\n", + "\n", + "$y=[Z]a$\n", + "\n", + "->**A standard Linear Algebra Problem**\n", + "\n", + "*the vector a is unknown, and Z is calculated based upon the assumed function*\n" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Z =\n", + "\n", + " 1 0 0\n", + " 1 2 4\n", + " 1 4 16\n", + " 1 6 36\n", + " 1 8 64\n", + " 1 10 100\n", + " 1 12 144\n", + " 1 14 196\n", + " 1 16 256\n", + " 1 18 324\n", + " 1 20 400\n", + "\n", + "a =\n", + "\n", + " 21.40341\n", + " -0.81538\n", + " 0.23935\n", + "\n" + ] + } + ], + "source": [ + "Z=[x.^0,x,x.^2]\n", + "\n", + "a=Z\\y" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x_fcn=linspace(min(x),max(x));\n", + "plot(x,y,'o',x_fcn,a(1)+a(2)*x_fcn+a(3)*x_fcn.^2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### General Coefficient of Determination\n", + "\n", + "$r^{2}=\\frac{S_{t}-S_{r}}{S_{t}}=1-\\frac{S_{r}}{S_t}$" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "St = 27.923\n", + "Sr = 2.6366\n" + ] + } + ], + "source": [ + "St=std(y)\n", + "Sr=std(y-a(1)-a(2)*x-a(3)*x.^2)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the coefficient of determination for this fit is 0.880485\n", + "the correlation coefficient this fit is 0.938342\n" + ] + } + ], + "source": [ + "r2=1-Sr/St;\n", + "r=sqrt(r2);\n", + "\n", + "fprintf('the coefficient of determination for this fit is %f',r2)\n", + "fprintf('the correlation coefficient this fit is %f',r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compare this to a straight line fit" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "St = 27.923\n", + "Sr = 9.2520\n", + "the coefficient of determination for this fit is 0.668655\n", + "the correlation coefficient this fit is 0.817713\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Z=[ones(size(x)) x];\n", + "a_line=Z\\y;\n", + "x_fcn=linspace(min(x),max(x));\n", + "plot(x,y,'o',x_fcn,a(1)+a(2)*x_fcn+a(3)*x_fcn.^2,...\n", + "x_fcn,a_line(1)+a_line(2)*x_fcn)\n", + "St=std(y)\n", + "Sr=std(y-a_line(1)-a_line(2)*x)\n", + "r2=1-Sr/St;\n", + "r=sqrt(r2);\n", + "\n", + "fprintf('the coefficient of determination for this fit is %f',r2)\n", + "fprintf('the correlation coefficient this fit is %f',r)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tresiduals of straight line\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(x,y-a_line(1)-a_line(2)*x)\n", + "title('residuals of straight line')" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tresiduals of parabola\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(x,y-a(1)-a(2)*x-a(3)*x.^2)\n", + "title('residuals of parabola')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Warning \n", + "**Coefficient of determination reduction does not always mean a better fit**\n", + "\n", + "Try the function, \n", + "\n", + "$y(x)=a_0+a_{1}x+a_{2}x^{2}+a_{4}x^{4}+a_{5}x^{5}+a_{5}x^{5}+a_{6}x^{6}+a_{7}x^{7}+a_{8}x^{8}$" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a_overfit =\n", + "\n", + " 2.1487e+01\n", + " -1.4264e+01\n", + " 1.5240e+01\n", + " -6.0483e+00\n", + " 1.1887e+00\n", + " -1.2651e-01\n", + " 7.4379e-03\n", + " -2.2702e-04\n", + " 2.8063e-06\n", + "\n" + ] + } + ], + "source": [ + "Z=[ones(size(x)) x x.^2 x.^3 x.^4 x.^5 x.^6 x.^7 x.^8];\n", + "a_overfit=Z\\y" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tparabola\n", + "\n", + "\t\n", + "\t\tparabola\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tn=8-fit\n", + "\n", + "\t\n", + "\t\tn=8-fit\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(x,y,'o',x_fcn,a(1)+a(2)*x_fcn+a(3)*x_fcn.^2,...\n", + "x_fcn,a_overfit(1)+a_overfit(2)*x_fcn+a_overfit(3)*x_fcn.^2+...\n", + "a_overfit(4)*x_fcn.^3+a_overfit(5)*x_fcn.^4+...\n", + "a_overfit(6)*x_fcn.^5+a_overfit(7)*x_fcn.^6+...\n", + "a_overfit(8)*x_fcn.^7+a_overfit(9)*x_fcn.^8)\n", + "legend('data','parabola','n=8-fit','Location','NorthWest')" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "St = 27.923\n", + "Sr = 0.77320\n", + "the coefficient of determination for this fit is 0.972309\n", + "the correlation coefficient this fit is 0.986057\n" + ] + } + ], + "source": [ + "St=std(y)\n", + "Sr=std(y-polyval(a_overfit(end:-1:1),x))\n", + "r2=1-Sr/St;\n", + "r=sqrt(r2);\n", + "\n", + "fprintf('the coefficient of determination for this fit is %f',r2)\n", + "fprintf('the correlation coefficient this fit is %f',r)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Linear Regression is only limited by the ability to separate the parameters from the function to achieve\n", + "\n", + "$y=[Z]a$\n", + "\n", + "$Z$ can be any function of the independent variable(s)\n", + "\n", + "**Example**:\n", + "We assume two functions are added together, sin(t) and sin(3t). What are the amplitudes?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t14\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "load sin_data.csv\n", + "t=sin_data(1,:)';\n", + "y=sin_data(2,:)';\n", + "plot(t,y)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a =\n", + "\n", + " 0.99727\n", + " 0.50251\n", + "\n" + ] + } + ], + "source": [ + "Z=[sin(t) sin(3*t)];\n", + "a=Z\\y" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t14\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(t,y,'.',t,a(1)*sin(t)+a(2)*sin(3*t))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_17/octave-workspace b/lecture_17/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_17/octave-workspace differ diff --git a/lecture_17/q1.png b/lecture_17/q1.png new file mode 100644 index 0000000..7c89cbf Binary files /dev/null and b/lecture_17/q1.png differ diff --git a/lecture_17/q2.png b/lecture_17/q2.png new file mode 100644 index 0000000..7eea25c Binary files /dev/null and b/lecture_17/q2.png differ diff --git a/lecture_17/sin_data.csv b/lecture_17/sin_data.csv new file mode 100644 index 0000000..a5ff272 --- /dev/null +++ b/lecture_17/sin_data.csv @@ -0,0 +1,2 @@ + 0.00000000e+00 1.26933037e-01 2.53866073e-01 3.80799110e-01 5.07732146e-01 6.34665183e-01 7.61598219e-01 8.88531256e-01 1.01546429e+00 1.14239733e+00 1.26933037e+00 1.39626340e+00 1.52319644e+00 1.65012947e+00 1.77706251e+00 1.90399555e+00 2.03092858e+00 2.15786162e+00 2.28479466e+00 2.41172769e+00 2.53866073e+00 2.66559377e+00 2.79252680e+00 2.91945984e+00 3.04639288e+00 3.17332591e+00 3.30025895e+00 3.42719199e+00 3.55412502e+00 3.68105806e+00 3.80799110e+00 3.93492413e+00 4.06185717e+00 4.18879020e+00 4.31572324e+00 4.44265628e+00 4.56958931e+00 4.69652235e+00 4.82345539e+00 4.95038842e+00 5.07732146e+00 5.20425450e+00 5.33118753e+00 5.45812057e+00 5.58505361e+00 5.71198664e+00 5.83891968e+00 5.96585272e+00 6.09278575e+00 6.21971879e+00 6.34665183e+00 6.47358486e+00 6.60051790e+00 6.72745093e+00 6.85438397e+00 6.98131701e+00 7.10825004e+00 7.23518308e+00 7.36211612e+00 7.48904915e+00 7.61598219e+00 7.74291523e+00 7.86984826e+00 7.99678130e+00 8.12371434e+00 8.25064737e+00 8.37758041e+00 8.50451345e+00 8.63144648e+00 8.75837952e+00 8.88531256e+00 9.01224559e+00 9.13917863e+00 9.26611167e+00 9.39304470e+00 9.51997774e+00 9.64691077e+00 9.77384381e+00 9.90077685e+00 1.00277099e+01 1.01546429e+01 1.02815760e+01 1.04085090e+01 1.05354420e+01 1.06623751e+01 1.07893081e+01 1.09162411e+01 1.10431742e+01 1.11701072e+01 1.12970402e+01 1.14239733e+01 1.15509063e+01 1.16778394e+01 1.18047724e+01 1.19317054e+01 1.20586385e+01 1.21855715e+01 1.23125045e+01 1.24394376e+01 1.25663706e+01 + 9.15756288e-02 3.39393873e-01 6.28875306e-01 7.67713096e-01 1.05094584e+00 9.70887288e-01 9.84265740e-01 1.02589034e+00 8.53218113e-01 6.90197665e-01 5.51277193e-01 5.01564914e-01 5.25455797e-01 5.87052838e-01 5.41394658e-01 7.12365594e-01 8.14839678e-01 9.80181855e-01 9.44430709e-01 1.06728057e+00 1.15166322e+00 8.99464065e-01 7.77225453e-01 5.92618124e-01 3.08822183e-01 -1.07884730e-03 -3.46563271e-01 -5.64836023e-01 -8.11931510e-01 -1.05925186e+00 -1.13323611e+00 -1.11986890e+00 -8.88336727e-01 -9.54113139e-01 -6.81378679e-01 -6.02369117e-01 -4.78684439e-01 -5.88160325e-01 -4.93580777e-01 -5.68747320e-01 -7.51641934e-01 -8.14672884e-01 -9.53191554e-01 -9.55337518e-01 -9.85995556e-01 -9.63373597e-01 -1.01511061e+00 -7.56467517e-01 -4.17379564e-01 -1.22340361e-01 2.16273929e-01 5.16909714e-01 7.77031694e-01 1.00653798e+00 9.35718089e-01 1.00660116e+00 1.11177057e+00 9.85485116e-01 8.54344900e-01 6.26444042e-01 6.28124048e-01 4.27764254e-01 5.93991751e-01 4.79248018e-01 7.17522492e-01 7.35927848e-01 9.08802925e-01 9.38646871e-01 1.13125860e+00 1.07247935e+00 1.05198782e+00 9.41647332e-01 6.98801244e-01 4.03193543e-01 1.37009682e-01 -1.43203880e-01 -4.64369445e-01 -6.94978252e-01 -1.03483196e+00 -1.10261288e+00 -1.12892727e+00 -1.03902484e+00 -8.53573083e-01 -7.01815315e-01 -6.84745997e-01 -6.14189417e-01 -4.70090797e-01 -5.95052432e-01 -5.96497000e-01 -5.66861911e-01 -7.18239679e-01 -9.52873043e-01 -9.37512847e-01 -1.15782985e+00 -1.03858206e+00 -1.03182712e+00 -8.45121554e-01 -5.61821980e-01 -2.83427014e-01 -8.27056140e-02 diff --git a/lecture_17/xy_data.csv b/lecture_17/xy_data.csv new file mode 100644 index 0000000..15b919d --- /dev/null +++ b/lecture_17/xy_data.csv @@ -0,0 +1,2 @@ + 0.00000000e+00 2.00000000e+00 4.00000000e+00 6.00000000e+00 8.00000000e+00 1.00000000e+01 1.20000000e+01 1.40000000e+01 1.60000000e+01 1.80000000e+01 2.00000000e+01 + 2.15011412e+01 2.08415256e+01 2.31920098e+01 2.26949773e+01 3.02668745e+01 4.01107461e+01 4.33054255e+01 5.47873036e+01 7.08844291e+01 8.94836828e+01 9.72813533e+01 diff --git a/lecture_18/.Newtint.m.swp b/lecture_18/.Newtint.m.swp new file mode 100644 index 0000000..769fe2b Binary files /dev/null and b/lecture_18/.Newtint.m.swp differ diff --git a/lecture_18/.ipynb_checkpoints/lecture_18-checkpoint.ipynb b/lecture_18/.ipynb_checkpoints/lecture_18-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_18/.ipynb_checkpoints/lecture_18-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_18/Newtint.m b/lecture_18/Newtint.m new file mode 100644 index 0000000..e4c6c83 --- /dev/null +++ b/lecture_18/Newtint.m @@ -0,0 +1,34 @@ +function yint = Newtint(x,y,xx) +% Newtint: Newton interpolating polynomial +% yint = Newtint(x,y,xx): Uses an (n - 1)-order Newton +% interpolating polynomial based on n data points (x, y) +% to determine a value of the dependent variable (yint) +% at a given value of the independent variable, xx. +% input: +% x = independent variable +% y = dependent variable +% xx = value of independent variable at which +% interpolation is calculated +% output: +% yint = interpolated value of dependent variable + +% compute the finite divided differences in the form of a +% difference table +n = length(x); +if length(y)~=n, error('x and y must be same length'); end +b = zeros(n,n); +% assign dependent variables to the first column of b. +b(:,1) = y(:); % the (:) ensures that y is a column vector. +for j = 2:n + for i = 1:n-j+1 + b(i,j) = (b(i+1,j-1)-b(i,j-1))/(x(i+j-1)-x(i)); + end +end +%b +% use the finite divided differences to interpolate +xt = 1; +yint = b(1,1); +for j = 1:n-1 + xt = xt*(xx-x(j)); + yint = yint+b(1,j+1)*xt; +end diff --git a/lecture_18/challenger_oring.csv b/lecture_18/challenger_oring.csv new file mode 100644 index 0000000..11d647e --- /dev/null +++ b/lecture_18/challenger_oring.csv @@ -0,0 +1,24 @@ +Flight#,Temp,O-Ring Problem +1,53,1 +2,57,1 +3,58,1 +4,63,1 +5,66,0 +6,66.8,0 +7,67,0 +8,67.2,0 +9,68,0 +10,69,0 +11,69.8,1 +12,69.8,0 +13,70.2,1 +14,70.2,0 +15,72,0 +16,73,0 +17,75,0 +18,75,1 +19,75.8,0 +20,76.2,0 +21,78,0 +22,79,0 +23,81,0 diff --git a/lecture_18/lecture_18.ipynb b/lecture_18/lecture_18.ipynb new file mode 100644 index 0000000..f1fd1b3 --- /dev/null +++ b/lecture_18/lecture_18.ipynb @@ -0,0 +1,2197 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.081014\n", + " 0.317493\n", + " 0.690279\n", + " 1.169170\n", + " 1.715370\n", + " 2.284630\n", + " 2.830830\n", + " 3.309721\n", + " 3.682507\n", + " 3.918986\n", + "\n" + ] + } + ], + "source": [ + "N=10;\n", + "A_beam=diag(ones(N,1))*2+diag(ones(N-1,1)*-1,-1)+diag(ones(N-1,1)*-1,1);\n", + "[v,e]=eig(A_beam);\n", + "diag(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nonlinear Regression\n", + "\n", + "We can define any function and minimize the sum of squares error even if the constants cannot be separated.\n", + "\n", + "$S_{r}=\\left[y-f(z_{1},z_{2},...)\\right]^{2}$\n", + "\n", + "Consider the function, \n", + "\n", + "$f(x) = a_{0}(1-e^{a_{1}x})$\n", + "\n", + "We can define the sum of squares error as a function of $a_{0}$ and $a_{1}$:\n", + "\n", + "$f_{SSE}(a_{0},a_{1})=\\sum_{i=1}^{n}\\left[y- a_{0}(1-e^{a_{1}x})\\right]^{2}$" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "function [SSE,yhat] = sse_nonlin_exp(a,x,y)\n", + " % This is a sum of squares error function based on \n", + " % the two input constants a0 and a1 where a=[a0,a1]\n", + " % and the data is x (independent), y (dependent)\n", + " % and yhat is the model with the given a0 and a1 values\n", + " a0=a(1);\n", + " a1=a(2);\n", + " yhat=a0*(1-exp(a1*x));\n", + " SSE=sum((y-a0*(1-exp(a1*x))).^2);\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Where the data we are fitting is:\n", + "\n", + "| x | y |\n", + "|---|---|\n", + " | 0.0 | 0.41213|\n", + " | 1.0 | -2.65190|\n", + " | 2.0 | 15.04049|\n", + " | 3.0 | 5.19368|\n", + " | 4.0 | -0.71086|\n", + " | 5.0 | 12.69008|\n", + " | 6.0 | 29.20309|\n", + " | 7.0 | 58.68879|\n", + " | 8.0 | 91.61117|\n", + " | 9.0 | 173.75492|\n", + " | 10.0 | 259.04083|" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "data=[\n", + " 0.00000 0.41213\n", + " 1.00000 -2.65190\n", + " 2.00000 15.04049\n", + " 3.00000 5.19368\n", + " 4.00000 -0.71086\n", + " 5.00000 12.69008\n", + " 6.00000 29.20309\n", + " 7.00000 58.68879\n", + " 8.00000 91.61117\n", + " 9.00000 173.75492\n", + " 10.00000 259.04083\n", + "\n", + "];\n" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the sum of squares for a0=-2.00 and a1=0.20 is 98118.4\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t250\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[SSE,yhat]=sse_nonlin_exp([-2,0.2],data(:,1),data(:,2));\n", + "fprintf('the sum of squares for a0=%1.2f and a1=%1.2f is %1.1f',...\n", + "-2,0.2,SSE)\n", + "plot(data(:,1),data(:,2),'o',data(:,1),yhat)" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a =\n", + "\n", + " -1.71891 0.50449\n", + "\n", + "fsse = 633.70\n" + ] + } + ], + "source": [ + "[a,fsse]=fminsearch(@(a) sse_nonlin_exp(a,data(:,1),data(:,2)),[-2,0.2])" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t250\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[sse,yhat]=sse_nonlin_exp(a,data(:,1),data(:,2));\n", + "plot(data(:,1),data(:,2),'o',data(:,1),yhat)" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tresiduals of function\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[sse,yhat]=sse_nonlin_exp(a,data(:,1),data(:,2));\n", + "plot(data(:,1),data(:,2)-yhat)\n", + "title('residuals of function')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Case Study: Logistic Regression\n", + "\n", + "Many times the variable you predict is a binary (or discrete) value, such as pass/fail, broken/not-broken, etc. \n", + "\n", + "One method to fit this type of data is called [**logistic regression**](https://en.wikipedia.org/wiki/Logistic_regression).\n", + "\n", + "[Logistic Regression link 2](http://www.holehouse.org/mlclass/06_Logistic_Regression.html)\n", + "\n", + "We use a function that varies from 0 to 1 called a logistic function:\n", + "\n", + "$\\sigma(t)=\\frac{1}{1+e^{-t}}$\n", + "\n", + "We can use this function to describe the likelihood of failure (1) or success (0). When t=0, the probability of failure is 50%. " + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t=linspace(-10,10);\n", + "sigma=@(t) 1./(1+exp(-t));\n", + "plot(t,sigma(t))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we make the assumption that we can predict the boundary between the pass-fail criteria with a function of our independent variable e.g.\n", + "\n", + "$y=\\left\\{\\begin{array}{cc} \n", + "1 & a_{0}+a_{1}x +\\epsilon >0 \\\\\n", + "0 & else \\end{array} \\right\\}$\n", + "\n", + "so the logistic function is now:\n", + "\n", + "$\\sigma(x)=\\frac{1}{1+e^{-(a_{0}+a_{1}x)}}$\n", + "\n", + "Here, there is not a direct sum of squares error, so we minimize a cost function: \n", + "\n", + "$J(a_{0},a_{1})=\\sum_{i=1}^{n}\\left[-y_{i}\\log(\\sigma(x_{i}))-(1-y_{i})\\log((1-\\sigma(x_{i})))\\right]$\n", + "\n", + "y=0,1 \n", + "\n", + "So the cost function either sums the " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example: Challenger O-ring failures\n", + "\n", + "The O-rings on the Challenger shuttles had problems when temperatures became low. We can look at the conditions when damage was observed to determine the likelihood of failure. \n", + "\n", + "[Challenger O-ring data powerpoint](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjZvL7jkP3SAhUp04MKHXkXDkMQFggcMAA&url=http%3A%2F%2Fwww.stat.ufl.edu%2F~winner%2Fcases%2Fchallenger.ppt&usg=AFQjCNFyjwT7NmRthDkDEgch75Fc5dc66w&sig2=_qeteX6-ZEBwPW8SZN1mIA)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "oring =\n", + "\n", + " 1.00000 53.00000 1.00000\n", + " 2.00000 57.00000 1.00000\n", + " 3.00000 58.00000 1.00000\n", + " 4.00000 63.00000 1.00000\n", + " 5.00000 66.00000 0.00000\n", + " 6.00000 66.80000 0.00000\n", + " 7.00000 67.00000 0.00000\n", + " 8.00000 67.20000 0.00000\n", + " 9.00000 68.00000 0.00000\n", + " 10.00000 69.00000 0.00000\n", + " 11.00000 69.80000 1.00000\n", + " 12.00000 69.80000 0.00000\n", + " 13.00000 70.20000 1.00000\n", + " 14.00000 70.20000 0.00000\n", + " 15.00000 72.00000 0.00000\n", + " 16.00000 73.00000 0.00000\n", + " 17.00000 75.00000 0.00000\n", + " 18.00000 75.00000 1.00000\n", + " 19.00000 75.80000 0.00000\n", + " 20.00000 76.20000 0.00000\n", + " 21.00000 78.00000 0.00000\n", + " 22.00000 79.00000 0.00000\n", + " 23.00000 81.00000 0.00000\n", + "\n" + ] + } + ], + "source": [ + "% read data from csv file \n", + "% col 1 = index\n", + "% col 2 = temperature\n", + "% col 3 = 1 if damaged, 0 if undamaged\n", + "oring=dlmread('challenger_oring.csv',',',1,0)" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t55\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t65\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t75\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t85\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tfailure (1)/ pass (0)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tTemp (F)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(oring(:,2),oring(:,3),'o')\n", + "xlabel('Temp (F)')\n", + "ylabel('failure (1)/ pass (0)')" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "function J=sse_logistic(a,x,y)\n", + " % Create function to calculate cost of logistic function\n", + " % t = a0+a1*x\n", + " % sigma(t) = 1./(1+e^(-t))\n", + " sigma=@(t) 1./(1+exp(-t));\n", + " a0=a(1);\n", + " a1=a(2);\n", + " t=a0+a1*x;\n", + " J = 1/length(x)*sum(-y.*log(sigma(t))-(1-y).*log(1-sigma(t)));\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J = 0.88822\n", + "a =\n", + "\n", + " 15.03501 -0.23205\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t55\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t65\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t75\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t85\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "J=sse_logistic([10,-0.2],oring(:,2),oring(:,3))\n", + "a=fminsearch(@(a) sse_logistic(a,oring(:,2),oring(:,3)),[0,-3])\n", + "\n", + "T=linspace(50,85);\n", + "plot(oring(:,2),oring(:,3),'o',T,sigma(a(1)+a(2)*T),T,a(1)+a(2)*T)\n", + "axis([50,85,-0.1,1.2])" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "probability of failure when 70 degrees is 23.00% \n", + "probability of failure when 60 degrees is 75.25%\n", + "probability of failure when 36 degrees is 99.87%\n" + ] + } + ], + "source": [ + "fprintf('probability of failure when 70 degrees is %1.2f%% ',100*sigma(a(1)+a(2)*70))\n", + "fprintf('probability of failure when 60 degrees is %1.2f%%',100*sigma(a(1)+a(2)*60))\n", + "fprintf('probability of failure when 36 degrees is %1.2f%%',100*sigma(a(1)+a(2)*36))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpolation\n", + "\n", + "Using regression (linear and nonlinear) you are faced with the problem, that you have lots of noisy data and you want to fit a physical model to it. \n", + "\n", + "You can use interpolation to solve the opposite problem, you have a little data with very little noise.\n", + "\n", + "## Linear interpolation\n", + "\n", + "If you are trying to find the value of f(x) for x between $x_{1}$ and $x_{2}$, then you can match the slopes\n", + "\n", + "$\\frac{f(x)-f(x_{1})}{x-x_{1}}=\\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}$\n", + "\n", + "or\n", + "\n", + "$f(x)=f(x_{1})+(x-x_{1})\\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}$\n", + "\n", + "### Example: Logarithms\n", + "\n", + "Engineers used to have to use interpolation in logarithm tables for calculations. Find ln(2) from \n", + "\n", + "a. ln(1) and ln(6)\n", + "\n", + "b. ln(1) and ln(4)\n", + "\n", + "c. just calculate it as ln(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ln(2)~0.358352\n", + "ln(2)~0.462098\n", + "ln(2)~0.549306\n", + "ln(2)=0.693147\n" + ] + } + ], + "source": [ + "ln2_16=log(1)+(log(6)-log(1))/(6-1)*(2-1);\n", + "fprintf('ln(2)~%f\\n',ln2_16)\n", + "ln2_14=log(1)+(log(4)-log(1))/(4-1)*(2-1);\n", + "ln2_13=log(1)+(log(3)-log(1))/(3-1)*(2-1);\n", + "fprintf('ln(2)~%f\\n',ln2_14)\n", + "fprintf('ln(2)~%f\\n',ln2_13)\n", + "ln2=log(2);\n", + "fprintf('ln(2)=%f\\n',ln2)" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tln(x)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(1,6);\n", + "plot(x,log(x),2,log(2),'*',...\n", + "[1,2,6],[log(1),ln2_16,log(6)],'o-',...\n", + "[1,2,4],[log(1),ln2_14,log(4)],'s-')\n", + "ylabel('ln(x)')\n", + "xlabel('x')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Quadratic interpolation (intro curvature)\n", + "\n", + "Assume function is parabola between 3 points. The function is can be written as:\n", + "\n", + "$f_{2}(x)=b_{1}+b_{2}(x-x_{1})+b_{3}(x-x_{1})(x-x_{2})$\n", + "\n", + "When $x=x_{1}$\n", + "\n", + "$f(x_{1})=b_{1}$\n", + "\n", + "when $x=x_{2}$\n", + "\n", + "$b_{2}=\\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}$\n", + "\n", + "when $x=x_{3}$\n", + "\n", + "$b_{3}=\\frac{\\frac{f(x_{3})-f(x_{2})}{x_{3}-x_{2}}\n", + "-\\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}}{x_{3}-x_{1}}$\n", + "\n", + "#### Reexamining the ln(2) with ln(1), ln(4), and ln(6):" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Z =\n", + "\n", + " 1 1 1\n", + " 1 4 16\n", + " 1 600 360000\n", + "\n", + "ans = 5.1766e+05\n", + "ans =\n", + "\n", + " -4.6513e-01\n", + " 4.6589e-01\n", + " -7.5741e-04\n", + "\n" + ] + } + ], + "source": [ + "x=[1,4,600]';\n", + "Z=[x.^0,x.^1,x.^2]\n", + "cond(Z)\n", + "Z\\log(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b1 = 0\n", + "b2 = 0.46210\n", + "b3 = -0.051873\n" + ] + } + ], + "source": [ + "x1=1;\n", + "x2=4;\n", + "x3=6;\n", + "f1=log(x1);\n", + "f2=log(x2);\n", + "f3=log(x3);\n", + "\n", + "b1=f1\n", + "b2=(f2-b1)/(x2-x1)\n", + "b3=(f3-f2)/(x3-x2)-b2;\n", + "b3=b3/(x3-x1)" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0.56584\r\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(1,6);\n", + "f=@(x) b1+b2*(x-x1)+b3*(x-x1).*(x-x2);\n", + "plot(x,log(x),2,log(2),'*',...\n", + "[1,4,6],[log(1),log(4),log(6)],'ro',...\n", + "x,f(x),'r-',2,f(2),'s')\n", + "f(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Newton's Interpolating Polynomials\n", + "\n", + "For n-data points, we can fit an (n-1)th-polynomial\n", + "\n", + "$f_{n-1}(x)=b_{1}+b_{2}(x-x_{1})+\\cdots+b_{n}(x-x_{1})(x-x_{2})\\cdots(x-x_{n})$\n", + "\n", + "where \n", + "\n", + "$b_{1}=f(x_{1})$\n", + "\n", + "$b_{2}=\\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}$\n", + "\n", + "$b_{3}=\\frac{\\frac{f(x_{3})-f(x_{2})}{x_{3}-x_{2}}\n", + "-b_{2}}{x_{3}-x_{1}}$\n", + "\n", + "$\\vdots$\n", + "\n", + "$b_{n}=f(x_{n},x_{n-1},...,x_{2},x_{1})\n", + "=\\frac{f(x_{n},x_{n-1},...x_{2})-f(x_{n-1},x_{n-2},...,x_{1})}{x_{n}-x_{1}}$\n", + "\n", + "**e.g. for 4 data points:**\n", + "\n", + "![Newton Interpolation Iterations](newton_interpolation.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b =\n", + "\n", + " 0.00000 0.54931 -0.08721 0.01178\n", + " 1.09861 0.28768 -0.02832 0.00000\n", + " 1.38629 0.20273 0.00000 0.00000\n", + " 1.79176 0.00000 0.00000 0.00000\n", + "\n", + "ans = 0.66007\n", + "ans =\n", + "\n", + " 0.00000\n", + " 1.09861\n", + " 1.38629\n", + " 1.79176\n", + "\n" + ] + } + ], + "source": [ + "Newtint([1,3,4,6],log([1,3,4,6]),2)\n", + "log([1,3,4,6]')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ln(2)=0.693147\n", + "ln(2)~0.693147\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "\n", + "x=[0.2,1,2,3,4]; % define independent var's\n", + "y=log(x); % define dependent var's\n", + "xx=linspace(min(x),max(x)+1);\n", + "yy=zeros(size(xx));\n", + "for i=1:length(xx)\n", + " yy(i)=Newtint(x,y,xx(i));\n", + "end\n", + "plot(xx,log(xx),2,log(2),'*',...\n", + "x,y,'ro',...\n", + "xx,yy,'r-')\n", + "\n", + "fprintf('ln(2)=%f',log(2))\n", + "fprintf('ln(2)~%f',Newtint(x,y,2))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_18/newton_interpolation.png b/lecture_18/newton_interpolation.png new file mode 100644 index 0000000..5990cb5 Binary files /dev/null and b/lecture_18/newton_interpolation.png differ diff --git a/lecture_18/octave-workspace b/lecture_18/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_18/octave-workspace differ diff --git a/lecture_19/.ipynb_checkpoints/lecture 19-checkpoint.ipynb b/lecture_19/.ipynb_checkpoints/lecture 19-checkpoint.ipynb new file mode 100644 index 0000000..2911efe --- /dev/null +++ b/lecture_19/.ipynb_checkpoints/lecture 19-checkpoint.ipynb @@ -0,0 +1,497 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Splines (Brief introduction before next section)\n", + "\n", + "Following interpolation discussion, instead of estimating 9 data points with an eighth-order polynomial, it makes more sense to fit sections of the curve to lower-order polynomials:\n", + "\n", + "0. zeroth-order (nearest neighbor)\n", + "\n", + "1. first-order (linear interpolation)\n", + "\n", + "2. third-order (cubic interpolation)\n", + "\n", + "Matlab and Octave have built-in functions for 1D and 2D interpolation:\n", + "\n", + "`interp1`\n", + "\n", + "`interp2`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'interp1' is a function from the file /usr/share/octave/4.0.0/m/general/interp1.m\n", + "\n", + " -- Function File: YI = interp1 (X, Y, XI)\n", + " -- Function File: YI = interp1 (Y, XI)\n", + " -- Function File: YI = interp1 (..., METHOD)\n", + " -- Function File: YI = interp1 (..., EXTRAP)\n", + " -- Function File: YI = interp1 (..., \"left\")\n", + " -- Function File: YI = interp1 (..., \"right\")\n", + " -- Function File: PP = interp1 (..., \"pp\")\n", + "\n", + " One-dimensional interpolation.\n", + "\n", + " Interpolate input data to determine the value of YI at the points\n", + " XI. If not specified, X is taken to be the indices of Y ('1:length\n", + " (Y)'). If Y is a matrix or an N-dimensional array, the\n", + " interpolation is performed on each column of Y.\n", + "\n", + " The interpolation METHOD is one of:\n", + "\n", + " \"nearest\"\n", + " Return the nearest neighbor.\n", + "\n", + " \"previous\"\n", + " Return the previous neighbor.\n", + "\n", + " \"next\"\n", + " Return the next neighbor.\n", + "\n", + " \"linear\" (default)\n", + " Linear interpolation from nearest neighbors.\n", + "\n", + " \"pchip\"\n", + " Piecewise cubic Hermite interpolating\n", + " polynomial--shape-preserving interpolation with smooth first\n", + " derivative.\n", + "\n", + " \"cubic\"\n", + " Cubic interpolation (same as \"pchip\").\n", + "\n", + " \"spline\"\n", + " Cubic spline interpolation--smooth first and second\n", + " derivatives throughout the curve.\n", + "\n", + " Adding '*' to the start of any method above forces 'interp1' to\n", + " assume that X is uniformly spaced, and only 'X(1)' and 'X(2)' are\n", + " referenced. This is usually faster, and is never slower. The\n", + " default method is \"linear\".\n", + "\n", + " If EXTRAP is the string \"extrap\", then extrapolate values beyond\n", + " the endpoints using the current METHOD. If EXTRAP is a number,\n", + " then replace values beyond the endpoints with that number. When\n", + " unspecified, EXTRAP defaults to 'NA'.\n", + "\n", + " If the string argument \"pp\" is specified, then XI should not be\n", + " supplied and 'interp1' returns a piecewise polynomial object. This\n", + " object can later be used with 'ppval' to evaluate the\n", + " interpolation. There is an equivalence, such that 'ppval (interp1\n", + " (X, Y, METHOD, \"pp\"), XI) == interp1 (X, Y, XI, METHOD, \"extrap\")'.\n", + "\n", + " Duplicate points in X specify a discontinuous interpolant. There\n", + " may be at most 2 consecutive points with the same value. If X is\n", + " increasing, the default discontinuous interpolant is\n", + " right-continuous. If X is decreasing, the default discontinuous\n", + " interpolant is left-continuous. The continuity condition of the\n", + " interpolant may be specified by using the options \"left\" or \"right\"\n", + " to select a left-continuous or right-continuous interpolant,\n", + " respectively. Discontinuous interpolation is only allowed for\n", + " \"nearest\" and \"linear\" methods; in all other cases, the X-values\n", + " must be unique.\n", + "\n", + " An example of the use of 'interp1' is\n", + "\n", + " xf = [0:0.05:10];\n", + " yf = sin (2*pi*xf/5);\n", + " xp = [0:10];\n", + " yp = sin (2*pi*xp/5);\n", + " lin = interp1 (xp, yp, xf);\n", + " near = interp1 (xp, yp, xf, \"nearest\");\n", + " pch = interp1 (xp, yp, xf, \"pchip\");\n", + " spl = interp1 (xp, yp, xf, \"spline\");\n", + " plot (xf,yf,\"r\", xf,near,\"g\", xf,lin,\"b\", xf,pch,\"c\", xf,spl,\"m\",\n", + " xp,yp,\"r*\");\n", + " legend (\"original\", \"nearest\", \"linear\", \"pchip\", \"spline\");\n", + "\n", + " See also: pchip, spline, interpft, interp2, interp3, interpn.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help interp1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'interp2' is a function from the file /usr/share/octave/4.0.0/m/general/interp2.m\n", + "\n", + " -- Function File: ZI = interp2 (X, Y, Z, XI, YI)\n", + " -- Function File: ZI = interp2 (Z, XI, YI)\n", + " -- Function File: ZI = interp2 (Z, N)\n", + " -- Function File: ZI = interp2 (Z)\n", + " -- Function File: ZI = interp2 (..., METHOD)\n", + " -- Function File: ZI = interp2 (..., METHOD, EXTRAP)\n", + "\n", + " Two-dimensional interpolation.\n", + "\n", + " Interpolate reference data X, Y, Z to determine ZI at the\n", + " coordinates XI, YI. The reference data X, Y can be matrices, as\n", + " returned by 'meshgrid', in which case the sizes of X, Y, and Z must\n", + " be equal. If X, Y are vectors describing a grid then 'length (X)\n", + " == columns (Z)' and 'length (Y) == rows (Z)'. In either case the\n", + " input data must be strictly monotonic.\n", + "\n", + " If called without X, Y, and just a single reference data matrix Z,\n", + " the 2-D region 'X = 1:columns (Z), Y = 1:rows (Z)' is assumed.\n", + " This saves memory if the grid is regular and the distance between\n", + " points is not important.\n", + "\n", + " If called with a single reference data matrix Z and a refinement\n", + " value N, then perform interpolation over a grid where each original\n", + " interval has been recursively subdivided N times. This results in\n", + " '2^N-1' additional points for every interval in the original grid.\n", + " If N is omitted a value of 1 is used. As an example, the interval\n", + " [0,1] with 'N==2' results in a refined interval with points at [0,\n", + " 1/4, 1/2, 3/4, 1].\n", + "\n", + " The interpolation METHOD is one of:\n", + "\n", + " \"nearest\"\n", + " Return the nearest neighbor.\n", + "\n", + " \"linear\" (default)\n", + " Linear interpolation from nearest neighbors.\n", + "\n", + " \"pchip\"\n", + " Piecewise cubic Hermite interpolating\n", + " polynomial--shape-preserving interpolation with smooth first\n", + " derivative.\n", + "\n", + " \"cubic\"\n", + " Cubic interpolation (same as \"pchip\").\n", + "\n", + " \"spline\"\n", + " Cubic spline interpolation--smooth first and second\n", + " derivatives throughout the curve.\n", + "\n", + " EXTRAP is a scalar number. It replaces values beyond the endpoints\n", + " with EXTRAP. Note that if EXTRAPVAL is used, METHOD must be\n", + " specified as well. If EXTRAP is omitted and the METHOD is\n", + " \"spline\", then the extrapolated values of the \"spline\" are used.\n", + " Otherwise the default EXTRAP value for any other METHOD is \"NA\".\n", + "\n", + " See also: interp1, interp3, interpn, meshgrid.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help interp2" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tlinear\n", + "\n", + "\t\n", + "\t\tlinear\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tcubic spline\n", + "\n", + "\t\n", + "\t\tcubic spline\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tpiecewise cubic\n", + "\n", + "\t\n", + "\t\tpiecewise cubic\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(-pi,pi,9);\n", + "xi=linspace(-pi,pi,100);\n", + "y=sin(x);\n", + "yi_lin=interp1(x,y,xi,'linear');\n", + "yi_spline=interp1(x,y,xi,'spline'); \n", + "yi_cubic=interp1(x,y,xi,'cubic');\n", + "plot(x,y,'o',xi,yi_lin,xi,yi_spline,xi,yi_cubic)\n", + "axis([-pi,pi,-1.5,1.5])\n", + "legend('data','linear','cubic spline','piecewise cubic','Location','NorthWest')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example: Accelerate then hold velocity\n", + "\n", + "Here the time is given as vector t in seconds and the " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "t=[0 2 40 56 68 80 84 96 104 110]';\n", + "v=[0 20 20 38 80 80 100 100 125 125]';\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_19/Newtint.m b/lecture_19/Newtint.m new file mode 100644 index 0000000..e4c6c83 --- /dev/null +++ b/lecture_19/Newtint.m @@ -0,0 +1,34 @@ +function yint = Newtint(x,y,xx) +% Newtint: Newton interpolating polynomial +% yint = Newtint(x,y,xx): Uses an (n - 1)-order Newton +% interpolating polynomial based on n data points (x, y) +% to determine a value of the dependent variable (yint) +% at a given value of the independent variable, xx. +% input: +% x = independent variable +% y = dependent variable +% xx = value of independent variable at which +% interpolation is calculated +% output: +% yint = interpolated value of dependent variable + +% compute the finite divided differences in the form of a +% difference table +n = length(x); +if length(y)~=n, error('x and y must be same length'); end +b = zeros(n,n); +% assign dependent variables to the first column of b. +b(:,1) = y(:); % the (:) ensures that y is a column vector. +for j = 2:n + for i = 1:n-j+1 + b(i,j) = (b(i+1,j-1)-b(i,j-1))/(x(i+j-1)-x(i)); + end +end +%b +% use the finite divided differences to interpolate +xt = 1; +yint = b(1,1); +for j = 1:n-1 + xt = xt*(xx-x(j)); + yint = yint+b(1,j+1)*xt; +end diff --git a/lecture_19/lecture 19.ipynb b/lecture_19/lecture 19.ipynb new file mode 100644 index 0000000..fde5c6e --- /dev/null +++ b/lecture_19/lecture 19.ipynb @@ -0,0 +1,1842 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questions from last class\n", + "\n", + "![q1](q1.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![q2](q2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a =\n", + "\n", + " 1.04210\n", + " 8.19609\n", + " 0.50283\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% for linear regression\n", + "x=linspace(0,20)';\n", + "y=x.^2 +10*exp(-2*x)+0.5*sinh(x/2)+rand(size(x))*200-100;\n", + "Z=[x.^2 exp(-2*x) sinh(x/2)];\n", + "a=Z\\y\n", + "\n", + "plot(x,y,'o',x,a(1)*x.^2+a(2)*exp(-2*x)+a(3)*sinh(x/2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![q3](q3.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![q4](q4.png)\n", + "\n", + "# Answer: It depends\n", + "\n", + "#### Other:\n", + "\n", + "Twice the amount of points needed\n", + "\n", + "depends on what order polynomial it is and how far the data needs to be extrapolated \n", + "\n", + "As man you as possible \n", + "\n", + "Never extrapolate unless linear interpolation.\n", + "\n", + "You shouldn't. 2 if the linear is a good fit for the region, and you absolutely have to.\n", + "\n", + "Wait can you do that?\n", + "\n", + "Don't use extrapolation\n", + "\n", + "do not extrapolate\n", + "\n", + "As many data points as you have\n", + "\n", + "the more the better so that the best polynomial can be made through the data points\n", + "\n", + "Twice the amount of points needed" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questions from you\n", + "\n", + "- when will the project assignment be finalized? Also do you pronounce it \"jiff\" or \"gif\"?\n", + "\n", + "- If blue is red and red is blue, then what is purple? \n", + "\n", + "- How do we open the .ipynb lecture files? Or will the lectures continue to be also saved in pdf (last few have not).\n", + "\n", + "- When will we be put on teams for the final project?\n", + "\n", + "- What is the grading rubric for the project?\n", + "\n", + "- How to sync repository with files from laptop like hw without using Github desktop \n", + "\n", + "- Are there any upcoming deadlines for the project?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Splines (Brief introduction before integrals)\n", + "\n", + "Following interpolation discussion, instead of estimating 9 data points with an eighth-order polynomial, it makes more sense to fit sections of the curve to lower-order polynomials:\n", + "\n", + "0. zeroth-order (nearest neighbor)\n", + "\n", + "1. first-order (linear interpolation)\n", + "\n", + "2. third-order (cubic interpolation)\n", + "\n", + "Matlab and Octave have built-in functions for 1D and 2D interpolation:\n", + "\n", + "`interp1`\n", + "\n", + "`interp2`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'interp1' is a function from the file /usr/share/octave/4.0.0/m/general/interp1.m\n", + "\n", + " -- Function File: YI = interp1 (X, Y, XI)\n", + " -- Function File: YI = interp1 (Y, XI)\n", + " -- Function File: YI = interp1 (..., METHOD)\n", + " -- Function File: YI = interp1 (..., EXTRAP)\n", + " -- Function File: YI = interp1 (..., \"left\")\n", + " -- Function File: YI = interp1 (..., \"right\")\n", + " -- Function File: PP = interp1 (..., \"pp\")\n", + "\n", + " One-dimensional interpolation.\n", + "\n", + " Interpolate input data to determine the value of YI at the points\n", + " XI. If not specified, X is taken to be the indices of Y ('1:length\n", + " (Y)'). If Y is a matrix or an N-dimensional array, the\n", + " interpolation is performed on each column of Y.\n", + "\n", + " The interpolation METHOD is one of:\n", + "\n", + " \"nearest\"\n", + " Return the nearest neighbor.\n", + "\n", + " \"previous\"\n", + " Return the previous neighbor.\n", + "\n", + " \"next\"\n", + " Return the next neighbor.\n", + "\n", + " \"linear\" (default)\n", + " Linear interpolation from nearest neighbors.\n", + "\n", + " \"pchip\"\n", + " Piecewise cubic Hermite interpolating\n", + " polynomial--shape-preserving interpolation with smooth first\n", + " derivative.\n", + "\n", + " \"cubic\"\n", + " Cubic interpolation (same as \"pchip\").\n", + "\n", + " \"spline\"\n", + " Cubic spline interpolation--smooth first and second\n", + " derivatives throughout the curve.\n", + "\n", + " Adding '*' to the start of any method above forces 'interp1' to\n", + " assume that X is uniformly spaced, and only 'X(1)' and 'X(2)' are\n", + " referenced. This is usually faster, and is never slower. The\n", + " default method is \"linear\".\n", + "\n", + " If EXTRAP is the string \"extrap\", then extrapolate values beyond\n", + " the endpoints using the current METHOD. If EXTRAP is a number,\n", + " then replace values beyond the endpoints with that number. When\n", + " unspecified, EXTRAP defaults to 'NA'.\n", + "\n", + " If the string argument \"pp\" is specified, then XI should not be\n", + " supplied and 'interp1' returns a piecewise polynomial object. This\n", + " object can later be used with 'ppval' to evaluate the\n", + " interpolation. There is an equivalence, such that 'ppval (interp1\n", + " (X, Y, METHOD, \"pp\"), XI) == interp1 (X, Y, XI, METHOD, \"extrap\")'.\n", + "\n", + " Duplicate points in X specify a discontinuous interpolant. There\n", + " may be at most 2 consecutive points with the same value. If X is\n", + " increasing, the default discontinuous interpolant is\n", + " right-continuous. If X is decreasing, the default discontinuous\n", + " interpolant is left-continuous. The continuity condition of the\n", + " interpolant may be specified by using the options \"left\" or \"right\"\n", + " to select a left-continuous or right-continuous interpolant,\n", + " respectively. Discontinuous interpolation is only allowed for\n", + " \"nearest\" and \"linear\" methods; in all other cases, the X-values\n", + " must be unique.\n", + "\n", + " An example of the use of 'interp1' is\n", + "\n", + " xf = [0:0.05:10];\n", + " yf = sin (2*pi*xf/5);\n", + " xp = [0:10];\n", + " yp = sin (2*pi*xp/5);\n", + " lin = interp1 (xp, yp, xf);\n", + " near = interp1 (xp, yp, xf, \"nearest\");\n", + " pch = interp1 (xp, yp, xf, \"pchip\");\n", + " spl = interp1 (xp, yp, xf, \"spline\");\n", + " plot (xf,yf,\"r\", xf,near,\"g\", xf,lin,\"b\", xf,pch,\"c\", xf,spl,\"m\",\n", + " xp,yp,\"r*\");\n", + " legend (\"original\", \"nearest\", \"linear\", \"pchip\", \"spline\");\n", + "\n", + " See also: pchip, spline, interpft, interp2, interp3, interpn.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help interp1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'interp2' is a function from the file /usr/share/octave/4.0.0/m/general/interp2.m\n", + "\n", + " -- Function File: ZI = interp2 (X, Y, Z, XI, YI)\n", + " -- Function File: ZI = interp2 (Z, XI, YI)\n", + " -- Function File: ZI = interp2 (Z, N)\n", + " -- Function File: ZI = interp2 (Z)\n", + " -- Function File: ZI = interp2 (..., METHOD)\n", + " -- Function File: ZI = interp2 (..., METHOD, EXTRAP)\n", + "\n", + " Two-dimensional interpolation.\n", + "\n", + " Interpolate reference data X, Y, Z to determine ZI at the\n", + " coordinates XI, YI. The reference data X, Y can be matrices, as\n", + " returned by 'meshgrid', in which case the sizes of X, Y, and Z must\n", + " be equal. If X, Y are vectors describing a grid then 'length (X)\n", + " == columns (Z)' and 'length (Y) == rows (Z)'. In either case the\n", + " input data must be strictly monotonic.\n", + "\n", + " If called without X, Y, and just a single reference data matrix Z,\n", + " the 2-D region 'X = 1:columns (Z), Y = 1:rows (Z)' is assumed.\n", + " This saves memory if the grid is regular and the distance between\n", + " points is not important.\n", + "\n", + " If called with a single reference data matrix Z and a refinement\n", + " value N, then perform interpolation over a grid where each original\n", + " interval has been recursively subdivided N times. This results in\n", + " '2^N-1' additional points for every interval in the original grid.\n", + " If N is omitted a value of 1 is used. As an example, the interval\n", + " [0,1] with 'N==2' results in a refined interval with points at [0,\n", + " 1/4, 1/2, 3/4, 1].\n", + "\n", + " The interpolation METHOD is one of:\n", + "\n", + " \"nearest\"\n", + " Return the nearest neighbor.\n", + "\n", + " \"linear\" (default)\n", + " Linear interpolation from nearest neighbors.\n", + "\n", + " \"pchip\"\n", + " Piecewise cubic Hermite interpolating\n", + " polynomial--shape-preserving interpolation with smooth first\n", + " derivative.\n", + "\n", + " \"cubic\"\n", + " Cubic interpolation (same as \"pchip\").\n", + "\n", + " \"spline\"\n", + " Cubic spline interpolation--smooth first and second\n", + " derivatives throughout the curve.\n", + "\n", + " EXTRAP is a scalar number. It replaces values beyond the endpoints\n", + " with EXTRAP. Note that if EXTRAPVAL is used, METHOD must be\n", + " specified as well. If EXTRAP is omitted and the METHOD is\n", + " \"spline\", then the extrapolated values of the \"spline\" are used.\n", + " Otherwise the default EXTRAP value for any other METHOD is \"NA\".\n", + "\n", + " See also: interp1, interp3, interpn, meshgrid.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help interp2" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tlinear\n", + "\n", + "\t\n", + "\t\tlinear\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tcubic spline\n", + "\n", + "\t\n", + "\t\tcubic spline\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tpiecewise cubic\n", + "\n", + "\t\n", + "\t\tpiecewise cubic\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(-pi,pi,9);\n", + "xi=linspace(-pi,pi,100);\n", + "y=sin(x);\n", + "yi_lin=interp1(x,y,xi,'linear');\n", + "yi_spline=interp1(x,y,xi,'spline'); \n", + "yi_cubic=interp1(x,y,xi,'cubic');\n", + "plot(x,y,'o',xi,yi_lin,xi,yi_spline,xi,yi_cubic)\n", + "axis([-pi,pi,-1.5,1.5])\n", + "legend('data','linear','cubic spline','piecewise cubic','Location','NorthWest')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example: Accelerate then hold velocity\n", + "\n", + "Test driving a car, the accelerator is pressed, then released, then pressed again for 20-second intervals, until speed is 120 mph. Here the time is given as vector t in seconds and the velocity is in mph. " + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t140\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tv (mph)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tt (s)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tdata\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tdata\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tremoved data point\n", + "\n", + "\t\n", + "\t\tremoved data point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tlinear\n", + "\n", + "\t\n", + "\t\tlinear\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tcubic spline\n", + "\n", + "\t\n", + "\t\tcubic spline\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tpiecewise cubic\n", + "\n", + "\t\n", + "\t\tpiecewise cubic\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t=[0 20 40 68 80 84 96 104 110]';\n", + "v=[0 20 20 80 80 100 100 125 125]';\n", + "tt=linspace(0,110)';\n", + "v_lin=interp1(t,v,tt);\n", + "v_spl=interp1(t,v,tt,'spline');\n", + "v_cub=interp1(t,v,tt,'cubic');\n", + "\n", + "plot(t,v,'o',56,38,'s',tt,v_lin,tt,v_spl,tt,v_cub)\n", + "xlabel('t (s)')\n", + "ylabel('v (mph)')\n", + "legend('data','removed data point','linear','cubic spline','piecewise cubic','Location','NorthWest')" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tdv/dt (mph/s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tt (s)\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tlinear\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tlinear\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tcubic spline\n", + "\n", + "\t\n", + "\t\tcubic spline\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tpiecewise cubic\n", + "\n", + "\t\n", + "\t\tpiecewise cubic\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t=[0 20 40 56 68 80 84 96 104 110]';\n", + "v=[0 20 20 38 80 80 100 100 125 125]';\n", + "tt=linspace(0,110)';\n", + "v_lin=interp1(t,v,tt);\n", + "v_spl=interp1(t,v,tt,'spline');\n", + "v_cub=interp1(t,v,tt,'cubic');\n", + "\n", + "\n", + "plot(tt(2:end),diff(v_lin)./diff(tt),tt(2:end),diff(v_spl)./diff(tt),tt(2:end),diff(v_cub)./diff(tt))\n", + "xlabel('t (s)')\n", + "ylabel('dv/dt (mph/s)')\n", + "legend('linear','cubic spline','piecewise cubic','Location','NorthWest')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Choose spline wisely\n", + "\n", + "For example of sin(x), not very important\n", + "\n", + "For stop-and-hold examples, the $C^{2}$-continuity should not be preserved. You don't need smooth curves.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numerical Integration\n", + "\n", + "A definite integral is defined by \n", + "\n", + "$I=\\int_{a}^{b}f(x)dx$\n", + "\n", + "To determine the mass of an object with varying density, you can perform a summation\n", + "\n", + "mass=$\\sum_{i=1}^{n}\\rho_{i}\\Delta V_{i}$\n", + "\n", + "or taking the limit as $\\Delta V \\rightarrow dV=dxdydz$\n", + "\n", + "mass=$\\int_{0}^{h}\\int_{0}^{w}\\int_{0}^{l}\\rho(x,y,z)dxdydz$\n", + "\n", + "## Newton-Cotes Formulas\n", + "\n", + "$I=\\int_{a}^{b}f(x)dx=\\int_{a}^{b}f_{n}(x)dx$\n", + "\n", + "where $f_{n}$ is an n$^{th}$-order polynomial approximation of f(x)\n", + "\n", + "## First-Order: Trapezoidal Rule\n", + "\n", + "$I=\\int_{a}^{b}f(x)dx\\approx \\int_{a}^{b}\\left(f(a)+\\frac{f(b)-f(a)}{b-a}(x-a)\\right)dx$\n", + "\n", + "$I\\approx(b-a)\\frac{f(a)+f(b)}{2}$" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I_trap = 0.78540\n", + "I_act = 1.00000\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(0,pi)';\n", + "plot(x,sin(x),[0,pi/2],sin([0,pi/2]))\n", + "I_trap=mean(sin(([0,pi/2]))*(diff([0,pi/2])))\n", + "I_act = -(cos(pi/2)-cos(0))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Improve estimate with more points\n", + "\n", + "$I=\\int_{a}^{b}f(x)dx=\\int_{a}^{a+\\Delta x}f(x)dx+\\int_{a+\\Delta x}^{a+2\\Delta x}f(x)dx+ \\cdots \\int_{b-\\Delta x}^{b}f(x)dx$\n", + "\n", + "$I\\approx\\Delta x\\frac{f(a)+f(a+\\Delta x)}{2}+\\Delta x\\frac{f(a+\\Delta x)+f(a+2\\Delta x)}{2}\n", + "+\\cdots \\Delta x\\frac{f(b-\\Delta x)+f(b)}{2}$\n", + "\n", + "$I\\approx \\frac{\\Delta x}{2}\\left(f(a)+2\\sum_{i=1}^{n-1}f(a+i\\Delta x) +f(b)\\right)$" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For 70 steps\n", + "trapezoid approximation of integral is 0.99 \n", + " actual integral is 1.00\n" + ] + } + ], + "source": [ + "N=70;\n", + "I_trap=trap(@(x) sin(x),0,pi/2,N);\n", + "fprintf('For %i steps\\ntrapezoid approximation of integral is %1.2f \\n actual integral is %1.2f',N,I_trap,I_act)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(0,pi);\n", + "plot(x,sin(x),linspace(0,pi/2,N),sin(linspace(0,pi/2,N)),'-o')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Increase accuracy = Increase polynomial order\n", + "\n", + "### Simpson's Rules\n", + "\n", + "When integrating f(x) and using a second order polynomial, this is known as **Simpson's 1/3 Rule**\n", + "\n", + "$I=\\frac{h}{3}(f(x_{0})+4f(x_{1})+f(x_{2}))$\n", + "\n", + "where a=$x_{0}$, b=$x_{2}$, and $x_{1}=\\frac{a+b}{2}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This can be used with n=3 or multiples of 2 intervals\n", + "\n", + "$I=\\int_{x_{0}}^{x_{2}}f(x)dx+\\int_{x_{2}}^{x_{4}}f(x)dx+\\cdots +\\int_{x_{n-2}}^{x_{n}}f(x)dx$\n", + "\n", + "$I=(b-a)\\frac{f(x_{0})+4\\sum_{i=1,3,5}^{n-1}f(x_{i})+2\\sum_{i=2,4,6}^{n-2}f(x_{i})+f(x_{n})}{3n}$" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1.6235\n", + "Is_1_3 = 1.0023\n" + ] + } + ], + "source": [ + "f=@(x) 0.2+25*x-200*x.^2+675*x.^3-900*x.^4+400*x.^5;\n", + "simpson3(f,0,0.8,4)\n", + "Is_1_3=simpson3(@(x) sin(x),0,pi/2,2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## General Newton-Cotes formulae\n", + "\n", + "![Newton-Cotes Table](newton_cotes.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_19/newton_cotes.png b/lecture_19/newton_cotes.png new file mode 100644 index 0000000..b734d11 Binary files /dev/null and b/lecture_19/newton_cotes.png differ diff --git a/lecture_19/octave-workspace b/lecture_19/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_19/octave-workspace differ diff --git a/lecture_19/q1.png b/lecture_19/q1.png new file mode 100644 index 0000000..44ec9da Binary files /dev/null and b/lecture_19/q1.png differ diff --git a/lecture_19/q2.png b/lecture_19/q2.png new file mode 100644 index 0000000..fb27a54 Binary files /dev/null and b/lecture_19/q2.png differ diff --git a/lecture_19/q3.png b/lecture_19/q3.png new file mode 100644 index 0000000..62c4402 Binary files /dev/null and b/lecture_19/q3.png differ diff --git a/lecture_19/q4.png b/lecture_19/q4.png new file mode 100644 index 0000000..5457483 Binary files /dev/null and b/lecture_19/q4.png differ diff --git a/lecture_19/simpson3.m b/lecture_19/simpson3.m new file mode 100644 index 0000000..2ae0c81 --- /dev/null +++ b/lecture_19/simpson3.m @@ -0,0 +1,23 @@ +function I = simpson3(func,a,b,n,varargin) +% simpson3: composite simpson's 1/3 rule +% I = simpson3(func,a,b,n,pl,p2,...): +% composite trapezoidal rule +% input: +% func = name of function to be integrated +% a, b = integration limits +% n = number of segments (default = 100) +% pl,p2,... = additional parameters used by func +% output: +% I = integral estimate +if nargin<3,error('at least 3 input arguments required'),end +if ~(b>a),error('upper bound must be greater than lower'),end +if nargin<4|isempty(n),n=100;end +x = a; h = (b - a)/n; + +xvals=linspace(a,b,n+1); +fvals=func(xvals,varargin{:}); +s=fvals(1); +s = s + 4*sum(fvals(2:2:end-1)); +s = s + 2*sum(fvals(3:2:end-2)); +s = s + fvals(end); +I = (b - a) * s/(3*n); diff --git a/lecture_19/trap.m b/lecture_19/trap.m new file mode 100644 index 0000000..85b8685 --- /dev/null +++ b/lecture_19/trap.m @@ -0,0 +1,22 @@ +function I = trap(func,a,b,n,varargin) +% trap: composite trapezoidal rule quadrature +% I = trap(func,a,b,n,pl,p2,...): +% composite trapezoidal rule +% input: +% func = name of function to be integrated +% a, b = integration limits +% n = number of segments (default = 100) +% pl,p2,... = additional parameters used by func +% output: +% I = integral estimate +if nargin<3,error('at least 3 input arguments required'),end +if ~(b>a),error('upper bound must be greater than lower'),end +if nargin<4|isempty(n),n=100;end + +x = a; h = (b - a)/n; +xvals=linspace(a,b,n); +fvals=func(xvals,varargin{:}); +s=func(a,varargin{:}); +s = s + 2*sum(fvals(2:n-1)); +s = s + func(b,varargin{:}); +I = (b - a) * s/(2*n); diff --git a/lecture_20/.ipynb_checkpoints/lecture_20-checkpoint.ipynb b/lecture_20/.ipynb_checkpoints/lecture_20-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_20/.ipynb_checkpoints/lecture_20-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_20/gauss_weights.png b/lecture_20/gauss_weights.png new file mode 100644 index 0000000..9e3f29d Binary files /dev/null and b/lecture_20/gauss_weights.png differ diff --git a/lecture_20/lecture_20.ipynb b/lecture_20/lecture_20.ipynb new file mode 100644 index 0000000..da8c4ac --- /dev/null +++ b/lecture_20/lecture_20.ipynb @@ -0,0 +1,2192 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Questions from last class\n", + "\n", + "The interp2 function uses splines to interpolate between data points. What are three options for interpolation:\n", + "\n", + "- cubic spline\n", + "\n", + "- piecewise cubic spline\n", + "\n", + "- linear spline\n", + "\n", + "- quadratic spline\n", + "\n", + "- fourth-order spline\n", + "\n", + "![q1](q1.png)\n", + "\n", + "Numerical integration is a general application of the Newton-Cotes formulas. What is the first order approximation of the Newton-Cotes formula? *\n", + "\n", + "- trapezoidal rule\n", + "\n", + "- Simpson's 1/3 rule\n", + "\n", + "- Simpson's 3/8 rule\n", + "\n", + "- linear approximation of integral\n", + "\n", + "- constant approximation of integral (sum(f(x)*dx))\n", + "\n", + "![q2](q2.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Questions from you\n", + "\n", + "- Is spring here to stay?\n", + " \n", + " - [Punsxatawney Phil](http://www.groundhog.org/)\n", + "\n", + "- The time is now.\n", + "\n", + "- Final Project Sheet?\n", + " \n", + " - coming this evening/tomorrow\n", + "\n", + "- can you provide some sort of hw answer key?\n", + " \n", + " - we can go through some of the HW \n", + "\n", + "- What's the most 1337 thing you've ever done?\n", + "\n", + " - sorry, I'm n00b to this\n", + "\n", + "- Can we do out more examples by hand (doc cam or drawing on computer notepad) instead of with pre-written code?\n", + "\n", + " - forthcoming\n", + "\n", + "- Favorite movie?\n", + " \n", + " - Big Lebowski\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Integrals in practice\n", + "\n", + "### Example: Compare toughness of Stainless steel to Structural steel\n", + "\n", + "![Stress-strain plot of steel](steel_psi.jpg)\n", + "\n", + "### Step 1 - G3Data to get points \n", + "\n", + "Use the plot shown to determine the toughness of stainless steel and the toughness of structural steel.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "toughness of structural steel is 10.2 psi\n", + "toughness of stainless steel is 18.6 psi\n" + ] + } + ], + "source": [ + "fe_c=load('structural_steel_psi.jpg.dat');\n", + "fe_cr =load('stainless_steel_psi.jpg.dat');\n", + "\n", + "fe_c_toughness=trapz(fe_c(:,1),fe_c(:,2));\n", + "fe_cr_toughness=trapz(fe_cr(:,1),fe_cr(:,2));\n", + "\n", + "fprintf('toughness of structural steel is %1.1f psi\\n',fe_c_toughness)\n", + "fprintf('toughness of stainless steel is %1.1f psi',fe_cr_toughness)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gauss Quadrature (for functions)\n", + "\n", + "Evaluating an integral, we assumed a polynomial form for each Newton-Cotes approximation.\n", + "\n", + "If we can evaluate the function at any point, it makes more sense to choose points more wisely rather than just using endpoints\n", + "\n", + "![trapezoidal example](trap_example.png)\n", + "\n", + "Let us set up two unknown constants, $c_{0}$ and $x_{0}$ and determine a *wise* place to evaluate f(x) such that \n", + "\n", + "$I=c_{0}f(x_{0})$\n", + "\n", + "and I is exact for polynomial of n=0, 1\n", + "\n", + "$\\int_{a}^{b}1dx=b-a=c_{0}$\n", + "\n", + "$\\int_{a}^{b}xdx=\\frac{b^2-a^2}{2}=c_{0}x_{0}$\n", + "\n", + "so $c_{0}=b-a$ and $x_{0}=\\frac{b+a}{2}$\n", + "\n", + "$I=\\int_{a}^{b}f(x)dx \\approx (b-a)f\\left(\\frac{b+a}{2}\\right)$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f1 =\n", + "\n", + "@(x) x + 1\n", + "\n", + "f2 =\n", + "\n", + "@(x) 1 / 2 * x .^ 2 + x + 1\n", + "\n", + "f3 =\n", + "\n", + "@(x) 1 / 6 * x .^ 3 + 1 / 2 * x .^ 2 + x\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1500\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f1=@(x) x+1\n", + "f2=@(x) 1/2*x.^2+x+1\n", + "f3=@(x) 1/6*x.^3+1/2*x.^2+x\n", + "plot(linspace(-18,18),f3(linspace(-18,18)))" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "integral of f1 from 2 to 3 = 3.500000\n", + "integral of f1 from 2 to 3 ~ 3.500000\n", + "integral of f2 from 2 to 3 = 6.666667\n", + "integral of f2 from 2 to 3 ~ 6.625000\n" + ] + } + ], + "source": [ + "fprintf('integral of f1 from 2 to 3 = %f',f2(3)-f2(2))\n", + "fprintf('integral of f1 from 2 to 3 ~ %f',(3-2)*f1(3/2+2/2))\n", + "\n", + "fprintf('integral of f2 from 2 to 3 = %f',f3(3)-f3(2))\n", + "fprintf('integral of f2 from 2 to 3 ~ %f',(3-2)*f2(3/2+2/2))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This process is called **Gauss Quadrature**. Usually, the bounds are fixed at -1 and 1 instead of a and b\n", + "\n", + "$I=c_{0}f(x_{0})$\n", + "\n", + "and I is exact for polynomial of n=0, 1\n", + "\n", + "$\\int_{-1}^{1}1dx=b-a=c_{0}$\n", + "\n", + "$\\int_{-1}^{1}xdx=\\frac{1^2-(-1)^2}{2}=c_{0}x_{0}$\n", + "\n", + "so $c_{0}=2$ and $x_{0}=0$\n", + "\n", + "$I=\\int_{-1}^{1}f(x)dx \\approx 2f\\left(0\\right)$\n", + "\n", + "Now, integrals can be performed with a change of variable\n", + "\n", + "a=2\n", + "\n", + "b=3\n", + "\n", + "x= 2 to 3\n", + "\n", + "or $x_{d}=$ -1 to 1\n", + "\n", + "$x=a_{1}+a_{2}x_{d}$\n", + "\n", + "at $x_{d}=-1$, x=a\n", + "\n", + "at $x_{d}=1$, x=b\n", + "\n", + "so \n", + "\n", + "$x=\\frac{(b+a) +(b-a)x_{d}}{2}$\n", + "\n", + "$dx=\\frac{b-a}{2}dx_{d}$\n", + "\n", + "$\\int_{2}^{3}x+1dx=\\int_{-1}^{1}\\left(\\frac{(2+3) +(3-2)x_{d}}{2}\n", + "+1\\right)\n", + "\\frac{3-2}{2}dx_{d}$\n", + "\n", + "$\\int_{2}^{3}x+1dx=\\int_{-1}^{1}\\left(\\frac{5 +x_{d}}{2}\n", + "+1\\right)\n", + "\\frac{3-2}{2}dx_{d}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$\\int_{2}^{3}x+1dx=\\int_{-1}^{1}\\left(\\frac{7}{4}+\\frac{1}{4}x_{d}\\right)dx_{d}=2\\frac{7}{4}=3.5$" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "function I=gauss_1pt(func,a,b)\n", + " % Gauss quadrature using single point\n", + " % exact for n<1 polynomials\n", + " c0=2;\n", + " xd=0;\n", + " dx=(b-a)/2;\n", + " x=(b+a)/2+(b-a)/2*xd;\n", + " I=func(x).*dx*c0;\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 6.6250\r\n" + ] + } + ], + "source": [ + "gauss_1pt(f2,2,3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## General Gauss weights and points\n", + "\n", + "![Gauss quadrature table](gauss_weights.png)\n", + "\n", + "### If you need to evaluate an integral, to increase accuracy, increase number of Gauss points\n", + "\n", + "### Adaptive Quadrature\n", + "\n", + "Matlab/Octave built-in functions use two types of adaptive quadrature to increase accuracy of integrals of functions. \n", + "\n", + "1. `quad`: Simpson quadrature good for nonsmooth functions\n", + "\n", + "2. `quadl`: Lobatto quadrature good for smooth functions\n", + "\n", + "```matlab\n", + "q = quad(fun, a, b, tol, trace, p1, p2, …)\n", + "fun : function to be integrates\n", + "a, b: integration bounds\n", + "tol: desired absolute tolerance (default: 10-6)\n", + "trace: flag to display details or not\n", + "p1, p2, …: extra parameters for fun\n", + "quadl has the same arguments\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 6.6667\n", + "ans = 6.6667\n", + "ans = 6.6667\n", + "f_c =\n", + "\n", + "@(x) cosh (x / 30) + exp (-10 * x) .* erf (x)\n", + "\n", + "ans = 2.0048\n", + "ans = 2.0048\n" + ] + } + ], + "source": [ + "% integral of quadratic\n", + "quad(f2,2,3)\n", + "quadl(f2,2,3)\n", + "f3(3)-f3(2)\n", + "f_c=@(x) cosh(x/30)+exp(-10*x).*erf(x)\n", + "\n", + "quad(f_c,1,3)\n", + "quadl(f_c,1,3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numerical Differentiation\n", + "\n", + "Expanding the Taylor Series:\n", + "\n", + "$f(x_{i+1})=f(x_{i})+f'(x_{i})h+\\frac{f''(x_{i})}{2!}h^2+\\cdots$" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tLow noise in sin wave\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(-pi,pi);\n", + "y_smooth=sin(x);\n", + "y_noise =y_smooth+rand(size(x))*0.1-0.05;\n", + "plot(x,y_smooth,x,y_noise)\n", + "title('Low noise in sin wave')" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tNoise Amplified with derivative\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% Central Difference derivative\n", + "\n", + "dy_smooth=zeros(size(x));\n", + "dy_smooth([1,end])=NaN;\n", + "dy_smooth(2:end-1)=(y_smooth(3:end)-y_smooth(1:end-2))/2/(x(2)-x(1));\n", + "\n", + "dy_noise=zeros(size(x));\n", + "dy_noise([1,end])=NaN;\n", + "dy_noise(2:end-1)=(y_noise(3:end)-y_noise(1:end-2))/2/(x(2)-x(1));\n", + "\n", + "plot(x,dy_smooth,x,dy_noise)\n", + "title('Noise Amplified with derivative')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reduce noise\n", + "\n", + "Options:\n", + "\n", + "1. Fit a function and take derivative\n", + " \n", + " a. splines won't help much\n", + " \n", + " b. best fit curve (better)\n", + " \n", + "2. Smooth data (does not matter if you smooth before/after derivative)" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tderiv of spline\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tderiv of spline\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tno change\n", + "\n", + "\t\n", + "\t\tno change\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "y_spline_i1=interp1(x,y_noise,x+0.1);\n", + "y_spline_in1=interp1(x,y_noise,x-0.1);\n", + "dy_spline=(y_spline_i1-y_spline_in1)/0.2;\n", + "plot(x,dy_spline,x,dy_noise)\n", + "legend('deriv of spline','no change')" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a = 1.0007\r\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Z=[sin(x')];\n", + "a=Z\\y_noise'\n", + "plot(x,a*sin(x),x,y_noise)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(x,a*cos(x),x,dy_smooth,'o')" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 100\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% Smooth data\n", + "N=10; % average data between 10 points (forward/backward)\n", + "y_data=[y_noise(N/2:-1:1) y_noise y_noise(end:-1:end-N/2+1)];\n", + "y_filter=y_data;\n", + "for i=6:length(x)\n", + " y_filter(i)=mean(y_data(i-5:i+5));\n", + "end\n", + "y_filter=y_filter(N/2:end-N/2-1);\n", + "size(y_filter)\n", + "plot(x,y_filter,x,y_noise,'.')" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tNoise Amplified with derivative\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dy_filter=zeros(size(x));\n", + "dy_filter([1,end])=NaN;\n", + "dy_filter(2:end-1)=(y_filter(3:end)-y_filter(1:end-2))/2/(x(2)-x(1));\n", + "\n", + "plot(x,dy_smooth,x,dy_filter,x,dy_noise,'.')\n", + "title('Noise Amplified with derivative')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_20/octave-workspace b/lecture_20/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_20/octave-workspace differ diff --git a/lecture_20/q1.png b/lecture_20/q1.png new file mode 100644 index 0000000..749476d Binary files /dev/null and b/lecture_20/q1.png differ diff --git a/lecture_20/q2.png b/lecture_20/q2.png new file mode 100644 index 0000000..d61cecd Binary files /dev/null and b/lecture_20/q2.png differ diff --git a/lecture_20/stainless_steel_psi.jpg.dat b/lecture_20/stainless_steel_psi.jpg.dat new file mode 100644 index 0000000..dfa2a4a --- /dev/null +++ b/lecture_20/stainless_steel_psi.jpg.dat @@ -0,0 +1,12 @@ +1.0208494318e-05 1.6556901722 +0.00241601032192 33.1999376148 +0.00420249682757 53.9506164087 +0.00603492155765 82.1777412288 +0.00844582763241 114.552704897 +0.00959768607462 122.017666367 +0.0207793901842 141.840010208 +0.0369377352739 161.610673548 +0.0574942399989 177.181817537 +0.0774314294019 181.959392878 +0.100609815751 174.241771174 +0.117644389936 156.618719826 diff --git a/lecture_20/steel_psi.jpg b/lecture_20/steel_psi.jpg new file mode 100644 index 0000000..5781642 Binary files /dev/null and b/lecture_20/steel_psi.jpg differ diff --git a/lecture_20/structural_steel_psi.jpg.dat b/lecture_20/structural_steel_psi.jpg.dat new file mode 100644 index 0000000..10c9ade --- /dev/null +++ b/lecture_20/structural_steel_psi.jpg.dat @@ -0,0 +1,13 @@ +1.0208494318e-05 1.6556901722 +0.00180179924712 23.2370851913 +0.00242111456908 34.0306538399 +0.00298938741945 36.5170602372 +0.00410551613155 38.1670081313 +0.0113042060414 39.7537909669 +0.026807506079 42.9158720819 +0.0450807109082 46.8799580317 +0.063896667352 49.1768692533 +0.0937667217264 50.5282186886 +0.134122601181 48.4475999405 +0.194912483429 42.0009357786 +0.224198952211 38.3737301413 diff --git a/lecture_20/trap_example.png b/lecture_20/trap_example.png new file mode 100644 index 0000000..facc398 Binary files /dev/null and b/lecture_20/trap_example.png differ diff --git a/lecture_21/.ipynb_checkpoints/lecture_21-checkpoint.ipynb b/lecture_21/.ipynb_checkpoints/lecture_21-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_21/.ipynb_checkpoints/lecture_21-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_21/lecture_21.ipynb b/lecture_21/lecture_21.ipynb new file mode 100644 index 0000000..6d1701d --- /dev/null +++ b/lecture_21/lecture_21.ipynb @@ -0,0 +1,1173 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![q1](q1.png)\n", + "\n", + "![q2](q2.png)\n", + "\n", + "## Reduce Noise in derivative of data\n", + "\n", + "![reduce noise](reduce_noise.png)\n", + "\n", + "- Turn the volume down!\n", + "\n", + "- Use robust statistics like median and mean absolute deviation\n", + "\n", + "- Gauss quadrature\n", + "\n", + "- Put a filter on it\n", + "\n", + "- Take the average\n", + "\n", + "- Low-pass filter\n", + "\n", + "- Expand the Taylor series\n", + "\n", + "- Fit a function and derive that\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error: subscript indices must be either positive integers less than 2^31 or logicals\n", + "ans =\n", + "\n", + " 1 100\n", + "\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x=linspace(-pi,pi);\n", + "y_smooth=sin(x);\n", + "y_noise =y_smooth+rand(size(x))*0.1-0.05;\n", + "\n", + "% Smooth data\n", + "N=20; % average data between 10 points (forward/backward)\n", + "y_data=[y_noise(N/2:-1:1) y_noise y_noise(end:-1:end-N/2+1)];\n", + "y_filter=y_data;\n", + "for i=6:length(x)\n", + " y_filter(i)=mean(y_data(i-10:i));\n", + "end\n", + "y_filter=y_filter(N/2:end-N/2-1);\n", + "size(y_filter)\n", + "plot(x,y_filter,x,y_noise,'.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Homework Review\n", + "\n", + "### HW #4\n", + "\n", + "![collar mass](../HW4/collar_mass.png)\n", + "\n", + "$E_{total}=m x_C g\\sin(\\theta)+\\frac{K}{2}\\left(0.5 - \\sqrt{0.5^2+(0.5-x_C)^2}\\right)^{2}$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```matlab\n", + "% Define function ...\n", + "function collar_potential_energy(x,theta)\n", + " % function to evaluate E_total\n", + " Etotal = m*x*g.*sin(theta)+K/2*(0.5-sqrt(0.5^2+(0.5-x).^2);\n", + "end\n", + "\n", + "% solve for x\n", + "\n", + "x=goldmin(@(x) collar_potential_energy(x,theta),xl,xu)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## HW #5\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initial Value Problem\n", + "\n", + "## Euler's method\n", + "\n", + "$\\frac{dy}{dt}=f(t,y)$\n", + "\n", + "$y_{i+1}=y_{i}+f(t_{i},y_{i})h$\n", + "\n", + "The error of this method is:\n", + "\n", + "$E_{t}=\\frac{f'(t_i , y_i )}{2!}h^2 + \\cdots + O(h^{n+1})$\n", + "\n", + "or\n", + "\n", + "$E_{a}=O(h^2)$\n", + "\n", + "### Example: Freefalling problem\n", + "\n", + "An object is falling and has a drag coefficient of 0.25 kg/m and mass of 60 kg\n", + "Define time from 0 to 12 seconds with `N` timesteps \n", + "function defined as `freefall`\n", + "\n", + "Using the Euler ODE solution results in a conditionally stable solution *(at some point the time steps are too large to solve the problem)*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function [v_analytical,v_terminal,t]=freefall(N,tmax)\n", + " t=linspace(0,tmax,N)';\n", + " c=0.25; m=60; g=9.81; v_terminal=sqrt(m*g/c);\n", + "\n", + " v_analytical = v_terminal*tanh(g*t/v_terminal);\n", + " v_numerical=zeros(length(t),1);\n", + " delta_time =diff(t);\n", + " for i=1:length(t)-1\n", + " v_numerical(i+1)=v_numerical(i)+(g-c/m*v_numerical(i)^2)*delta_time(i);\n", + " end\n", + " % Print values near 0,2,4,6,8,10,12 seconds\n", + " indices = round(linspace(1,length(t),7));\n", + " fprintf('time (s)| error (m/s)\\n')\n", + " fprintf('-------------------------\\n')\n", + " M=[t(indices),abs(v_analytical(indices)-v_numerical(indices))];\n", + " fprintf('%7.1f | %10.2f\\n',M(:,1:2)');\n", + " plot(t,v_analytical,'-',t,v_numerical,'o-')\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time (s)| error (m/s)\n", + "-------------------------\n", + " 0.0 | 0.00\n", + " 1.7 | 0.64\n", + " 3.4 | 2.50\n", + " 6.9 | 3.12\n", + " 8.6 | 2.10\n", + " 10.3 | 1.23\n", + " 12.0 | 0.67\n", + "\n", + "O(h^2)=2.94\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t12\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[v_an,v_t,t]=freefall(8,12);\n", + "fprintf('\\nO(h^2)=%1.2f',min(diff(t).^2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Heun Method\n", + "\n", + "Increase accuracy with *predictor-corrector approach*\n", + "\n", + "$y_{i+1}=y_{i}^{m}+f(t_{i},y_{i})h$\n", + "\n", + "$y_{i+1}^{j}=y_{i}^{m}+\n", + "\\frac{f(t_{i},y_{i}^{m})+f(t_{i+1},y_{i+1}^{i-1})}{2}h$\n", + "\n", + "This is analagous to the trapezoidal rule\n", + "\n", + "$\\int_{t_{i}}^{t_{i+1}}f(t)dt=\\frac{f(t_{i})+f(t_{i+1})}{2}h$\n", + "\n", + "therefore the error is\n", + "\n", + "$E_{t}=\\frac{-f''(\\xi)}{12}h^3$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Example with Heun's method**\n", + "\n", + "Problem Statement. Use Heun’s method with iteration to integrate \n", + "\n", + "$y' = 4e^{0.8t} − 0.5y$\n", + "\n", + "from t = 0 to 4 with a step size of 1. The initial condition at t = 0 is y = 2. Employ a stopping criterion of 0.00001% to terminate the corrector iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dy =\n", + "\n", + " 3\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + "\n", + "y =\n", + "\n", + " 2\n", + " 5\n", + " 0\n", + " 0\n", + " 0\n", + "\n" + ] + } + ], + "source": [ + "yp=@(t,y) 4*exp(0.8*t)-0.5*y;\n", + "t=linspace(0,4,5)';\n", + "y=zeros(size(t));\n", + "dy=zeros(size(t));\n", + "dy_corr=zeros(size(t));\n", + "y(1)=2;\n", + "dy(1)=yp(t(1),y(1))\n", + "y(2)=y(1)+dy(1)*(t(2)-t(1))" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dy_corr =\n", + "\n", + " 4.70108\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "y =\n", + "\n", + " 2.00000\n", + " 6.70108\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n" + ] + } + ], + "source": [ + "% improve estimate for y(2)\n", + "dy_corr(1)=(dy(1)+yp(t(2),y(2)))/2\n", + "y(2)=y(1)+dy_corr(1)*(t(2)-t(1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This process can be iterated until a desired tolerance is achieved" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "n=0;\n", + "e=10;\n", + "while (1)\n", + " n=n+1;\n", + " yold=y(2);\n", + " dy_corr(1)=(dy(1)+yp(t(2),y(2)))/2;\n", + " y(2)=y(1)+dy_corr(1)*(t(2)-t(1));\n", + " e=abs(y(2)-yold)/y(2)*100;\n", + " if e<= 0.00001 | n>100, break, end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 2.00000\n", + " 6.36087\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "dy_corr =\n", + "\n", + " 4.36087\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "n = 12\n", + "e = 6.3760e-06\n" + ] + } + ], + "source": [ + "y\n", + "dy_corr\n", + "n\n", + "e" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y_an =\n", + "\n", + "@(t) 4 / 1.3 * exp (0.8 * t) - 1.0769 * exp (-t / 2)\n", + "\n", + "dy_an =\n", + "\n", + "@(t) 0.8 * 4 / 1.3 * exp (0.8 * t) + 1.0769 / 2 * exp (-t / 2)\n", + "\n" + ] + } + ], + "source": [ + "\n", + "y_euler=zeros(size(t));\n", + "for i=1:length(t)-1\n", + " y_euler(i+1)=y_euler(i)+dy(i)*(t(i+1)-t(i));\n", + "end\n", + "\n", + "y_an =@(t) 4/1.3*exp(0.8*t)-1.0769*exp(-t/2)\n", + "dy_an=@(t) 0.8*4/1.3*exp(0.8*t)+1.0769/2*exp(-t/2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "yp=@(t,y) 4*exp(0.8*t)-0.5*y;\n", + "t=linspace(0,4,5)';\n", + "y=zeros(size(t));\n", + "dy=zeros(size(t));\n", + "dy_corr=zeros(size(t));\n", + "y(1)=2;\n", + "for i=1:length(t)-1\n", + " dy(i)=yp(t(i),y(i));\n", + " dy_corr(i)=yp(t(i),y(i));\n", + " y(i+1)=y(i)+dy_corr(i)*(t(i+1)-t(i));\n", + " n=0;\n", + " e=10;\n", + " while (1)\n", + " n=n+1;\n", + " yold=y(i+1);\n", + " dy_corr(i)=(dy(i)+yp(t(i+1),y(i+1)))/2;\n", + " y(i+1)=y(i)+dy_corr(i)*(t(i+1)-t(i));\n", + " e=abs(y(i+1)-yold)/y(i+1)*100;\n", + " if e<= 0.00001 | n>100, break, end\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 2.0000\n", + " 6.3609\n", + " 15.3022\n", + " 34.7433\n", + " 77.7351\n", + "\n", + "ans =\n", + "\n", + " 2.0000\n", + " 6.1946\n", + " 14.8439\n", + " 33.6772\n", + " 75.3390\n", + "\n" + ] + } + ], + "source": [ + "y\n", + "y_an(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ty\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ttime\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tHeuns method\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tHeuns method\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tEuler\n", + "\n", + "\t\n", + "\t\tEuler\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tanalytical\n", + "\n", + "\t\n", + "\t\tanalytical\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(t,y,'o',t,y_euler,'s',linspace(min(t),max(t)),y_an(linspace(min(t),max(t))))\n", + "legend('Heuns method','Euler','analytical','Location','NorthWest')\n", + "xlabel('time')\n", + "ylabel('y')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_21/octave-workspace b/lecture_21/octave-workspace new file mode 100644 index 0000000..f2ecb23 Binary files /dev/null and b/lecture_21/octave-workspace differ diff --git a/lecture_21/q1.png b/lecture_21/q1.png new file mode 100644 index 0000000..3145b8d Binary files /dev/null and b/lecture_21/q1.png differ diff --git a/lecture_21/q2.png b/lecture_21/q2.png new file mode 100644 index 0000000..2def4d3 Binary files /dev/null and b/lecture_21/q2.png differ diff --git a/lecture_21/reduce_noise.png b/lecture_21/reduce_noise.png new file mode 100644 index 0000000..5a67ad5 Binary files /dev/null and b/lecture_21/reduce_noise.png differ diff --git a/lecture_22/.ipynb_checkpoints/lecture_22-checkpoint.ipynb b/lecture_22/.ipynb_checkpoints/lecture_22-checkpoint.ipynb new file mode 100644 index 0000000..8fdd6a6 --- /dev/null +++ b/lecture_22/.ipynb_checkpoints/lecture_22-checkpoint.ipynb @@ -0,0 +1,821 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![q1](q1.png)\n", + "\n", + "![q2](q2.png)\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initial Value Problem\n", + "\n", + "## Euler's method\n", + "\n", + "$\\frac{dy}{dt}=f(t,y)$\n", + "\n", + "$y_{i+1}=y_{i}+f(t_{i},y_{i})h$\n", + "\n", + "The error of this method is:\n", + "\n", + "$E_{t}=\\frac{f'(t_i , y_i )}{2!}h^2 + \\cdots + O(h^{n+1})$\n", + "\n", + "or\n", + "\n", + "$E_{a}=O(h^2)$\n", + "\n", + "### Example: Freefalling problem\n", + "\n", + "An object is falling and has a drag coefficient of 0.25 kg/m and mass of 60 kg\n", + "Define time from 0 to 12 seconds with `N` timesteps \n", + "function defined as `freefall`\n", + "\n", + "Using the Euler ODE solution results in a conditionally stable solution *(at some point the time steps are too large to solve the problem)*" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function [v_analytical,v_terminal,t]=freefall(N,tmax)\n", + " t=linspace(0,tmax,N)';\n", + " c=0.25; m=60; g=9.81; v_terminal=sqrt(m*g/c);\n", + "\n", + " v_analytical = v_terminal*tanh(g*t/v_terminal);\n", + " v_numerical=zeros(length(t),1);\n", + " delta_time =diff(t);\n", + " for i=1:length(t)-1\n", + " v_numerical(i+1)=v_numerical(i)+(g-c/m*v_numerical(i)^2)*delta_time(i);\n", + " end\n", + " % Print values near 0,2,4,6,8,10,12 seconds\n", + " indices = round(linspace(1,length(t),7));\n", + " fprintf('time (s)| error (m/s)\\n')\n", + " fprintf('-------------------------\\n')\n", + " M=[t(indices),abs(v_analytical(indices)-v_numerical(indices))];\n", + " fprintf('%7.1f | %10.2f\\n',M(:,1:2)');\n", + " plot(t,v_analytical,'-',t,v_numerical,'o-')\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time (s)| error (m/s)\n", + "-------------------------\n", + " 0.0 | 0.00\n", + " 7.1 | 26.67\n", + " 14.3 | 54.21\n", + " 28.6 | 33.62\n", + " 35.7 | 29.84\n", + " 42.9 | 82.85\n", + " 50.0 | 47.86\n", + "\n", + "O(h^2)=51.02\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[v_an,v_t,t]=freefall(8,50);\n", + "fprintf('\\nO(h^2)=%1.2f',min(diff(t).^2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Heun Method\n", + "\n", + "Increase accuracy with *predictor-corrector approach*\n", + "\n", + "$y_{i+1}=y_{i}^{m}+f(t_{i},y_{i})h$\n", + "\n", + "$y_{i+1}^{j}=y_{i}^{m}+\n", + "\\frac{f(t_{i},y_{i}^{m})+f(t_{i+1},y_{i+1}^{i-1})}{2}h$\n", + "\n", + "This is analagous to the trapezoidal rule\n", + "\n", + "$\\int_{t_{i}}^{t_{i+1}}f(t)dt=\\frac{f(t_{i})+f(t_{i+1})}{2}h$\n", + "\n", + "therefore the error is\n", + "\n", + "$E_{t}=\\frac{-f''(\\xi)}{12}h^3$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Example with Heun's method**\n", + "\n", + "Problem Statement. Use Heun’s method with iteration to integrate \n", + "\n", + "$y' = 4e^{0.8t} − 0.5y$\n", + "\n", + "from t = 0 to 4 with a step size of 1. The initial condition at t = 0 is y = 2. Employ a stopping criterion of 0.00001% to terminate the corrector iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dy =\n", + "\n", + " 3\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + "\n", + "y =\n", + "\n", + " 2\n", + " 5\n", + " 0\n", + " 0\n", + " 0\n", + "\n" + ] + } + ], + "source": [ + "yp=@(t,y) 4*exp(0.8*t)-0.5*y;\n", + "t=linspace(0,4,5)';\n", + "y=zeros(size(t));\n", + "dy=zeros(size(t));\n", + "dy_corr=zeros(size(t));\n", + "y(1)=2;\n", + "dy(1)=yp(t(1),y(1))\n", + "y(2)=y(1)+dy(1)*(t(2)-t(1))" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dy_corr =\n", + "\n", + " 4.70108\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "y =\n", + "\n", + " 2.00000\n", + " 6.70108\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n" + ] + } + ], + "source": [ + "% improve estimate for y(2)\n", + "dy_corr(1)=(dy(1)+yp(t(2),y(2)))/2\n", + "y(2)=y(1)+dy_corr(1)*(t(2)-t(1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This process can be iterated until a desired tolerance is achieved" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "n=0;\n", + "e=10;\n", + "while (1)\n", + " n=n+1;\n", + " yold=y(2);\n", + " dy_corr(1)=(dy(1)+yp(t(2),y(2)))/2;\n", + " y(2)=y(1)+dy_corr(1)*(t(2)-t(1));\n", + " e=abs(y(2)-yold)/y(2)*100;\n", + " if e<= 0.00001 | n>100, break, end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 2.00000\n", + " 6.36087\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "dy_corr =\n", + "\n", + " 4.36087\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "n = 12\n", + "e = 6.3760e-06\n" + ] + } + ], + "source": [ + "y\n", + "dy_corr\n", + "n\n", + "e" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y_an =\n", + "\n", + "@(t) 4 / 1.3 * exp (0.8 * t) - 1.0769 * exp (-t / 2)\n", + "\n", + "dy_an =\n", + "\n", + "@(t) 0.8 * 4 / 1.3 * exp (0.8 * t) + 1.0769 / 2 * exp (-t / 2)\n", + "\n" + ] + } + ], + "source": [ + "\n", + "y_euler=zeros(size(t));\n", + "for i=1:length(t)-1\n", + " y_euler(i+1)=y_euler(i)+dy(i)*(t(i+1)-t(i));\n", + "end\n", + "\n", + "y_an =@(t) 4/1.3*exp(0.8*t)-1.0769*exp(-t/2)\n", + "dy_an=@(t) 0.8*4/1.3*exp(0.8*t)+1.0769/2*exp(-t/2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "yp=@(t,y) 4*exp(0.8*t)-0.5*y;\n", + "t=linspace(0,4,5)';\n", + "y=zeros(size(t));\n", + "dy=zeros(size(t));\n", + "dy_corr=zeros(size(t));\n", + "y(1)=2;\n", + "for i=1:length(t)-1\n", + " dy(i)=yp(t(i),y(i));\n", + " dy_corr(i)=yp(t(i),y(i));\n", + " y(i+1)=y(i)+dy_corr(i)*(t(i+1)-t(i));\n", + " n=0;\n", + " e=10;\n", + " while (1)\n", + " n=n+1;\n", + " yold=y(i+1);\n", + " dy_corr(i)=(dy(i)+yp(t(i+1),y(i+1)))/2;\n", + " y(i+1)=y(i)+dy_corr(i)*(t(i+1)-t(i));\n", + " e=abs(y(i+1)-yold)/y(i+1)*100;\n", + " if e<= 0.00001 | n>100, break, end\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 2.0000\n", + " 6.3609\n", + " 15.3022\n", + " 34.7433\n", + " 77.7351\n", + "\n", + "ans =\n", + "\n", + " 2.0000\n", + " 6.1946\n", + " 14.8439\n", + " 33.6772\n", + " 75.3390\n", + "\n" + ] + } + ], + "source": [ + "y\n", + "y_an(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ty\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ttime\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tHeuns method\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tHeuns method\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tEuler\n", + "\n", + "\t\n", + "\t\tEuler\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tanalytical\n", + "\n", + "\t\n", + "\t\tanalytical\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(t,y,'o',t,y_euler,'s',linspace(min(t),max(t)),y_an(linspace(min(t),max(t))))\n", + "legend('Heuns method','Euler','analytical','Location','NorthWest')\n", + "xlabel('time')\n", + "ylabel('y')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Phugoid Oscillation example\n", + "\n", + "[phugoid lessons in python](" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_22/.ipynb_checkpoints/lecture_22_python-checkpoint.ipynb b/lecture_22/.ipynb_checkpoints/lecture_22_python-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_22/.ipynb_checkpoints/lecture_22_python-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_22/01_phugoid/.gitignore b/lecture_22/01_phugoid/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/lecture_22/01_phugoid/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/lecture_22/01_phugoid/.ipynb_checkpoints/01_01_Phugoid_Theory-checkpoint.ipynb b/lecture_22/01_phugoid/.ipynb_checkpoints/01_01_Phugoid_Theory-checkpoint.ipynb new file mode 100644 index 0000000..902854f --- /dev/null +++ b/lecture_22/01_phugoid/.ipynb_checkpoints/01_01_Phugoid_Theory-checkpoint.ipynb @@ -0,0 +1,764 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, C. Cooper, G.F. Forsyth, A. Krishnan." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Motion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome to [**\"Practical Numerical Methods with Python!\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about) This course is a collaborative, online, open education project, where we aim to give a foundation in scientific computing. The focus is on numerical solution of problems modeled by ordinary and partial differential equations.\n", + "\n", + "This IPython Notebook introduces the problem we'll be studying in the **first module** of the course: the _phugoid model of glider flight_. We'll start with some background, explaining the physics, and working out the mathematical model. \n", + "\n", + "First, we'll look at an idealized motion where there is no drag, resulting in a simple harmonic motion. We can plot some interesting trajectories that will pique your imagination. In the next notebook, you'll learn to numerically integrate the differential equation using Euler's method. But hang on ... first things first. \n", + "\n", + "The term \"phugoid\" is used in aeronautics to refer to a motion pattern where an aircraft oscillates up and down —nose-up and climb, then nose-down and descend— around an equilibrium trajectory. The aircraft oscillates in altitude, speed and pitch, with only small (neglected) variations in the angle of attack, as it repeatedly exchanges kinetic and potential energy.\n", + "\n", + "A low-amplitude phugoid motion can be just a nuisance, as the aircraft does not exceed the stall angle of attack and nothing bad happens. But the mode can also be unstable leading to a stall or even a loop!\n", + "\n", + "Look at this video showing a Cessna single-engine airplane in phugoid motion:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz\nODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj\nY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQED\nEQH/xAAaAAACAwEBAAAAAAAAAAAAAAACAwABBAUG/8QAQBAAAgIBAwEDCAgFBAIDAQEBAQIAAxEE\nEiExE0FRBRQiMmFxgZEjQlJTcpKhsRUzYsHRBkOC4SRjovDxNMIW/8QAGQEBAQEBAQEAAAAAAAAA\nAAAAAAECAwQF/8QAKBEBAAIBBAICAQQDAQAAAAAAAAERAgMSMVETIUFhBCJSgaEyYnEU/9oADAMB\nAAIRAxEAPwBlFdfYp9GnqjuEcKqvu0/KJKax2Nf4R+0PYRPpxEU8coKaj/tp8oa01/dp8oPIlhyI\nqCzeyr+6r/KJfY0/cp+UQFsEMWCZ2ra+yp+7T8oliuof7SflkyDB57o2wWaqUfdp+UQxXQf9tPyi\nZt57xJvPuk2ltfYUn/bT8ok7Cn7pPyiZO1Yd8IXtG0to7CodKk/KJDVWf9tPyiKF5MMOTJtLEtVQ\n/wBqv8olGmvORUn5RJuMm4xULYjXSRg1Jn8IgCmjPNSflEvcZecxUFgfT6furT8ok7Cnb/Lr/KIR\nJlFj4RSWUdPVn+Un5RJ2FQ/20/KIRfxEE2CWi1dnV91X+USdjT92n5RL3r3S+090UWX2NP3SflEr\nsqvu0/KI4FD1/SUwTuYy1BZRqq+6T8ogNp6T/tp+URpU9xEEhx3RUJZLaav7tPyiLOnr+7X5TTk+\nEHM0WzHTp92v5RKFNf3a/lmk+6TEIQKqe+tPkIxaqs/yk+Qh9lmEtWIqF9qFFP3afljFop+7T8ol\npXHKoHSZmlL83p7qk/KJR09XdUn5RNG2Q5EgStNXfWn5RD83p+6T8olk5lB8SUWIU1D/AGk/KIa1\n1fdJ+USltHfGKymSltBVV90n5RC7Kr7pPyiECJczRYOwp+6T8ok83q+6T8ohyRRYOwq+6T8ok7Cn\n7pPyiMzKigs0VfdJ+USjRT90n5RG5lEiKCeyo+6T8oldjV90n5RGnEA++WiwGqr7qv8AKJR09P3a\n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\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('ysdU4mnRYdM')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That doesn't look too good! What's happening? \n", + "\n", + "It can get a lot worse when an aircraft enters one of these modes that is unstable. For example, one of [NASA's Helios Solar Powered Aircraft](http://www.nasa.gov/centers/dryden/history/pastprojects/Helios/) prototype broke up in mid air due to extreme phugoid oscillations!\n", + "\n", + "Helios was a proof-of-concept solar electric-powered flying wing that broke the world altitude record for a non-rocket-powered aircraft in August 2001. But in June 26, 2003, it broke something else. The aircraft entered phugoid motion after encountering turbulence near the Hawaiian Island of Kauai. The high speed in the oscillatory movement exceeded the design limits, and it ended up wrecked in the Pacific Ocean. Luckily, the Helios was remotely operated, and nobody got hurt." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The physics of phugoids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The phugoid oscillation has the aircraft pitching up and down, as it decelerates and accelerates. The trajectory might look like a sinusoid, as in the figure below. The assumption is that the forward velocity of the aircraft, $v$, varies in such a way that the angle of attack remains (nearly) constant, which means that we can assume a constant lift coefficient." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/oscillatory_trajectory.png)\n", + "#### Figure 1. Trajectory of an aircraft in phugoid motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the descending portion of the trajectory, the aircraft's velocity increases as it proceeds from a peak to the minimum height—gaining kinetic energy at the expense of potential energy. The contrary happens in the upward segment, as its velocity decreases there.\n", + "\n", + "We measure the pitch angle (between the aircraft's longitudinal axis and the horizontal) as positive when the aircraft's nose is pointing up. In the portion of the trajectory below the center-line, where it curves upwards, the pitch angle $\\theta$ is increasing: $\\dot{\\theta}>0$. And where the trajectory curves down, the pitch angle is decreasing: $\\dot{\\theta}<0$, as shown in the figure.\n", + "\n", + "Let's remind ourselves of the forces affecting an aircraft in a downward glide. Look at the figure below: we show the flight path, the forces on the glider (no thrust), and the _glide angle_ or flight path angle, $\\gamma$, between the flight path and the horizontal." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces.png)\n", + "#### Figure 2. Forces on a glider." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The force of lift, $L$ —created by the airflow around the wings— is perpendicular to the trajectory, and the force of drag, $D$, is parallel to the trajectory. Both forces are expressed in terms of coefficients of lift and drag, $C_L$ and $C_D$, respectively, that depend on the wing design and _angle of attack_—the angle between the wing chord and the flight path.\n", + "\n", + "If you are not familiar with airplane aerodynamics, you might be getting confused with some terms here ... and all those angles! But be patient and look things up, if you need to. We're giving you a quick summary here.\n", + "\n", + "Lift and drag are proportional to a surface area, $S$, and the dynamic pressure: $1/2 \\rho v^2$, where $\\rho$ is the density of air, and $v$ the forward velocity of the aircraft. The equations for lift and drag are:\n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "If the glider were in equilibrium, the forces would balance each other. We can equate the forces in the directions perpendicular and parallel to the trajectory, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "L = W \\cos \\gamma \\quad \\text{and} \\quad D = W \\sin \\gamma\n", + "\\end{equation}$$\n", + "\n", + "where $W$ repesents the weight of the glider.\n", + "\n", + "In the figure, we've drawn the angle $\\gamma$ as the _glide angle_, formed between the direction of motion and the horizontal. We are not bothered with the _sign_ of the angle, because we draw a free-body diagram and take the direction of the forces into account in writing our balance equations. But later on, we will need to be careful with the sign of the angles. It can cause you a real headache to keep this straight, so be patient!\n", + "\n", + "It looks like we've set this up to do a little bit of mathematics. Are you ready?\n", + "\n", + "But before, a short glimpse of the history." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lanchester's Aerodonetics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Phugoid theory\" was first described by the British engineer Frederick W. Lanchester in _\"Aerodonetics\"_ (1909). This book is so old that it is now in the public domain, so you can actually download [from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&dq=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&pg=PA37#v=onepage&q=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&f=false) a PDF file of a scan, or read it online. \n", + "\n", + "Lanchester defines phugoid theory as the study of longitudinal stability of a flying machine (aerodone). He first considered the simplification where drag and moment of inertia are neglected. Then he included these effects, obtaining an equation of stability. In addition to describing many experiments by himself and others, Lanchester also reports on _\"numerical work ... done by the aid of an ordinary 25-cm slide rule.\"_ Go figure!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ideal case of zero drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we follow the derivation given by Milne-Thompson (1966), which we find a little bit easier than that of the original in \"Aerodonetics\"!\n", + "\n", + "An aircraft flying in a steady, straight horizontal flight has a lift equal to its weight. The velocity in this condition is sometimes called _trim velocity_ (\"trim\" is what pilots do to set the controls to just stay in a steady flight). Let's use $v_t$ for the trim velocity, and from $L=W$ deduce that:\n", + "\n", + "$$\\begin{equation}\n", + "W = C_L S \\times\\frac{1}{2} \\rho v_t^2\n", + "\\end{equation}$$\n", + "\n", + "The weight $W$ is constant for the aircraft, but the lift at any other flight condition depends on the flight speed, $v$. We can use the expression for the weight in terms of $v_t$ to obtain the ratio $L/W$ at any other flight velocity, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}= \\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "Imagine that the aircraft experienced a little upset, a wind gust, and it finds itself off the \"trim\" level, in a curved path with an instantaneous angle $\\theta$. In the sketch below, we exaggerate the curved trajectory of flight to help you visualize what we'll do next. The angle $\\theta$ (using the same name as Milne-Thompson) is between the _trajectory_ and the horizontal, positive up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "#### Figure 3. Curved trajectory of the aircraft going up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can form a free body diagram to determine the balance of forces. \n", + "\n", + "\n", + "\n", + "#### Figure 4. Free body diagram of the aircraft trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the free body diagram, we can see that\n", + "\n", + "\\begin{equation}\n", + "\\vec{L} + \\vec{W} = m\\vec{a} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "where $\\frac{v^2}{R}$ is the centripetal acceleration and $R$ is the radius of curvature of the trajectory.\n", + "If we decompose the lift and weight into their normal and tangential components we get\n", + "\n", + "\\begin{equation}\n", + "L\\hat{n} + W_n\\hat{n} + W_t\\hat{t} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "The component of the weight in the normal direction ($W_n$) is\n", + "\n", + "\\begin{equation}\n", + "W_n = -W \\cos \\theta\n", + "\\end{equation}\n", + "\n", + "If we then consider that all of the components in $\\hat{n}$ must balance out, we arrive at\n", + "\n", + "\\begin{equation}\n", + "L - W \\cos \\theta = \\frac{mv^2}{R}\n", + "\\end{equation}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can rewrite this as\n", + "\n", + "$$\\begin{equation}\n", + "L- W \\cos \\theta = \\frac{W}{g} \\frac{v^2}{R}\n", + "\\end{equation}$$\n", + "\n", + "where $g$ is the acceleration due to gravity. Rearrange this by dividing the equation by the weight, and use the expression we found for $L/W$, above. The following equation results:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{v^2}{v_t^2}-\\cos \\theta = \\frac{v^2}{g R}\n", + "\\end{equation}$$\n", + "\n", + "Recall that we simplified the problem assuming that there is no friction, which means that the total energy is constant (the lift does no work). If $z$ represents the depth below a reference horizontal line, the energy per unit mass is (kinetic plus potential energy):\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{2}v^2-g z = \\text{constant}\n", + "\\end{equation}$$\n", + "\n", + "To get rid of that pesky constant, we can choose the reference horizontal line at the level that makes the constant energy equal to zero, so $v^2 = 2 g z$. That helps us re-write the phugoid equation in terms of $z$ as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z}{z_t}-\\cos \\theta = \\frac{2z}{R}\n", + "\\end{equation}$$\n", + "\n", + "Let $ds$ represent a small arc-length of the trajectory. We can write \n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} \\quad \\text{and}\\quad \\sin\\theta = -\\frac{dz}{ds}\n", + "\\end{equation}$$\n", + "\n", + "Employing the chain rule of calculus,\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} = \\frac{dz}{ds}\\frac{d\\theta}{dz} = -\\sin \\theta\\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "Multiply the phugoid equation by $\\frac{1}{2\\sqrt{z}}$ to get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} - \\frac{\\cos\\theta}{2\\sqrt{z}} = \\frac{\\sqrt{z}}{R}\n", + "\\end{equation}$$\n", + "\n", + "Substituting for $1/R$ on the right hand side and bringing the cosine term over to the right, we get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} = \\frac{\\cos \\theta}{2 \\sqrt{z}} - \\sqrt{z} \\sin \\theta \\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "The right-hand-side is an exact derivative! We can rewrite it as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d}{dz} \\left(\\sqrt{z}\\cos\\theta \\right) = \\frac{\\sqrt{z}}{2z_t}\n", + "\\end{equation}$$\n", + "\n", + "Integrating this equation, we add an arbitrary constant, chosen as $C\\sqrt{z_t}$ which (after dividing through by $\\sqrt{z}$) gives:\n", + "\n", + "$$\\begin{equation}\n", + "\\cos \\theta = \\frac{1}{3}\\frac{z}{z_t} + C\\sqrt{\\frac{z_t}{z}}\n", + "\\end{equation}$$\n", + "\n", + "Taking the derivative of both sides of equation (15) and applying the relations from equation (10) yields:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z_t}{R} = \\frac{1}{3} - \\frac{C}{2}\\sqrt{\\frac{z_t^3}{z^3}}\n", + "\\end{equation}$$\n", + "\n", + "Make sure you have followed the derivation, and perhaps write it out on paper!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Phugoid Curves" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Equation (15) is non-linear, which usually means we are hard-pressed to write a clean expression for the variable of interest, $z$. In fact, Lanchester himself said that he was unable to _\"reduce this expression to a form suitable for co-ordinate plotting.\"_ If the great polymath couldn't do it, we can't either!\n", + "\n", + "But Lanchester _was_ able to plot a suitable approximation of the phugoid flight path using what he called the \"trammel\" method. If you're interested in seeing how he did it, his explanation begins on page [48 of Aerodonetics](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PA49&lpg=PA48&dq=aerodonetics+the+use+of+the+trammel&source=bl&ots=lB6EVKYQuT&sig=aVE2kiDWZoWftaWczMIrcYftMOs&hl=en&sa=X&ei=gTD_U82fGYjzgwT3moGwCQ&ved=0CCAQ6AEwAA#v=onepage&q=aerodonetics%20the%20use%20of%20the%20trammel&f=false). It's a trip.\n", + "\n", + "Lanchester used Equations (15) and (16) to solve for the constant $C$ and the radius of curvature $R$ and then iteratively plotted small arcs of the phugoid path. By hand.\n", + "\n", + "We wrote a neat little code that duplicates the manual trammel method, but it might be a bit much for you to absorb in the first lesson. If you want to look it over, you are more than welcome to. If you are just starting with Python, skip it for the moment and we'll return to it at the end of this module. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting the flight path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we mentioned, we wrote a Python code to reproduce programmatically what Lanchester did graphically. Here's a neat feature of IPython Notebooks: you can run external programs with the magical keyword ... wait for it ... `run`. And the jargon of IPython _is_ to call this \"magic.\" In fact, there are a bunch of [magic functions](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) that you will learn about. They will make you a happy camper.\n", + "\n", + "Let's do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%run phugoid.py\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This code cell loaded our simulated-trammel code, `phugoid.py`. The code defined a function for you in the background, called `plot_flight_path`, taking three inputs: $z_t$, $z$ and $\\theta$. \n", + "\n", + "Look again at Equation (15), where we take the positive square root. There are several possibilities, depending on the value that the constant $C$ takes. \n", + "\n", + "* There are no physical solutions for $C>2/3$, because it would result in $\\cos\\theta>1$. \n", + "\n", + "* If $C=2/3$, then the solution is a horizontal straight line, because $\\cos\\theta=1$, $\\theta=0$ and $R=\\infty$.\n", + "\n", + "* Any value of $C$ for which $0 < C < \\frac{2}{3}$ will produce \"trochoidal\"-like paths. What does this look like? Let's use our custom function `plot_flight_path` to find out!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n5MgRihQpQt++fQE4fPgw+fLlo1SpUpw8eTLV19+1axfFihULPC5WrBixsbFZ10G/zPQzNefrf0oy\n2tfBgwczdOhQALZu3UpERESq22amn+mtL7XtixcvniM/0wtR4BMRkWxlluFzxf7JuT/a6bV69WqG\nDx9OxYoVyZcvH506daJHjx5/2q5atWqMGDEiQ6+xf/9+Nm7cyJQpUwBo27Ytbdq0oXr16syYMYP7\n77+fCRMmnHcfR44c4aKLLgo8joyM5Pfff0/T66e1j5C5fqbmfP1PSUb6unfvXr799lu+++471qxZ\nw6RJk3j++edT3T4z/UxvfefbPqM/06ykKV0REfG8Zs2a8dVXX9GoUSMKFChAjx49eP3119m/f3+W\nvUaRIkVo0KBB4HHlypWJjo7m22+/5aqrrkrzPoJD7R9//EGJEiXS9L3J+xgVFcXIkSMZP3483333\nXfo6kwGp9f9826e3r4sWLaJr16488MAD3HXXXezZs4cOHTpkSz/TW19q22fmZ5qVNMInIiLZKqOj\nclnt5ZdfZv/+/bz99tuAbzqwbNmySbYJngIMlpYpwHr16rFs2bLA43z58pGQkMC3337LqVOnmDt3\nLsuXL+f06dPMnj07xf1cccUVrFmzJvD48OHDNGnSJEN9fP3112nfvj1NmjShT58+fPrpp1nSz9Sk\n1v/UZKSvO3fupE6dOoBv5Wvnzp355JNPsqWf6a0vte2LFSuWqZ9plsnMio/cfEMrykREsky4/059\n+eWX3bPPPuucc27jxo1u6dKl7oYbbnArVqzIstc4ffq0a9GiReBxq1at3LZt25JsM3z48CSrdH/6\n6SeXmJgYeHzy5EnXoEGDwOOGDRu6/fv3O+eci42NTbJtcsn7+PDDD7tff/3VOefcDTfckImepWz8\n+PGub9++gcfn63/yfjqXsb6OHTvWjR071jnnXOfOnd2OHTvcI488ki39PF996enP+faTktT+L5HJ\nVbrmwuSTV04zM5dX+y4iktVSu+B7OPjPf/7Db7/9RtGiRRk2bBjXXHMNd911F59//jmDBg3K0tea\nP38+y5cvxzlH7dq1ueOOOwLPTZs2jREjRmBmDB06lJtvvpkmTZowbtw4GjduHNhu0qRJbN++Hecc\n1apVC+yjTp06vPXWW1x//fVp6uO+fft45plnqFChAp07d2bOnDlZ1s933nmHqVOnsnPnTvr27cuT\nTz5JkSJFUu1/Sv3MSF+PHz/O888/T4MGDahfvz4tWrTg4Ycf5tlnn82WfqZWX3r7k1p7SlL7v+Rv\nz/ABsQp8IiKSaeEc+FIyefJkqlSpQuXKlbnssstCXU6aJCYm8s0331zw1C7nvP3227Rt25Y6derQ\nt29fPvvss2yuMOukp6+5uZ8pUeDLYgp8IiJZJ7cFvlmzZhEXF0ezZs3Oe664cDJ16lS6devGxRdf\nnKbtDx8+zMcff0yxYsWoX78+LVu2zOYKs056+pqb+5kSBb4spsAnIpJ1clvgy41OnjzJJZdcEuoy\nckRe6mtyCnxZTIFPRCTrKPCJZI3sCnw6D5+IiIiIxynwiYiIiHicAp+IiIiIxynwiYiIiHicAp+I\niIiIx+lauiIikmlVqlT50/VKRST9suu8kDoti4iIiEiY02lZREREROS8FPhEREREPE6BT0RERMTj\nFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RE\nRMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6B\nT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjwj7wmdk4\nM9tvZhuC2oqbWbSZbTGz+WZWNOi5oWYWa2abzKxDaKoWERERCR9hH/iAfwIdk7UNARY652oBi4Ch\nAGZWF+gF1AFuAN4zM8vBWkVERETCTtgHPufcMuBIsubuwAT//QlAD//9G4Epzrl459x2IBZonhN1\nioiIiISrsA98qSjjnNsP4JzbB5Txt1cEdgZtt9vfJiIiIpJn5dbAl5wLdQEiIiIi4Sp/qAvIoP1m\nVtY5t9/MygEH/O27gcuCtqvkb0vR8OHDA/ejoqKIiorK+kpFRERE0ikmJoaYmJgs2585F/6DY2ZW\nFfjSOdfA/3gk8JtzbqSZDQaKO+eG+BdtfApchW8qdwFQw6XQSTNLqVlEREQk7JgZzrkML0QN+xE+\nM5sMRAElzexXYBjwCjDNzO4FduBbmYtz7kczmwr8CMQBDynViYiISF6XK0b4soNG+ERERCS3yOwI\nn1cWbYiIiIhIKhT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9E\nRETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxO\ngU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERE\nRDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4zwZ+Mysk5ltNrOtZjY41PWIiIiIhJI550JdQ5Yys3zAVuBaYA+wGrjVObc52XbOa30XERERbzIz\nnHOW0e/34ghfcyDWObfDORcHTAG6h7gmERERkZDxYuCrCOwMerzL3yYiIiKSJ3kx8ImIiIhIkPyh\nLiAb7AYqBz2u5G/7k+HDhwfuR0VFERUVlZ11iYiIiKRJTEwMMTExWbY/Ly7aiAC24Fu0sRf4FrjN\nObcp2XZatCEiIiK5QmYXbXhuhM85l2BmjwDR+KasxyUPeyIiIiJ5iedG+NJKI3wiIiKSW+i0LCIi\nIiJyXgp8IiIiIh6nwCciIiLicQp8IiIiIh7nuVW66ZGYmEi+fMq8IuI9Z86c4ddff2Xnzp3s27eP\ns2fPEh8fT6FChShdujTly5enZs2aREZGhrpUEckBeTrwRUREUKJECa644gqqV69O06ZNadWqFU2b\nNtUvQRHJVU6dOsXXX3/N/PnzWbVqFevXrycuLu6835M/f37q1KlDy5Yt6dixI9dccw3FihXLoYpF\nJCfl6dOypPZc4cKF6dy5Mz179qR79+5cfPHFOVmaiEiaJCQksGDBAsaOHctXX33F6dOnA8+ZGZUr\nV6Zy5cpUqFCBiy66iIiICE6ePMmBAwfYtWsX27ZtI/hvQIECBejSpQt33nknN954IwUKFAhFt0Qk\nBZk9LUueDnzx8fEcOnSIn376ic2bN7Ny5UqWLVvGpk3/O09z8eLFufvuu3nwwQepU6dOCCsWEfE5\nfvw477//Pu+++y47d+4MtDdr1oyuXbvStm1bmjZtyqWXXnre/Zw8eZINGzawePFi5s+fz7Jly0hM\nTASgUqVKDBgwgPvvv5+iRYtma39E5MIU+DLofCde/uWXX5g1axaffvopa9asCbR3796d559/nqZN\nm+ZUmSIiAceOHeP111/nzTff5OjRowBUq1aNfv360adPHypWrJip/e/du5fPPvuMsWPHBj74FilS\nhIEDB/LEE09QuHDhTPdBRDJGgS+D0nqljbVr1/LBBx8wceLEwHRJ165defXVVzXiJyI5Ij4+nrFj\nx/K3v/2NgwcPAtC2bVueeeYZOnTokOWLzxITE5k3bx6vvfZa4OLtZcuW5cUXX6Rfv35ERERk6euJ\nyIUp8GVQei+ttm/fPkaPHs17773HqVOniIiI4OGHH2bYsGGUKFEiGysVkbxs8eLFPProo2zcuBHw\nBb2///3vtG3bNkdePyYmhkGDBrF69WoAmjdvzgcffECjRo1y5PVFxEeBL4Myei3dAwcO8PzzzzN2\n7FgSExMpUaIE//jHP7j77rsxy/DPQUQkiaNHjzJo0CA++ugjAC6//HJee+01brrpphz/XeOcY+rU\nqTz55JPs2bOHiIgInnjiCV588UUtahPJIQp8GZTRwHfO+vXreeKJJ1i8eDEAHTt25IMPPqBKlSpZ\nVaKI5FGzZ8+mf//+7Nmzh8jISJ577jkGDhzIRRddFNK6jh8/zvPPP88777xDYmIidevWZdKkSTRu\n3DikdYnkBQp8GZTZwAe+T70TJ07kiSee4MiRIxQuXJhXX32Vv/71rxrtE5F0+/3333n00UcZP348\nAC1atGDcuHHUrVs3tIUls3r1au6++242b95MgQIFePHFFxk4cKCO7RPJRgp8GZQVge+cffv28cgj\njzB9+nQAunXrxscff0ypUqWyZP8i4n1r1qzh9ttvJzY2losuuogRI0bw6KOPhm2IOnXqFIMHD+ad\nd94BICoqis8++4xy5cqFuDIRb1Lgy6CsDHznTJ06lQcffJCjR49Svnx5Jk6cyHXXXZelryEi3pKY\nmMjo0aN59tlniYuLo379+nz22WfUr18/1KWlybx58+jbty/79++nfPnyfP755zm2oEQkL8ls4NOF\nZLNQr169WL9+PW3btmXv3r1cf/31DB48mPj4+FCXJiJh6Pjx49x0000MGjSIuLg4Hn30Ub799ttc\n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\n9dVXqf4eVOBT4Atrq1atcj179nRmluSP++zZs11CQkKoy5MckpiY6ObOnZvkQ4CZuW7durmlS5eG\nujyRTImPj3eTJ092derUCby/K1eu7N566y134sSJUJcnYeTIkSPu73//uytdunTgvVK/fn03c+bM\nC37gVeBT4MsVfvrpJzdgwABXuHDhJFfuGDVqlM5m72GHDx92r7/+epIrYxQqVMg99NBDujqGeE58\nfLybMmWKq1u3buD9Xrx4cffMM8+4PXv2hLo8CaHdu3e7gQMHBhZjAK5p06Zu2rRpaR78UOBT4MtV\njh496kaNGuUqV66cZLr31ltv1ZSeRyQmJrqlS5e6O++8M8m0bYUKFdyIESO0kEc8LyEhwU2fPt21\natUqye+5e+65x/3www+hLk9y0MqVK92dd97pIiMjA++Fa6+91i1YsCDdf+8yG/jC/jx82cXMXF7t\neziIj49nzpw5fPjhh8yZM+dcCKdGjRr069eP22+/ncsuuyzEVUp67NmzhylTpjBu3Dh+/PFHAMyM\nDh068MADD9CtWzcKFCgQ4ipFctZ//vMfRo8ezcyZMwO/59q1a0f//v3p2bMnkZGRIa5QstqZM2f4\n/PPPeeedd1i92ne113z58tGzZ0+GDBnClVdemaH9mhkuE+fhU+CTkPv1118ZN24c48aNC1yqzcxo\n164dd9xxBzfffDPFihULcZWSkuPHjzNjxgw+/fRTvv7668AftHLlynHvvfdy3333cfnll4e4SpHQ\n27ZtG2+88Qbjx4/n5MmTAJQpU4Z+/frxwAMPULVq1dAWKJkWGxvLP//5T8aOHcvBgwcBKFGiBPfd\ndx/9+/fP9M9YgS+DFPjCT3x8PHPnzuWTTz5h9uzZnDlzBoDIyEi6du1K7969ueGGGyhSpEiIK83b\nTp48ybx585g6dSqzZ88OXPYnMjKSLl26cOedd2o0TyQVx48f59NPP+X999/nhx9+AP43Et6nTx+6\nd+9OoUKFQlylpNXvv//OtGnT+Pjjj1m2bFmgvVGjRjz66KPcdtttXHzxxVnyWgp8GaTAF96OHTsW\nGDlatGhRYOQoMjKS6667jp49e9KtWzfKli0b4krzhkOHDvHll1/yxRdfEB0dneTajldffTV33nkn\nN998M8WLFw9hlSK5h3OO//znP4wZM4apU6dy9uxZAIoUKcLNN9/MXXfdRbt27ciXL6SXvJcUJCQk\n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\nKVasGMWKFaNo0aIUK1aMMmXKUL58eSpUqEDx4sU9H+guRIEvgxT4REREJLfIbODTsj0RERERj1Pg\nExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERER\nj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4R\nERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4\nBT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExER\nEfE4BT4RERERjwvbwGdmr5rZJjP73symm9mlQc8NNbNY//MdgtqbmNkGM9tqZm+EpnIRERGR8BK2\ngQ+IBuo55xoBscBQADOrC/QC6gA3AO+Zmfm/532gn3OuJlDTzDrmfNkiIiIi4SVsA59zbqFzLtH/\ncCVQyX//RmCKcy7eObcdXxhsbmblgCLOudX+7SYCPXKyZhEREZFwFLaBL5l7gTn++xWBnUHP7fa3\nVQR2BbXv8reJiIiI5Gn5Q/niZrYAKBvcBDjgWefcl/5tngXinHOfhaBEERERkVwvpIHPOXf9+Z43\ns75AZ+CaoObdwGVBjyv521JrT9Xw4cMD96OiooiKirpw0SIiIiLZLCYmhpiYmCzbnznnsmxnWcnM\nOgGjgaudc4eD2usCnwJX4ZuyXQDUcM45M1sJPAasBr4C3nLOzUtl/y5c+y4iIiISzMxwztmFt0xZ\nSEf4LuBtIBJY4F+Eu9I595Bz7kczmwr8CMQBDwUlt4eB8cBFwJzUwp6IiIhIXhK2I3zZTSN8IiIi\nkltkdoQvt6zSFREREZEMUuATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER\n8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+AT\nERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGP\nU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPC9vAZ2Yvmtl6M1tnZvPMrFzQc0PNLNbMNplZh6D2Jma2wcy2mtkboalcREREJLyYcy7U\nNaTIzAo75373338UqOuc629mdYFPgWZAJWAhUMM558xsFfCIc261mc0B3nTOzU9l/y5c+y4iIiIS\nzMxwzllGvz9sR/jOhT2/S4BE//0bgSnOuXjn3HYgFmjuHwEs4pxb7d9uItAjp+oVERERCVf5Q13A\n+ZjZS8DdwFGgvb+5IrAiaLPd/rZ4YFdQ+y5/u4iIiEieFtIRPjNb4D/m7tztB//XbgDOueecc5Xx\nTeE+GspaRURERHKrkI7wOeeuT+Omk4GvgOH4RvQuC3qukr8ttfZUDR8+PHA/KiqKqKioNJYjIiIi\nkn1iYmKIiYnJsv2F86KN6s65bf77jwJtnXO9ghZtXIVvynYB/1u0sRJ4DFiNLyC+5Zybl8r+tWhD\nREREcoXMLtoI52P4XjGzmvgWa+wA/grgnPvRzKYCPwJxwENBye1hYDxwETAntbAnIiIikpeE7Qhf\ndtMIn4iIiOQWnj0ti4iIiIhkDQU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T\n4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+ERER\nEY9T4BMRERHxOAU+EREREY9T4BMRERHxOAW+PCYmJibUJYSE+p23qN95i/qdt+TVfmeWAl8ek1f/\no6jfeYv6nbeo33lLXu13ZinwiYiIiHicAp+IiIiIx5lzLtQ1hISZ5c2Oi4iISK7knLOMfm+eDXwi\nIiIieYWmdEVEREQ8ToFPRERExOPyXOAzs05mttnMtprZ4FDXk5XMbJyZ7TezDUFtxc0s2sy2mNl8\nMysa9NxQM4s1s01m1iE0VWeemVUys0VmttHMfjCzx/ztnu67mRU0s1Vmts7f72H+dk/3+xwzy2dm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#zt = 64, z = 16, theta=0\n", + "plot_flight_path(64, 16, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool! Note that the plot title tells us what the calculated value of $C$ was for our input conditions. We have a value of $C$ between $0$ and $\\frac{2}{3}$ and our path is trochoidal, like we announced it would be.\n", + "\n", + "* For negative values of $C$, the resultant flight path consists of a series of loops. Let's try it out!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUqZMGcLCwrjpppvo0KHDX9arWLEigwYNytZ77Nu3j/Xr1zNlyhQAWrRoQfPmzalcuTKffvop999/\nP2PHjj3nNo4cOUKBAgWSP4+KiiI2NjZT75/ZfYTz28/0nGv/05Kdfd2zZw/Lli1j5cqVrFixggkT\nJvD888+nu34w9nPy5MnMmDGDN998M9vbyOz3Pzs0tSoiInleo0aN+O9//0u9evWIjIykQ4cOvPXW\nW+zbty9o7xEdHU3t2rWTPy9XrhxfffUVy5Yto3HjxpneRsqyGhcXR4kSJTL12tT72LJlS4YMGcKY\nMWOSj0PLSent/7nWz+q+zps3j/bt29OrVy+6du3K7t27adWqVY7uZ6dOnfjggw+46aabsnUbuqx8\n/7NDI3IiIpKjQuXWXa+99hr79u1j2LBhgG9a7pJLLvnTOimn4lLKzFRczZo1+e6775I/DwsLIzEx\nkWXLlnHq1CnmzJnD4sWLOX36NJ9//nma26lUqRIrVqxI/vzQoUM0aNAgW/v41ltvcd1119GgQQO6\nd+/OxIkTg7Kf6Ulv/9OTnX3dtWsX1atXB3xnvLZt25bx48fnyH5+8cUXvPrqqyxevJjo6GguueQS\nPvnkkwzPxE1t6dKlxMXFZer7ny3W2nz58O26iIgEQ6j/m/raa6/Z5557zlpr7fr16+2iRYtsmzZt\n7Pfffx+09zh9+rRt0qRJ8ufNmjWzv/7665/WGThwoH3ppZeSP9+yZYtNSkpK/vzkyZO2du3ayZ/X\nrVvX7tu3z1pr7ebNm/+0bmqp97FPnz52586d1lpr27Rpcx57lrYxY8bYHj16JH9+rv1PvZ/WZm9f\nR48ebUePHm2ttbZt27Z2x44dtm/fvjmyn3PmzEn+eiYlJdmyZcvar776Kt39CUj9dUkp9fc/Len9\nXfIv/0ufMTZEflPKbcYYm1/3PSNnz55l8+bN7Nixg507d7J3715OnDjBmTNnKF26dPJBpiIiAend\n6DsULFmyhMOHD1OsWDFefPFFrr/+erp27crUqVN56qmngvpeX375JYsXL8ZaS7Vq1ejSpUvyc9Om\nTWPQoEEYY+jfvz8dO3akQYMGfPDBB9SvXz95vQkTJrB9+3astVSsWDF5G9WrV+edd97hxhtvzNQ+\n7t27l2effZbLLruMtm3b8sUXXwRtP999910+/vhjdu3aRY8ePejXrx/R0dHp7n9a+5mdfT1+/DjP\nP/88tWvXplatWjRp0oQ+ffrw3HPP5ch+jhw5koSEBHbs2EGVKlV44IEHzrk/6X1dIO3vf1rS+7vk\nX/6XA05V5ITjx4/z7bffMnfuXJYtW8batWuJj49Pc93atWuzdu3aXE4oIqEulItcWiZNmkT58uUp\nV64cZcuWdR0nU5KSkliwYEGmL2ExbNgwWrRoQfXq1enRoweTJ0/O4YTBk5V99fJ+pkVFLpPye5E7\nfvw4M2bMYNKkScybN4+EhIQ/PV+hQgUqVapEuXLlKF26NEWLFuWCCy6gVKlSdOrUyVFqEQlVXity\nn332GWfPnqVRo0bnvNZZKPn444+5+eabKViwYKbWP3ToEB9++CHFixenVq1aNG3aNIcTBk9W9tXL\n+5kWFblMyq9FbsOGDbzzzjuMGzeOuLg4AMLDw2nSpAmtWrWiRYsW1K9fP0euki0ieZfXipwXnTx5\nksKFC7uOkSvy076mpiKXSfmtyK1evZoXXniB2bNnJy9r0aIFXbp0oWPHjiF3+xcR8RYVOZHgyGqR\n0+VH8rjt27fz5JNPJt/CpFChQnTv3p2+fftSo0YNx+lERETkfKjI5VHx8fEMHjyYwYMHc/r0aQoU\nKECfPn146qmnKFWqlOt4IiIiEgQqcnnQmjVr6Nq1K+vWrQOgc+fOvP7665QpU8ZxMhEREQkm3aIr\nD0lMTGTIkCE0atSIdevWUblyZRYsWMDEiRNV4kRERPIgjcjlEYcOHeKuu+7i66+/BuDBBx/kjTfe\nyLdn/YiIiOQHKnJ5wPr167nlllvYunUrpUqVYuzYsdx0002uY4lIPlK+fPm/3M9SRLIuq9c11NSq\nx82ePZsmTZqwdetWGjRowIoVK1TiRCTXBW6z5IXH8OHDk0vnI488wtmzZ51nyu7j+PHjtG/fHoCI\niAjGjx/vPJMe5/fYvn17lv7uqch52Pjx4+nQoQOxsbF06tSJRYsWeeZWMyIiLgwaNIg+ffpgreX1\n11/n7bffJiLCu5NT0dHRzJw5k8cff5yEhAS6devG6NGjXceSXKQi51EjRoygW7duJCYmMmDAACZO\nnEihQoVcxxIRCVmvvfYazz77LMYY/vOf//Dkk0+6jhQU4eHhDB06lNdeew1rLffffz/Dhw93HUty\nie7s4EFDhw5N/gfojTfe4IknnnCcSEQktI0cOZKHHnoIYwwTJkygc+fOriPliLfffpvHHnsM8O1z\n7969HSeSYNEtulLxapH7z3/+Q+/evTHG8N5779GrVy/XkUREQtqkSZO4++67sdby/vvvc//997uO\nlKNSltaPP/6Yjh07uo4kQaAil4oXi9yUKVPo3Lkz1lpGjBjBgw8+6DqSiEhIW7BgAX/7299ISEhg\nyJAhPPXUU64j5YpXX32VAQMGEBUVxZw5c7j++utdR5LzpCKXiteK3Ny5c2nbti0JCQm8+uqrPPvs\ns64jiYiEtG3bttGoUSMOHTrEY489xptvvuk6Uq6x1vLII48wbNgwoqOjWbp0KdWrV3cdS86Dilwq\nXipyv/zyC40bN+bYsWM8/vjjvPHGG7pek4jIOcTGxtKsWTPWrVvHTTfdxOzZswkPD3cdK1clJSVx\n1113MW3aNKpUqcLSpUu58MILXceSbFKRS8UrRe7IkSM0adKETZs2cdttt/HJJ58QFqaTjUVE0mOt\n5a677uLjjz+matWq/PDDDxQvXtx1LCdOnjxJ8+bN+fHHH2ndujX//e9/812hzSvSK3JqBCEsMTGR\nTp06sWnTJurUqcO4ceNU4kREMjB69Gg+/vhjihQpwueff55vSxxA4cKFmTlzJiVLluTLL7/k+eef\ndx1JgkytIIQNGjSIL7/8kosvvpjPP/+cIkWKuI4kIhLSNmzYwCOPPALAe++9R0xMjONE7pUvXz55\nNmfw4MF88803riNJEKnIhahFixbx4osvAjBhwoQs33tNRCS/iY+P56677iIuLo7u3bvTpUsX15FC\nxrXXXssLL7yAtZauXbty4MAB15EkSFTkQtChQ4fo3LkzSUlJPPPMM7Rq1cp1JBGRkPfqq6+ybt06\nKleuzLBhw1zHCTnPPfccLVq0YM+ePdx777144ThxyZhOdghBnTp1YsqUKTRt2pQFCxYQGRnpOpKI\nSEhbs2YNDRs2JCEhgYULF9KiRQvXkULSzp07qVu3LkePHmXcuHF07drVdSTJJJ3s4BGffvopU6ZM\noXDhwkyYMEElTkQkAwkJCdx7770kJCTQp08flbhzKFeuHG+99RYAjzzyCHv37nWcSM6XilwIOXTo\nUPLdGoYMGULFihUdJxIRCX0jRoxg1apVlC9fnkGDBrmOE/K6d+9O69atOXLkCH379nUdR86TplZD\nSPfu3Rk3bhzXXnst8+bN06VGREQycODAAapUqcKxY8f47LPPuOWWW1xH8oQdO3ZQq1YtYmNjmT17\n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\nli5dyh133MG0adNCqiilnFIdNWoU9913n+tIkgs0tZoPXHnllTzxxBNYa+nevbtu3yUikg0RERFM\nmjSJ6Ohopk+fzujRo11HSpZ6SrVnz56uI4ljGpHLY06fPs2VV17Jhg0bPHGwrohIqJo4cSJ33303\nBQsWZOXKlVSvXt11JCZNmkSXLl2Ijo7mp59+oly5cq4jSS5Jb0RORS4PWr16NY0bN+bs2bPMmTOH\nm266yXUkERFP6tatG+PHj6du3br88MMPFChQwFmWnTt3UrduXY4ePaop1XxIU6v5SP369Xn55ZcB\nuPfeezl06JDjRCIi3jR8+HAqVarEmjVreOqpp5zlSExMpFu3bhw9epT27dtrSlWSqcjlUU8++STN\nmzdnz5499O7dW/diFRHJhujoaCZPnkxkZCTDhg3j448/dpLj9ddfZ8GCBVxyySV88MEHIXXyhbil\nqdU8bNu2bdSpU4fY2FjGjBlD9+7dXUcSEfGkYcOG8fDDD1OkSBGWL19OtWrVcu29ly9fTrNmzUhI\nSNDhMvmYplbzoQoVKjBs2DAAHnroIX7++WfHiUREvKlv377cddddxMbG0rFjx1y78HpsbCxdunQh\nISGBRx55RCVO/kIjcnmctZZu3boxYcIEateuzdKlSylYsKDrWCIinhMbG0ujRo34+eef6dKlC+PH\nj8/xKc577rmHMWPGULt2bZYtW+b0ZAtxSyNy+ZQxhhEjRhATE8O6det47LHHXEcSEfGkIkWKMH36\ndAoXLszEiRMZOXJkjr7fRx99xJgxYyhQoACTJk1SiZM0aUQun/jxxx9p0qQJ8fHxTJkyhX/84x+u\nI4mIeNLkyZPp3LkzERERfPPNN1xzzTVBf4+1a9fSuHFjTp8+zYcffsg999wT9PcQb9GIXD5Xr149\n3nrrLQDuv/9+fv31V8eJRES8qVOnTvTr14+EhATuuOMOduzYEdTtHz9+nL///e+cPn2ae+65RyVO\nzkkjcvmItZY777yTTz75hNq1a/P9999TuHBh17FERDwnISGB9u3b8+WXX1KnTh0WL15MkSJFznu7\n1lo6derE1KlTqV27Nj/88AOFChUKQmLxOo3ICcYYPvjgg+Tj5e6//35dX05EJBsiIiKYMmUKMTEx\nrF27lh49epCUlHTe2x0xYgRTp06lSJEiTJs2TSVOMqQil88ULVqUmTNnUqRIESZPnszbb7/tOpKI\niCcVL16czz//nGLFijF9+vTkO+pk18KFC3n00UcBGD16NFWrVg1GTMnjNLWaT3366afccccdhIeH\n8yGE+i0AACAASURBVPXXX9OyZUvXkUREPGnOnDm0a9cOay0TJ06kc+fOWd7Gzp07adiwIQcOHODx\nxx9n6NChOZBUvExTq/Int99+O8888wyJiYnceeed7Nq1y3UkERFPatOmDW+++Sbgu+7bggULsvT6\nU6dO0aFDBw4cOMCNN97I4MGDcyKm5FEakcvHEhMTadOmDXPnzqV+/fosWrRIJz+IiGTTI488wjvv\nvEPx4sVZsmQJ1atXz/A11lq6dOnC5MmTqVixIsuXL6dEiRK5kFa8RiNy8hfh4eFMnjyZypUrs3r1\narp16xaUg3VFRPKjN998kw4dOnD06FHatGnD3r17M3zN0KFDmTx5MkWKFOHzzz9XiZMsU5HL5y66\n6CJmzZpFsWLF+PTTTxkwYIDrSCIinhQeHs7EiRNp3LgxO3bsoF27dsTGxqa7/syZM3n66acBGD9+\nPDVr1sytqJKHqMgJ1apV45NPPiE8PJxBgwYxduxY15FERDypUKFCfP7551SsWJFVq1Zxxx13cObM\nmb+st3z5cjp37oy1lldeeYUOHTo4SCt5gY6Rk2TvvfceDz74IJGRkXzzzTe0aNHCdSQREU/atGkT\nzZs358CBA9x5551MmjSJ8PBwAHbs2EHjxo3Zt28f99xzDx988AHG/OXQJ5E/Se8YORU5+ZPAwbol\nSpRg8eLFVKtWzXUkERFPWrVqFddddx3Hjx+nV69evPfeexw/fpyrr76a9evXc/311zNnzhyioqJc\nRxUPUJFLRUUubQkJCdx2223Mnj2b8uXLs2TJEi677DLXsUREPGnhwoW0bt2a06dP8/jjj7NmzRq+\n/vprqlevzpIlSyhevLjriOIRKnKpqMil7+TJk9xwww0sXbqUunXrsmDBAooVK+Y6loiIJ82ePZtb\nb701+aoApUqVYunSpVxxxRVug4mn6PIjkmmFCxdm9uzZxMTEsGbNGm6//Xbi4+NdxxIR8aR27dpx\n0UUXJX9+0003qcRJ0KjISZpKlizJ//73Py699FLmzZsXtBtCi4jkN4MHD+bAgQPJn48bN46RI0c6\nTCR5iYqcpKtChQrMmTOH6OhopkyZwsMPP4ymo0VEMm/UqFE8++yzGGOYOnUqw4YNA+Chhx7i/fff\n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\nnfuBvr+KXDIqcpLRXL9+nY0bN7J69Wo2btzIkSNH7nm8YMGCNGrUiKeffhofHx9q1qypk9zTIZfL\nxaFDh9zF7bvvvuPcuXP3PKdYsWL4+vri6+tL8+bNdUhdJB2LiooiIiKCyMhI+vbt+8DfR0UuGRU5\nyehOnz7Nt99+y8aNG9m4cSMnT5685/Hs2bNTu3ZtfHx88PHxoW7duhQvXlwzYtPYxYsXCQ8Pd99+\n+OEH9yXd7nrooYdo2LAhDRs2pEmTJjzxxBP6dxLJZFTkklGRk8zEWsvx48cJDQ1l27ZthIWF3XMt\nwruKFClCzZo177mVKVNGpSEFWGs5e/Yse/bsYe/evezdu5ft27ffc57jXcWLF6dBgwY0atSIRo0a\nUalSJf0biGRyKnLJqMhJZnf58mXCw8MJCwsjLCyMnTt3Eh0d/ZvneXt7U6VKFapUqULlypXdH4sV\nK6ZycR9RUVEcPnyYQ4cOsX//fndxu3Tp0m+emydPHmrXrk29evWoV68edevWpWTJkg6kFpH0TEUu\nGRU5kXtZa4mMjGTXrl3u286dO7l48eLvPt/b25uKFSvy2GOP8eijj/LYY4+5b0WLFs3QJc9aS1RU\nFJGRkURGRnL8+HGOHDnCoUOHOHTo0O8WNoACBQpQrVo1qlevTrVq1ahZsyaVK1fW7GIR+UMqcsmo\nyIn8MWst58+fZ//+/Rw4cOCej5cvX77v1+XKlYtSpUpRokQJSpYsSYkSJdz3ixcvTuHChSlcuDD5\n8uVLd4UvNjaW8+fPc+7cud98PH36tLu8xcTE3Pd75M2bl4oVK7pvTz75JNWrV6dkyZLp7r9XRDyD\nilwyKnIiD+5uwTt69Cg///wzP//8M8eOHXPfv98eqeSyZcvmLnWFCxfG29ubvHnzki9fvns+5s2b\nlxw5cpAtWzb3LXv27GTLlo2sWbPicrlwuVzcuXPHfd/lchEbG0tMTAwxMTHcvHnTfT8mJobo6Ggu\nX77M5cuX+fXXX933r1+//qeye3t7U6ZMGcqUKUPp0qUpX748FStWpEKFCpo0IiIpTkUuGRU5kdRz\n9epVTp8+zenTpzlz5gxnzpxx3z979iyXLl0iKiqKGzduOB31N7y8vHj44YcpVqwYxYoVo2jRou77\nxYsXp2zZspQuXRpvb2+no4pIJqIil4yKnIjzbt68yaVLl7h06RIXL17kypUrXL9+nWvXrnHt2jX3\n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\n8zlOaAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,numpy.pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can play around with the input values and see what kind of behavior results. Just note that any value of $C > \\frac{2}{3}$ will result in $\\cos \\theta > 1$, which doesn't exist. Python will probably throw a few errors if you hit that condition, but just try again!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* The last case is $C = 0$. Take another look at Equation (16) and plug in $C = 0$, what should happen? It looks like it will just reduce to \n", + "\n", + "$$R = 3z_t$$\n", + "\n", + "It's a constant radius of curvature! In fact, this solution is a series of semi-circles, with a cusp between them. One way to force $C = 0$ that we can figure out from Equation (15), is to make:\n", + "\n", + "\n", + "$$z = 3z_t\\ \\ \\ ,\\ \\ \\ \\theta = 0$$" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\npZeYNm0a1atXp1mzZpx11lkVUfZWef/99xk5ciQ33ngjAMOHD+eLL75g7dq1tGjRgpNOOmmz70/7\nsZa2vuL6l+txJv29WeX8nVxRklQ2/H/q/9x3332xT58+sX///t9pP++88+LcuXNjjDG2a9cuzpkz\np8j3r1ixInbs2HHT88MOOywuXbq0/AreBvn5+fH444+Pv/rVr2KMMc6fPz/ec889m14///zz4zff\nfFPs+7flWCdMmBAff/zxeO+998avv/56K49g80pbX3H9S7Of4n6Xsu1FZhqnRCVJKqVrrrmGE088\n8Ttts2fPZuHChbRo0QKAUaNG0bJlyyLf/+abb9KuXbtNzzt06MA///nP8it4GwwbNoxu3bptev7l\nl18yZswY1q9fD0C9evXYbrvtin3/1h7r559/zpNPPsl5551HixYteP7557fhKIpX2vqK61/e59Qp\nUUlSlTNr1iz+/Oc/f2c9rI2PQwgcdthh9OrVq1T7fOONN2jYsCGDBg3i66+/pn79+px77rlF9v3i\niy9o1KjRpueNGjVi5syZW308xdnW41y2bBnVqlVjxx13ZNWqVQAceOCB5Ofn88Mf/pALLriAY445\nhpo1axa7j6091p///OfcdNNNAHz66adUr169XI6ztPUV13+HHXYo13NqYJMklYkQilzvs9Q2/oW7\nNSZNmsSAAQNo3rw51apV4yc/+Qm9e/f+Xr899tiDu+66a1vK/J7Fixczbdo0hgwZAsCRRx7Jj370\nI9q0afO9vl9//TXbb7/9pufbbbcd33zzTYk+p6THCNt+nH//+9/52c9+xlNPPfWd9htvvJGBAwdy\n/fXX87vf/W6z+9iaY/3Pf/7DO++8w7vvvsvkyZMZNGgQt956a7H9t+U4S1vf5vpv7TktCadEJUmV\nxsEHH8yrr77KD37wA2rWrEnv3r154IEHWLx4cbl/dv369TnggAM2PW/RogWjRo0qtm/BYLpmzRoa\nN25cos8pfIxdu3blt7/9LU8++STvvvvuth1EAe+88w6HHnro99pnzpzJuHHjGDVqFC+//DK33347\nb7/9drH72ZpjfeONNzjhhBO44IILOOuss1i4cCHHHHNMuRxnaesrrv+2nNOScIRNklQmtmVkrCzd\neeedLF68mIcffhjITKc1bdr0O30KTqEVtC1Tou3atWP8+PGbnlerVo28vLwi++65555Mnjx50/Nl\n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\nSZISMm/ePPr160d+fj633norJ5xwQtIlSZVKoiNsIYTRIYQpBbap2Z89AWKMv4gxtiAzBXp5krVK\nkor27bffcsopp7B06VKOPfZYbrvttqRLkiqdREfYYoxHl7DrYOBVYACZEbXdC7y2W7atSAMGDNj0\nuGvXrnTt2rWUVUqSihNj5IILLmDSpEm0atWKwYMHU7169aTLknLC2LFjGTt2bIn6pvmmgzYxxs+y\njy8Hjowx9i1w08GhZKZCR+NNB5KUiPvuu4/rrruOunXrMnHiRNq3b590SVLO2txNB2m+hm1gCGFv\nMjcbzAUuAogxfhxCGAp8DKwHLjGVSVLFe+2117jhhhsA+Otf/2pYk8pRakfYyoIjbJJUPj755BMO\nPfRQVqxYwW233fady08kbZ3NjbAZ2CRJpbJs2TIOO+wwPvvsM/r06cPzzz9PtWqpXSVKyhkGNklS\nmVi7di1HH300b731FgceeCBvvvkm9erVS7osqVLIyYVzJUnpEmPkZz/7GW+99RbNmjVj+PDhhjWp\nghjYJEklcscdd/D0009Tt25dXnnlFZo3d81yqaI4JSpJ2qJBgwZx1llnEULgpZdeomfPnkmXJFU6\nTolKkrba6NGj6d+/PwAPPPCAYU1KgCNskqRivf/++3Tu3JlvvvmG6667jnvuuSfpkqRKy7tEJUml\nNmfOHDp16sSiRYvo168fgwYNcvkOqRwZ2CRJpfLll19y5JFH8sknn3DUUUcxYsQIatWqlXRZUqVm\nYJMkldjKlSvp1q0b7733Hu3bt+fNN9+kYcOGSZclVXredCBJKpE1a9bQq1cv3nvvPfbcc09Gjhxp\nWJNSwMAmSQJgw4YNnH766YwbN45mzZoxevRodtlll6TLkoSBTZIE5OXl0b9/f15++WUaN27MqFGj\naN26ddJlScoysElSFZefn89FF13EoEGDqFu3LiNGjKBdu3ZJlyWpAAObJFVhMUauvPJKHnvsMWrX\nrs2rr77KoYcemnRZkgoxsElSFRVj5Prrr+eRRx5hu+2248UXX6RLly5JlyWpCAY2SaqCYozccsst\n3HfffdSoUYNhw4ZxzDHHJF2WpGLUSLoASVLFijFy8803M3DgQKpXr86QIUM44YQTki5L0mYY2CSp\nCokxcuONN3L33XdvCmsnn3xy0mVJ2gIDmyRVETFGbrjhBu69915q1KhhWJNyiIFNkqqAGCNXX301\nDz74IDVq1GDo0KH06dMn6bIklZCBTZIquby8PC688EIef/xxatasydChQ+ndu3fSZUkqBQObJFVi\n69ev5+yzz2bIkCFsv/32vPDCC/zkJz9JuixJpWRgk6RK6ttvv+W0007j5Zdfpn79+rzyyit07tw5\n6bIkbQUDmyRVQitXrqRPnz688cYb7LDDDowcOZKDDz446bIkbSUDmyRVMosXL6ZHjx6899577LLL\nLowcOZL27dsnXZakbWBgk6RKZPbs2RxzzDF89tlntGnThpEjR7LHHnskXZakbeRXU0lSJfHhhx9y\n+OGH89lnn3HggQcyfvx4w5pUSRjYJKkSGD16NEceeSSLFi2iW7dujB07lqZNmyZdlqQyYmCTpBz3\n5JNP0qNHD/773//St29fRowYQYMGDZIuS1IZMrBJUo6KMfKrX/2K/v37s2HDBm644QaeffZZtt9+\n+6RLk1TGvOlAknLQunXruOCCC3jqqaeoVq0aDz/8MJdccknSZUkqJwY2ScoxS5cu5aSTTuKtt96i\nTp06DBkyhJ49eyZdlqRyZGCTpBzy8ccf07NnT2bNmkWzZs0YPnw4HTt2TLosSeXMa9gkKUeMHDmS\nTp06MWvWLA466CAmTZpkWJOqCAObJKVcjJH777+fHj16sHLlSk455RTefPNNmjVrlnRpkiqIgU2S\nUmz16tWcddZZXHvtteTn5/OLX/yC5557jjp16iRdmqQK5DVskpRSc+fOpU+fPrz//vvUrVuXp556\nipNPPjnpsiQlwMAmSSn0z3/+k759+7J06VL23HNPXnzxRfbff/+ky5KUEKdEJSlF8vPzueuuu+je\nvTtLly7l2GOPZdKkSYY1qYozsElSSnz99deceOKJ3HzzzZuuV3v11VfZYYcdki5NUsKcEpWkFHjv\nvfc45ZRTmD17NjvssANPP/00xx9/fNJlSUoJR9gkKUExRh5++GE6derE7NmzOeigg3jvvfcMa5K+\nw8AmSQn56quvOOmkk7jiiitYt24dF110EePHj6dVq1ZJlyYpZZwSlaQETJw4kX79+jFv3jwaNmzI\nn//8Z0499dSky5KUUo6wSVIF2rBhA7fffjudO3dm3rx5HHroobz//vuGNUmb5QibJFWQ2bNnc9ZZ\nZzFhwgQArr/+eu644w5q1qyZcGWS0i71I2whhGtDCPkhhMYF2m4KIcwMIUwPIRyTZH2StCUxRp56\n6ik6dOjAhAkTaNasGaNHj+buu+82rEkqkVSPsIUQdgOOBuYWaNsX6AvsC+wGjAkh7BVjjMlUKUnF\nW7p0KRdffDHPP/88ACeffDJ/+tOfaNKkScKVScolaR9hewC4vlDbicCQGOOGGOMcYCZwSEUXJklb\n8uKLL9KuXTuef/556tWrxxNPPMHf/vY3w5qkUkttYAsh9ALmxxinFnqpOTC/wPMF2TZJSoWvv/6a\ns846iz59+rBkyRK6dOnChx9+yLnnnksIIenyJOWgRKdEQwijgaYFm4AI/AK4mcx0qCTljFdeeYUL\nL7yQhQsXUrt2bQYOHMhll11GtWqp/fexpByQaGCLMRYZyEII+wOtgA9D5p+juwHvhRAOITOi1qJA\n992ybUUaMGDApsddu3ala9eu21q2JH3PkiVLuPLKKxkyZAgAnTp14sknn2TvvfdOuDJJaTV27FjG\njh1bor4hF67VDyHMBjrGGL8OIewHPAMcSmYqdDRQ5E0HIQTvRZBUrmKMPPPMM1x11VUsW7aM2rVr\nc/vtt3PllVdSvXr1pMuTlENCCMQYi7xuItV3iRYQyUyXEmP8OIQwFPgYWA9cYiqTlITZs2dz6aWX\n8o9//AOA7t2786c//Yk99tgj4cokVTY5McK2tRxhk1Qe1q1bx3333cdvfvMb1qxZQ6NGjbj//vu9\nqUDSNqkMI2ySlArjxo3j4osvZvr06QD069eP+++/n1122SXhyiRVZt62JEklsGjRIs455xy6du3K\n9OnT2WuvvRg9ejSDBw82rEkqdwY2SdqMjdOfe++9N3/961+pVasWAwYMYMqUKXTv3j3p8iRVEU6J\nSlIxRo0axZVXXsmMGTMAOOGEE3jggQdo06ZNwpVJqmocYZOkQj799FN69+7Nsccey4wZM9hrr714\n9dVXGT58uGFNUiIMbJKUtWzZMq644gratWvHSy+9RN26dRk4cCBTp06lR48eSZcnqQpzSlRSlbd2\n7VoeeeQRbr/9dpYvX04IgfPPP5/f/OY37LrrrkmXJ0kGNklVV15eHoMHD+aXv/wlc+bMATKL3953\n3320b98+2eIkqQADm6QqJ8bIq6++ys0338zUqVMB2G+//bjnnns47rjjXPxWUup4DZukKuWtt96i\nc+fO9OzZk6lTp7L77rvzxBNPMGXKFHr06GFYk5RKjrBJqhImTpzIbbfdxpgxYwBo0qQJv/jFL7jo\noovYfvvtE65OkjbPwCapUvv3v//NbbfdxsiRIwFo0KABV199Nddccw0NGjRIuDpJKhkDm6RKafz4\n8dxxxx289tprANSvX58rr7ySa665hh122CHh6iSpdAxskiqNGCOjRo3ijjvu4K233gKgbt26XHHF\nFVx77bU0adIk4QolaesY2CTlvLy8PF588UUGDhzI5MmTAWjUqBFXXHEFV1xxhUFNUs4zsEnKWatX\nr+bJJ5/k/vvv5/PPPwdgp5124pprruGSSy7xGjVJlYaBTVLOWbJkCY8++iiPPvooy5YtA6B169Zc\nc801nHfeedSpUyfhCiWpbBnYJOWM9957j4ceeohnn32WdevWAXDwwQdz/fXXc9JJJ1G9evWEK5Sk\n8mFgk5Rq69ev54UXXuChhx5iwoQJAIQQ6NmzJ9dddx1HHnmki91KqvQMbJJSaf78+Tz22GM89thj\nLFy4EMisoXb++edz2WWXscceeyRcoSRVHAObpNTIy8tj1KhR/PGPf+SVV14hPz8fgLZt23L55Zdz\n9tlnU69evYSrlKSKZ2CTlLg5c+bw5JNP8uSTTzJ37lwAatasyamnnspFF11Ely5dnPaUVKUZ2CQl\nYvXq1bzwwgv85S9/4Y033tjU3rp1ay688EL69+/PzjvvnGCFkpQeBjZJFSY/P59x48YxaNAgnn/+\neVauXAnA9ttvz8knn8x5551H165dqVatWsKVSlK6GNgklasYI1OnTmXQoEEMHjyYBQsWbHrt4IMP\n5vzzz+e0006jUaNGCVYpSelmYJNULqZNm8bQoUMZOnQoM2bM2NTeqlUrzjzzTM444wzatm2bYIWS\nlDsMbJLKRIyRjz76iGHDhjF06FCmT5++6bXGjRtz2mmnceaZZ9KpUydvIJCkUjKwSdpqeXl5TJw4\nkRdffJEXX3yRWbNmbXqtcePG9OnTh759+9KtWzdq1qyZYKWSlNsMbJJKZcWKFYwePZoRI0YwfPhw\nli5duum1nXbaiZ49e9K3b1+OOuooQ5oklREDm6TNijEybdo0RowYwYgRI5gwYQIbNmzY9Pqee+5J\n79696d27N506dfL7PCWpHBjYJH3PggULeP311xkzZgxjxozhP//5z6bXqlevTufOnenRowfHH388\n7dq185o0SSpnBjZJLF68mDfffJM333yTN954g48//vg7rzdt2pTjjjuOHj16cPTRR7sEhyRVMAOb\nVMXEGJkzZw4TJ07kzTffZNy4cXzyySff6VO3bl26du1K9+7d6d69u6NokpQwA5tUya1atYp3332X\nt99+m7fffpt//etfLF68+Dt96tSpw+GHH06XLl3o0qULhx56KNttt11CFUuSCjOwSZXI6tWr+eCD\nD3j33XeZPHky7777LtOnTyc/P/87/Zo0aUKnTp340Y9+RJcuXTjooIO8o1OSUszAJuWg/Px85syZ\nw5QpU5gyZQpTp05lypQpzJw5kxjjd/pWr16dDh060KlTp01bmzZtnOKUpBxiYJNS7JtvvuHzzz/n\nk08+YcaMGUyfPp0ZM2bwySefsGbNmu/1r169Ou3ateOggw7ihz/8IQcddBDt27endu3aCVQvSSor\nBjYpQWvWrOGLL75g3rx5zJ8/nzlz5vD5559v2pYsWVLse3fddVcOOOAA2rdvv2lr27YttWrVqsAj\nkCRVBAObVMa+/fZbli1bxldffcWyZcv48ssvWbRo0Xe2//znP3zxxRd8+eWXm91XrVq1aN26Nfvs\nsw9t27albdu27Lvvvuyzzz4urSFJVYiBTVXe119/zauvvkp+fj55eXmbtvz8fDZs2MDatWv59ttv\nv7OtWrWKlStX8t///nfTzxUrVvDVV18VOVVZnBo1arDbbrvRokULdt99d1q0aMGee+65aWvevDnV\nqlUrx6OXJOWCUPgC5cokhBAr8/GpbEyZMoUOHTqU2f5q1qxJkyZNaNKkCY0bN2bHHXdk1113ZZdd\ndtm0NW3alN13352mTZsayCRJAIQQiDEWeUeYI2yq8ho3bswZZ5xB9erVqVat2nd+Vq9ene233/57\nW506dWjQoAH169f/zs/GjRtTt25d78CUJJUpR9gkSZJSYHMjbM7FSJIkpZyBTZIkKeUMbJIkSSln\nYJMkSUq51Aa2EMJtIYQvQgjvZbefFHjtphDCzBDC9BDCMUnWKUmSVN5SG9iy7o8xdsxurwGEEPYF\n+gL7AscBvw8pWUNh7NixSZegbeD5y12eu9zm+cttnr+KkfbAVlQQOxEYEmPcEGOcA8wEDqnQqorh\nH9rc5vnLXZ673Ob5y22ev4qR9sB2WQjhgxDCYyGEhtm25sD8An0WZNskSZIqpUQDWwhhdAhhSoFt\navZnT+D3wB4xxh8Ai4D7kqxVkiQpKTnxTQchhJbA8Bhj+xDCjUCMMf42+9prwG0xxn8X8b70H5wk\nSVJWzn2XaAhhlxjjouzTk4CPso9fBp4JITxAZiq0DfBOUfso7qAlSZJySWoDG3B3COEHQD4wB7gQ\nIMb4cQhhKPAxsB64xC8MlSRJlVlOTIlKkiRVZWm/SzQnhBDuzi7i+0EIYVgIoUGB11zkN+VCCD8J\nIcwIIXwaQvh50vVo80IIu4UQ3gghTMveqHRFtn2HEMKoEMInIYSRBe4sV8qEEKplF0R/Ofvcc5cj\nQggNQwh/y/6dNi2EcKjnr2IY2MrGKKBd9o7WmcBNACGE/UjpIr/KCCFUAx4BjgXaAf1CCG2TrUpb\nsAG4JsbYDugEXJo9ZzcCY2KM+wBvkP09VCpdSeaylo08d7njQWBEjHFfoAMwA89fhTCwlYEY45gY\nY3726b+A3bKPe5HSRX61ySHAzBjj3BjjemAImcWZlVIxxkUxxg+yj78BppP5nTsReCrb7SmgdzIV\nanNCCLsBPYDHCjR77nJAdvboyBjjEwDZv9tW4PmrEAa2snceMCL72EV+06/wOfoCz1HOCCG0An5A\n5h9KTWOMiyET6oCdk6tMm/EAcD1Q8AJqz11uaA0sDSE8kZ3S/n8hhDp4/iqEga2EtrDI78Y+twDr\nY4zPJliqVCWEEOoBzwNXZkfaCt9B5R1VKRNCOB5YnB0h3dzlIZ67dKoBdAQejTF2BFaRmQ71d68C\npHlZj1SJMR69uddDCOeSGeY/qkDzAmD3As93y7YpPRYALQo89xzlgBBCDTJh7ekY40vZ5sUhhKYx\nxsUhhF2AJclVqGIcAfQKIfQAagP1QwhPA4s8dznhC2B+jHFy9vkwMoHN370K4AhbGQgh/ITMEH+v\nGOPaAi+9DJweQtguhNCazSzyq8RMAtqEEFqGELYDTidz3pRufwE+jjE+WKDtZeDc7ONzgJcKv0nJ\nijHeHGNsEWPcg8zv2hsxxrOA4XjuUi877Tk/hLB3tunHwDT83asQrsNWBkIIM4HtgGXZpn/FGC/J\nvnYTcD6ZRX6vjDGOSqZKFScbuB8k8w+Yx2OMAxMuSZsRQjgCeBOYSmbqJQI3k/nH0FAyo9pzgb4x\nxuVJ1anNCyF0Aa6NMfYKITTGc5cTQggdyNwwUhOYBfQHquP5K3cGNkmSpJRzSlSSJCnlDGySJEkp\nZ2CTJElKOQObJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElK\nOQObJElSytVIugBJyhUhhAuAHYF9gKeBlsDOwP7ADTHGBQmWJ6kSCzHGpGuQpNQLIfwMmBJj/HcI\n4WBgNHAusAp4DegRYxyZYImSKjFH2CSpZJrEGP+dfdwCyIsxvhhCqA10jTG+lWBtkio5R9gkqZRC\nCA8Bu8cY+yRdi6SqwZsOJKn0ugFjky5CUtVhYJOkLQghVAshdA8ZOwPtKBDYQgg3JFacpCrBwCZJ\nW3YhMArYC+gLrAa+AAgh9AI+Sq40SVWB17BJ0haEEDoA1wMzgA+BBsBRwBxgdoxxUHLVSaoKDGyS\nJEkp55SoJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElKOQOb\nJElSyhnYJEmSUu7/A9i2e0jPCtaoAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(16,48,0.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks an awful lot like a quarter circle. And what's the radius of the arc? It's $$r = 48 = 3z_t.$$\n", + "\n", + "We can also get a semi-circle out of our simulated trammel by changing to another configuration where $C$ is (near) zero. Here's one example:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nvS8Z0/tyPr0nGdP7kjG9LznDb4/STXNNdhERERGvZozBXsZBG357lK6IiJyvQoUKxMTEOB1DxG+V\nL1+e/fv3e3y9GuETEZFU7lEEp2OI+K3M/g1e7gif9uETERER8XEqfCIiIiI+ToVPRERExMep8ImI\niIj4OBU+ERERkcu0du1aEhISOHv2LOvWrXM6znl0WhYREZF0Tp06xbhx4wgLC+PPP//k2Wef/dfj\nW7duJTIyksGDB2e6jsWLF7Nz504CAwO56qqr6Ny5c07HzpZt27Yxc+ZMJkyYkLrsYtufXl7Z1uzI\n6P3JSEREBDExMZQuXZp33nkHAGstxYsXJyAgIPXI22bNmjF37twcz52eCp+IiEg6Tz75JCNHjiQs\nLIyqVavywAMPUL58ecD1S3z48OHUrl07068/efIkL730Eps3bwagbt263HvvvZQoUSJX8mfV//3f\n/7F+/XqKFSv2r+UX2v70LmdbN2zYwI8//siJEyfo2rXreTmcltn7k5GhQ4fSokULypYtS2BgIAD7\n9+/nrbfe4o477iAgIIBFixZx991353TsDGlKV0REJI1ffvmFw4cPExYWBsDKlSv/VXYWLFhA48aN\nL7iOtWvXUqVKldT7t956K6tXr86ZwJfhmWeeoXXr1v9adrHtTy+727pv3z7ef/99nnjiCcLCwpg/\nf342tyLnZPT+ZCY4OJirr746tewB5M+fn7Zt21KhQgWKFi1KcHAwlStXzqm4F6QRPhER8Tk///wz\n77777r9OYpvyuTGG22+/nVatWmX4tV9++SWhoaF8+OGHnDhxgiJFitClSxcA4uLiCAgIoGTJkpw6\ndSrT1//111//NSpUrFgx9uzZ47kNdLuc7czMhbY/I9nd1ueff54XXngBgN27d/+rKKWXE9vpadHR\n0VhriYuL44YbbqBVq1aULVs29fHJkyfz9NNPO5ZPhU9ERLLEmGyf5P882b2ax8aNGxk1ahTlypUj\nICCAFi1a0KZNm/OeV7FiRcaMGZOt14iNjWXnzp3MmTMHgPr163PnnXdy/fXXs3DhQrp3784HH3xw\nwXWcOHGC/Pnzp97Ply8f8fHxWXr9rG4jXN52ZuZC25+R7Gzrb7/9RnR0NJs3b2bTpk18+OGHDB8+\nPNPn58R2elq3bt2oUaMGANWrV6dhw4aEhoYCrvcoLi6OkJAQx/Kp8ImISJ5x2223sWzZMt566y12\n7dpFmzZteO211+jUqRNXXnmlR16jSJEiVKtWLfV+WFgYK1eu5Pjx49SpUyfL6zh+/Hjq/TNnzlCm\nTJksfW36bWzUqBHjxo3jyiuvpFq1atSsWfPSNugSZbb9mRW+7Gzrl19+yf3330+PHj04ffo0gwYN\nolmzZjm+na+++ioJCQn/WpYyShgREXHBqeuLufXWW1M/L168OFFRUanTwXPnznVsKjeFCp+IiGSJ\nt1xjd/To0cTGxvLGG28ArunA9GUv7RRgWlmZAqxSpQrr169PvR8QEEBSUhLR0dGcPn2a5cuX89VX\nX5GQkMCnn36a4Xquu+46Nm3alHo/Li6O8PDwbG3ja6+9RuPGjQkPDyciIoJZs2Z5ZDszk9n2ZyY7\n23rw4MHUArR48WLuvfdeZs6cmePbOWjQoIs+JztmzZrFZ599lpo5Pj7+X1PUX375JY899liOvHaW\nWWv98ubadBERScvb/28cPXq0HTp0qLXW2p07d9p169bZe+65x3799dcee42EhAR7++23p96/4447\n7N69e//1nFGjRtkXX3wx9f6+fftscnJy6v1Tp07ZatWqpd6/9dZbbWxsrLXW2j179vzrueml38a+\nffvaAwcOWGutveeeey5jyzL2/vvv2y5duqTev9D2p99Oa7O3rVOnTrVTp0611lp777332piYGNuv\nX78c3c7sSv/+WHv++7B+/Xq7Zs0aa6218fHxtkKFCvbUqVOpj1evXt2uWrUqS6+X2b9B9/Js9x4d\npSsiInnChg0bqFatGs2bN6dJkyYsXLiQa665hkaNGnH77bd77HVCQkIYNWoUI0aMYPjw4fTp04fr\nrrsu9fGPP/6YxYsXs3jx4tQjSx944AG+++671OcULFiQQYMG8Z///IeXX36ZgQMHUrp0aQBatmzJ\nqlWrsryNwAUPaLgcb775JtOmTSMqKooXX3yRv/7664Lbn347s7utDz74INu3b2fq1KkMHz6csLAw\nkpOTc2w7syuj9wfOfx/q1avHwYMHmThxIkOHDmXOnDkULFgw9fESJUpQrly5XM+flrFeMkSf24wx\n1l+3XUQkM2mPgswLZs+eTfny5QkLC+Oaa65xOk6WJCcns2bNmoue2iXFG2+8Qf369alcuTJdunTh\no48+yuGEnnMp25qXt9OTMvs36F6e7SOnVPhERCRVXit8ixcvJjExkdtuu+2ydrjPTfPmzaNly5YU\n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\npozTkbyGRvjysB49elC9enUOHDjA2LFjnY4jIiLimISEhNRrz7/44osqex6mET6HffXVV9x5552E\nhITwww8/ULFiRacjiYiI5LqXX36ZESNGULVqVbZu3UpQkKNnjvM6GuHL4+rVq0fnzp05e/Ys/fv3\nxxtKqIiISG7av38/o0ePBuDNN99U2csBKnxe4NVXXyU0NJTPPvuM+fPnOx1HREQk11hr6d27NwkJ\nCXTs2JGGDRs6HcknaUrXS7zzzjv06tWLMmXKsGvXLooVK+Z0JBERkRw3Z84cOnbsSLFixdi1a5f2\n3cuEpnR9RPfu3alXrx6///47gwcPdjqOiIhIjjtx4kTqgRrjx49X2ctBGuHzIjt37qRGjRokJiay\nfv166tWr53QkERGRHNO9e3emTp1KgwYNWL16NQEBGofKjEb4fEiVKlUYNGgQ4Dply99//+1wIhER\nkZyxZs0apk6dSr58+XjnnXdU9nKY3l0vM3ToUK6//np++OEHxowZ43QcERERj0tISKBnz54ADBky\nhJtuusnhRL5PU7peaM2aNTRq1IigoCA2btxI9erVnY4kIiLiMYMGDWL8+PHcdNNNfPfdd4SEhDgd\nyetpStcHNWzYkH79+nHu3Dm6dOlCYmKi05FEREQ8YsOGDUyYMIGAgADef/99lb1cosLnpcaMGcO1\n117Ltm3bUk9GKSIikpedPn2aLl26YK1l0KBB1KlTx+lIfkNTul4sKiqKxo0ba2pXRER8wjPPPMNr\nr71GlSpV2Lx5s0b3LoGmdH1Yo0aN/jW1q6N2RUQkr1q/fj0TJ04kMDBQU7kOUOHzcmPGjKFixYps\n27aNUaNGOR1HRETkksXHx6dO5b7wwgvUqlXL6Uh+R1O6ecD69etp2LAh1lqioqJo0KCB05FERESy\nrFu3bkybNo1bbrmFjRs3ki9fPqcj5Tma0vUDd955Jy+88ALWWjp37swff/zhdCQREZEsWbBgAdOm\nTSN//vzMnj1bZc8hKnx5xMiRI7nttts4cOAAffv2dTqOiIjIRR06dIju3bsDrmvlVqlSxeFE/ktT\nunnI7t27qVGjBqdPn2bWrFl06tTJ6UgiIiIZSk5OplmzZnzxxRfce++9LF26FGOyPSPp9zSl60cq\nVarE66+/DkDv3r3Zv3+/s4FEREQy8dprr/HFF19QqlQppk+frrLnMI3w5THWWtq3b88nn3xC7dq1\nWbdunfaHEBERr7Jx40bq1atHYmIiS5Ys4f7773c6Up6nET4/Y4xh6tSphIWFER0dzeDBg52OJCIi\nkuqPP/6gQ4cOJCYm0q9fP5U9L6ERvjzqm2++oX79+pw7d47FixfTqlUrpyOJiIifSzsLVbNmTb76\n6iudYNlDNMLnp26//XbGjh0LQJcuXYiJiXE4kYiI+LtJkybxySefULRoUebNm6ey50U0wpeHWWtp\n1aoVS5cu5fbbb2ft2rUEBwc7HUtERPxQdHQ0d955J4mJicyfP5/27ds7HcmnaITPjxljeP/997nm\nmmv45ptvGDhwoNORRETEDx0/fpyHHnqIxMREnnzySZU9L6QRPh/w9ddf07BhQxITE3V+PhERyVVJ\nSUncd999REZGUqtWLdavX6+p3BygET6hbt26qefn69atG9u3b3c4kYiI+IsRI0YQGRlJyZIlmT9/\nvsqel9IIn4+w1vLEE0/w/vvvU7FiRTZt2kTx4sWdjiUiIj7sk08+oV27dgQEBPD555/TpEkTpyP5\nLI3wCeD6QXjrrbcIDw/n559/5pFHHiEpKcnpWCIi4qN27drFY489BsCrr76qsuflVPh8SIECBVi4\ncCElSpRg+fLljBw50ulIIiLig/7880/atm1LfHw8Dz/8MM8884zTkeQiNKXrg1atWkXz5s1JTk7m\no48+4uGHH3Y6koiI+IikpCRat27NsmXLuOWWW9iwYQOFChVyOpbP05SunKdp06a89tprADz++ONE\nR0c7nEhERHzFoEGDWLZsGSVKlOCTTz5R2csjNMLno6y19OrViylTplCmTBk2btzI1Vdf7XQsERHJ\nw6ZOnUr37t0JDg5m1apVNGjQwOlIfuNyR/hU+HxYYmIizZo1IyoqivDwcNauXau/xEREJFtWr15N\ns2bNOHfuHNOmTeOJJ55wOpJf0ZSuZCo4OJj58+dz3XXXsWXLFiIiIkhOTnY6loiI5DF79uyhffv2\nnDt3jueee05lLw9S4fNxJUqUYOnSpYSGhrJgwQIGDx7sdCQREclD4uLiuP/++zlx4gQtW7Zk7Nix\nTkeSbFDh8wM33XQT8+fPJygoiPHjx/Pmm286HUlERPKAM2fO0KpVK3bv3s0tt9zCrFmzCAwMdDqW\nZIMKn59o2rQpU6dOBeDJJ59k0aJFDicSERFvlpSUxKOPPsqGDRu4+uqr+eyzzyhSpIjTsSSbVPj8\nSEREBC+99BLWWjp27MjXX3/tdCQREfFC1lqefvppFi5cSGhoKCtWrKBcuXJOx5LLoKN0/Yy1lh49\nejB16lRKlCjB119/zQ033OB0LBER8SITJkxg4MCB5MuXj8jISBo1auR0JL+n07Jkk78WPoBz587R\nqlUrli9fzrXXXsv69eu56qqrnI4lIiJeYPbs2TzyyCMAulqTF9FpWeSSBQUFMW/ePGrVqsUvv/xC\n8+bNOX78uNOxRETEYcuWLSMiIgKA8ePHq+z5EBU+P1W4cGGWL1/OTTfdxI4dO7jvvvs4deqU07FE\nRMQh69at44EHHuDcuXMMHDiQZ5991ulI4kGa0vVzv/76K/Xq1ePAgQM0a9aMTz/9lJCQEKdjiYhI\nLtqyZQuNGzfm5MmTdO/enXfeeQdjsj17KDlAU7pyWa6++mo+//xzSpUqxcqVK+ncuTNJSUlOxxIR\nkVzy008/0aJFC06ePEmHDh14++23VfZ8kAqfUKlSJSIjIylatCgff/wx3bt31yXYRET8QExMDHff\nfTdHjx6lRYsWzJw5UydW9lEqfAJAjRo1WLp0KQUKFOC9996jV69eKn0iIj7swIEDNG7cmIMHD1Kv\nXj0WLFhAvnz5nI4lOUSFT1LVr1+fpUuXkj9/ft5991369euH9nMUEfE9v/76K40bN+aXX36hdu3a\nLFu2jIIFCzodS3KQCp/8S5MmTVIP3Hj77bcZMGCASp+IiA85dOgQjRs35ueff6ZWrVpERkYSGhrq\ndCzJYSp8cp67776bRYsWkS9fPt544w2eeeYZlT4RER9w+PBhmjRpwt69ewkPD2flypUUK1bM6ViS\nC1T4JEMtWrRg4cKFBAcHM3HiRAYNGqTSJyKSh/322280adKE3bt3U716dT7//HOKFy/udCzJJSp8\nkqn77ruP+fPnExQUxIQJE3juuedU+kRE8qDffvuNu+66i59++olbbrmFVatWccUVVzgdS3KRCp9c\nUKtWrZg3bx7BwcH83//9H3369NHRuyIieUhMTAwNGjRg165dVKtWjS+++IISJUo4HUtyma60IVny\n2Wef0b59exISEujcuTPTp08nKCjI6VgiInIBu3fvpmnTphw8eJDw8HAiIyMpWbKk07EkGy73Shsq\nfJJlq1evpmXLlpw6dYr27dsze/ZsnbNJRMRLbd++nWbNmhEbG0u9evVYtmyZjsbNw3RpNck1jRs3\n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\nvMsjiwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,-numpy.pi/2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is so nice. We have reproduced the trajectories that Lanchester found more than a hundred years ago, painstakingly drawing them by hand with a contraption called a \"trammel.\" It must have taken him days!\n", + "\n", + "Here is how the different phugoid curves are drawn in von Kármán's book, _Aerodynamics_ (1957). He never says _how_ he drew them, but we're guessing by hand, also. We did pretty good!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/vonKarman-phugoids.png)\n", + "\n", + "#### Figure 4. Phugoid curves in von Kármán (1957)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the next notebook of this series, we'll look at the differential equation that arises when you consider small perturbations on the horizontal phugoid, and we'll learn to numerically integrate that to get the flight paths." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Lanchester, F. W. _Aerodonetics_, D. van Nostrand Company: New York, 1909. On the public domain. [Get it from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PP1#v=onepage&q&f=false).\n", + "\n", + "2. Milne-Thompson, L. M. _Theoretical Aerodynamics_, Dover 2012 reprint of the revised 1966 edition. [Read on Google Books](http://books.google.com/books?id=EMfCAgAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see section 18.5)\n", + "\n", + "3. Sinha, N. K. and Ananthkrishnan, N. _Elementary Flight Dynamics with an introduction to Bifurcation and Continuation Methods_, CRC Press, 2013. [Read on Google Books](http://books.google.com/books?id=yXL6AQAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see chapter 5)\n", + "\n", + "4. von Kármán, T. _Aerodynamics_, Dover 2004 reprint of the 1957 2nd edition. (see pages 149–151)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Execute this cell to load the notebook's style sheet, then ignore it\n", + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/.ipynb_checkpoints/01_02_Phugoid_Oscillation-checkpoint.ipynb b/lecture_22/01_phugoid/.ipynb_checkpoints/01_02_Phugoid_Oscillation-checkpoint.ipynb new file mode 100644 index 0000000..eb6283b --- /dev/null +++ b/lecture_22/01_phugoid/.ipynb_checkpoints/01_02_Phugoid_Oscillation-checkpoint.ipynb @@ -0,0 +1,949 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth. Partly based on David Ketcheson's pendulum lesson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Oscillation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome back! This is the second IPython Notebook of the series _\"The phugoid model of glider flight\"_, the first learning module of the course [**\"Practical Numerical Methods with Python.\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about)\n", + "\n", + "In the first notebook, _\"Phugoid Motion\"_, we described the physics of an aircraft's oscillatory trajectory, seen as an exchange of kinetic and potential energy. This analysis goes back to Frederick Lanchester, who published his book _\"Aerodonetics\"_ on aircraft stability in 1909. We concluded that first exposure to our problem of interest by plotting the flight paths predicted by Lanchester's analysis, known as _phugoids_.\n", + "\n", + "Here, we will look at the situation when an aircraft is initially moving on the straight-line phugoid (obtained with the parameters $C=2/3$, $\\cos\\theta=1$, and $z=z_t$ in the previous analysis), and experiences a small upset, a wind gust that slightly perturbs its path. It will then enter into a gentle oscillation around the previous straight-line path: a _phugoid oscillation_.\n", + "\n", + "If the aircraft experiences an upward acceleration of $-d^2z/dt^2$, and we assume that the perturbation is small, then $\\cos\\theta=1$ is a good approximation and Newton's second law in the vertical direction is:\n", + "\n", + "$$\\begin{equation}\n", + "L - W = - \\frac{W}{g}\\frac{d^2 z}{dt^2}\n", + "\\end{equation}$$\n", + "\n", + "In the previous notebook, we saw that the following relation holds for the ratio of lift to weight, in terms of the trim velocity $v_t$:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}=\\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "This will be useful: we can divide Equation (1) by the weight and use Equation (2) to replace $L/W$. Another useful relation from the previous notebook expressed the conservation of energy (per unit mass) as $v^2 = 2 gz$. With this, Equation (1) is rearranged as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d^2z}{dt^2} + \\frac{gz}{z_t} = g\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look at Equation (3) for a moment. Does it ring a bell? Do you recognize it?\n", + "\n", + "If you remember from your physics courses the equation for _simple harmonic motion_, you should see the similarity! \n", + "\n", + "Take the case of a simple spring. Hooke's law is $F=-kx$, where $F$ is a restoring force, $x$ the displacement from a position of equilibrium and $k$ the spring constant. This results in the following ordinary differential equation for the displacement:\n", + "\n", + "$$\\begin{equation}\n", + " \\frac{d^2 x}{dt^2}= -\\frac{k}{m}x\n", + "\\end{equation}$$\n", + "\n", + "which has the solution $x(t) = A \\cos(\\omega t- \\phi)$, representing simple harmonic motion with an angular frequency $\\omega=\\sqrt{k/m}=2\\pi f$ and phase angle $\\phi$.\n", + "\n", + "Now look back at Equation (3): it has nearly the same form and it represents simple harmonic motion with angular frequency $\\omega=\\sqrt{g/z_t}$ around mean height $z_t$. \n", + "\n", + "Think about this for a moment ... we can immediately say what the period of the oscillation is: exactly $2 \\pi \\sqrt{z_t/g}$ — or, in terms of the trim velocity, $\\pi \\sqrt{2} v_t/g$.\n", + "\n", + "_This is a remarkable result!_ Think about it: we know nothing about the aircraft, or the flight altitude, yet we can obtain the period of the phugoid oscillation simply as a function of the trim velocity. For example, if trim velocity is 200 knots, we get a phugoid period of about 47 seconds—over that time, you really would not notice anything if you were flying in that aircraft.\n", + "\n", + "Next, we want to be able to compute the trajectory of the aircraft for a given initial perturbance. We will do this by numerically integrating the equation of motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare to integrate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to integrate the differential equation and plot the trajectory of the aircraft. Are you ready?\n", + "\n", + "The equation for the phugoid oscillation is a second-order, ordinary differential equation (ODE). Let's represent the time derivative with a prime, and write it like this:\n", + "\n", + "$$\\begin{equation}\n", + "z(t)'' + \\frac{g \\,z(t)}{z_t}=g\n", + "\\end{equation}$$\n", + "\n", + "There's a convenient trick when we work with ODEs: we can turn this 2nd-order equation into a system of two 1st-order equations. Like this:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z'(t) &=& b(t)\\\\\n", + "b'(t) &=& g\\left(1-\\frac{z(t)}{z_t}\\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Are you following? Make sure you are following the derivations, even if it means writing the equations down in your own notes! (Yes, the old-fashioned paper way.)\n", + "\n", + "Another way to look at a system of two 1st-order ODEs is by using vectors. You can make a vector with your two independent variables, \n", + "\n", + "$$\\begin{equation}\n", + "\\vec{u} = \\begin{pmatrix} z \\\\ b \\end{pmatrix}\n", + "\\end{equation}$$\n", + "\n", + "and write the differential system as a single vector equation:\n", + "\n", + "\\begin{equation}\n", + "\\vec{u}'(t) = \\begin{pmatrix} b\\\\ g-g\\frac{z(t)}{z_t} \\end{pmatrix}\n", + "\\end{equation}\n", + "\n", + "If you call the right-hand-side $\\vec{f}(\\vec{u})$, then the equation is very short: $\\vec{u}'(t) = \\vec{f}(\\vec{u})$—but let's drop those arrows to denote vectors from now on, as they are a bit cumbersome: just remember that $u$ and $f$ are vectors in the phugoid equation of motion.\n", + "\n", + "Next, we'll prepare to solve this problem numerically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initial value problems" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's step back for a moment. Suppose we have a first-order ODE $u'=f(u)$. You know that if we were to integrate this, there would be an arbitrary constant of integration. To find its value, we do need to know one point on the curve $(t, u)$. When the derivative in the ODE is with respect to time, we call that point the _initial value_ and write something like this:\n", + "\n", + "$$u(t=0)=u_0$$\n", + "\n", + "In the case of a second-order ODE, we already saw how to write it as a system of first-order ODEs, and we would need an initial value for each equation: two conditions are needed to determine our constants of integration. The same applies for higher-order ODEs: if it is of order $n$, we can write it as $n$ first-order equations, and we need $n$ known values. If we have that data, we call the problem an _initial value problem_.\n", + "\n", + "Remember the definition of a derivative? The derivative represents the slope of the tangent at a point of the curve $u=u(t)$, and the definition of the derivative $u'$ for a function is:\n", + "\n", + "$$u'(t) = \\lim_{\\Delta t\\rightarrow 0} \\frac{u(t+\\Delta t)-u(t)}{\\Delta t}$$\n", + "\n", + "If the step $\\Delta t$ is already very small, we can _approximate_ the derivative by dropping the limit. We can write:\n", + "\n", + "$$\\begin{equation}\n", + "u(t+\\Delta t) \\approx u(t) + u'(t) \\Delta t\n", + "\\end{equation}$$\n", + "\n", + "With this equation, and because we know $u'(t)=f(u)$, if we have an initial value, we can step by $\\Delta t$ and find the value of $u(t+\\Delta t)$, then we can take this value, and find $u(t+2\\Delta t)$, and so on: we say that we _step in time_, numerically finding the solution $u(t)$ for a range of values: $t_1, t_2, t_3 \\cdots$, each separated by $\\Delta t$. The numerical solution of the ODE is simply the table of values $t_i, u_i$ that results from this process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to execute the process described above and find the numerical solution of the ODE, we start by choosing the values $t_1,t_2,t_3 \\cdots t_n$—we call these values our *grid* in time. The first point of the grid is given by our _initial value_, and the small difference between two consecutive times is called the _time step_, denoted by $\\Delta t$. The solution value at time $t_n$ is denoted by $u_n$.\n", + "\n", + "Let's build a time grid for our problem. We first choose a final time $T$ and the time step $\\Delta t$. In code, we'll use readily identifiable variable names: `T` and `dt`, respectively. With those values set, we can calculate the number of time steps that will be needed to reach the final time; we call that variable `N`. \n", + "\n", + "Let's write some code. The first thing we do in Python is load our favorite libraries: NumPy for array operations, and the Pyplot module in Matplotlib, to later on be able to plot the numerical solution. The line `%matplotlib inline` tells IPython Notebook to show the plots inline." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy \n", + "from matplotlib import pyplot\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, initialize `T` and `dt`, calculate `N` and build a NumPy array with all the values of time that make up the grid." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100.0\n", + "dt = 0.02\n", + "N = int(T/dt)+1\n", + "t = numpy.linspace(0.0, T, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have our grid! Now it's time to apply the numerical time stepping represented by Equation (10)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Write the code above using the NumPy function `arange()` instead of `linspace()`. If you need to, read the documentation for these functions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Enter a question mark followed by any function, e.g., `?numpy.linspace`, into a code cell and execute it, to get a help pane on the notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The approximate solution at time $t_n$ is $u_n$, and the numerical solution of the differential equation consists of computing a sequence of approximate solutions by the following formula, based on Equation (10):\n", + "\n", + "$$u_{n+1} = u_n + \\Delta t \\,f(u_n).$$\n", + "\n", + "This formula is called **Euler's method**.\n", + "\n", + "For the equations of the phugoid oscillation, Euler's method gives the following algorithm that we need to implement in code:\n", + "\n", + "\\begin{align}\n", + "z_{n+1} & = z_n + \\Delta t \\, b_n \\\\\n", + "b_{n+1} & = b_n + \\Delta t \\left(g - \\frac{g}{z_t} \\, z_n \\right).\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To apply the numerical solution method, we need to set things up in code: define the parameter values needed in the model, initialize a NumPy array to hold the discrete solution values, and initialize another array for the elevation values." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# initial conditions\n", + "z0 = 100. #altitude\n", + "b0 = 10. #upward velocity resulting from gust\n", + "zt = 100.\n", + "g = 9.81\n", + "\n", + "u = numpy.array([z0, b0])\n", + "\n", + "# initialize an array to hold the changing elevation values\n", + "z = numpy.zeros(N)\n", + "z[0] = z0 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should pay attention to a couple of things: (1) See how there is a dot after the numbers used to define our parameters? We just want to be explicit (as a good habit) that these variables are real numbers, called \"floats.\" (2) We both _created_ and _initialized_ with zeros everywhere the solution vector `z`. Look up the documentation for the handy NumPy function `zeros()`, if you need to. (3) In the last line above, we assign the _initial value_ to the first element of the solution vector: `z[0]`.\n", + "\n", + "Now we can step in time using Euler's method. Notice how we are time stepping the two independent variables at once in the time iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-loop using Euler's method\n", + "for n in range(1,N):\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make sure you understand what this code is doing. This is a basic pattern in numerical methods: iterations in a time variable that apply a numerical scheme at each step." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the code is correct, we have stored in the array `z` the position of the glider at each time. Let's use Matplotlib to examine the flight path of the aircraft.\n", + "\n", + "You should explore the [Matplotlib tutorial](http://matplotlib.org/users/pyplot_tutorial.html) (if you need to) and familiarize yourself with the command-style functions that control the size, labels, line style, and so on. Creating good plots is a useful skill: it is about communicating your results effectively. \n", + "\n", + "Here, we set the figure size, the limits of the vertical axis, the format of tick-marks, and axis labels. The final line actually produces the plot, with our chosen line style (continuous black line)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAncAAAEZCAYAAAD13APVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdYVUf+P/D3iNhjB0TFgg1FBWOvoIJUr4qoaCyRrEnW\nElP8JvmlbEjZJJtkN+4mm0SNRgQ0FgSUqiAoWAIqNmxRsYAiigUVpN35/QHXJYTOuXfOOffzeh4e\n8N5zZ97kRvkwM2eGcc5BCCGEEELUoZHoAIQQQgghRDpU3BFCCCGEqAgVd4QQQgghKkLFHSGEEEKI\nilBxRwghhBCiIlTcEUIIIYSoCBV3hBBCCCEqYrDijjE2gTG2izGWwRjTMsYWVXJNX8bYTsbYfcbY\nE8bYMcaYTbnnmzLGvmOM3WGMPWaMhTHGuhjqeyCEEEIIkTtDjty1BHAKwEoA+QD+sHsyY6wngIMA\nLgOYCMAWwPsAHpe7bDUALwA+AMYDaA0gnDFGI5CEEEIIIQCYiBMqGGOPACzjnG8q99hmACWc8wVV\nvKYNgGwAL3LOt5Q91hXANQBunPM9+k9OCCGEECJvshjxKht58wRwjjEWzRjLZowlM8Zml7tsKABT\nAM+KOM55BoBzAMYYNDAhhBBCiEzJorgDYA6gFYD3AEQDcAKwBUAQY8y97JpOKB3Zy6nw2tsALAwV\nlBBCCCFEzhqLDlBGV2SGcs5Xl319ijE2DMByAJFiYhFCCCGEKItciru7AIoBnK3w+HkAc8q+zgJg\nwhjrUGH0rhOAAxUbZIwZfjEhIYQQQkg9cc6ZFO3IorjjnBcyxlIA2FR4qi+Aq2VfHwNQBGAKSqds\ndTdU2AA4VEW7+ohLDMDPzw9+fn6iY5B6oPdO2ej9UzZ6/5SLMUnqOgAGLO4YYy0B9Cn7YyMA3Rlj\n9gByOOc3AHwFYBtjLBFAPEq3Q5kDYBoAcM4fMsbWA/iKMZYN4B6AfwE4CSDWUN8HIYQQQoicGfKG\niuEAjpd9NAPwcdnXHwMA5zwMwMsAVqF0P7xlABZwzqPKtfE6gBAAWwEkAcgFMJXTEB0hhBBCCAAD\njtxxzhNQQzHJOfcH4F/N84UAXiv7ICrm6OgoOgKpJ3rvlI3eP2Wj948AgjYxNgTGGA3oEUIIIUQR\nGGOS3VAhl33uCCGEEEKIBKi4I4QQQghRESruCCGEEEJUhIo7QgghhBAVoeKOEEIIIURFqLgjhBBC\nCFERKu4IIYQQQlSEijtCCCGEEBWh4o4QQgghREWouCOEEEIIUREq7gghhBBCVISKO0IIIYQQFaHi\njhBCCCFERai4I4QQQghRESruCCGEEEJUhIo7QgghhBAVoeKOEEIIIURFqLgjhBBCCFERKu4IIYQQ\nQlSEijtCCCGEEBWh4o4QQgghREWouCOEEEIIUREq7gghhBBCVISKO0IIIYQQFaHijhBCCCFERQxW\n3DHGJjDGdjHGMhhjWsbYomquXVN2zVsVHm/KGPuOMXaHMfaYMRbGGOui//SEEEIIIcpgyJG7lgBO\nAVgJIB8Ar+wixpg3gOEAblZyzWoAXgB8AIwH0BpAOGOMRiAJIYQQQgA0NlRHnPMoAFEAwBjbWNk1\njLHuKC3gJgOIrvBcGwC+AF7knMeVPbYAwDUATgD26Cs7IYQQQohSyGbEizHWGMAWAJ9yzi9UcslQ\nAKYoV8RxzjMAnAMwxiAhCSGEEEJkTjbFHYCPAWRzztdU8XwnACWc85wKj98GYKHXZIQQQgghCmGw\nadnqMMYcASwCYF/xKcOnIYQQQghRLlkUdwAcAFgCuMXYs3rOBMA/GGMrOefdAGQBMGGMdagwetcJ\nwIHKGvXz83v2taOjIxwdHaVPTgghhBBSRwkJCUhISNBL24zzSm9a1SvG2CMAyzjnm8r+bAbArPwl\nAGIAbAawjnP+e9kNFdkovaFiS9nruqL0hgpXzvneCn1wEd8bIYQQQkhdMcbAOZdkxtJgI3eMsZYA\n+pT9sRGA7owxewA5nPMbAO5UuL4IQBbn/HcA4Jw/ZIytB/AVYywbwD0A/wJwEkCsgb4NQgghhBBZ\nM+QNFcMBHC/7aIbSGyiOl32urdcBhADYCiAJQC6AqTRERwghhBBSSsi0rCHQtCwhhBBClELKaVk5\nbYVCCCGEEEIaiIo7QgghhBAVoeKOEEIIIURFqLgjhBBCCFERKu4IIYQQUidJSUnw9fWFvb09Bg4c\niLlz5yIqKgp0I6M80N2yhBBCDC4/Px9hYWFISUlBYWEhBgwYgBkzZqBTp06io5FqPHjwAK+88gpS\nUlKwYsUKjB8/HqampkhOTsZ3332Hjh07wt/fH1ZWVqKjKg7dLUsIIQAyMzMRFhaGrVu3IjU1FSUl\nJaIjkRpwzrFx40b06NED/v7+MDMzQ69evXD48GH0798f//d//4f8/HzRMUklbty4gTFjxsDMzAxp\naWl44403MGzYMNjZ2WHJkiVITU3F5MmTMWbMGJw5c0Z0XKNGI3fE6GVlZSEvLw+dO3dGs2bNRMch\ntXD+/Hm89dZb+O233zBy5Ei0aNECp0+fRnFxMf72t79hwYIFKHdONZGJ4uLiZ0XAxo0bYW9v/4fn\ns7OzsWzZMqSnpyMiIgIWFhaCkpKKcnJyMG7cOCxevBhvv/12tddu3rwZq1atwsGDB9GzZ08DJVQ+\nGrkjpIHy8vLw97//HT169ICtrS0mTZqEDh06QKPR4MiRI6LjkWps3LgR48ePh4uLCzIyMhAREYHt\n27fj/Pnz2LhxI/71r3/B29sbeXl5oqOSckpKSuDj44Pbt2/j4MGDfyrsAMDc3Bzbtm2Dp6cnHBwc\nkJOTIyApqaikpATe3t7w9PSssbADgHnz5uHdd9+Fp6cnHj9+bICEpCIq7uqJc46YmBjMnDkTlpaW\naNWqFQYOHIi3334b169fFx2PVOP48eMYNGgQTp8+jdDQUNy9exdXr15FVlYWPDw84OXlhVWrVtEU\nnwz985//xMcff4zExES89tprfxppHTduHJKTk9GiRQs4OzvjyZMngpKSit5++23k5OQgNDQULVu2\nrPI6xhj8/Pwwbdo0aDQaFBQUGDAlqcznn38OAPjyyy9r/ZrXXnsNI0aMwJtvvqmvWKQ6nHNVfpR+\na/qRlZXFp06dym1sbPjPP//Mr169yh8+fMiPHj3K33rrLd6hQwe+evVqrtVq9ZaB1E9MTAzv2LEj\n3759e5XX5OTk8MmTJ/Np06bxgoICA6Yj1QkKCuLdunXjGRkZNV6r1Wr5iy++yD08PHhRUZEB0pHq\nhISEcGtra56Tk1Pr15SUlPBp06bxN998U4/JSE2OHTvGzc3Na/X3rqKHDx/yHj168PDwcD0kU5+y\nukWaGkiqhuT2oa/i7sKFC9za2pq/++67Vf7gv3TpEre3t+e+vr68uLhYLzlI3SUnJ3MzMzOemJhY\n47UFBQV82rRpfN68ebykpMQA6Uh1UlNTeceOHfmpU6dq/ZrCwkI+efJk/sEHH+gxGanJrVu3uIWF\nBT948GCdX3v37l3etWtXHhMTo4dkpCYlJSV85MiRfP369fVuIy4ujnfv3p3n5eVJmEydqLgTVNxd\nv36dW1lZ8XXr1tV47ePHj/nEiRP5kiVLaARPBjIzM7mlpSUPCwur9Wvy8vL4mDFj+KeffqrHZKQm\neXl5fMCAATwgIKDOr7116xbv1KkTT0hI0EMyUhve3t78vffeq/frIyMjubW1NRUHAqxdu5aPGTOm\nwb/gent7848//liiVOpFxZ2A4u7Ro0d84MCB/Ouvv671a3Jzc/mwYcP4l19+KWkWUjclJSXcycmJ\n+/n51fm1GRkZ3MLColajfUQ/3nrrLT5nzpx6/5IUHh7Oe/bsScWBAPv27eM9evRo8H/7mTNn8g8/\n/FCiVKQ2njx5wi0tLfnRo0cb3NbVq1d5hw4d6jW1a0ykLO5oK5Raeumll6DVarFhw4Y6bbFw48YN\nDB8+HNu2bcOECRMky0Nqb/Xq1dixYwcSEhLQuHHjOr8+PDwcK1asQFpaGlq0aKGHhKQqZ8+ehaOj\nI9LS0mBmZlbvdmbNmoUBAwbg448/ljAdqU5xcTGGDBkCPz8/zJw5s0FtZWRkwM7ODqdOnUKXLl0k\nSkiq88033+DIkSPYsWOHJO2tWrUKhYWF+M9//iNJe2ok5VYoVNzVwvbt2/H+++/j+PHjaNWqVZ1f\nHxUVhVdffRVpaWn1ej2pv5s3b2Lw4ME4fPgw+vTpU+925s6dix49euCLL76QMB2pDucczs7O0Gg0\neO211xrUVkZGBuzt7ZGcnAxra2uJEpLqbNiwAf7+/khISJBkz8F33nkHDx8+xE8//SRBOlKdR48e\noXfv3ti3bx9sbW0lafP27dvo378/Tp8+TQV6Fai4qwWpirsHDx5gwIABCAkJwciRI+vdzqJFi9Cu\nXTusXr26wZlI7c2bNw89e/bE3//+9wa1c+vWLQwePBj79+/HgAEDJEpHqrN79268++67OHHiBExN\nTRvc3ieffILff/8dAQEBEqQj1SkqKoKNjQ1++eUXyWYscnJy0K9fPxw5cgS9e/eWpE1SuX/84x84\nefIkNm/eLGm7q1atQkFBAb777jtJ21ULKu5qQaribsWKFSgsLMSaNWsa1E5OTg5sbW0RERGBoUOH\nNjgXqVlSUhLmzZuHc+fOVbuvVm3985//RGJiIkJDQyVIR6rDOcfQoUPxt7/9DdOnT5ekzdzcXPTp\n00fS0QhSuY0bN8Lf3x/x8fGStvvJJ5/gypUr2Lhxo6Ttkv8pLCxEz549ERkZCTs7O0nbzsrKQv/+\n/XHp0iV06NBB0rbVQMriTviND/r6gAQ3VJw8eZKbm5vzu3fvNrgtzjlfs2YNd3R0pLtnDUCr1XIH\nBwe+YcMGydrMy8vjXbt25YcOHZKsTVK5kJAQbm9vL/nfla+//prPmDFD0jbJHxUXF/PevXvz+Ph4\nydvOycnh7dq1o4X5ehQQEMAnT56st/YXLVrEv/jiC721r2Sgu2UNU9xNnTqVr169usHt6BQVFXEb\nGxseEREhWZukcrGxsbxPnz6Sb2D7888/cwcHByrQ9Uir1XJ7e3seGhoqedt5eXncwsKCp6WlSd42\nKRUcHMxHjx6tt/Zfe+01/n//9396a9+YabVaPmTIEL3+jEpNTeVdunThhYWFeutDqaQs7uj4sSr8\n9ttvSE1NxSuvvCJZm40bN8aXX36Jd955B1qtVrJ2yR9xzvHhhx/io48+qtfdsdVZtGgRMjIycPDg\nQUnbJf8TExMDrVYLjUYjedvNmzfHsmXL8M9//lPytkmpf//731i5cqXe2n/jjTewfv165Obm6q0P\nY3XgwAHk5eXB1dVVb33Y29ujT58+kt2FSypHxV0VPvzwQ3z44Yd/OruyoTQaDZo1a4awsDBJ2yX/\nc+DAAeTk5MDHx0fyths3boxVq1bhH//4h+Rtk1KrV6/GG2+8IckdlpVZunQpQkJCcOvWLb20b8xO\nnDiBy5cvw8vLS2999OjRA05OTvjll1/01oexWrt2LZYuXYpGjfRbGqxYsYLuetYzuqGiEocOHcL8\n+fNx4cIFSe7SqygkJASff/45kpOT9fYDzJhNmzYNbm5uePXVV/XSfn5+PqytrbF3714MHDhQL30Y\nq7Nnz2LSpEm4evWq5L9Ylbd8+XK0bt362YHoRBq+vr7o3bs33nvvPb32k5CQgKVLlyItLY3+DZXI\nvXv3YG1tjStXrqB9+/Z67auwsBDdunXDgQMH0LdvX732pSRS3lBBI3eV+Oabb/Dmm2/qpbADSouP\nJ0+eIDY2Vi/tG7OLFy/i8OHDWLhwod76aN68OVasWIFvvvlGb30Yq//85z949dVX9VrYAcDKlSvx\n888/o6CgQK/9GJOcnByEhITg5Zdf1ntfDg4O0Gq1SEpK0ntfxiIwMBAeHh56L+wAoEmTJliwYAE2\nbNig976MFY3cVXDp0iWMHj0aV69elWT7jKps2rQJ/v7+iIuL01sfxmjp0qXo0KEDPv30U732c+/e\nPfTq1Qu///47OnbsqNe+jIXuv+m5c+fQqVMnvffn5OSEl156CXPnztV7X8bgu+++w5EjRxAUFGSQ\n/lavXo2UlBSD9admnHMMHjwY3333HRwdHQ3S5/nz5zFx4kRcv35dbwMpSkMjd3q0evVqvPzyy3ot\n7ADAx8cHZ8+exdmzZ/XajzG5f/8+tmzZgmXLlum9r/bt22P69On0m6eEgoKC4OrqapDCDgBeffXV\nBu9fSf5nw4YN8PX1NVh/CxcuREREBO7evWuwPtUqOTkZT58+hYODg8H6tLGxQa9evRAZGWmwPo0J\nFXfl3Lt3D0FBQVi+fLne+2rSpAlefvllfP/993rvy1gEBgYatDhYunQpfvrpJ5SUlBikPzXjnGP9\n+vX4y1/+YrA+p02bhgsXLuDcuXMG61OtUlNTcf/+fUycONFgfbZv3x5Tp06lkTsJ+Pv7Y/HixQZf\nv+jr60s3xuiJwYo7xtgExtguxlgGY0zLGFtU7rnGjLF/MMZOMsYeM8ZuMsaCGGNWFdpoyhj7jjF2\np+y6MMaYZIfU+fv7w8PDA5aWllI1Wa1XXnkFW7ZswcOHDw3Sn5pxzrFu3TosWbLEYH0OHz4c7du3\nR0xMjMH6VKvjx48jNzfXoMWBqakpfH19sXbtWoP1qVYbNmzA4sWL9X6XZUULFy6k4+QaqKioCNu3\nbxeyPGHmzJmIj4/HgwcPDN632hnyb2JLAKcArASQD4BXeG4IgM/KPk8DYAUgmjFmUu661QC8APgA\nGA+gNYBwxliDvw/OOdauXSvpvnY16dy5M1xcXODv72+wPtUqOTkZeXl5BlsvorN06VL8+OOPBu1T\njX7++Wf4+voavDh46aWXEBQUhKKiIoP2qyZPnz7Fli1b8OKLLxq870mTJuHmzZs0+toAe/fuRZ8+\nfdCzZ0+D992mTRs4OTlh586dBu9b7Qz2LynnPIpz/gHnPBiAtsJzDznnUzjn2znnv3POUwC8AqA/\nABsAYIy1AeALYBXnPI5zngpgAYDBAJwami8pKQmMMYwbN66hTdXJsmXL8OOPP0KtN7YYytq1a7Fk\nyRKDFwezZ89GYmIisrKyDNqvmuTl5WHr1q1CigNra2v07dsX0dHRBu9bLXbv3g07Ozt0797d4H2b\nmJhg3rx5CAwMNHjfarF582bMmzdPWP9z587F5s2bhfWvVnJec9em7PP9ss9DAZgC2KO7gHOeAeAc\ngDEN7WzNmjV4+eWXDb7mYNy4cSgpKcFvv/1m0H7VJDc3Fzt37hRSHLRq1QrTp0+nf5waICQkBKNG\njULXrl2F9L9gwQKa2muAX3/9VWhxsGDBAgQGBtKpP/WQl5eH8PBwzJo1S1gGDw8PHDt2jDYVl5gs\nizvGWBMA/wSwi3N+s+zhTgBKOOc5FS6/DcCiIf3l5OQgPDwcCxYsaEgz9cIYw+LFi2lRaQNs374d\njo6OsLBo0P8G9bZo0SKaWm+AzZs3Y/78+cL6nz17NmJiYmjdTz3k5uYiNjYWM2bMEJbBzs4Obdq0\nQWJiorAMSrV7926MGjVK2L+dQOm+oRqNBtu2bROWQY2kPXhTAoyxxgACUbqezrMhbfn5+T372tHR\nscr1WEFBQfDw8ECHDh0a0l29LVy4EIMGDcK3336LFi1aCMmgZEFBQQbZ/qQqDg4OePjwIU6cOAF7\ne3thOZTo7t27OHjwILZu3SosQ7t27eDk5IQdO3YY9G5dNdi1axcmTJhgkI1vqzN//nxs3rzZoFt5\nqMHmzZtlsc/jvHnz8NFHH+n1TGI5SkhIQEJCgn4a55wb/APAIwALK3m8MYDtAM4CMK/w3CSUrtXr\nUOHxNAAfVdIWr61hw4bxPXv21Pp6fXBzc+MBAQFCMyhRRkYGb9euHc/Pzxea44MPPuCvv/660AxK\n9OOPP/I5c+aIjsFDQkL4+PHjRcdQHA8PDx4YGCg6Br9y5Qo3MzPjRUVFoqMoxsOHD/lzzz3HHzx4\nIDoKLyws5O3bt+c3btwQHUWosrpFkjpLNtOyjDFTAFsBDAQwkXOeXeGSYwCKAEwp95quKL3h4lB9\n+z1//jwyMzMxadKk+jYhCZqarZ8tW7bAy8tL78dV1WTRokXYvHkziouLheZQmi1btshi5MDd3R1p\naWnIyMgQHUUx7t27h8TEREybNk10FPTs2fPZWaWkdiIjIzF+/Hi0adOm5ov1zNTUFJ6enggNDRUd\nRTUMuc9dS8aYPWPMvqzf7mV/tirb7mQ7gJEA5pVezjqVfTQDSu+oBbAewFeMscmMsSEAAgCcBFDv\nQ1oDAwMxd+5cmJiY1HyxHmk0Gpw4cYJ+uNRRYGAgXnjhBdEx0Lt3b/To0QPx8fGioyjGjRs3cObM\nGbi6uoqOgiZNmmDq1KkIDg4WHUUxdu7cCRcXF7Rq1Up0FACAt7c3duzYITqGYoSEhAhdK1mRl5cX\nbYkiIUOO3A0HcLzsoxmAj8u+/hhAVwAaAJYoHaG7We5jdrk2XgcQgtIRviQAuQCmlg1n1plWq0VQ\nUJCQGykqatq0KWbMmCF07ZHSpKWl4e7du7JZZzN79mx6/+pg69atmDFjBpo2bSo6CgBg1qxZ2L59\nu+gYivHrr7/Cx8dHdIxnvL29sXPnTjoxphaePn2KmJgYaDQa0VGemTJlCo4dO0bHyUnEkPvcJXDO\nG5V9mJT72pdzfq2Sx3Ufm8q1Ucg5f41z3pFz3pJzPo1znlnfTIcOHULLli1hZ2cnzTfZQD4+Pvj1\n119Fx1CMoKAgzJs3z+B721Vl9uzZCA0NRWFhoegoiiCXKVkdZ2dnnD17FpmZ9f4nxWjk5OQgJSVF\nFqOuOr1794alpSWSkpJER5G92NhY2NnZwdzcXHSUZ5o3bw5nZ2fs3r1bdBRVkMdPRUECAgIwf/58\ng+9tV5WJEyfixo0b+P3330VHkT3OufD9tSqysrJCv379EBtb71UCRiM9PR03btww+Iki1aGp2doL\nDw/H5MmTZXd3P03N1o7cpmR1aGpWOkZb3BUWFmLHjh2yKg5MTEwwe/ZsGr2rhdTUVJiYmMhm1FVn\n9uzZtF9TLYSEhECj0Qhf61oRTc3WjlyLg1mzZiE4OJg2NK5GcXExdu3ahenTp4uO8iceHh7Yv38/\nHj16JDqK4hltcRcXFwcbGxt069ZNdJQ/8PHxwZYtW+g4shrs2LEDM2fOlM2oq463tzd27dqFgoIC\n0VFkLSQkBF5eXqJj/ImzszPS0tJw8+bNmi82Unl5edi3bx88PDxER/mTvn37ol27dkhJSREdRbaS\nkpLQrVs39OjRQ3SUP2nTpg3Gjh2LqKgo0VEUz2iLu+3btws9cqUqo0ePRl5eHk6fPi06imxxzhEc\nHIyZM2eKjvInXbp0wcCBAxETEyM6imxlZWXhzJkzmDx5sugof9K0aVN4enrS1Gw1YmJiMGLECOEb\nF1dFo9Fg165domPIllxHXXU0Gg3Cw8NFx1A8oyzuioqKEBYWJsuRA8YY3VhRg7S0NDx9+hTDhg0T\nHaVSc+bMoam9aoSFhcHV1VU2d8lW5OXlhbCwMNExZCs0NFSWU3o6VNxVjXMu2ylZHQ8PD0RFRdFd\nzw1klMVdfHw8+vTpI7spWR1vb28EBwfT1GwVdKN2cpuS1Zk2bRoiIyNRVFQkOoosyXVKVsfZ2RnJ\nycl01mwliouLER4eLouNi6syYsQIZGdn48qVK6KjyM6FCxdQUlICW1tb0VGq1K1bN1haWiI5OVl0\nFEUzyuJOrlOyOkOHDkV+fj7OnTsnOoos6dbbyVXXrl3Rq1cv2i2/Eg8ePMChQ4fg5uYmOkqVWrZs\nCQcHB0RGRoqOIjsHDhyAtbU1rKysREepkomJCTw9PWlLjUpERUXB1dVVtr8Y63h6etLUbAMZXXFX\nXFyM0NBQWRcHjDHMmDGDbgmvxMWLF5GTk4PRo0eLjlKt6dOn01E6lQgPD4ejo6NsTjWoyrRp02hq\nrxKhoaGyXq+lQ1OzlYuOjpb1L1Y6Hh4eVNw1kNEVd/v370ePHj1keadQebTfT+WCg4Ph5eUlm42L\nq6Ir7mhq/Y/kPiWr4+npiZiYGNqQuhzOOcLCwmQ9Javj5OSElJQU3L9/X3QU2cjLy8OhQ4dkeSNT\nRaNGjUJmZiZu3LghOopiyfsnpB7IfUpWZ9y4ccjIyEB6erroKLIi9ylZnf79+6N58+Y4fvy46Ciy\nkZ+fj9jYWEydOlV0lBp16tQJNjY2SEhIEB1FNs6ePYtGjRphwIABoqPUSDe1Hh0dLTqKbMTHx2Po\n0KFo3bq16Cg1MjExgZubGyIiIkRHUSyjKu5KSkoQEhKiiOLAxMQE06ZNQ0hIiOgosnHjxg1cu3YN\n48ePFx2lRrqpdZqa/Z/4+HjY2dmhQ4cOoqPUCk3t/VFkZCTc3Nxkv15Lh96/P1LKlKwOTc02jFEV\nd4cOHYKlpSV69eolOkqt0NTsH0VERMDNzQ2NGzcWHaVWaN3dH0VERMhy49uq6Nbd0dR6qcjISLi7\nu4uOUWuenp6Ijo6mu9bL6G6mUAoXFxccOHAAeXl5oqMoklEVd0pZL6IzadIkpKWlISsrS3QUWdi9\ne7cipvR0Ro4cibt37+LSpUuiowjHOVdccde/f380bdoUqampoqMIl5ubi2PHjmHixImio9Sa7hf5\nQ4cOiY4i3KVLl5Cfn4/BgweLjlJr7dq1w/PPP4/4+HjRURTJaIo7JS0G1mnatCnc3d1pQ1UAT548\nQWJiIlxcXERHqbVGjRpBo9HQ+4fSjacByHp/rYoYY/T+lYmNjcXo0aPRsmVL0VHqxN3dnY6ygnK2\nQKnIw8OD1t3Vk9EUdxcuXEB+fj6GDBkiOkqd0JYopeLi4jB8+HC0adNGdJQ6mTZtGk3N4n9Tskr7\n4TJ16lT64QLlTcnquLm5UXEH5U3J6ri4uNBRjvVkNMXdrl27oNFoFPfDxcXFBYcPH8ajR49ERxFq\n9+7d8PT0FB2jziZNmoSTJ0/i3r17oqMIpbQpWZ2xY8fi8uXLRr00gnOOqKgoRRZ3I0aMQEZGBjIy\nMkRHESau8kVnAAAgAElEQVQ/Px9JSUlwdnYWHaXOBg0ahPz8fFraUg9GU9wpbUpW57nnnsPo0aOx\nZ88e0VGE0Wq1CA8PV9R6O51mzZph4sSJRr0lw/3793HixAlFrdfSMTU1hZOTk1G/f6dOnULz5s3R\np08f0VHqzMTEBC4uLkb9/h04cAB2dnZo27at6Ch1xhij0bt6MoriLjs7G2lpaXB0dBQdpV40Go1R\nH6Vz/PhxtG3bFr179xYdpV6Mfd1ITEwMJkyYgObNm4uOUi/u7u5G/f4pdUpWx83NzaiPklPqlKyO\nsRfn9WUUxV1ERAScnZ3RtGlT0VHqxdPTExERESgpKREdRQilTsnqeHh4IDo6GsXFxaKjCKHUKVkd\nNzc3xMbGGu2WGkqdktVxcXHBvn37jPa0EaXtb1eRs7MzDhw4gIKCAtFRFMUoijvdejul6t69Ozp3\n7owjR46IjiKEUqdkdbp06YLu3bvj8OHDoqMYXElJCaKjoxVd3HXq1Mlot9TQTak7ODiIjlJv5ubm\n6Nu3r1G+f+np6bh//z7s7e1FR6m3Dh06wMbGBgcPHhQdRVFUX9zl5+dj3759iv7hApTetWeMU7OZ\nmZm4evUqxowZIzpKg3h6ehrlbuvJycmwtLREt27dREdpEHd3d6Oc2tu7dy/Gjx+v2Cl1HWOdmtVN\nycr9LO6auLq60rq7OlL2O14LcXFxGDJkCNq3by86SoMY61E64eHhcHV1VcypFFUx1nV34eHhiv/F\nCjDedXdKX2+nY6xboih9SlaHbqqoO9UXd0qfktUZNmwY7t+/j8uXL4uOYlBKn5LVGT58OO7cuYP0\n9HTRUQxK6evtdIYPH47bt2/j2rVroqMYjFarVU1xMHz4cGRlZeHGjRuioxhMQUEB9u/fr8gtUCoa\nMWIErl27hlu3bomOohiqLu60Wi12796tyC1QKmrUqBE8PDyMamo2Ly8P+/fvV9SpFFVp1KiR0Y3+\nZGRk4MaNGxg1apToKA1mYmICV1dXoxr9SU1NRdu2bWFtbS06SoOZmJhgypQpRvX+JSYmYsCAAejQ\noYPoKA3WuHFjODk5GfWWYHWl6uIuJSUF7du3R69evURHkYSxbYkSFxeHoUOHol27dqKjSEJ317Ox\niIyMhIuLi+Kn1HWMbd2dWqZkdYxtalYto646tCVK3ai6uFPLlKyOk5MTUlJS8ODBA9FRDEItU7I6\nzs7OOHjwIB4/fiw6ikGoZUpWx8XFBQkJCXj69KnoKAah9C1QKnJxcUF8fLzRbImi9P3tKnJxccHe\nvXuNdkuwujJYcccYm8AY28UYy2CMaRljiyq5xo8xlskYy2OMxTPGBlR4vilj7DvG2B3G2GPGWBhj\nrEtVfaqtuGvRogUmTJhgFL+9cM4RHh6u6P3tKmrdujVGjBiBuLg40VH07unTp4iPj1fVD5f27dtj\n8ODB2L9/v+goenf37l2kpaVh/PjxoqNIxszMDP369UNSUpLoKHp3/fp1ZGdnY9iwYaKjSMbKygoW\nFhY4fvy46CiKYMiRu5YATgFYCSAfAC//JGPsHQBvAlgOYDiAbAB7GWOtyl22GoAXAB8A4wG0BhDO\nGKv0+7hz5w5Gjhwp8bchlrFsiXL8+HG0atUKffv2FR1FUsayJcr+/fsxaNAgVaz3Kc9Ypmb37NkD\nR0dHxW78XhVjmZqNjo7GlClTFL8FSkU0NVt7BnvnOedRnPMPOOfBALTln2OMMQCvA/iCcx7COU8D\nsAjAcwDmlV3TBoAvgFWc8zjOeSqABQAGA3CqrE9PT0/V/c/t6emJqKgo1e+Wr7YpWR3dujvOec0X\nK5jaRl11jKW4U9uUrI6xFHdRUVGqWm+nQ1ui1F6tKp+yKdK/VfJ4e8bYPgly9ARgAeDZrTCc86cA\nDgDQ7V47FIBphWsyAJwrd80fqGlKVqdLly6wtrZW/W7dSj9yrCq9e/dG69atVT21wDlX3Xo7HTs7\nO+Tl5eHixYuio+iN7lQRNRYHw4YNw+3bt1W9JUphYSHi4+NVsctARRMmTMDJkyeNZt15Q9R2WMsB\nwOuMsR2MsfJblTcB4ChBjk5ln29XeDy73HOdAJRwznMqXHMbpYXhnzg5VTqgp3hqn5q9efMmrly5\ngrFjx4qOohdq39D4/PnzKCoqwqBBg0RHkRxjTPWjd0ePHoWFhYXiTxWpjDFsiXLo0CH06dMHZmZm\noqNIrnnz5hg7dqxRrFtuqLrMWToB6AEgiTHWWT9xKlXv+auvvvoKfn5+8PPzQ0JCgoSRxNKdVqHW\nqb2IiAi4uLjA1NRUdBS9UPu6O92oXelqC/VRe3Gu1ilZHbVPzap1SlbH1dVVNevuEhISntUofn5+\n0jbOOa/xA6Vr5MwBNAewFUAmgGEoHU3T1qaNCu09ArCw3J+ty/oYWuG6CAC/lH09qeyaDhWuSQPw\nUSV9cLXSarW8a9eu/Ny5c6Kj6MXUqVN5UFCQ6Bh6U1hYyNu2bctv3bolOopeODo68l27domOoTe5\nubm8VatW/NGjR6Kj6MXw4cP5vn37RMfQm9u3b/PWrVvzgoIC0VH0YvDgwfzQoUOiY+jNuXPnuJWV\nFddqtaKjSK6sbqlTPVXVR53uNuCc56P0TtW1ABIAzK5fSfkn6QCyAEzRPcAYawZgHIBDZQ8dA1BU\n4ZquAGzKXWMUGGOYOnWqKs+azc/PR0JCgqq20KjI1NQUU6ZMUeXU3sOHD3H06FFMmjRJdBS9ee65\n5zBy5EhVTg1lZ2fj4sWLql0SAQDm5ubo27evKtctZ2ZmIiMjAyNGjBAdRW/69esHxhjOnTsnOoqs\n1flW0rIC82MALwL4oravY4y1ZIzZM8bsy/rtXvZnq7KKdTWAdxhjMxhjAwFsROkI3+ayfh8CWA/g\nK8bYZMbYEAABAE4CiK3r96F0al13t2/fPgwZMgTt27cXHUWv1Do1u2fPHowbNw4tW7YUHUWv1Do1\nGxMTg8mTJ6NJkyaio+iVWqdmo6Oj4ezsDBMTE9FR9IYxBldXV7prtga1Le4mAbhf/gHO+Q4AIwEs\nrmUbwwEcL/toBuDjsq8/LmvvKwDfAvgvgBSU3iQxhXP+pFwbrwMIQenUcBKAXABTy4pDozJx4kSc\nOnUKd+/eFR1FUrt371blFigVubm5IS4uDgUFBaKjSEqtW6BUpLupQm3/9ERGRqp6vZaOm5ubatZt\nlRcdHa3qWQ8d2u+uZkxt/zjpMMZUX/N5eXlh+vTpWLhwoegokuCcw8rKCnFxcejXr5/oOHo3duxY\n+Pn5wdnZWXQUSWi1WnTq1AnJycno0aOH6Dh6xTlHnz59EBwcDDs7O9FxJFFcXAwLCwucOnUKXbpU\nefCPKpSUlMDc3BwnT55E165dRceRRHFxMczMzHDu3Dl06tSp5hco2MOHD9G1a1dkZ2ejefPmNb9A\nAYqKitCkSRNwziW5E01dO/waGbVNzZ44cQLNmzdX3akUVVHb1GxKSgrMzMxUX9gB6twS5bfffoOV\nlZXqCzvgf1uiqGn058iRI+jZs6fqCzsAaNOmDezt7VV1FGB8fLyk7VFxp2AeHh7Yu3evaqb2dFOy\nat1CoyIPDw/s3r1bNVN7at24uCpqW3cXGRmp6i1QKlLburuoqCijmJLVUdOWKEDpemUpUXGnYObm\n5hgwYIBqfnsxlvV2OoMGDUJxcTHOnz8vOookIiIijGK9nY6DgwNOnTqFe/fuiY4iCWMr7lxcXBAX\nF6eaoxzVvr9dRWo7ikzq74WKO4VTy5YoN2/exKVLlzBu3DjRUQyGMaaaqdmbN28iPT0dY8ZUehKg\nKjVr1gwODg6S/8YtQmZmJq5fv45Ro0aJjmIwFhYW6N27Nw4dUv5OWllZWUhPT8fo0aNFRzGY559/\nHjk5Obh27ZroKA128+ZNZGZmStomFXcKp1t3p/SpPbWfSlEVtRR3kZGRmDJlCho3biw6ikGpZWo2\nOjraKN8/tUzNRkdHY/LkyUb1/jVq1AjOzs6qGL3bs2eP5MelUnGncLa2tjAxMcHp06dFR2mQ8PBw\no5qS1Zk4cSJSU1MVP7VnbOvtdNzd3REdHY2SkhLRURokIiLCqKZkddRS3Kn9yLiqqGXdXUxMjOS7\nJtBWKCqwcuVKmJmZ4YMPPhAdpV7y8/NhYWGBq1evqn7z4spoNBrMnTsXc+fOFR2lXgoKCmBubo7L\nly+jY8eOouMY3KBBg7Bu3TrFTmkWFhbCzMwMv//+O8zNzUXHMSjdlihK3v5FtwVKWloaOnc25LHv\n4t2+fRv9+vXDnTt3FDvrU1JSAgsLC5w4cQJWVla0FQr5H41Go+gtUYzlVIqqKH1qdv/+/bC1tTXK\nwg6A4rdESUpKgo2NjdEVdkDplijOzs6KHv05fPgwevbsaXSFHVC6btLa2hpHjhwRHaXeUlJSYGlp\nKfl+i1TcqcD48eNx8eJF3Lp1S3SUetm9e7dR3WVZkW5qr7i4WHSUejHWKVkdpRd3xnaXbEVKn5o1\ntrtkK1L6UWT6OlWEijsVaNKkCaZMmaLIhd2cc6Ndb6fTtWtXdOvWDYcPHxYdpc4450a3BUpFY8aM\nweXLlxX7y1VkZKRRF+eurq6K3hLF2ItzpR9Fpq/inIo7lVDq1KzuVApjOG6sOkqdmr148SIKCgow\nePBg0VGEMTU1VezUXnp6OnJycvD888+LjiKMbmpPib9c6bawGTlypOgowowePRqXLl1Cdna26Ch1\ndvfuXZw/fx5jx46VvG0q7lTCzc0N8fHxyM/PFx2lToztVIqqeHp6KnLkNTw8HO7u7kb//il1SxTd\nqEGjRsb9o8DV1VWRU7PGuoVNeU2aNIGjoyP27t0rOkqd7dmzB46OjmjatKnkbRv332gVad++PYYM\nGYK4uDjRUeokJCQE06ZNEx1DuOHDh+POnTtIT08XHaVOjH29pI6rqytiY2MVN7Vn7FN6Okpdd0fv\nXymlrrvT13o7gIo7VdFoNIo6rSI9PR2ZmZlGdSpFVRo1agR3d3dFjf7cvXsXqampkm++qUQWFhbo\n27cvkpKSREeptby8PBw4cEDy/bWUaNSoUbh+/Tpu3rwpOkqtFRUVIS4uDi4uLqKjCKc7ikyr1YqO\nUmtarRYxMTFU3JGa6U6rUMr/4KGhodBoNDAxMREdRRY8PT0VtW4yIiICTk5OaN68uegosqC0u2Zj\nY2MxdOhQtGvXTnQU4Ro3bgwnJydFrZs8ePAg+vTpAwsLC9FRhOvZsyfatm2LEydOiI5Sa6mpqWjX\nrh169uypl/apuFORvn37okOHDopZGLxz507MmDFDdAzZmDJlCg4fPoyHDx+KjlIroaGhmD59uugY\nsuHh4aGo4jwsLIyWRJSjtKnZyMhIo94CpSKlTc3qewsbKu5UxtvbG8HBwaJj1Oj27ds4ffo0Jk+e\nLDqKbDz33HNwcHBQxNRsXl4e9u3bZ9RbaFQ0dOhQPHr0COfPnxcdpUYlJSUIDw+n4q4cpa2bpOLu\nj1xdXRU1cq7P9XYAFXeq4+3tjR07dkDuR6/t2rULrq6uaNasmegosuLl5YWdO3eKjlGjvXv3Ytiw\nYUZ7qkhlGjVqhOnTpyM0NFR0lBr99ttvsLCw0NuUkBJZWlqiV69eilg3eeXKFdy5cwcjRowQHUU2\nJk6ciFOnTuHu3buio9To/v37OHXqFBwcHPTWBxV3KmNra4sWLVogJSVFdJRq0ZRs5aZOnYq9e/ci\nLy9PdJRq0ZRs5ZRS3NGUbOWU8v7t2rULnp6etF65nGbNmmHSpEmKGL2Ljo7GhAkT9Dq4QcWdyjDG\nMHPmTOzYsUN0lCo9fPgQBw8epCmFSnTs2BHDhg3Dnj17REepUnFxMU3pVcHR0REXL15EZmam6CjV\nouKuctOmTUNYWJjsZz7o/aucUjbz3717NzQajV77oOJOhXTr7uT6D1RkZCQmTJiA1q1bi44iS3Kf\nmj106BCsrKzQrVs30VFkx9TUFO7u7rLekujChQt49OiRUZ9KUZWBAwfCxMQEJ0+eFB2lSvfu3cOx\nY8doC6JKeHh4YO/evSgoKBAdpUpFRUWIjo7W+/6gVNypkL29PQDI9rbwHTt2wMvLS3QM2Zo+fTrC\nw8NRWFgoOkqlaOPp6k2fPh0hISGiY1QpLCwMGo3G6E+lqAxj7NnonVxFRkZi4sSJaNGihegosmNu\nbo4BAwZg//79oqNUKSkpCb169ULnzp312g/97VYhxtizGyvkJjc3F7GxsbTerhpdunRBv379kJCQ\nIDrKn2i1WgQHB8Pb21t0FNlydXXFkSNH8ODBA9FRKkVTetWT+7o7ev+qp9vvVa527dql9ylZgIo7\n1dKtu5Pb1GxYWBgcHBxo49QaeHl5yXJLmyNHjqB169awtbUVHUW2WrVqJdstbbKyspCWloaJEyeK\njiJbY8aMQUZGBq5evSo6yp8UFBRg7969dORfNXTFndx+9gEA5/zZeer6RsWdSg0fPhwFBQWyWzvy\n66+/wsfHR3QM2fPy8kJoaChKSkpER/mDbdu2Yfbs2aJjyN6MGTNkOfoTHBwMT09PvRxUrhaNGzeG\np6enLNdNxsfHw9bWFubm5qKjyJatrS0aNWqE06dPi47yJ+fOnUNhYSHs7Oz03hcVdyrFGMMLL7yA\noKAg0VGeycnJQVJSkkGGpJWuV69esLKyQnx8vOgoz2i1Wmzfvp2Ku1qYOnUq9uzZI7stbbZv345Z\ns2aJjiF7cp2a1a2XJFVjjMl2alZ3lyxjTO99yaq4Y4w1Zox9zhi7whjLL/v8KWPMpMJ1foyxTMZY\nHmMsnjE2QFRmOXvhhRewefNm2Yz+7Ny5Ey4uLmjVqpXoKIowb948bNmyRXSMZw4dOoSOHTvCxsZG\ndBTZMzMzw8iRI2U1NZuVlYUTJ07QQfO14OzsjKNHj+LevXuiozxTUlKCkJAQzJw5U3QU2dNoNLK8\nKWbXrl0GmZIFZFbcAXgPwCsAVgDoB2AlgKUA/p/uAsbYOwDeBLAcwHAA2QD2MsaoYqhgwIABsLCw\nkM2dQ1u3bqUp2TqYM2cOQkJC8PTpU9FRAJS+fzRqV3s+Pj749ddfRcd4RjclS6fC1KxFixZwdnaW\n1ehdYmIiOnfujN69e4uOInsTJkzAlStXcO3aNdFRnrl16xbOnj0LR0dHg/Qnt+JuOIBdnPMIzvl1\nzvluAOEARgIAKx3LfB3AF5zzEM55GoBFAJ4DME9UaDmbP38+AgMDRcfArVu3cOzYMdq4uA66dOkC\nOzs7WRxmXlJSgh07dtCUXh3MmDEDsbGxyM3NFR0FAE3J1tWcOXNkVZxv27aN3r9aMjU1xfTp02V1\nU1pISAg8PDwMtt5VbsVdFIBJjLF+AFA23ToRgG5uoycACwDPtu/nnD8FcADAGMNGVQYfHx+EhoYi\nPz9faI7AwEB4eXmhefPmQnMozbx587B582bRMXDgwAF06tQJffv2FR1FMdq1awcHBwdZTA/RlGzd\neXh44LfffsOdO3dER0FJSQmCg4OpuKsDuW0HZuhfrmRV3HHOfwAQBOAcY6wQwBkAGznnP5Vd0qns\n8+0KL80u9xwpp3Pnzhg6dCjCw8OFZeCc45dffsGLL74oLINSzZw5E3v27BE++uPv74+FCxcKzaBE\ncpmaDQ4OhoeHB03J1kHLli3h7u4ui9GfAwcOoEuXLjQlWweTJ0/GhQsXcOPGDdFRcPv2baSmpmLK\nlCkG61NWxR1j7DUAiwH4ABgCYCGAZYwx31q8/E+b2vj5+T37kOOGsIYyf/58+Pv7C+s/JSUFRUVF\nGDdunLAMStW+fXs4OjoKPfHg8ePHCAsLw7x5tPKhrjQaDZKSkpCTkyM0R2BgIF544QWhGZRILlOz\ntAVR3ZmamkKj0ciiOA8NDYW7u/ufZq4SEhL+UKdIinMumw+UjsitqPDY+wB+L/vaGoAWwNAK10QA\n+KXCY5yUevz4MW/Xrh2/ceOGkP5fffVV/tlnnwnpWw22bdvGJ06cKKx/f39/7unpKax/pZs1axZf\ns2aNsP4vXLjALSwseFFRkbAMSpWfn8/btm3LMzMzhWUoLi7m5ubm/NKlS8IyKFVERAQfO3as6Bh8\n8uTJPDg4uMbryuoWSeopWY3cAWAoLd7K05Y9DgDpALIAPBvbZIw1AzAOwCFDBFSili1bYu7cudiw\nYYPB+87Pz8e2bdtoSq8BNBoNTp8+jcuXLwvpn6ZkG2bBggVCR84DAgIwb948NG7cWFgGpWrWrBk0\nGo3QtVtxcXGwsrJCr169hGVQKicnJ5w9exaZmZnCMty5cwcpKSlwdXU1aL9yK+5CAbzLGHNnjPVg\njM0A8AaAEKCspAVWA3iHMTaDMTYQwEYAjwCIX3UuY0uWLMHPP/9s8D3vQkJCMHToUFhZWRm0XzVp\n2rQpFixYIKQ4v379Ok6cOGGwvZnUyM3NDVeuXMGFCxcM3rdWq0VAQAAV5w3g4+Mj9KYmf39/LFq0\nSFj/StakSRNoNBps27ZNWIbg4GC4ubmhRYsWBu1XbsXdGwC2AvgvgLMAvgGwFqVTswAAzvlXAL4t\nuyYFpXfPTuGcPzF4WgWxt7dHp06dEBMTY9B+f/jhB7z66qsG7VONXnrpJWzcuBHFxcUG7dff3x+z\nZ8+mhfgN0LhxYyxYsAC//PKLwftOTExE69atDXLckVo5Ozvj+vXrOHfunMH7zs3NRXh4OO0P2gAL\nFixAQECAsP4DAgIwf/58g/crq+KOc/6Ec76Kc96Tc96Cc96Lc/4B57ywwnUfc847c86bc84ncs7P\nisqsJEuWLMHatWsN1t+JEydw7do1Oi5HAra2tujWrRuio6MN1mdxcTHWrl2LV155xWB9qtXixYux\nadMmgxfnmzZtwsKFCw1y3JFaiSzOg4ODMXHiRJiZmRm8b7VwdHREdnY2zpw5Y/C+L1++jEuXLgnZ\ngkhWxR3Rr7lz5yIpKQnp6ekG6e+///0v/vrXv9JaH4m89NJLWLduncH6Cw8Ph5WVFezt7Q3Wp1r1\n798f3bt3N+jI+cOHD7Fz504howZqs3jxYgQEBAgrzkn9mZiYYP78+UJG7wIDAzFnzhyYmpoavG8q\n7oxIq1at8NJLL+Hf//633vu6f/8+duzYgb/85S9678tYzJ07FwcPHsSVK1cM0t+PP/6IpUuXGqQv\nY+Dr64uff/7ZYP1t2rQJU6ZMQadOtAVoQ9nY2KBnz54GHTm/evUqTp8+DQ8PD4P1qVYLFixAYGCg\nQdecc84REBCABQsWGKzP8qi4MzIrVqzApk2b8ODBA732s3btWnh6esLc3Fyv/RiTli1bwtfXF99/\n/73e+7p06RJSU1Ph7e2t976Mxdy5c3HgwAGDnHfJOcdPP/2Ev/71r3rvy1gsXrzYoFOz69atwwsv\nvGCw46rUzNbWFpaWloiPjzdYn0eOHEHjxo0xbNgwg/VZHhV3RqZr165wd3fX6/Refn4+Vq9ejbff\nfltvfRir5cuXY+PGjXo/seK7776Dr68v3UghoVatWmHRokX44Ycf9N5XYmIiOOdwcHDQe1/GYs6c\nOdi3bx9u3bql974KCwuxfv16uhlNQgsXLjTojgPr16/Hiy++KGy9KyvdXUR9GGNcrd9bQ6WmpmLq\n1Km4dOmSXn54//DDD4iKisLu3bslb5sAs2fPxrhx4/Daa6/ppf27d++ib9++OHPmDDp37qyXPozV\n5cuXMXLkSFy/fl2vWyP4+PhgzJgxevt/xFgtXboU5ubm0p8mUMGvv/6KtWvXYt++fXrtx5jcv38f\n1tbWuHDhgt5nlB48eICePXvi/PnzsLCwqPXrGGPgnEtSDdLInREaMmQInn/+eb3cOVtUVISvv/4a\n7733nuRtk1Jvvvkmvv32WxQVFeml/e+//x4zZ86kwk4PevXqhTFjxiAoKEhvfaSnpyM2NpbOctaD\n5cuXY82aNSgoKNBrPz/++CNNqUusXbt28PLyMsjoXWBgIFxcXOpU2ElOqqMu5PYBOn6sWsePH+eW\nlpb8yZMnkra7Zs0aPmnSJEnbJH/m5OTEf/75Z8nbffz4MTczM+MXLlyQvG1SKjY2ltvY2PDi4mK9\ntL9s2TL+7rvv6qVtwrmzszMPCAjQW/snT57klpaWvLCwUG99GKuUlBTevXt3vf3d45xzrVbLbW1t\neXx8fJ1fCxUfP0YMZMiQIRg9erSk63+ePHmCjz/+GP/4xz8ka5NU7qOPPsJnn30m+ejd999/D0dH\nR/Tt21fSdsn/TJo0CW3atNHLgeZ37txBUFAQTcfq0WuvvYZ///vfukEEyX311VdYuXKlkO0z1G7Y\nsGEwNzdHVFSU3vpITExEcXGx8PWutObOiJ07dw4TJkxAWlqaJGsQPvvsM5w5cwa//vqrBOlITZyd\nnTFnzhzJtpu5f/8++vbti6SkJPTr10+SNknlIiMj8e677+LEiRNo1Ei637Hff/993Llzx6CblRsb\nrVaLAQMG4L///S8mT54sadtXr17F0KFDceXKFbRp00bStkkpf39/BAQEIDY2Vi/tazQauLu71+tm\nGCnX3FFxZ+RWrVqF+/fvY/369Q1q59q1axg2bBiOHDlCB1wbSHJyMmbMmIHz58/jueeea3B777zz\nDu7fv0+FgQFwzjF8+HC899578PLykqTNrKws2Nra4vjx4+jevbskbZLKBQYGYu3atdi/f7+kd0Ou\nWLECLVq0oNkPPSosLESvXr0QEhIi+TYlZ8+exaRJk5Ceno7mzZvX+fVU3NUCFXe1k5ubi/79+2Pb\ntm0YO3ZsvdrgnMPT0xNjx46lGykMbNGiRbC0tMSXX37ZoHYuXbqEUaNG4cSJE+jatatE6Uh1oqKi\n8Prrr+PMmTOSTMEtX74cpqam+PbbbyVIR6pTXFyM/v37Y926dXB0dJSkzczMTAwePBhnzpyBpaWl\nJG2Syq1evRqJiYmSL43w9fWFtbU1Pvjgg3q9XsriTviND/r6AN1QUWshISHc2tqaP3z4sF6vDwgI\n4F7gdXEAAA/jSURBVAMHDuQFBQUSJyM1uXnzJu/QoQM/f/58vdvQarXcycmJf/311xImI7Xh6urK\nV69e3eB2Ll68yDt06MCzs7MlSEVqY+PGjXz8+PFcq9VK0t6SJUv422+/LUlbpHq6G8fOnTsnWZvX\nrl3j7dq14zk5OfVuAxLeUEEjdwQAsGTJEhQUFMDf379O0wy6dXuxsbGws7PTY0JSle+//x4BAQE4\nePBgvc7xDQgIwDfffIOjR4/SIm4DO3v2LBwdHZGWllbvw+E553B2doabmxveeustiROSqhQXF+P5\n55/H3/72twaf5HLhwgWMGzcOFy9eRLt27SRKSKrz+eef48SJE9i2bZsk7fn6+qJz58747LPP6t0G\njdzRyJ3kHj16xAcPHsy//PLLWr/m7t273MbGRi9bcpDaKykp4VOmTOF+fn51fu2FCxd4x44d+fHj\nx/WQjNTGqlWruLe3d71HgAIDA7mdnR0vKiqSOBmpSVxcHO/evTvPy8urdxtarZa7uLjwb775RsJk\npCZPnjzhXbp04UeOHGlwW2lpadzMzIw/ePCgQe1AwpE74UWYvj6ouKu7jIwMbmVlxdesWVPjtffv\n3+fDhw/n77zzjgGSkZpkZGTwzp0785CQkFq/Jjc3l9vZ2fEffvhBj8lITfLz83n//v15UFBQnV+b\nnp7OzczMeHJysh6Skdrw8vLiH3zwQb1fv3nzZj5o0CDa106A9evX83HjxjVoal2r1XIPDw9JlrVQ\ncUfFnd78/vvv3Nramr/zzjtVrqFLS0vj/fr142+88YZk601IwyUnJ/OOHTvyxMTEGq/Nz8/nkyZN\n4q+88gq9hzJw9OhR3rFjR3769OlavyY/P5+PGjWK1koKdvPmTW5ubs5/++23Or/21q1bvFOnTvzQ\noUN6SEZqUlxczO3t7fnGjRvr3UZwcDDv37+/JGvOqbij4k6vbt++zTUaDbexseHr1q3j6enpPCcn\nhx8+fJgvW7aMd+zYka9fv150TFKJmJgY3rFjRx4cHFzlNbdv3+Zjxozh8+bN0+tO7aRuAgMDeY8e\nPXhmZmaN1xYXF3Nvb28+a9YsXlJSYoB0pDrbtm3jvXv35vfu3av1a4qLi/nkyZP5hx9+qMdkpCbH\njx/nZmZm/ObNm3V+7YMHD3jXrl15QkKCJFmkLO7ohgpSKc459u7di7Vr1+Lw4cN4/PgxrK2tMXXq\nVPz1r3+lW/VlLCUlBT4+Phg5ciTeffddDBo0CIwx5ObmYtOmTfj000/xyiuvwM/PT9INdEnDffXV\nV1izZg1iYmLQu3fvSq/Jz8/HokWLkJOTg8jISDRt2tTAKUlldNvaREVF1XhjEuccb7zxBk6dOoW9\ne/fCxMTEQClJZd5//30cP34c4eHhtX4vOOeYPXs2LCws8P3330uSg/a5qwUq7ogxe/z4Mb799lus\nW7cOeXl5aNWqFbKzs+Hu7o733nsPzz//vOiIpApr1qzBBx98gE8++QS+vr7PijfOORITE7F8+XIM\nHDgQGzZsQLNmzQSnJTolJSWYMWMGGGPYunVrle8N5xzvv/8+IiIisH//frRt29bASUlFRUVFcHJy\nwvjx42t9t+u//vUvBAQE4PDhw5L9PaTirhaouCOk9AdJVlYW8vLyYGVlhSZNmoiORGrh1KlTWLVq\nFVJTUzFmzBg0b94cJ0+eRHFxMT755BP4+PhIejICkUZhYSEWLVqES5cuYdOmTejfv/8fnr99+zaW\nLVuGzMxMhIWFSXLsI5FGdnY2Ro0ahZUrV2LlypXVXhsQEID33nsPSUlJkp4GQ8VdLVBxRwhRuuvX\nryMlJQUFBQXo168fhgwZQlPpMsc5x08//YQPP/wQEyZMwIQJE9CkSROkpKQgNDQUL7/8Mvz8/Op1\nPBXRr2vXrmHSpEnw9vbGZ5999qfp9ZKSEnzxxRdYu3YtoqKiYGtrK2n/VNzVAhV3hBBCRHn06BGC\ng4Nx9OhRFBUVwdbWFrNmzaL1yjKXnZ0NX19fXLlyBa+//jrGjx+PRo0a4fDhw/jPf/6DNm3aIDAw\nEF26dJG8byruaoGKO0IIIYTUle6Gwg0bNuDYsWPQarWws7PDokWLoNFo9LYkgoq7WqDijhBCCCFK\nIWVxR4s3CCGEEEJUhIo7QgghhBAVkV1xxxizZIz5M8ayGWP5jLE0xtiECtf4McYyGWN5jLF4xtgA\nUXkJIYQQQuREVsUdY6wtgIMAOAB3ADYAlgPILnfNOwDeLHt8eNlzexljrQwemBBCCCFEZmR1QwVj\n7HMA4znn46t4ngG4CeA/nPMvyh5rhtICbxXnfG25a+mGCkIIIYQogppvqJgOIJkxtpUxdpsxlsoY\nW1bu+Z4ALADs0T3AOX8K4ACAMYaNSgghhBAiP3Ir7qwBLAVwCcAUAP8G8GW5Aq9T2efbFV6XXe45\nQgghhBCj1Vh0gAoaAUjmnL9f9ueTjLE+AJYB+G8Nr6U5WEIIIYQYPbkVdzcBnK3w2HkA3cq+zir7\nbAEgo9w1FuWee8bPz+/Z146OjnB0dJQoJiGEEEJI/SUkJCAhIUEvbcvthoogAFac8wnlHvsUwAzO\n+cCyGyoyAXxX4YaK2yi9oWJdudfRDRWEEEIIUQQ131DxLYBRjLH3GGO9GWOzAKxA2ZRsWbW2GsA7\njLEZjLGBADYCeARgs6DMhBBCCCGyIauROwBgjLkD+BxAPwDXAHzPOf++wjUfAXgFQDsARwAs45yf\nrXANjdwRQgghRBGkHLmTXXEnFSruCCHk/7d3vyF31nUcx98fNTMsTRJcqVmCGRakhZGxrIT2oJ5E\nT6wIzQf2xz9ZEdRmVJAZiPhvGRakSVJkD0xNBia4Cq2mYgbTsUpHWW13mkxzs83t24PrutvxuN33\nqTXPdX69X3Bxn+u6fuc+v3tfzjmf/a4/P0mzouXDspIkSdoLhjtJkqSGGO4kSZIaYriTJElqiOFO\nkiSpIYY7SZKkhhjuJEmSGmK4kyRJaojhTpIkqSGGO0mSpIYY7iRJkhpiuJMkSWqI4U6SJKkhhjtJ\nkqSGGO4kSZIaYriTJElqiOFOkiSpIYY7SZKkhhjuJEmSGmK4kyRJaojhTpIkqSGGO0mSpIYY7iRJ\nkhpiuJMkSWqI4U6SJKkhhjtJkqSGDDbcJVmeZGeSlWPbv5Lkz0m2JLkzyQnT6qMkSdLQDDLcJXkb\ncDbwW6BGtn8e+CxwHnAyMAf8NMlLp9FPSZKkoRlcuEtyKHADcBbwxMj2AJ8Gvl5VN1XVWuBM4GXA\nh6fRV+07q1evnnYX9F+ydrPN+s026ycYYLgDvg38qKp+BmRk+2uBI4Db5zdU1TPAz4G3v6A91D7n\nB9TssnazzfrNNusngAOm3YFRSc4GjmXXSFyN7F7S/9w09rQ54FX7uGuSJEkzYTDhLsnxwNeApVW1\nY34zzx2925NavIkkSVL7UjWMXJTko8C1wI6RzfvTBbcdwBuBdcDJVXXfyPNuA+aq6qyx3zeMP0yS\nJGkCVTXJgNaiBjNyB9wErBlZD3AdsB64GPgdsBFYBtwHkOQgYCnwufFf9r/6B5IkSZolgwl3VbUZ\n2Dy6LckW4ImqerBfvwJYkWQdXdj7IvAU8P0XuLuSJEmDNJhwtwfFyPl0VXVJkpcAVwOHAb8CllXV\n01PqnyRJ0qAM5pw7SZIk7b0h3uduryU5J8kjSbYmuTfJ0mn3Sc/VTy93T5LNSeaS3JLkDbtp53Rz\nA+dUgbMnySuTXN+/97YmWZvk1LE21m+AkhyQ5OIkD/e1ezjJV5PsP9bO+k1ZklP777ZH+8/IM3fT\nZsE6JXlxkpVJ/pbkH0luTnLkYq/dXLhLcjpwBXARcCJwN7AqydFT7ZjGvRP4BnAKcBrwLHBHksPm\nGzjd3PA5VeDsSfJy4C66er0XeD1dneZG2li/4VoBfBw4HzgeuAA4B1g+38D6DcbBdJ+NFwBbGbtt\n24R1ugL4APBB4B3AIcBPkiyc36qqqQX4NfCtsW3rgYun3TeXBet2MF3Ae1+/HuCvwPKRNgcBTwIf\nm3Z/XQrgUOD3dEH9TuAqazf8he7uA79YYL/1G/AC3ApcN7bteuBW6zfche7izzNG1hetU/8Z+0/g\nQyNtjqK7PdyyhV6vqZG7JAcCb2ZkirLe7ThF2dAdQjeSPD+fsNPNDZ9TBc6m9wNrkvwwyaYk9yc5\nd2S/9Ru2VcBp/Y3/6Q/jvRu4rd9v/WbDJHV6C/CisTaPAg+xSC2HfrXsf+pwuhsf726KsiXPb64B\nuRK4H/hlv+50cwPmVIEz7Vi6w3iX0Y3inQSsTEJVXY31G7Sq+maSo4CHkjxL9z1+UVVd0zexfrNh\nkjotAXZU1eNjbTbRBcM9ai3caQYluYzufyFLqx93XoSXeE+RUwXOvP2ANVV1Yb/+QJLjgHPpbjO1\nEOs3ZUk+BZxFdw7WWrpwfmWSDVV17SJPt36zYa/r1NRhWeAxumPR44n2CLpj2xqYJJcDpwOnVdWG\nkV0b+5+7q+VGNE2n0I2Sr02yPcl24FTgnCTb6N6HYO2G6i/Ag2Pb1gGv7h/73hu2C+nOIb+xqtZW\n1Q10o7DzF1RYv9kwSZ02AvsnecVYmyUsUsumwl1VbaObmmzZ2K730F01qwFJciW7gt36sd2PsGu6\nufn289PNWcvpuoluruc39cuJwL3AD/rHo1MFAtZuYO6iu0J21OuADf1j33vDFmDn2Lad7Bo5t36z\nYZI63QdsH2tzFN37d8FatnhY9jLge0nW0P3xn6BLudcs+Cy9oJJcDXyE7uTuzUnmzz94qqqerqpy\nurlhKqcKnHWXA3cnWQHcSHdY73z6kR/fe4P3Y+ALSR6hG4E9CfgM3RWz1m9AkhwMHNev7gcck+RE\n4PGq+tNidaqqzUm+A1ySZA74O13GeQC4Y8EXn/blwfvokuNP0qXiZ4B76M4Nmnq/XJ5To510h9B3\nji1fGmv3ZbrDSFvpbrdxwrT77rLbev77VijWbvgL3f3tftPXZh1w3m7aWL8BLnS3jbq0/47bAvyB\n7r6uB1q/YS3Au0a+20a/766dtE7AgcBVdKe7PA3cDBy52Gs7/ZgkSVJDmjrnTpIk6f+d4U6SJKkh\nhjtJkqSGGO4kSZIaYriTJElqiOFOkiSpIYY7SZKkhhjuJEmSGmK4k6QJJVmdZOW0+yFJCzHcSZIk\nNcTpxyRpAkm+C5wxtvk1VfXHKXRHkvbIcCdJE0hyCLAKeAhY0W9+rKp2Tq9XkvR8B0y7A5I0C6rq\nySTbgC1VNTft/kjSnnjOnSRJUkMMd5IkSQ0x3EnS5Lbh6SySBs5wJ0mT2wC8NckxSQ5Pkml3SJLG\nGe4kaXKX0o3ePQhsAo6ebnck6fm8FYokSVJDHLmTJElqiOFOkiSpIYY7SZKkhhjuJEmSGmK4kyRJ\naojhTpIkqSGGO0mSpIYY7iRJkhpiuJMkSWrIvwCdhWYS6i+zlAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10,4)) #set plot size\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z, 'k-');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Explore and think" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try changing the value of `v` in the initial conditions. \n", + "\n", + "* What happens when you have a larger gust? \n", + "* What about a smaller gust? \n", + "* What happens if there isn't a gust (`v = 0`)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The equation for phugoid oscillations is a 2nd-order, linear ODE and it has an exact solution of the following form:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "z(t) = A \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + B \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $A$ and $B$ are constants that we solve for using initial conditions. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our numerical solution used the initial conditions:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z(0) = z_0 \\\\\n", + "b(0) = b_0\n", + "\\end{eqnarray}$$\n", + "\n", + "Applying these to the exact solution and solving for $A$ and $B$, we get:\n", + "\n", + "$$\\begin{equation}\n", + "z(t) = b_0 \\sqrt{\\frac{z_t}{g}} \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + (z_0-z_t) \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We already defined all of these variables for our numerical solution, so we can immediately compute the exact solution. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The expression is a bit long —if you don't feel like scrolling left and right, you can insert a line break in the code using a backslash '\\' _(without any trailing spaces)_ and Python will treat the next line as a continuation of the first." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot our exact solution! Even better, we can plot _both_ the numerical solution *and* the exact solution to see how well Euler's method approximated the phugoid oscillations.\n", + "\n", + "To add another curve to a plot, simply type a second `pyplot.plot()` statement. We also added a legend using the format\n", + "\n", + "```Python\n", + "pyplot.legend([\"line 1\",\"line 2\"])\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nXZ3JngAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10,4))\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z)\n", + "pyplot.plot(t, z_exact)\n", + "pyplot.legend(['Numerical Solution','Analytical Solution']);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks like pretty good agreement, but what's happening towards the end? We'll come back to this. For now, re-run the previous steps with a different timestep, say $dt=0.01$ and pay attention to the difference.\n", + "\n", + "Euler's method, like all numerical methods, introduces some errors. If the method is *convergent*, the approximation will get closer and closer to the exact solution as we reduce the size of the step, $\\Delta t$. The error in the numerical method should tend to zero, in fact, when $\\Delta t\\rightarrow 0$—when this happens, we call the method _consistent_. We'll define these terms more carefully in the theory components of this course. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compare the two solutions, we need to use a **norm** of the difference, like the $L_1$ norm, for example.\n", + "\n", + "$$ E = \\Delta t \\sum_{n=0}^N \\left|z(t_n) - z_n\\right|$$\n", + "\n", + "The $L_1$ norm is the sum of the individual differences between the exact and the numerical solutions, at each mesh point. In other words, $E$ is the discrete representation of the integral over the interval $T$ of the (absolute) difference between the computed $z$ and $z_{\\rm exact}$:\n", + "\n", + "$$ E = \\int \\vert z-z_\\rm{exact}\\vert dt $$\n", + "\n", + "We check for convergence by calculating the numerical solution using progressively smaller values of `dt`. We already have most of the code that we need. We just need to add an extra loop and an array of different $\\Delta t$ values to iterate through. \n", + "\n", + "You should read the documentation for the function [enumerate](https://docs.python.org/2/library/functions.html#enumerate) and make sure you understand how we're using it below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Warning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The cell below can take a little while to finish (the last $\\Delta t$ value alone requires 1 million iterations!). If the cell is still running, the input label will say `In [*]`. When it finishes, the `*` will be replaced by a number." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-increment array\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001, 0.0001])\n", + "\n", + "# array that will contain solution of each grid\n", + "z_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " N = int(T/dt)+1 # number of time-steps\n", + " ### discretize the time using numpy.linspace() ###\n", + " t = numpy.linspace(0.0, T, N)\n", + "\n", + " # initial conditions\n", + " u = numpy.array([z0, b0])\n", + " z = numpy.empty_like(t)\n", + " z[0] = z0\n", + " \n", + " # time loop - Euler method\n", + " for n in range(1,N):\n", + " ### compute next solution using Euler method ###\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0] # store the elevation at time-step n+1\n", + " \n", + " z_values[i] = z.copy() # store the total elevation calculation grid i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculate the error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical solutions for each $\\Delta t$ in the array `z_values`. To calculate the error corresponding to each $\\Delta t$, we can write a function! " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_error(z, dt):\n", + " \"\"\"Returns the error relative to analytical solution using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " z : array of float\n", + " numerical solution.\n", + " dt : float\n", + " time increment.\n", + " \n", + " Returns\n", + " -------\n", + " err : float\n", + " L_{1} norm of the error with respect to the exact solution.\n", + " \"\"\"\n", + " N = len(z)\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt\n", + " \n", + " return dt * numpy.sum(numpy.abs(z-z_exact))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: in the last line of the function, we perform an 'array operation': \n", + "\n", + "`z - z_exact`\n", + "\n", + "We are *not* subtracting one value from another. Instead, we are taking the difference between elements at each corresponding index in both arrays. Here is a quick example:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 2, 1])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = numpy.array([1, 2, 3])\n", + "b = numpy.array([4, 4, 4])\n", + "\n", + "b - a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we iterate through each $\\Delta t$ value and calculate the corresponding error. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "error_values = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " ### call the function get_error() ###\n", + " error_values[i] = get_error(z_values[i], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remember, *if* the method is convergent then the error should get smaller as $\\Delta t$ gets smaller. To visualize this, let's plot $\\Delta t$ vs. error. If you use `pyplot.plot` you won't get a very useful result. Instead, use `pyplot.loglog` to create the same plot with a log-log scale. This is what we do almost always to assess the errors of a numerical scheme graphically." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nWtIESavUofkys59KukjSFElDJT0gaaGZbStJ7n6pu+/s7ru4e3Pbl4Yssi9f7eb72p626+75rp7r\nuL6z7aL42rq3P7OQ14XOM591Scqy0Nf2Ns9C1pdLnqX4Xe9sHXnm91xf1hVbnP/uZN/s3XaF5tmV\nSJo4d1/o7pPd/XZJ6zvZ5AxJ17n7Ne7+vLuPl/S6pJO7ek8zu1vSrZJGm9krZrZnX+uMw//ZpWri\nVqxY0W0dIcT5L6KunuvNX0RxzrLQ18bhL/a05BmXJo48wzVxpciyqzpCv47f9XCvLWUTF/klRsxs\npaRT3X1mbrm/pI8lHZlr8lq3u1jSTu6e6ePP45ArAABIjK4uMdKv1IXkYUtJG0t6s8P6tyRt3dc3\n7yoIAACAJOHsVAAAgASKYxP3jqR1kgZ3WD9YLXNxAAAAZS92TZy7r5H0uKQDOjy1v1rOUgUAACh7\nkczEmdlASTvkFjeS9BUzGyrpXXd/RdL/SLrezB5RS+N2klrm4S6Pol4AAIC4ieTsVDPLSGrKLbr+\ndX236e7+s9w2J0s6U9IQSX+SdLq731fiUgEAAGIp8kuMIBnMbIWkD9RyXb/33H2/aCtKPjPbRNKz\nkm51919GXU9SmdkgSYvVcmShv6TL3P3iaKtKptwF1a+X9AVJn0j6jbvfFm1VyWZmsyUNl9To7kdE\nXU8SmdlBki5Uy5G789z9mohLig2aOOTFzF6S9C13/39R15IWZvZbSZWSXnb3M6OuJ6nMbCNJ/d29\nOdcYPyNpD3d/O+LSEsfMtpa0lbs/bWaD1TKfvIO7r4q4tMQys+GSNpV0HE1c4cysn1p+pzOSVkp6\nQtL33P29KOuKi9id2IBY4xp7gZjZDpK+LmmhyLVP3H19m9vvfVbSaknN3bwEXXD3N9z96dyf31TL\n1QK2iLaqZHP3pZI+irqOBNtD0jPu/rq7fyRpgTY88bFs0cQhXy7pXjN7xMyOirqYFLhA0llRF5EW\nZraZmT0l6WVJU919ZdQ1JZ2Z7SppI3d/LepaUNa2kdR2H3xV0hcjqiV24njHBsTTD9z99dzhlrvN\n7E/u/qeoi0oiMztE0gvu/lcz2zvqetLA3T+Q9F0z20rSEjNrcPe/Rl1XUpnZFpJmSBoXdS0oe8x8\ndYNv4lLIzIaZ2Vwze9XM1pvZcZ1sc4qZvWRmq8zssbbNRO65ZWb2hJlVSJK7v5773zfU8nX2LqX6\nPFErQp57SjoyN2d4gaQTzGxy6T5RtIqxf7Zy97ckZSUNLfoHiYFiZGlmAyTNlnSuuz9Uuk8TvSLu\nm2XbiPQ1U0n/UPtv3r6k9t/MlTWauHQaKOlpSRMkrVKHv0DM7KeSLpI0RS3/sXtA0sLcmWly90vd\nfWd336V1WNzMNs299nOSfijpzyX7NNELmqe7n+3uX3b3r0r6v5KucvcpJfw8UQu9f27VZv/cTNI+\nufcvB6GzNEnTJTW5+42l+xixETTPti8tRfEx1adMJT0qaScz2yb3358DJd1Votrjz915pPihlrN5\nju2w7mFJV3RY94Kk33XxHl+V9GTu8SdJ1VF/riTn2WG74ySdH/XnSnKeknaXtCy3fy7r+H7l8giU\n5d5que3hE7ksl6nlrPTIP18S88w9f7ektyR9LOkVSXtG/dmSlqmkgyU9L+lFSeOi/hxxejATV2bM\nrL9aDoWe3+GpBkl7dfYad39JZXJ4qlC9ybMtd59RjLqSqpf756OSdi5yaYnTyyzvk7RxkUtLpN7+\nrrv7iGLWlWT5Zuru8yTNK2FpicHh1PKzpVr+kn6zw/q31HJrMxSGPMMiz3DIMizyDI9M+4gmDgAA\nIIFo4srPO2qZeRncYf1gSa+XvpzEI8+wyDMcsgyLPMMj0z6iiSsz7r5GLbfS6XjF6/3VclYQCkCe\nYZFnOGQZFnmGR6Z9x4kNKWRmAyXtkFvcSNJXzGyopHfd/RVJ/yPpejN7RC2/KCepZf7g8ijqjTvy\nDIs8wyHLsMgzPDItsqhPj+UR/qGWGwWvzz3WtfnztW22OVnSS2q5x+SjkvaOuu64PsiTPOP6IEvy\njPuDTIv7sFyAAAAASBBm4gAAABKIJg4AACCBaOIAAAASiCYOAAAggWjiAAAAEogmDgAAIIFo4gAA\nABKIJg4AACCBaOIAAAASiCYOAApkZgPM7AUz+0HUtQAoXzRxAFC4EyVtLmlKdxuZ2cZm9pyZbVOa\nsgCUE5o4ACiAmW0i6euSzpY03MxGdLP5rpK2cPd/lKQ4AGWFJg4ACnOKpEskXStpuaTfdLPtvpKa\nSlEUgPJDEwcAeTKz/yPpi+7+rLuvk1QnaU8zO6jDdj82s/+VdLqkz5nZ/5rZ1yMoGUCKmbtHXQMA\nJIKZ/UrSLe7+t9yySfqTpDXuvkuHbftLek/SLu7+QsmLBZB6fBMHAHkwsy0kbd7awEmSt/wr+BxJ\nQ81sTIeX/EDShzRwAIqFJg4A8lMt6Q8dV7r7HZKekFSX+2au1f6SsqUpDUA5ookDgB6Y2WBJ/d39\ntS42+S9J35R0VJt1I5Rr4sxsbzMbUNQiAZQdZuIAoAe5kxQelPRWN5tNl7RG0o7uvs7MPpa0l6Tn\nJE109/OKXiiAskITBwDdMLOtJb0kKZ9v0lzSz9x9hpldKGmtpLclXeHuHxexTABliCYOAAAggZiJ\nAwAASCCaOAAAgASiiQMAAEggmjgAAIAEookDAABIIJo4AACABKKJAwAASCCaOAAAgAT6/wsNBajn\noDeVAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10, 6))\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase tick font size\n", + "pyplot.grid(True) #turn on grid lines\n", + "pyplot.xlabel('$\\Delta t$', fontsize=16) #x label\n", + "pyplot.ylabel('Error', fontsize=16) #y label\n", + "pyplot.loglog(dt_values, error_values, 'ko-') #log-log plot\n", + "pyplot.axis('equal') #make axes scale equally;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the kind of result we like to see! As $\\Delta t$ shrinks (towards the left), the error gets smaller and smaller, like it should." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We calculated the error for several different timestep sizes using two nested `for` loops. That worked, but whenever possible, we like to re-use code (and not just copy and paste it!). \n", + "\n", + "Create a function that implements Euler's method and re-write the error analysis cell to use your function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/.ipynb_checkpoints/01_03_PhugoidFullModel-checkpoint.ipynb b/lecture_22/01_phugoid/.ipynb_checkpoints/01_03_PhugoidFullModel-checkpoint.ipynb new file mode 100644 index 0000000..742302d --- /dev/null +++ b/lecture_22/01_phugoid/.ipynb_checkpoints/01_03_PhugoidFullModel-checkpoint.ipynb @@ -0,0 +1,929 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, I. Hawke. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Full phugoid model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the third IPython Notebook of the series on the _phugoid model of glider flight_, our first learning module of the course [\"Practical Numerical Methods with Python\"](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about). In the first notebook, we described the physics of the trajectories known as phugoids obtained from an exchange of potential and kinetic energy in an idealized motion with no drag. We gave you a neat little code to play with and plot various phugoid curves.\n", + "\n", + "In the second notebook, we looked at the equation representing small perturbations on the straight-line phugoid, resulting in simple harmonic motion. This is a second-order ordinary differential equation, and we solved it numerically using **Euler's method**: the simplest numerical method of all. We learned about convergence and calculated the error of the numerical solution, comparing with an analytical solution. That is a good foundation!\n", + "\n", + "Now, let's go back to the dynamical model, and take away the idealization of no-drag. Let's remind ourselves of the forces affecting an aircraft, considering now that it may be accelerating, with an instantaneous upward trajectory. We use the designation $\\theta$ for the angle, and consider it positive upwards." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces-lesson3.png)\n", + "#### Figure 1. Forces with a positive trajectory angle." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Figure 1, $L$ is the lift, $W$ is the weight, $D$ is the drag, and $\\theta$ the positive angle of the trajectory, instantaneously. \n", + "\n", + "In lesson 1, we wrote the force balance in the directions perpendicular and parallel to the trajectory for a glider in _equilibrium_. What if the forces are _not_ in balance? Well, there will be acceleration terms in the equations of motion, and we would have in that case:\n", + "\n", + "\\begin{align}\n", + "m \\frac{dv}{dt} & = - W \\sin\\theta - D \\\\\n", + "m v \\, \\frac{d\\theta}{dt} & = - W \\cos\\theta + L\n", + "\\end{align}\n", + "\n", + "We can use a few little tricks to make these equations more pleasing. First, use primes to denote the time derivatives and divide through by the weight:\n", + "\n", + "\\begin{align}\n", + " \\frac{v'}{g} & = - \\sin\\theta - D/W \\\\\n", + "\\frac{v}{g} \\, \\theta' & = - \\cos\\theta + L/W\n", + "\\end{align}\n", + "\n", + "\n", + "Recall, from our first lesson, that the ratio of lift to weight is known from the trim conditions—$L/W=v^2/v_t^2$— and also from the definitions of lift and drag, \n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "we see that $L/D=C_L/C_D$. The system of equations can be re-written:\n", + "\n", + "\\begin{align}\n", + " v' & = - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\\n", + " \\theta' & = - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v\n", + "\\end{align}\n", + "\n", + "It is very interesting that the first equation has the factor $C_D/C_L$, which is the inverse of a measure of the aerodynamic efficiency of the aircraft. It turns out, this is the term that contributes damping to the phugoid model: if drag is zero, there is no damping. Drag is never zero in real life, but as engineers design more aerodynam-ically efficient aircraft, they make the phugoid mode more weakly damped. At altitude, this is nothing but a slight bother, but vertical oscillations are unsafe during final approach to land, so this is something to watch out for!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The initial value problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to visualize the flight trajectories predicted by this model, we are going to need to integrate the spatial coordinates, which depend on both the forward velocity (tangential to the trajectory) and the trajectory angle. The position of the glider on a vertical plane will be designated by coordinates $(x, y)$ with respect to an inertial frame of reference, and are obtained from:\n", + "\n", + "\\begin{align}\n", + "x'(t) & = v \\cos(\\theta) \\\\\n", + "y'(t) & = v \\sin(\\theta).\n", + "\\end{align}\n", + "\n", + "Augmenting our original two differential equations by the two equations above, we have a system of four first-order differential equations to solve. We will use a time-stepping approach, like in the previous lesson. To do so, we do need *initial values* for every unknown:\n", + "\n", + "$$\n", + "v(0) = v_0 \\quad \\text{and} \\quad \\theta(0) = \\theta_0\\\\\n", + "x(0) = x_0 \\quad \\text{and} \\quad y(0) = y_0\n", + "$$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solve with Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We know how to apply Euler's method from the previous lesson. We replace each of the time derivatives by an approximation of the form:\n", + "\n", + "$$v'(t) \\approx \\frac{v^{n+1} - v^n}{\\Delta t},$$\n", + "\n", + "where we are now using a superscript $n$ to indicate the $n$-th value in the time iterations. The first differential equation, for example, gives:\n", + "\n", + "$$\\frac{v^{n+1} - v^n}{\\Delta t} = - g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2$$\n", + "\n", + "Alright, we know where this is going. At each time iteration $t^n$, we want to evaluate all the known data of our system to obtain the state at $t^{n+1}$—the next time step. We say that we are _stepping in time_ or _time marching_.\n", + "\n", + "The full system of equations discretized with Euler's method is:\n", + "\n", + "\\begin{align}\n", + "v^{n+1} & = v^n + \\Delta t \\left(- g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2 \\right) \\\\\n", + "\\theta^{n+1} & = \\theta^n + \\Delta t \\left(- \\frac{g}{v^n}\\,\\cos\\theta^n + \\frac{g}{v_t^2}\\, v^n \\right) \\\\\n", + "x^{n+1} & = x^n + \\Delta t \\, v^n \\cos\\theta^n \\\\\n", + "y^{n+1} & = y^n + \\Delta t \\, v^n \\sin\\theta^n.\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we've learned before, the system of differential equations can also be written as a vector equation:\n", + "\n", + "$$u'(t) = f(u)$$\n", + "\n", + "where\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix}.\n", + "\\end{align}\n", + "\n", + "It's a bit tricky to code the solution using a NumPy array holding all your independent variables. But if you do, a function for the Euler step can be written that takes any number of simultaneous equations. It simply steps in time using the same line of code:\n", + "\n", + "```Python\n", + "def euler_step(u, f, dt):\n", + " return u + dt * f(u)\n", + "```\n", + "\n", + "This function can take a NumPy array `u` with any number of components. All we need to do is create an appropriate function `f(u)` describing our system of differential equations. Notice how we are passing a _function_ as part of the arguments list to `euler_step()`. Neat!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we start by loading the modules and libraries that we need for this problem. We'll need a few transcendental functions, including the $\\log$ for a convergence study later on. And remember: the line `%matplotlib inline` is a magic function that tells Matplotlib to give us the plots in the notebook (the default behavior of Matplotlib is to open a pop-up window). In addition, we are importing the module `rcParams` to define notebook-wide plotting parameters: font family and size. Here we go!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log, ceil\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to set things up to start our numerical solution: the parameter \n", + "values and the _initial values_. You know what the acceleration of gravity is: 9.8 m/s$^2$, but what are good values for $C_D/C_L$, the inverse of the aerodynamic efficiency? Some possible values are given on a table in the Wikipedia entry for [lift-to-drag ratio](http://en.wikipedia.org/wiki/Lift-to-drag_ratio): a modern sailplane can have $L/D$ of 40 to 60, depending on span (and, in case you're interested, a flying squirrel has $L/D$ close to 2).\n", + "\n", + "For the _trim velocity_, the speed range for typical sailplanes is between 65 and 280 km/hr, according to Wikipedia (it must be right!). Let's convert that to meters per second: 18 to 78 m/s. We'll pick a value somewhere in the middle of this range.\n", + "\n", + "Here's a possible set of parameters for the simulation, but be sure to come back and change some of these, and see what happens!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 30.0 # trim velocity in m s^{-1} \n", + "C_D = 1/40 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = v_t # start at the trim velocity (or add a delta)\n", + "theta0 = 0 # initial angle of trajectory\n", + "x0 = 0 # horizotal position is arbitrary\n", + "y0 = 1000 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll define a function `f()` to match the right-hand side of Equation (15), the full differential system in vector form. This function assumes that we have available the parameters defined above. If you re-execute the cell above with different parameter values, you can just run the solution without re-executing the function definition." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the code defining function `f(u)` with the differential equations, and convince yourself that it's right!\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix} \\nonumber\n", + "\\end{align}\n", + "\n", + "Now, Euler's method is implemented in a simple function `euler_step()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equations.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After defining a final time for the solution, and the time step $\\Delta t$, we can construct the grid in time using the NumPy function [`linspace()`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html). Make sure you study the decisions we made here to build the time grid: why do we add 1 to the definition of `N`, for example?\n", + "\n", + "Look at the code below, and make sure you understand the following aspects of it.\n", + "\n", + "* The NumPy array `u` contains the solution at every time-step, consisting of the velocity, angle and location of the glider. \n", + "* The first element of the array `u` is set to contain the initial conditions. \n", + "* In the `for`-loop, the function `euler_step()` is called to get the solution at time-step $n+1$. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100 # final time\n", + "dt = 0.1 # time increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u = numpy.empty((N, 4))\n", + "u[0] = numpy.array([v0, theta0, x0, y0])# fill 1st element with initial values\n", + "\n", + "# time loop - Euler method\n", + "for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to plot the path of the glider, we need the location (`x`, `y`) with respect to time. That information is already contained in our NumPy array containing the solution; we just need to pluck it out. \n", + "\n", + "Make sure you understand the indices to `u`, below, and the use of the colon notation. If any of it is confusing, read the Python documentation on [Indexing](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the glider's position with respect to the time\n", + "x = u[:,2]\n", + "y = u[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to plot the path of the glider and get the distance travelled!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nnMGDB7Np0ybGjx9PcXExr7zyStwh5h0dAamBjoCIiNRPs2fPZvTo0VRUVNCgQQPGjh3LuHHjaNAg\nv3831xRMQqgAERGpv7Zu3cq4ceO4+eabcXeGDBnC5MmT83pKRlMwUqfo/PpolKfolKtolKfoMuVq\nr7324i9/+QszZ86kRYsWPPHEE/Ts2ZOPP/449wHmGRUgIiKS9372s59RXl5Ohw4dWLBgAb1792bd\nunVxh1WvaQqmBpqCERHJHx999BF9+vRhyZIldOzYkbKysrw7VVdTMCIiIjl24IEHUlpaSnFxMcuX\nL2fAgAF8+eWXcYdVL6kAkazQPHQ0ylN0ylU0ylN0UXPVunVrXnzxRTp27MjixYs588wz2bJlS+0G\nl4dUgIiIiKRp1aoVM2fOpE2bNpSVlTFixIgab3Ynu0drQGqgNSAiIvmroqKCnj178uWXXzJ27Fiu\nu+66uEOqdboOSEKoABERyW+zZs1iwIABVFZW8thjj3H22WfHHVKt0iJUqVM0Dx2N8hSdchWN8hTd\nnuaqX79+3HzzzQCMHDmSRYsWZTGq/KUCREREpAa//e1vufDCC9m8eTNnnnkmn376adwh1XmagqmB\npmBERARgy5Yt9OrVi1dffZX+/fszY8aMennfGE3BiIiIJMjee+/N1KlT2X///Xnuuee44YYb4g6p\nTlMBIlmheeholKfolKtolKfospGrdu3a8eCDD2JmjB8/nhdeeOGHB5anVICIiIjshv79+zN27Fjc\nnfPPP58PPvgg7pDqJK0BqYHWgIiISLrt27czYMAAnn/+eXr06EFZWRkFBQVxh5UVWgMiIiKSUA0b\nNmTKlCkccsghzJ8/nyuvvDLukOocFSCSFZqHjkZ5ik65ikZ5ii7buWrdujWPPfYYjRo1YsKECUyf\nPj2r+6/vVICIiIjsoR49enzvImXLly+POaK6Q2tAaqA1ICIisivuzjnnnMPjjz9Oly5dKC8vp1mz\nZnGHtce0BkRERKQOMDMmTZpE586dWbp0KSNHjkS/uNZMBYhkheaho1GeolOuolGeoqvNXDVr1own\nn3ySFi1aMH36dP785z/X2mfVFypAREREsqBjx45MmTIFM+MPf/gDzz77bNwhJZrWgNRAa0BERGR3\nXH/99YwbN47mzZszb948jjrqqLhD2i25WgOiAqQGKkBERGR3VFZWcs455zBt2jTatm1LeXk5Bx98\ncNxhRaZFqCEz62lmpWb2jpmtMrMZZtY5rc8BZnadmZWb2etm9paZvWZmF2bYX4GZXR/2edPM5pnZ\nSbn7RvWT5qGjUZ6iU66iUZ6iy1WuGjRowOTJk+nRowdr1qzh9NNPZ+PGjTn57Lok0QWImfUCXgRm\nuPsR7t4eWAXMMbNDU7oeD/wn8Gt37+bunYF7gfvN7IK03U4EzgZOdvejgUnALDM7pna/jYiI5Ism\nTZrwz3/+kyOOOIJFixYxePBgNm/eHHdYiZLoKRgzmwO0d/d2KW3NgI+AB9z9V2Fbd+Cn7n5j2vvX\nAy+6+7Bw+0hgKTDK3e9P6fcvYJW7D8wQg6ZgRERkj7z33nucfPLJrFu3jr59+/LUU0/RpEmTuMPa\nJU3BBLoBb6c2uPtGYDVwRkpbeYbiowBoAnyS0jwEMKA07XNKgX5m1jR7oYuISL7r0KEDpaWlHHjg\ngbzwwgsMHjyYr7/+Ou6wEiHpBchXZI6xEjjIzPbJ9CYz2w+4A1gD3JDyUjGwHXg/7S0rgUZAlx8a\ncL7SPHQ0ylN0ylU0ylN0ceWqU6dOvPTSSxxwwAE8//zz9OnTh08++aTmN9ZzSS9AFgJHmVmjqgYz\nawEUhZvNUzubWRMzewv4mKCYGOzuH6R0aQVszjCnsiF83j+bwYuIiAB06dKF0tJS2rVrxyuvvEKP\nHj1YtmxZ3GHFKulrQI4D5gO3AtcQHKW4DRgGFAKt3H19hvc1JliUei0wwt2nh+2zgBPcvUVa/0uA\nu4EB7j4z7TWtARERkaxYu3YtAwcOZMGCBRQWFnLHHXcwYsSIuMP6nlytAWlUc5f4uPtrZtYXuApY\nAnwBPARsAYZnKj7C930D3GxmfYC/m9mT7l4JfAoU2s5VRdWRlM8y7W/kyJG0b98egJYtW9K1a1dO\nPfVU4LtDetrWtra1rW1tR9mePXs2l156KY888ggXXnghJSUlTJgwYccRkVzHU/XnVatWkVPuXuce\nQAkwK2W7MdAgQ7+/EqwX6RBuXxlut0vrNxHYCjTNsA+XmpWWlsYdQp2gPEWnXEWjPEWXpFxVVlb6\nvffe602bNnXAmzVr5n/961/9q6++ijs0D//fq/X/yxO9BsTM2plZcVpbC+Bk4O8pzXcD52TYRXuC\nguPzcHs64EDvtH69CQoanaQtIiK1zsy4+OKLefPNNxk0aBAbN25kzJgxtGvXjvHjx+f+aEQMkr4G\nZCQwBjjJ3debWSFwH9DQ3c9K6Xcf0BUY5OGiUzMbCjwKTHH3kSl97yAoOE5y98/M7CLgb8CJ7l6R\nIQZPco5ERKTue/bZZ7nuuusoLy/f0da9e3dOO+00TjnlFI477jgKCwtzEovuBQOY2bHATcARwHqC\nU2inAre4+/aUfkcB/w70JDjisRewieAqp3en9W0EjCe4Guo2gjNgxrj7vGpiUAEiIiK1zt2ZO3cu\nt99+O0899dROV05t164dnTt3pkOHDhQVFXH44YdTVFREUVERLVu2zFocKkASQgVINGVlZTsWNkn1\nlKfolKtolKfo6lKuNm3axMyZM5k9ezZz5sxhyZIlbNu2rdr+++67745ipKioiOLiYvr27UubNm12\n+7N1FoyIiEieKiwsZOjQoQwdOhSAb7/9lhUrVvD222+zYsUKVq5cueN55cqVrF+/nvXr17NgwYLv\n7adr165ceOGFDB8+nNatW8fxVaqlIyA10BEQERFJMnfnk08++V5hMn/+fMrKynZM4xQUFDBq1Ciu\nueYaDj300F3uT1MwCaECRERE6qKtW7dSUlLCvffeS0lJCe5O48aNueKKKxg7dix77713xvfpZnRS\np6Re0EaqpzxFp1xFozxFl2+52muvvRgyZAjPPPMMS5Ys4bzzzmPbtm3ceOONdO3alVdeeSXW+FSA\niIiI1HOdO3fm4YcfZu7cuXTq1Illy5bRs2dPJk6cSFxH+TUFUwNNwYiISH2yZcsWrr76am699VYA\nRowYwT333EPjxo0BrQFJDBUgIiJSHz366KOMGjWKTZs28fOf/5xp06ZRWFioNSBSt+Tb3OqeUp6i\nU66iUZ6iU66+79xzz2XOnDm0bt2amTNn0rdvX7788sucfb4KEBERkTz1k5/8hLlz53LYYYdRXl5O\n//79c/bZmoKpgaZgRESkvlu9ejW9evVi9erVAJqCERERkdp32GGHUVpayoknnpizz1QBIlmhudVo\nlKfolKtolKfolKtdKyoqYt68jPdlrRUqQERERAQITsHN2WdpfcOuaQ2IiIjkE52GKyIiIvWWChDJ\nCs2tRqM8RadcRaM8RadcJYsKEBEREck5rQGpgdaAiIhIPtEaEBEREam3VIBIVmhuNRrlKTrlKhrl\nKTrlKllUgIiIiEjOaQ1IDbQGRERE8onWgIiIiEi9pQJEskJzq9EoT9EpV9EoT9EpV8miAkRERERy\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualization of the path\n", + "pyplot.figure(figsize=(8,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'x', fontsize=18)\n", + "pyplot.ylabel(r'y', fontsize=18)\n", + "pyplot.title('Glider trajectory, flight time = %.2f' % T, fontsize=18)\n", + "pyplot.plot(x,y, 'k-', lw=2);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grid convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's study the convergence of Euler's method for the phugoid model. In the previous lesson, when we studied the straight-line phugoid under a small perturbation, we looked at convergence by comparing the numerical solution with the exact solution. Unfortunately, most problems don't have an exact solution (that's why we compute in the first place!). But here's a neat thing: we can use numerical solutions computed on different grids to study the convergence of the method, even without an analytical solution.\n", + "\n", + "We need to be careful, though, and make sure that the fine-grid solution is resolving all of the features in the mathematical model. How can we know this? We'll have a look at that in a bit. Let's see how this works first.\n", + "\n", + "You need a sequence of numerical solutions of the same problem, each with a different number of time grid points.\n", + "\n", + "Let's create a NumPy array called `dt_values` that contains the time-increment of each grid to be solved on. For each element `dt_values[i]`, we will compute the solution `u_values[i]` of the glider model using Euler's method. If we want to use five different values of $\\Delta t$, we'll have five solutions: we put them in an array ... but each one is also an array! We'll have an array of arrays. How meta is that?\n", + "\n", + "We have one more trick up our sleeve: `enumerate()`. To get all the numerical solutions—each with its value of $\\Delta t$—done in one fell swoop, we will loop over the elements of the array `dt_values`. Within the loop, we need to access both `dt_values[i]` and the index `i`. It turns out, `enumerate()` is a built-in Python function that will give us consecutive `index, value` pairs just like we need. \n", + "\n", + "Read the code below carefully, and remember: you can get a help pane on any function by entering a question mark followed by the function name. For example, add a new code cell below and type: `?numpy.empty_like`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), we compared our numerical result to an analytical solution, but now we will instead compare numerical results from different grids. \n", + "\n", + "For each solution, we'll compute the difference relative to the finest grid. You will be tempted to call this an _\"error\"_, but be careful: the solution at the finest grid is _not the exact_ solution, it is just a reference value that we can use to estimate grid convergence.\n", + "\n", + "To calculate the difference between one solution `u_current` and the solution at the finest grid, `u_finest`, we'll use the $L_1$-norm, but any norm will do.\n", + "\n", + "There is a small problem with this, though. The coarsest grid, where $\\Delta t = 0.1$, has 1001 grid points, while the finest grid, with $\\Delta t = 0.001$ has 100001 grid points. How do we know which grid points correspond to the same location in two numerical solutions, in order to compare them? \n", + "\n", + "If we had time grids of 10 and 100 steps, respectively, this would be relatively simple to calculate. Each element in our 10-step grid would span ten elements in our 100-step grid. \n", + "\n", + "Calculating the _ratio_ of the two grid sizes will tell us how many elements in our fine-grid will span over one element in our coarser grid.\n", + "\n", + "Recall that we can _slice_ a NumPy array and grab a subset of values from it. The syntax for that is\n", + "\n", + "```Python\n", + "my_array[3:8]\n", + "```\n", + "\n", + "An additional slicing trick that we can take advantage of is the \"slice step size.\" We add an additional `:` to the slice range and then specify how many steps to take between elements. For example, this code\n", + "\n", + "```Python\n", + "my_array[3:8:2]\n", + "```\n", + "\n", + "will return the values of `my_array[3]`, `my_array[5]` and `my_array[7]`\n", + "\n", + "With that, we can write a function to obtain the differences between coarser and finest grids. Here we go ..." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = ceil(N_fine/N_current)\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the function has been defined, let's compute the grid differences for each solution, relative to the fine-grid solution. Call the function `get_diffgrid()` with two solutions, one of which is always the one at the finest grid. Here's a neat Python trick: you can use negative indexing in Python! If you have an array called `my_array` you access the _first_ element with\n", + "\n", + "`my_array[0]`\n", + "\n", + "But you can also access the _last_ element with \n", + "\n", + "`my_array[-1]`\n", + "\n", + "and the next to last element with\n", + "\n", + "`my_array[-2]`\n", + "\n", + "and so on. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.1\n", + "dt = 0.05\n", + "dt = 0.01\n", + "dt = 0.005\n", + "dt = 0.001\n" + ] + } + ], + "source": [ + "# compute difference between one grid solution and the finest one\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " print('dt = {}'.format(dt))\n", + "\n", + " ### call the function get_diffgrid() ###\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to create a plot of the results! We'll create a *log-log* plot with the Matplotlib function [`loglog()`](http://matplotlib.org/api/pyplot_api.html?highlight=loglog#matplotlib.pyplot.loglog). Remember to skip the difference of the finest-grid solution with itself, which is zero." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIh\nZGatzGyLmZ1Sibanm9nPkhGXSLIpSYmE0/1AE+APlWj7Z6BHYsMRCYaSlEjImNmPgM3ANKCnmZ1X\nTtss4GLgv5IUnkhSaasOkZAxs/HAEOAYIhsdvu3u/1ZG27bAB8Cx7r41eVGKJId6UiIhYmYXA/90\n9x3uvgp4DuhoZpeXaJdjZi8CfwO2AE+Y2ejkRyySWOpJiYSImU0C/t3d90RfHwusAv7H3Q8b9jOz\nmcB6dx+U3EhFkkM9KZGQMLNuwJv7ExSAu39FZHvuc8zsmhLtawA/BRYkNVCRJFJPSiQEohMgXnT3\n60s51xBYDWwHznD3oujxC4D3gObuvjmZ8Yoki3pSIuFwAzCptBPu/i2RqehtgJsOOtWRyDCgEpSk\nLSUpkYCZWW2go7u/UU6zMcAaYLiZ1Y0e60h0qM/MapvZgwkNVCQANYMOQES4DXAzu7OCdp8CXYhM\nTx8BNAdmRc/dCbyYsAhFAqKalEiAor2itUCzSr7Fga+BVkA3oDewFHjL3RcmJEiRAClJiYhIaKkm\nJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIi\nofX/ARE7ZqFnKYAXAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# log-log plot of the grid differences\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel('$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='-', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Order of convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The order of convergence is the rate at which the numerical solution approaches the exact one as the mesh is refined. Considering that we're not comparing with an exact solution, we use 3 grid resolutions that are refined at a constant ratio $r$ to find the *observed order of convergence* ($p$), which is given by:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "p = \\frac{\\log \\left(\\frac{f_3-f_2}{f_2-f_1} \\right) }{\\log(r)}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $f_1$ is the finest mesh solution, and $f_3$ the coarsest. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is p = 1.014\n" + ] + } + ], + "source": [ + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values2 = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values2 = numpy.empty_like(dt_values2, dtype=numpy.ndarray)\n", + "\n", + "diffgrid2 = numpy.empty(2)\n", + "\n", + "for i, dt in enumerate(dt_values2):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + "\n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values2[i] = u\n", + " \n", + "\n", + "#calculate f2 - f1\n", + "diffgrid2[0] = get_diffgrid(u_values2[1], u_values2[0], dt_values2[1])\n", + "\n", + "#calculate f3 - f2\n", + "diffgrid2[1] = get_diffgrid(u_values2[2], u_values2[1], dt_values2[2])\n", + "\n", + "# calculate the order of convergence\n", + "p = (log(diffgrid2[1]) - log(diffgrid2[0])) / log(r)\n", + "\n", + "print('The order of convergence is p = {:.3f}'.format(p));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See how the observed order of convergence is close to 1? This means that the rate at which the grid differences decrease match the mesh-refinement ratio. We say that Euler's method is of *first order*, and this result is a consequence of that." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Paper airplane challenge" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose you wanted to participate in a paper-airplane competition, and you want to use what you know about the phugoid model to improve your chances. For a given value of $L/D$ that you can obtain in your design, you want to know what is the best initial velocity and launch angle to fly the longest distance from a given height.\n", + "\n", + "Using the phugoid model, write a new code to analyze the flight of a paper airplane, with the following conditions:\n", + "\n", + "* Assume $L/D$ of 5.0 (a value close to measurements in Feng et al. 2009)\n", + "* For the trim velocity, let's take an average value of 4.9 m/s.\n", + "* Find a combination of launch angle and velocity that gives the best distance.\n", + "* Think about how you will know when the flight needs to stop ... this will influence how you organize the code.\n", + "* How can you check if your answer is realistic?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Feng, N. B. et al. _\"On the aerodynamics of paper airplanes\"_, AIAA paper 2009-3958, 27th AIAA Applied Aerodynamics Conference, San Antonio, TX. [PDF](http://arc.aiaa.org/doi/abs/10.2514/6.2009-3958)\n", + "\n", + "* Simanca, S. R. and Sutherland, S. _\"Mathematical problem-solving with computers,\"_ 2002 course notes, Stony Brook University, chapter 3: [The Art of Phugoid](https://www.math.sunysb.edu/~scott/Book331/Art_Phugoid.html). (Note that there is an error in the figure: sine and cosine are switched.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/.ipynb_checkpoints/01_04_Second_Order_Methods-checkpoint.ipynb b/lecture_22/01_phugoid/.ipynb_checkpoints/01_04_Second_Order_Methods-checkpoint.ipynb new file mode 100644 index 0000000..dfe6da7 --- /dev/null +++ b/lecture_22/01_phugoid/.ipynb_checkpoints/01_04_Second_Order_Methods-checkpoint.ipynb @@ -0,0 +1,1187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, C.D. Cooper. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid model: bonus!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_The phugoid model of glider flight_ has been such a fun problem to showcase the power of numerical solution of differential equations, we thought you'd enjoy a bonus notebook. The previous lessons were:\n", + "\n", + "* [Phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_01_Phugoid_Theory.ipynb) —Lays the groundwork for our fun problem, with some context, a little history and a description of the physics of phugoids: curves representing the trajectory of a glider exchanging potential and kinetic energy, with no drag.\n", + "* [Phugoid oscillation](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb) —Develops the simple harmonic motion of an aircraft experiencing a small perturbation from the horizontal trajectory: our opportunity to introduce Euler's method, and study its convergence via an exact solution.\n", + "* [Full phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb) —The full model takes into account the force of drag and results in a system of two nonlinear equations. We obtain the trajectories using Euler's method in vectorized form, introduce grid-convergence analysis and finish with the paper-airplane challenge!\n", + "\n", + "That is a fantastic foundation for numerical methods. It's a good time to complement it with some theory: the first screencast of the course uses Taylor series to show that _Euler's method is a first-order method_, and we also show you graphical interpretations. Many problems require a more accurate method, though: second order or higher. Among the most popular higher-order methods that we can mention are the _Runge-Kutta methods_, developed around 1900: more than 100 years after Euler published his book containing the method now named after him!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Euler's method is a first-order method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this screencast, we use a Taylor series expansion to analyze Euler's method and show that it incurs a truncation error of first order. We also use a graphical interpretation to motivate the _modified_ Euler method, which achieves second order." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('6i6qhqDCViA')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Second-order methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The notebook on phugoid oscillation (lesson 2) included a study of the accuracy obtained with Euler's method, using the exact solution for the simple harmonic motion. We made a _convergence plot_ and saw that as $\\Delta t$ gets smaller, the error also gets smaller. \n", + "\n", + "We could have drawn a line with a slope equal to 1 on that log-log plot, and you would have seen that it was parallel to the convergence line. A slope equal to 1 on a log-log convergence plot is an indication that we have a first-order method: the error scales as ${\\mathcal O}(\\Delta t)$. \n", + "\n", + "In lesson 3, using the full phugoid model (which is nonlinear and does not have an exact solution), we did a _grid-convergence study_ with three different grids, and obtained the _observed_ order of convergence—it was very close to 1, indicating a slope of 1 on a log-log plot.\n", + "\n", + "Another way to look at an ${\\mathcal O}(\\Delta t)$ method is to say that the error scales _linearly_ with the step size, or that they are proportional:\n", + "\n", + "$$ e \\propto \\Delta t.$$\n", + "\n", + "where $e$ stands for the error. To get more accuracy, we could use a _second-order_ method, in which the error is ${\\mathcal O}(\\Delta t^2)$. In general, we say that a method is of order $p$ when the error is proportional to $(\\Delta t)^p$.\n", + "\n", + "In the screencast titled \"Euler's method is a first-order method,\" we used a graphical interpretation to get an idea for improving it: by estimating an intermediate point, like the **midpoint**, we can get a better approximation of the area under the curve of $u^\\prime$. The scheme has two steps and is written as:\n", + "\n", + "\\begin{align}\n", + "u_{n+1/2} & = u_n + \\frac{\\Delta t}{2} f(u_n) \\\\\n", + "u_{n+1} & = u_n + \\Delta t \\,\\, f(u_{n+1/2}).\n", + "\\end{align}\n", + "\n", + "This method is known as the *explicit midpoint method* or the *modified Euler method*, and it is a second-order method. Notice that we had to apply the right-hand side, $~f(u)$, twice. This idea can be extended: we could imagine estimating additional points between $u_{n}$ and $u_{n+1}$ and evaulating $~f(u)$ at the intermediate points to get higher accuracy—that's the idea behind Runge-Kutta methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge-Kutta methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the modified Euler method, we improve the accuracy over Euler's method by evaluating the right-hand side of the differential equation at an intermediate point: the midpoint. The same idea can be applied again, and the function $f(u)$ can be evaluated at more intermediate points, improving the accuracy even more. This is the basis of the famous *Runge-Kutta (RK) methods*, going back to Carl Runge and Martin Kutta. The modified Euler method corresponds to _second-order_ Runge-Kutta.\n", + "\n", + "Here's a bit of historical coincidence that will blow your mind: Carl Runge's daughter Iris—an accomplished applied mathematician in her own right—worked assiduously over the summer of 1909 to translate Lanchester's _\"Aerodonetics.\"_ She also reproduced his graphical method to draw the phugoid curves (Tobies, 2012)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Phugoid model with 2nd-order RK" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's compute the motion of a glider under the full phugoid model using the second-order Runge-Kutta method. We'll build on the _paper airplane challenge_ of lesson 3 now, and look for the horizontal distance that the plane travels until the moment it touches the ground. \n", + "\n", + "As usual, let's start by importing the libraries and modules that we need, and setting up the model parameters. We also set some default plotting formats using the [`rcParams`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.rcParams) module. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the paper-airplane challenge of lesson 3, we suggested an $L/D=5.0$ as a realistic value for paper airplanes, according to experiments, and a trim velocity of 4.9 m/s. Let's start with those values, but you could experiment changing these a bit. _What do you think will happen if you make $L/D$ higher?_" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Among the initial parameters that we suggest for your first experiment, we are starting with a velocity a little higher than the trim velocity, launch the paper airplane with a negative initial angle, and take the initial height to be 2 meters—all sound like reasonable choices.\n", + "\n", + "Now, we can define a few functions to carry out the computation:\n", + "* The right-hand side of the phugoid model from [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb),\n", + "* One step of the Euler's method that we learned in [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), and\n", + "* Differences with respect to a fine grid, as in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])\n", + "\n", + "\n", + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)\n", + "\n", + "\n", + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = int(numpy.ceil(N_fine/N_current))\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we also need to define the function `rk2_step()` that computes the next time step using the *modified Euler* method of equations $(1)$ and $(2)$, above, otherwise known as 2nd-order Runge-Kutta or RK2. This function will be called over and over again within the time loop." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def rk2_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using 2nd-order Runge-Kutta.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at the next time step.\n", + " \"\"\"\n", + " u_star = u + 0.5*dt*f(u)\n", + " return u + dt*f(u_star)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we first need to set up the time discretization, then initialize arrays to save the solution and we are set to go! The only difference this time is that we are using _both_ Euler's method and 2nd-order Runge-Kutta to get a solution, to compare the two. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "\n", + "# set initial conditions\n", + "u_euler = numpy.empty((N, 4))\n", + "u_rk2 = numpy.empty((N, 4))\n", + "\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_euler[0] = numpy.array([v0, theta0, x0, y0])\n", + "u_rk2[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "\n", + "# use a for loop to call the function rk2_step()\n", + "for n in range(N-1):\n", + " \n", + " u_euler[n+1] = euler_step(u_euler[n], f, dt)\n", + " u_rk2[n+1] = rk2_step(u_rk2[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get the position of the glider in time, according to both Euler's method and the 2nd-order Runge-Kutta method, by extracting the appropriate portions of the solution arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x_euler = u_euler[:,2]\n", + "y_euler = u_euler[:,3]\n", + "x_rk2 = u_rk2[:,2]\n", + "y_rk2 = u_rk2[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### How far will it fly before touching the ground?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As the $y$-axis measures the vertical coordinate with respect to the ground, negative values of $y$ don't have any physical meaning: the glider would have hit the ground by then! To find out if there are any negative $y$ values we can use the handy function [`numpy.where`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html). This function returns the **indices** of the elements in an array that match a given condition. For example, `numpy.where(y_euler<0)[0]` gives an array of the indices `i` where `y_euler[i]<0` (the `[0]` is necessary as `numpy.where` returns an array, which in this case contains a single line). If no elements of the array match the condition, the array of indices comes out empty. \n", + "\n", + "From the physical problem, we know that once there is one negative value, the glider has hit the ground and all the remaining time-steps are unphysical. Therefore, we are interested in finding the _first_ index where the condition applies, given by `numpy.where(y_euler<0)[0][0]`—do read the documentation of the function if you need to! " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_euler = numpy.where(y_euler<0.0)[0]\n", + "if len(idx_negative_euler)==0:\n", + " idx_ground_euler = N-1\n", + " print ('Euler integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_euler = idx_negative_euler[0]\n", + " \n", + "idx_negative_rk2 = numpy.where(y_rk2<0.0)[0]\n", + "if len(idx_negative_rk2)==0:\n", + " idx_ground_rk2 = N-1\n", + " print ('Runge-Kutta integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_rk2 = idx_negative_rk2[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Do Euler and RK2 produce the same solution?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An easy way to compare the numerical results obtained with the Euler and 2nd-order Runge-Kutta methods is using [`numpy.allclose`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html). This function compares each element of two arrays and returns `True` if each comparison is within some relative tolerance. Here, we use the default tolerance: $10^{-5}$." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Are the x-values close? False\n", + "Are the y-values close? False\n" + ] + } + ], + "source": [ + "# check to see if the paths match\n", + "print('Are the x-values close? {}'.format(numpy.allclose(x_euler, x_rk2)))\n", + "print('Are the y-values close? {}'.format(numpy.allclose(y_euler, y_rk2)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hmmm, they do differ. Maybe $10^{-5}$ is too tight a tolerance, considering we're using a somewhat coarse grid with first- and second-order methods. Perhaps we can assess this visually, by plotting the glider's path? Study the code below, where we are plotting the path twice, taking a closer look in the second plot by \"zooming in\" to the beginning of the flight." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n+eWXL1nerVu3i92pp06dMq1atTKNGzc2x9PpOsjI4cOHjYiY0qVLZysHb3mznwlAdyrQBfgFKOFF\n2RbAH8BB3IdmAAAgAElEQVT6VK/tWN2pu+z3T6Szbo6+L6WC3d69e02FChXMlClT/lm4caMxVata\nP4PF6tXGtGqVbpfuuHHjzI033mhOnTqV46q8PYdpd6qfrVixgh07djB69GhmzJgR8KcbBGIOoHr1\n6rF79252797tSP0qYxcuXCA+Ph4R4ZZbbvFY5tChQzRu3JiCBQuyaNEiChYsmOV6VtkDgDt06JCj\neEOBiNwLDAXijDGH7GWtRaRXqjIlxZ57xxiz0BhT1hhzY8oLSLml7Ul72bOBziPQ3HI+cEse4Hwu\nf/31Fy1atOC+++7jgQce+OeDqlXh55+tn17yey5168KXX6bbpTtkyBCqVatG79690x2q4mvaiPOz\npC1bWNysGU888USOHswbzHLlykXr5s2Z/9lnToei0ti/fz99+vRh7969DBo0iFq1anks16NHDzZs\n2MDIkSMvn0jTC8YYXnzxRWJiYhgxYkROww5qItIZmAG8CTQXkXvtRl0boLRdpgGwD5ia0abS/FQq\nrJw5c4a2bdvSpEkThg8ffnmBXKE14ktEeO2119iwYQMzZswITKXeXK4L9RdOdUecPGmOFi9uRleu\n7Mpu1NT233CDeaJ2bUdjyPZ+HjXKGOtm8ktfo0b5tnx6n/tASndqVFSUKVWqlClVqpTJly+fERFT\nu3Zt88MPP3hcL6U7tU6dOkZETJkyZcz27duzXP/kyZNNdHS0+fbbb3OaSqa82c/4sTsVOAokYXWF\npn4lASPtMjWAI3joIgVKATuB/fY6h+33ddKpL+dfmlJBJikpydx1112mY8eOrvv9uHnzZlOsWDGz\nfv36bG/D23OY4w2sQLycOgkeu+su80FUlNmxY4cj9QfS6aefNq/nzm3+/vtvx2II5192nsbEnT59\n2owYMcKIiGnVqpXHaWBSGnErVqwwvXv3NiJirr76avPbb795XffHH39soqOjzWeffeaTXDLjdCMu\n0K9wPq6Vew0fPtw0aNDAnDlzxhprtnix0yFlz4ULxniY2uTtt982VapUMadPn87WZr09h2l3qp8k\nfvghJz//nB969qRixYqOxRGo8Q55O3TgvyIsWbTIkfrV5fLmzcuzzz5LXFwcCxYs4PXXX0+3rIgw\n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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(10,6))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler[:idx_ground_euler], y_euler[:idx_ground_euler], 'k-', label='Euler')\n", + "pyplot.plot(x_rk2[:idx_ground_rk2], y_rk2[:idx_ground_rk2], 'r--', label='RK2')\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_rk2[idx_ground_rk2-1]))\n", + "pyplot.legend();\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler, y_euler, 'k-', label='Euler')\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From far away, the Euler and RK2 methods seem to be producing similar answers. However, if we take a closer look, small differences become evident. Keep in mind that we are solving the same equation and both methods will converge to the same solution as we refine the grid. However, they converge to that solution at different rates: RK2 gets more accurate faster, as you make $\\Delta t$ smaller." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Grid-convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we want to do a grid-convergence study with RK2, to see if we indeed observe the expected rate of convergence. It is always an important step in a numerical solution to investigate whether the method is behaving the way we expect it to: this needs to be confirmed experimentally for every new problem we solve and for every new method we apply!\n", + "\n", + "In the code below, a `for`-loop computes the solution on different time grids, with the coarsest and finest grid differing by 100x. We can use the difference between solutions to investigate convergence, as before." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for-loop to compute the solution on different grids\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once those runs are done, we compute the difference between each numerical solution and the fine-grid solution." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# compute diffgrid\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "for i, dt in enumerate(dt_values):\n", + "\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now we plot!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nicaKFSu44YYbWLVqFR9//HHU4UgBmUymza7Dqqy9lhRJb+kkfdpm0qUpfxdffDGTJk3iuOOO449/\n/GPU4VQs6bkLe/aaiEjNNDc3M2XKFMyMa665JupwpEJq6RSR9JaOSByMGDGCX/3qV5x++un86le/\nijocKYFaOiISW4cffji9e/fm6quvjjoUCYGKToql+VmBJEhL/i666CKam5vp27dv1KGEJi25y6cq\nRcfMZlfjviKSTttsU9FEW6kjpeynE2QTt0nu3rWSwOqBmfn48eM1ZVpEpAQtU6YnTJgQfMFPbeKm\niQQiIuWodCLB+8BRwODcayjwMnAHMILspm1H5/77DmAx2U3fpM6luV85CZKav08++YR7772XjRsT\ntcDJpyQ1d6UopaP0L+7+RMsbM5tEdhO3+/NcO93MTia7idvvQopRRFLkrrvu4vzzz+f444/noYce\nijocCZk2cStC3WsitbVmzRoGDhzIkiVLuOeee/j2t78ddUgSQNjP6ewCFJsk0BXYKcB9RSTlbrnl\nFpYsWcLBBx/Mt771rajDkSrQJm4pluZ+5SRIWv7ef/99Jk6cCMA111xDu3axn4tUUNJyV44gk98v\nAR4nu4nbUmAp2WnSPYCewCqgIawARSQdpk6dygcffMBRRx3FMcccE3U4UiWB1l4zs32AnwDHAZ1z\nh1cDTcA4d58bWoQR0piOSO1s2rSJe+65h/32249DDjkk6nCkAsXGdLSJWxF6OFREpHShPBwahJmd\n4e6xXw426S2dpO/pkXTKX3wlPXdRrDJ9Q5XuKyIiMVbKMjiNwM7uPir3vpnia7EZ0NvdO4QVZFSS\n3tIREamGisZ0zOxtYEdgF3dfa2brgafb+MzD3b1ToGjriIqOSPW4O8OHD+dLX/oSF154IZ06xf5X\nhuRUWnR6AB3d/c3c+6Xu3rONr2nzmjhIetFJer9y0sU9fzNnzuS4445jp512YuHChXTtGvuF6UsW\n99y1paIxHXdf1lJwcjqa2VQz+1qRL/t+uUGKSHps2rSJyy+/HIAxY8akquCkXZC11zYB04Hr3P2V\nqkRVJ5Le0hGJyvTp0znjjDPo3bs38+bNU9dawoT6nI6ZLXP3HqFEVudUdETCt379evbdd1+am5u5\n4447OPfcc6MOSUIW9pTpV8ysVxsfeFeA+0qNpXn9pySIa/5WrFhB79692X///TnzzDOjDicScc1d\n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\nzP8H50NbGbioopAAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot using the matplotlib function loglog()\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel(r'$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.xlim(1e-4,1)\n", + "pyplot.ylim(1e-4,1)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='--', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is looking good! The difference relative to our fine-grid solution is decreasing with the mesh size at a faster rate than in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), but *how much faster?* When we computed the observed order of convergence with Euler's method, we got a value close to 1—it's a first-order method. Can you guess what we'll get now with RK2?\n", + "\n", + "To compute the observed order of convergence, we use three grid resolutions that are refined at a constant rate, in this case $r=2$. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 1.983\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " ### call rk2_step() ###\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probably you're not too surprised to see that the observed order of convergence is close to $2$. Because we used a second-order method! This means that the numerical solution is converging with the grid resolution twice as fast compared with Euler's method in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), or in other words, the error scales as ${\\mathcal O}(\\Delta t^2)$. That is a lot faster! However, we are paying a price here: second-order Runge-Kutta requires more computations per iteration." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge task" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How much longer does it take to get the solution with RK2, compared to Euler's method? Run the same solution (same time grid, same parameters), but find a way to *time* the calculation with Python, and compare the runtimes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multi-step methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The screencast *\"Euler's method is a first-order method\"* motivated graphically an idea to get increased accuracy: using intermediate points between $u_{n}$ and $u_{n+1}$ and evaluating the right-hand side of the differential equation at those intermediate points. The idea is to somehow get a better approximation using more data from the function $f(u)$.\n", + "\n", + "Another way to bring more information about $f(u)$ into the numerical solution is to look at time data $t\\lt t_{n}$. For example, we can involve in the calculation of the solution $u_{n+1}$ the known solution at $u_{n-1}$, in addition to $u_{n}$. Schemes that use this idea are called _multi-step methods_.\n", + "\n", + "\n", + "A classical multi-step method achieves second order by applying a _centered difference_ approximation of the derivative $u'$:\n", + "\n", + "$$ u'(t) \\approx \\frac{u_{n+1} - u_{n-1}}{2\\Delta t}.$$\n", + "\n", + "Isolate the future value of the solution $u_{n+1}$ and apply the differential equation $u'=f(u)$, to get the following formula for this method:\n", + "\n", + "$$ u_{n+1} = u_{n-1} + 2\\Delta t \\, f(u_n),$$\n", + "\n", + "This scheme is known as the **leapfrog method**. Notice that it is using the right-hand side of the differential equation, $f(u)$, evaluated at the _midpoint_ between $u_{n-1}$ and $u_{n+1}$, where the time interval between these two solutions is $2\\Delta t$. Why is it called \"leapfrog\"? If you imagine for a moment all of the _even_ indices $n$ of the numerical solution, you notice that these solution values are computed using the slope estimated from _odd_ values $n$, and vice-versa.\n", + "\n", + "Let's define a function that computes the numerical solution using the leapfrog method:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def leapfrog_step(unm1, u, f, dt):\n", + " \"\"\"Returns the solution time-step n+1) using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " unm1 : array of float\n", + " solution at time-step n-1.\n", + " u : array of float\n", + " solution at time-step n.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at time-step n+1.\n", + " \"\"\"\n", + " return unm1 + 2.0*dt*f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But wait ... what will we do at the _initial_ time step, when we don't have information for $u_{n-1}$? This is an issue with all multi-step methods: we say that they are _not self-starting_. In the first time step, we need to use another method to get the first \"kick\"—either Euler's method or 2nd-order Runge Kutta could do: let's use RK2, since it's also second order.\n", + "\n", + "For this calculation, we are going to re-enter the model parameters in the code cell below, so that later on we can experiment here using the leapfrog method and different starting values. At the end of this notebook, we'll give you some other model parameters to try that will create a very interesting situation!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude\n", + "\n", + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# set initial conditions\n", + "u_leapfrog = numpy.empty((N, 4))\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_leapfrog[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "# first step using RK2\n", + "u_leapfrog[1] = rk2_step(u_leapfrog[0], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we have all the required information to loop in time using the leapfrog method. The code cell below calls the leapfrog function for each time step." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for loop to call the function leapfrog_step()\n", + "for n in range(1,N-1):\n", + " \n", + " u_leapfrog[n+1] = leapfrog_step(u_leapfrog[n-1], u_leapfrog[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like before, we extract from the solution array the information about the glider's position in time and find where it reaches the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the glider position in time\n", + "x_leapfrog = u_leapfrog[:,2]\n", + "y_leapfrog = u_leapfrog[:,3]\n", + "\n", + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_leapfrog = numpy.where(y_leapfrog<0.0)[0]\n", + "\n", + "if len(idx_negative_leapfrog)==0:\n", + " idx_ground_leapfrog = N-1\n", + " print ('The glider has not reached the ground yet!')\n", + "else:\n", + " idx_ground_leapfrog = idx_negative_leapfrog[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the glider's trajectory with both the leapfrog and RK2 methods, we find that the solutions are very close to each other now: we don't see the differences that were apparent when we compared Euler's method and RK2." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqkAAAIKCAYAAAAArtaHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8FHX+x/HXJwEpUoKCYA8IooIUUUFBREFOEI8TLNzJ\niVg478SKooiKiHDYPdvPLncqCFasWMBQBBQQkKIgTURAinQEUr6/P3aDMWxCNtndmZ19Px+PfSS7\nO+X93R2Gb2Y+8x1zziEiIiIi4idpXgcQERERESlMnVQRERER8R11UkVERETEd9RJFRERERHfUSdV\nRERERHxHnVQRERER8R11UuPEzMaa2UYzyzOzXoXeu9fMfjazQ7zKJ7FlZh3MbI2Z7Taz5TFcbmZ4\nuTvNLC+Gy73MzDab2ctRzPNIeHseFOW6csNtKPz4sph5jjWz6cW12cxGhNsQadk7zGxHNDlFRMRf\n1EmNE+dcV6Bb/tNCb9cAqgEVol2umd0T7igcVcaIvmRm7SJ17P3OOfe5c+5QYCr7ft9lWe6K8HJH\nx2K5ZlbLzN4GBhHaBku0TDM7Gbg+P1aUq13pnDs0wqN1Eeu6DpgM1N3PuhxwfaRlA7OBt6LMKSIi\nPqJOanxZpBedc9cBtZxzPyU4TzJJ1rtMRPzOY7TcWCx7BLAA+FOJV2xWDngBeDMG69/fuv4GXAi0\nAr7bz+TzgJ8jLKMBcDrwUswDiohIwpTzOkCqcs7tKuMi4tUZ8ougt88rVzrn1ppZZhTz3AJsBZ4B\nLo5HqAI+d86NBDArfhNwzj1SxFuXA8ucc1kxTSYiIgmlI6kxYmYtzGyimW01s2Vm9h+gUoTpJhdT\nq3qBmU0zs1XhmtWpZnabmVUPv78A6BeefEaB+rt64ffbmtlIM1tqZuvMbLWZvWBmNQutZ1yBDL3N\nbJCZ/WBmm8LvZUbIfYCZ3Wlm35vZWjNbaWafm9m/zOyAAtOZmV1nZvPC61hnZm+bWeMSfIbP8/sp\n2v8UaF9PM2tfsObTzE4Ir39tuB0vh5fxZzN7NzzNBjNbYWYPmVnlgusJ1yzmhfM9Gn49Pby8nWa2\nxcxuLjDP38xsZrhNG83sEzNrs782FZj/UDN7MdyGjeHPe5iZRdpGbgxvQxvMbI6ZXVTS9eyPc25t\nNNObWX3gNqBPrDIUxzm3rizzm1ka8HdCR4xFRCSZOef0KOMDaEjoSNPnhOpNjdApyzlAHnBZoenP\nLPw6cBaQDXQOPzfg6vB0bQtMNyj82lERcrwJTCBUSgBQH5gbfqQXkWE2cEn4tSOApcCcQtOmAR8C\n64BTw69VAV4OL6NJgWmfAbYBncLPMwh1PLcBjUvwWe7z2RR6/wtgPTAWOCz82ivAS+HfZwKjgCrh\n5y2AlcCHhZZzRXg9l0RYxwKgVYHntwM5hDo/RuiPjyeAPcA5hebNInQUr+BrhwA/EqqzPDT8WktC\np6onAFZg2jvCua4r8DmPABYBuRGyVsz/vqPcZjPD63lpP9NNAO4O/94uPM/dUa5rXfjz+g74hdC/\ni3uAyvuZLytSm/czzznh7+qIsv671kMPPfTQw9uHjqTGxn2EOhM3Oec2uZA3gRlFTB/pPOafgS3O\nuY8Awst4Hngf2LmfefMtAW5xzq0PL2MJ0B84ETi3iAzLnXOjw9OvAl4DmpjZ0QWm/RvQCRjknPs6\nPO124B+EOp+hBYaOLPYBHnPOfRyebjOhznY6MLSY7CVpX/77BwNDnHOrw6/dD4wM/74AuDmcD+fc\nrPB6O5lZowLLGUPoc+39h4WbtSTUoZ8efp5J6Psd5Zx7Jfy9/AbcRKjD9VAJ2jQMOBLo7ZxbE871\nVXi57YC/hNd1MHA3MNs590R4uu3Av4DaRSx7FrDazFqVIEdUzOzK8HqHlXFR1YH5QDPgKOBeQhdh\nTSp4hDtGLidUMrAqxssVEZEEUye1jMwsnVAHbo1zbl6ht7OiWNQvwEEWGuZn79BUzrmuzrmZJVmA\nc+5259w3hV7+IfzzhCJmm1roef5/7ocVeO2S8M9xhda3h9CRq2WFpvus0HS/AsuBDuHTsWX1W8HP\nxDk33zn3efj3XvkdwQL2+QzCnb83w5kOLzBtb/54wU13Qv9OCrcpB/gWONHMDi0qaLi9FxL6Y2BJ\nobfz25D/B0QH4AD2/Zx3UvQfPMuBjcDmojKUhpnVJtT57xNua1kc6px71jm3O/x4m1Bn/CRCnf2Y\nMLNqhDr8umBKRCQA1Ektu1pAZaBwxwggmvq/JwgdNb0R+NnMxpvZFWZWsaQLMLM64U7u3HBt5Rpg\nevjtfWofwzYUer4n/LN8gdfqE7rafnWhaXHOfZ1/1DI8HcCbVmjcSuBwIBc4qKTtKcb6ot4ws/rh\nmtMFBT6DN8JvF/4MXib0b6BXeN5KhDqU/yswTX6bHo3QptOA7fyxQ19YLUJDPR0RYf73w/Pn1wzX\nDf8salva5yizc66Lc66Oc+77YjKUxuPAG865SGOZRnVRW/iPlMLeC/88L9pgxbgE+A14J4bLFBER\nj+jq/tgp09XozrkdQFczO5HQ6fWehIb9udXMznT7uaDEzKrwe4f0wvwjjeHT9sUNLh/NAPEHALtL\nMF0H59y3USw3WhEzm9kRhI5OLgW653fczOxMQrWsf+Ccm2ihgfd7ETql3Q34ykW+uKi3c+69CK+X\n1ALn3EklnNYPIxt0AnaZ2V8KvJZ/gdwtZnYNoaqU4jroxcnfnmN5Q4vLgZHOuewYLlNERDyiI6ll\nt55QbWOdCO9Fei0is9B4O865ec65AcDRhE6JNgT6lmARHQjV+z1ZqDwgFh2eH8LL2adDYma1wx1k\nCF3cA6ELsCJN1y4GWYpzIaGjlv8udGSxuM/gv0ADM2tN6FR/4TswFdem6ha601R6MctfD2whdCR5\nH2bW3ELjesLvZRNFbUsJGzvWOVfNOXeI++MA+fk3p3gw/Np+O6hm9hcL3QigsPwa28JH8ksl/Bme\nhk71i4gEhjqpZeScyyV05fuhZtak0NvtoljUy2Z2S4Hl5gGPhZ9WLzBd/q0eywGY2eXhIYqKGnc1\nFnemGh3+2aXgi2ZWFVhB6Er1gtN1Y1+DKFn9YeH2tTazO0qYs6ijvMV9Bv8l1Pm7G2hCaNSAgt4m\ndLV4pDb9A3gkvA1EFP4exwC1Cg9ZFS4v+BzIH57rM0LfY6dC0x0IROroYWYVzaxWUeuPsWL/4DGz\nGgX+YMn3F0KjIhSWf5p/XIT3SuNyQqNSzInR8kRExGOedFLNrFm4bnChmX0brh/8jxUaz7OIeVeY\n2ewIj7MTkb0IdxGqLXzEzA4yszQz60booiIo+j/3gq874FozOwH23uWnL6E6zjEFplsY/tnIzCoA\ntxI6yjaVUM1o3wLLOBx4IIoMRb0+EviIUOnByeFlZwAvAtOcc+MBnHPTgKeAv5vZJeHPId3MehMq\nYbi7iHUVtJRQXWz+lfhXEBpGqiSZPyLUyR1gZkeGcx5H6PuJOJ9z7kdCpQDnAK8XPlXsnFsJDADO\nNrMbzKy8hZxHaLio/hFyFF7PQEKd+SfM7JhwrpqEhs76lnB9pnNuEzAEaGahsWbTwp2+pwh1XiO1\nexahGubSXt1fmiPt+8wTHgXhZ+AH++PYrw7oY2YXhreFdDPrTOgK/++Ah8uaz34fGzXwR1EDuO8U\nESlaosa6KvgAvid0MUul8PPDCP2HtQiouJ95l3uRuQRtOonQ1fxbCY2J+QKho0h5hK68nheebjKh\nq7Fzw6/PCb/eFHg6/DmsJvQf/mfAWYXWY8D/EbqQZjWhMUErht87AfiA0CnUZcAk4J/hDNuA78LT\nvVIow0fh1z8MP88Nv/9igfWWJ9TZWhRe93JCR3qrRfgs/kFoLMwNhDpnY4HmUXyWV4c/w7Xhz6tB\n+PNZQ6izlh3+/b8R5j09/D1sBhYDnxAajD7/e/g0wjyXhtt8UjGZLgSmhdu0ktAR0LMKvN8hQr6e\nBd4/JPy9rQp/b4uBfwNVI6zrekKd9Q2EhtS6mt/HpF0D3Flg2o/Dn9NxJfxsLyd0cdGucJtzws+X\nFTPPX8PT7A7Pkx1+/lSBaWqFt4kZQLkCrx8J3Al8RWib3kyofOSBIrad9HC238Lryg3//hvQvoh8\nHcLv1/B6PxDvBwHcd+qhhx56FPUw5xJ/i3QzWwh0cc4tK/DaFYQ6dhe60BA1Rc273DlXt6j3RUSC\nSvtOEUklXl3d38TtO/Zi/rA7GYkOIyKSJLTvFJGU4UlNaoSdLMCxhOrXJu1vfjO738y+NLNFFrqH\n+vkxDyki4jPad4pIKvHF1f3hIXyuBF5w+96Vp7B1wCznXGtCF9eMBcaa2bVxjiki4ivad4pIkHlS\nk7pPCLN7CA1J09aF7ose7fwfAGcAhzjn9hmGyMy8b6SIBJJzzrObL8Rz36n9pojES0n3m54fSQ0P\nT3Qh0Kk0O9mwr4GqFH1/es+vUHPOMWjQIM8zKIuyKEvsHl5KxL7T6883VbYjtU/tS6X2RcPTTqqZ\n/R24GTjbObffO8+EBy4/MMJb+YOpF3fnH8+tWLHC6wh7KUtkyhKZsvhLqu074yHo25Hal9yC3r6S\n8qyTamY9CQ2E3t6F70tvZl3M7OoC09Q2s4KHhHsQefDvFoTGVlwY4T0RkcDQvlNEUoVXd5y6FHge\nGAF0NLOe4R3v+YTvD2+he6mvJnS3nYL+agXuBW5mlwBdgQecczsTEL/ULr/8cq8j7KUskSlLZMri\nD6m674yHoG9Hal9yC3r7Ssqrwfw3EhrTr3DhrAMGO+fuNbOmwHjgMefcfeH5DgH6AH8mdAekDOBX\n4P+ccy8Usz7nRTtFJNjMDJfAC6cSue/UflNE4iGa/aZX46Qe7JxLd86lFXqkO+fuDU8z1zlXM38n\nG35tnXPuPufcqc655s65us65FsV1UP0kKyvL6wh7KUtkyhKZsvhDqu474yHo25Hal9yC3r6S8vzq\nfhERERGRwnwxTmq86bSViMRDok/3J5L2myISD74/3S8iIiIiUhx1UhPITzUmyhKZskSmLBI0Qd+O\n1L7kFvT2lZQ6qSIiIiLiO6pJFREpJdWkiohERzWpIiIiIpLU1ElNID/VmORn2bFjB3v27PFFFj9Q\nlsiURYIm6NuR2pfcgt6+klInNcXk5OQwatQo7rzzTmrUqEGVKlWoUKECRx55JFdddRWzZs3yOqKI\niIiIalJTySeffELfvn1ZsmTJ3tcqVKhAdnY2eXl5e1+76KKLePrpp6lZs6YXMUWShmpSRUSio5pU\n+YPs7Gz69u3Lueeey5IlS6hfvz5PPvkkK1eu5LfffiM7O5u5c+dyyy23ULlyZd544w2aNGnC7Nmz\nvY4uIiIiKUqd1ATyosZk69atdOzYkaeeeooDDjiA4cOH891339GoUSOOPPJIzIy0tDSaNGnCgw8+\nyIIFC2jTpg1r1qzhzDPPZMqUKXHP6KfaG2WJTFkkaIK+Hal9yS3o7SspdVIDbPPmzXTs2JGsrCwO\nPfRQJk2axG233Ua5cuWKnCczM5Px48fTo0cPtm3bxvnnn8/8+fMTmFpERERENamBtXv3bs4991yy\nsrLIzMzkiy++IDMzs8Tz5+bmctFFF/HOO++QmZnJN998Q40aNeIXWCQJqSZVRCQ6qklNcc45rr76\n6r1HUPM7qtFIT09n5MiRtGjRghUrVtC7d2/0H5aIiIgkijqpCZSoGpNhw4bxyiuvcOCBB/LBBx9w\n9NFHlypLxYoVeeONN8jIyGDs2LH897//jUNaf9XeKEtkyiJBE/TtSO1LbkFvX0mpkxowEydO5O67\n78bMeP311znppJPKtLy6devy+OOPA3DTTTexZs2aWMQUERERKZZqUgNk/fr1NGvWjNWrV3PHHXcw\ndOjQmCzXOUeXLl346KOP6NWrFyNGjIjJckWSnWpSRUSiE81+U53UgHDO0bVrV95//31at25NVlZW\nsVfxR2vp0qUcf/zx5OTkMGvWLJo3bx6zZYskK3VSRUSiowunfCqeNSavvfYa77//PhkZGYwaNWq/\nHdRosxxzzDFcd911OOfo169fTC+i8lPtjbJEpiwSNEHfjtS+5Bb09pWUOqkBsHbtWq6//noAHnnk\nEY488si4rOfOO+/koIMO4osvvuCjjz6KyzpEREREQKf7A+HCCy/krbfeomPHjowbNw6z+J19fPjh\nh7nlllto1aoVU6dOjeu6RPxOp/tFRKKjmtRCgryz/eijjzjvvPOoUqUK8+fPjzjcVCxt376dzMxM\nNm7cyIQJEzjrrLPiuj4RP1MnVUQkOqpJ9alY15js3r2bG264AYB77rknqg5qabNUqVJl7zqHDRtW\nqmXEKks8KEtkyiJBE/TtSO1LbkFvX0mpk5rEHn30UZYsWcLxxx+/tyY1Efr27UuVKlX4/PPPmTFj\nRsLWKyIiIqlDp/uT1KpVq2jYsCE7d+7ks88+o0OHDgld/6233spDDz1Ez549eeWVVxK6bhG/0Ol+\nEZHoqCa1kCDubHv06MHo0aPp3r07b775ZsLXv3z5co455hjKly/PTz/9xCGHHJLwDCJeUydVRCQ6\nqkn1qVjVmHz11VeMHj2aihUr8vDDD3uSpW7dunTu3Jk9e/bw4osvlmlZfqq9UZbIlEWCJujbkdqX\n3ILevpJSJzUJDRw4EICbbrop7lfzF6dv374APPPMM+Tm5nqWQ0RERIJHp/uTzIQJE2jfvj3Vq1dn\n+fLl1KhRw7MseXl5NGzYkCVLlvD+++/TpUsXz7KIeEGn+0VEoqPT/QHlnNt7FPXWW2/1tIMKkJaW\nxtVXXw3AiBEjPM0iIiIiwaJOagKVtcbkww8/ZPr06dSqVWvvWKVeZcnXs2dP0tLSeO+999i4caOn\nWWJBWSJTFgmaoG9Hal9yC3r7Skqd1CSRl5e39yjqHXfcQZUqVTxOFHLYYYfRsWNHsrOzGTVqlNdx\nREREJCBUk5okRo8eTY8ePTjiiCP44YcfqFixoteR9srP1qJFC2bOnOl1HJGEUU2qiEh0NE5qIcm+\ns83JyaFRo0YsXryY5557bm8dqF/s2rWLOnXqsGXLFubNm0fjxo29jiSSEOqkiohERxdO+VRpa0z+\n97//sXjxYo455hguv/xyT7NEUrFiRS655BIAXn/9dU+zlJWyRKYsEjRB347UvuQW9PaVlDqpPrd7\n924GDx4MwL333kv58uU9ThRZfid19OjR6OiLiIiIlJVO9/vcE088wfXXX0/jxo2ZO3cuaWn+/Lsi\nNzeXww8/nF9++YVZs2Zx0kkneR1JJO50ul9EJDo63R8QO3bsYOjQoQDcd999vu2gAqSnp3PhhRcC\noaOpIiIiImXh315PAEVbY/LEE0/wyy+/cOqpp/LnP//Z0ywlkX/Kf8yYMVGd8vdT7Y2yRKYsEjRB\n347UvuQW9PaVlDqpPrV582YeeOABAIYOHYqZ/88otm7dmsMPP5wVK1YwY8YMr+OIiIhIElNNqk/d\ndddd3HfffbRr144JEyYkRScV4Prrr+eJJ55gwIABDBs2zOs4InGlmlQRkehonNRCkm1nu27dOurV\nq8eOHTv48ssvOf30072OVGLjx4+nQ4cOnHDCCSxYsMDrOCJxpU6qiEh0dOGUT5W0xmT48OHs2LGD\n8847L24d1HjVu7Rt25aMjAwWLlzIDz/84GmW0lCWyJRFgibo25Hal9yC3r6SUifVZ1atWsXTTz8N\nhK7oTzbly5enc+fOAIwdO9bjNCIiIpKsdLrfZ/7xj3/w3HPPcfHFFyftUE5jxozhkksuoU2bNkye\nPNnrOCJxo9P9IiLRUU1qIcmys12yZAnHH388eXl5LFy4kIYNG3odqVS2bt1KzZo1yc3NZe3atdSq\nVcvrSCJxoU6qiEh0VJPqU/urMbnnnnvIycmhV69ece+gxrPepVq1apx99tnk5eXxwQcfeJolWsoS\nmbJI0AR9O1L7ktv+2rdhwwb27NmTmDAeUifVJ+bPn8/IkSMpX748gwYN8jpOmXXt2hVQXaqIiEi0\nnHN/uClO+/btWb58+d7no04+mfWXXQaPPQYffcToxx/nu+++8yJqXOl0v09ccMEFvPvuu/Tt25cn\nnnjC6zhl9vPPP3PEEUdQuXJlNm7cSMWKFb2OJBJzyXq638zuA+4Aejvn/lvENL7fb4oEUk4Od7Ro\nwU1HH02tAQPgtNPo3Lkz11xzzd67Tw5p2pSr2rfn0OxsWLSILePHU6FePSp++inUrcuMGTNo3rw5\n5cqV87gx+1JNaiF+39nOmDGDU089lUqVKrFs2TLq1KnjdaSYaNasGXPnzuWzzz6jQ4cOXscRiblE\nd1LNrBlwLdAayAHSgc+BIc65DSVcxhHAYqACoU7q/4qYztf7TZEgWb58OWmbNnH02LHw/POsNOP7\nk06i4/PPQ506rFmzhoMOOogKFSrsM29ubi7/98QTXHv66djJJ7N9506OOOIIZs2axTHHHONBa4qn\nmlSfKqrG5M477wRCd2tKVAc1EfU85557LgDjxo3zPEtJKUtkyuIbrwMZQAvnXBPgHKAj8KWZlfR0\nxTBgPJB0R4BjKejbkdqXXKbffz8Hn3Ya/PwzfPYZ859/nrPfeQfCfYJDDz00YgcVID09nb433oid\neiqkpfHzzz9z7bXX7u2gbtu6lWnTpiWsLbGkTqrHvvjiCz799FOqVatG//79vY4TU506dQLg448/\n9jiJSGDkAbc5534DcM6tBh4EGgCd9zezmbUATgeSv6ZIJMnNmzdv7+/n33MPwy+5hLznnoNGjahc\nuXKpT9U3bNiQoUOH7n3+5Xnnkf33v8PmzWXOnGg63e8h5xytWrXi66+/5r777mPgwIFeR4qpPXv2\nULNmTbZt28aPP/7IUUcd5XUkkZjy4HR/OedcTqHXOgEfAlc5517az/xZwNPAOmACcLlO94sk3pYt\nWzjuuON466234n7r84fuvpt/rVxJ5awsePVVslu2pHz58nFdZ3F0uj9JvP3223z99dfUqVOHG2+8\n0es4MXfAAQfQvn17AD755BOP04gkv8Id1LBjAQdMKm5eM/sLUME5NyYe2URk/5xzsGUL1atX55ln\nnmHVqlVxX+ct995L5REj4MknybngAh48/HA2b9oU9/XGgjqpCVSwhiYnJ2fvkdO7776bAw880LMs\n8VSSulQ/1RYpS2TK4k9mlg5cCbzgnFtSzHTlgeFAv0Rl87ugb0dqn/98OXEi7zZsiOvcGZyja9eu\nXHzxxRGnjUv7unTh4Ysuos8BB5DxyiuxX34cqJPqkZdffplFixZxzDHHcNVVV3kdJ27yO6mff/45\n2dnZHqcRCZy7gN3A/k7F/BOY75ybGv9IIrKPrVs5behQDl+/ngnXXw/mzXWL/Z96iprffw+XXQbA\n119/jZ/LelST6oGdO3fSoEEDVq9ezahRo+jRo4fXkeLqhBNO4LvvvmPixIm0bdvW6zgiMePlOKlm\n1pvQkdF2xQ0/ZWYZwEKgbf7RVjNrR6gmtdhxUnv16kVmZiYAGRkZNGvWjHbt2gG/H+nRcz3X86Kf\nt2rVijUzZvBjr17QuDGtRo6kYpUqvsj34YcfMmbMGObMmcPcuXPjtr6srCxGjBgBQGZmJoMHD9Y4\nqQX5rZN6//33c/vtt9O8eXNmzpxJWlqwD2jffPPNPProowwYMIBhw4Z5HUckZrzqpJrZ34H+QHvn\n3Lr9THsu8BywscDLVYBjgJ+AX4G3nHP3FZrPV/tNkWT06TvvcNxFF1Ht9tvJGDLEsyOokbz99ts0\nbtyYY489NqHr1YVTPpWVlcWmTZsYPnw4AMOHD/esg5r/V04idOzYEQid8vc6y/4oS2TK4h9m1pNC\nHVQz62JmVxeYprZZ6H9D59w459xRzrnm+Q8gv8borvBr9xVeT9AFfTtS+/yh4wUXMGPQIFb16BFV\nBzUR7evWrdveDuru7dv56N13477OaKmTmmBDhw5l8+bNnH322Zxzzjlex0mIM844g3LlyjFr1iw2\nJ+E4bSJ+YWaXAs8DI4COZtYz3Gk9HzgsPE1rYDXwVHGLKvRTRGJk586df7hYuPtdd9G4cWMPExUv\nLy+PkSedRKXrriMvN9frOH+g0/0JtHjxYho3bkxOTg4zZsygRYsWXkdKmDPOOIMpU6bw7rvv0rVr\nV6/jiMSEB+OkbiR0x6nC63TAYOfcvWbWlNAdpR6LcAq/DjANqAgcQuhU/3bgEufc14Wm9cV+UyTZ\nLFmyhDPPPJP777+fnj17eh2nRL748EPaDRqEXXABxHnM9mj2m6W7nYGUSr9+/cjOzuaKK65IqQ4q\nQPv27ZkyZQrjx49XJ1WklJxzB5dgmrlAzSLeWwvUjXUuEQlzjvr165OVlUWuz45KFues886D5s2h\nVSvWH3QQed26Ubt2ba9j6XR/oowbN44PPviAqlWr/uF2ZV5JdD1P/qD+EyZM8DxLcZQlMmWRoAn6\ndqT2JZZzjjdfeIG8s86C1atp0KABxx13XKmX50n7DjuMuYMHk3bttXzz2muJX38E6qQmQHZ2Njfd\ndBMAd911F3Xq1PE4UeK1bNmSypUrs2DBAtauXet1HBERkZjJ2bGDhrfdxgcrV+KS+P/4Q849l423\n3kqnxYu9jgKoJjUhHn/8cW644Qbq16/P/PnzqVChgmdZvHTuuefyySef8Nprr/G3v/3N6zgiZebl\nOKnx5vV+UyRpOAe9epG3fTszbrmFlqef7nWissvLg7Q0tm7dSrVq1WK6aA1B5SPr169n0KBBADzy\nyCMp20EFOPvss4HIp/xFRESSzcKFC/l1wABYsIC0V18NRgcVyM7NpX///px99tme3pFKndQ4u/nm\nm9m8eTN/+tOfqFKlitdx9vKi3iW/LnX8+PGeZymKskSmLBI0Qd+O1L7EWPjxx/z24IMsuv9+qFw5\nZsv1un1paWlUrFiRjz/+GPPwBgTqpMbRp59+yquvvkrFihV56qmnPP2i/aBZs2bUqFGDFStWsGzZ\nMq/jiIiIlMmF/frx48cfc1Tr1l5Hian09HTuvfdeatWq5WkO1aTGyc6dO2ncuDHLly9n+PDh3Hbb\nbQldv19Xw4PyAAAgAElEQVR169aNd955h+eff56rrrpq/zOI+JhqUkVS0w8//ECDBg28jpEQK6dO\n5dVbb+WKt96KyYXfqkn1gcGDB7N8+XKaNGnCzTff7HUc3yjqlL+IiEgy2L59O+eccw533nmn11ES\n4qnhw7lxzhxq7tiR8HWrkxoH06dP5+GHH8bMeP755ylfvjzgfY1JQV5lKTheav5RGn0ukSlLZH7K\nIskr6NuR2hc/VapUYcaMGTRq1Chu6/DT9zd87FgqDxxIuX/9KzSSQQKpkxpj27dvp2fPnuTm5tKv\nXz9OPfVUryP5SsOGDalTpw7r1q1j0aJFXscREREpkby8PHIWLIBPPqFWrVr89a9/9TpSQpgZ3Hor\nrFnDwsGD2bZtW+LWnQo1R4msrbr66qt54YUXaNq0KV999VVKDzlVlEsuuYQxY8bw7LPP0qdPH6/j\niJSaalJFUseol1/m5Ouu4+CBAzlowACv4yTcf6++mo4vv8yGSZM4sQxDbakm1SPvvvsuL7zwAhUq\nVODVV19VB7UIbdu2BWDixIkeJxERESmZHvPmkZeZyVdNm3odxRNt77iDmpddxolbtiRsneqkxsiP\nP/7IlVdeCcDw4cNp3LjxPtP4qcbEyywFO6nOOX0uRVCWyPyURZJX0LcjtS/GJkzARo+m4cSJdOrc\nOe6r8+P3V7duXcq/+CJ06oRzLiGD/HvSSTWzZmb2vJktNLNvzWyBmf3HzGqWYN7yZjbEzL4zs3lm\n9qWZeTpA2a5du+jevTu//vornTp14vrrr/cyju81atSIgw46iJ9//pkVK1Z4HUdERKRID9xxB7/1\n6AEvvggHH+x1HG+ZMWvWLNq2bZuQUXo8qUk1s++BecBlzrnfzOwwYDyhTnNT59yuYuZ9BmgHtHbO\nbTSzK4HHgdOdc3OLmCdutVXOOa688kpefvll6taty8yZMznooIPisq4g+ctf/sLYsWMZMWIEvXr1\n8jqOSKmoJlUk+Ga8+CJT+/fngtmzOeqoo7yO47mXXnoJ5xyXX3456enpUc8fzX7Tq07qQqCLc25Z\ngdeuAF4ALnTOvV3EfA2BhcCVzrkRBV6fD6xwznUpYr647WyHDRvGwIEDqVixItOmTaNZs2ZxWU/Q\nPPLII/Tr14/evXvz0ksveR1HpFTUSRVJDTk5OZQrV87rGIGQDBdONSnYQQ1bE/6ZUcx8FwAGfFHo\n9S+AjmYWuxvnlsBrr73GwIEDMTNGjhy53w6qn2pMvM5y5plnAjBp0iTPsxSkLJEpiwRN0Lcjta/s\nPvvsM3JycgAS3kFNhu/POcf4UaPiOiSVJ51U51xOhJePBRwwqZhZmwC5wMpCry8HygEnxCRgCbz5\n5pt7T1M/8sgjXHDBBYladSA0bdqUqlWrsnTpUtavX+91HBERkb1ycnJ4+OGHadOmzd6OqvzR/Zdd\nxgmXXcZPixfHbR2+GCfVzNKB2cA059w/ipnuU6Clc656odevAp4DOjnnPokwX0xPW7355pv06NGD\n3NxcBgwYwLBhw2K27FTSqVMnxo0bx6hRo+jRo4fXcUSiptP9IsHlnOObb76hRYsWXkfxpTVr1lD7\nn/8k7YwzoF+/Es+XDKf7C7sL2A3cGK8V7Ny5s8zLcM7x6KOPcvHFF5Obm8vtt9/O0KFDY5AuNeUP\nRTVpUnEHz0VERBIne8sWGD4cc04d1GIceuihpA0dCvffD3EaO9XzKmAz6w1cCLRzzv22n8k3AAfa\nvn/iVwv/3FjUjEcffTS9evWiSpUqZGRk0KxZM9q1awf8XvtR3PNdu3bxzjvv8NxzzwFwxRVXMGzY\nMMysRPPna9euXYmnj+fzOXPmcOONN3q2fvi9LvXtt9/m4osv9vTzyH9e+LvyMk/hTKm+veQ/f+yx\nx6L+9xur51lZWYwYMQKAzMxMJHllZWXt/Y6DSO0rnfXr1/Nm/fp0btSIo2+/PebLL6mk+f4aNeKn\nE0/kkxNPpMvXX1OnTp3YLj9/QFYvHsDfCQ1FdUgJp78NyAOOKvT6E4SOxFYuYj4HuNq1a7uxY8e6\naH311VeuYcOGDnAVKlRwI0eOjHoZzjn3xRdflGq+ePBDlt27d7uKFSs6wK1bt87rOM45f3wu+ZQl\nMj9lCe1CvduHxvMRbltg+Wk7ige1r5TmznV7atRwjw0YEJ/ll1AyfX8P9OnjdlWr5nI3bizR9NHs\nNz2rSTWznoQ6ne2dc+vCr3UBDnXOPR9+XhtYF24UZnYs8B1whXPuvwWWNR9Y7pw7v4h1uTPPPHPv\nbTgvueQSBg4cyIknnlhsxu+//55BgwYxZswYAE444QReffVVmjdvXpamSwFnn302X3zxBW+99Rbd\nunXzOo5IVFSTKhIgeXlwxhnQqxf06eN1muTywQdw1llw4IH7ndT3NalmdinwPDCC0NBRPcOd1vOB\nw8LTtAZWA0/lz+ecW0zoAqkBZnZweLreQF1gYHHrnDBhAo899hgVK1Zk9OjRNGnShA4dOvDAAw8w\nefJkFixYwKJFixg3bhwPPPAALVu25Pjjj2fMmDFUqFCB/v37M2vWLHVQY+yMM84A4Msvv/Q4iYiI\npKpff/2VDy68kLzsbLjqKq/jJJ8uXcirVIm5cyPeU6n0SnrINZYPQrWjuYRO3Rd85AJ3h6dpSqgG\n9c5C85YDhgD5d636ktDdp0p02mr58uWub9++rlKlSo5wGUBRjwMPPND16dPHrVy5skSHsPfHT4fv\n/ZLlk08+cYBr2bKl11Gcc/75XJxTlqL4KQs63Z+0/LQdxYPaF521a9e6T+rVcwM7d47pcksr2b6/\nnTt3uiZNmrg2bdq43NzcYqeNZr/pyYVTzrn93vzWhW5xWjPC6zmERgO4qzTrzszM5IknnuCee+5h\n3LhxTJo0idmzZ7N9+3b27NnDUUcdxXHHHUe7du3o0qULlSsn9P4AKadVq1ZY+F7AO3fu1OctIiIJ\nV7t2bTouXUqbGIwElIoqVarEyy+/TPPmzTGLXQWUL8ZJjTfVVvlb8+bNmTNnDllZWXuv+BdJBqpJ\nFUlueXl5bNy4kVq1ankdJWX4viZVpKDWrVsDqksVEZHEmj17NieccAIvvvii11ECISc7m4k33cQr\nMfo81UlNoILjX3rNT1lq1KgB+KOT6qfPRVki81MWSV5B347UvpJp0aIFkydP5uijj47J8mIlWb+/\nSZMnc+CIEZy8aFFMlqdOqniucePGAEydOpW8vDyP04iISErYtg0WLeK4446jQ4cOXqcJhLPOOouT\nR4/m+I8/hhiUC6kmVXzhyCOPZNWqVcyfP59GjRp5HUekRFSTKpKcli1bxrIePTijfn0qjBzpdZxg\ncQ6aNiV3+HDSOnXa50Iq1aRK0lFdqoiIJEr1TZto9e23DDngAK+jBI8ZU087jWkXXsiUKVPKtCh1\nUhPITzUmfsvil06q3z4Xv1AWCZqgb0dqX/EOfuABqgwYwL0vvRSbQDGW7N/f+g4dOOXAA2lTrVqZ\nluPJOKkihfmlkyoiIsGVl5fHhrFjOWTqVHj5ZdLSdKwuHrpedBE0agQNGpRpOapJFV/IyckhIyOD\nHTt2sHbtWmrXru11JJH9Uk2qSHL59ttv2dKiBdu6d6fz6697HSfwdu/ezezZs2nVqtXe11STKkmn\nXLlyezdiHU0VEZF4aNKkCQ2++opq//qX11ECb8uWLWRmZnL//fdT2j941UlNID/VmPgxS/4p/7IW\nWsciix8oS2R+yiLJK+jbkdpXtDonnUSbtm1jFyYOgvD9Va9ena+++op33nmn1LdKVSdVfKNNmzaA\njqSKiEhsbdiwgWuuuYZVq1Z5HSWlHHXUUWWaXzWp4hvbtm0jIyODtLQ0tmzZQuXKlb2OJFIs1aSK\nJIetW7cyfPhwli9fzqhRo7yOk1I2rV3LlDvuoOpll9GuXTvVpEpyqlq1Kk2aNCEnJ4cZM2Z4HUdE\nRAKiWrVqDBs2jJEauD/hXhs5kjajRlFn06ao51UnNYH8VGPi1yxeD0Xl18/Fa8oiQRP07Ujt+926\nOXPgwgvBuVLXRiZakL6/vjffTI1+/TiuFG1SJ1V8Jb+TOnXqVI+TiIhIstuyZQsfn346ny1ZgopX\nPHT11fDqq7jt26OaTTWp4isrVqygbt26HHzwwaxfvz5p/uqV1KSaVBGfW7yYvNNO49PHH+fcSy/1\nOk3K2r17N8saN+b1Xbu4d9Uq1aRKcjr66KOpU6cOGzduZMmSJV7HERGRZDZoEGk33aQOqscOOOAA\n5rduze01akQ1nzqpCeSnGhO/ZjGzvYP6T5s2zdMsXlOWyPyURZJX0LejVG+fc47/u+Yacj77DG68\nMTGhYiho35+ZcdGLL1Lp8cejmk+dVPGd0047DfCmkyoiIskvLy+POjt3ck+5cuwuX97rOAKQng7t\n2kU1i2pSxXcmT55M27Ztadq0KXPmzPE6jkiRVJMq4m+5ubmkp6d7HUPCnnvuOf7xj3+UeL+pTqr4\nzs6dO6levTp5eXls2bKFKlWqeB1JJCJ1UkX8Z+fOnboZjE/lXxytC6d8yE81Jn7OUrlyZZo2bUpe\nXl7CB/X38+fiJWWRoAn6dpTK7evWrRvdunXjl19+SVygGAvq95eZmRnV9Oqkii+pLlVERErjnXfe\noX379lSvXt3rKFJGOt0vvjRy5EguvfRSunTpwvvvv+91HJGIdLpfxGfWrYOaNSFNx+D8Kpr9pr5F\n8aX8I6nTp09H/1GKhJhZMzN73swWmtm3ZrbAzP5jZjX3M9+BZna7mU02s5nh+eaZ2U2Jyi4Sb+M/\n/5ztZ50FH3/sdRSJEXVSE8hPNSZ+z5KZmckhhxzChg0bWLp0qadZvKIskfkpiwdeBzKAFs65JsA5\nQEfgSzOrWMx8dYEhwL+dcyc75xoBtwEPmtnAeIf2o6BvR6nYvvKffspPP/zAJwE4ihr076+kkv+b\nlEAyM9WliuwrD7jNOfcbgHNuNfAg0ADoXMx824H/c859lP9C+Pd5QLf4xRVJEOdoO2EC9f/3P9qf\nc47XaSRGVJMqvnX//fdz++23889//pOnn37a6zgi+0h0TaqZlXPO5RR6rRPwIXCVc+6lKJe3DFjk\nnOsU4T3tNyUpOOewDz6AO++E2bNVj+pzqkmVQNCRVJE/KtxBDTsWcMCkki4nXKN6H1AJGBCjeCKe\nGP366yy+9FJ++Nvf1EENGH2bCeSnGpNkyNKiRQvS09P59ttv2bFjh6dZvKAskfkpi9fMLB24EnjB\nObekhPNMAX4FLgC6O+dS8rZuQd+OUql93S+4gJ//+lcWNGjgXaAYC/r3V1LqpIpvHXjggZ4N6i+S\nJO4CdgM3lnQG51wboDIwHBhvZn3jlE0kIcpXrMhZzz7LX7qpvDpoVJMqvta3b1+eeuophg0bxoAB\nOisp/uLlOKlm1hvoB7Rzzm0o5TKeAS4HjnbO/VLoPderV6+9d4jJyMigWbNmtGvXDvj9SI+e67lX\nz3NzcylfvjxnnHEGEydO9DyPnkd+npWVxYgRI4DQyD2DBw8u8X5TnVTxtddee42ePXty/vnn8957\n73kdR+QPvOqkmtnfgf5Ae+fcuhJMXx7Ic87lFnr9X8CTwDnOufGF3tN+U3ztxx9/5E9/+hMtWrTg\ntdde8zqOlJAunPKp/L8s/CBZsrRq1QpI3KD+yfK5JJqy+IeZ9aRQB9XMupjZ1QWmqW1mBf8TGAjc\nGmFxmeGfG+MU17eCvh2lQvuOPvpoFixYwJAhQ7yOE3NB//5KSp1U8bV69epRq1Yt1q9fz7Jly7yO\nI+IpM7sUeB4YAXQ0s57hTuv5wGHhaVoDq4GnCszqgGvN7PgCy2oDXANMTNWLpySJOQdvvUW6c9Sr\nV8/rNBInOt0vvte1a1fee+89XnnlFXr27Ol1HJG9PBgndSOhO04VXqcDBjvn7jWzpsB44DHn3H3h\n+TIJdUj/FJ63HJALjAIed87tjLAu7TfFl/Ly8niwUyeuXbCAA1eswMqV8zqSREGn+yVQNF6qSIhz\n7mDnXLpzLq3QI905d294mrnOuZr5HdTwayucc7c755o755o55xo755o654ZH6qCK+F3vn3/mmYMO\nYk9u7v4nlqSlTmoC+anGJJmyFKxL9TpLIilLZH7KIskr6NtRkNuXNm0aCzdu5JZZs6hQoYLXceIi\nyN9fNNRJFd875ZRTSE9PZ+7cuQkb1F9ERPxnw4YNuKFD4W9/g/LlvY4jcaaaVEkKJ510ErNnzyYr\nK4szzzzT6zgigLfjpMab9pviR4O7d+cf77/P5hkzOK5pU6/jSCmoJlUCR3WpIiJy9xtvsPDZZzlc\nV/SnBHVSE8hPNSbJliVRdanJ9rkkirJI0AR9Owpq+ywtjbN792bWrFleR4mroH5/0VInVZJCwSOp\nOgUpIpJa5s2bx+uvv06uruZPKapJlaTgnKN27dqsX7+epUuXavBm8QXVpIokxowZM7jxxhvp1KkT\nd955p9dxpAyi2W9qBFxJCmZGq1ateP/995k2bZo6qSIiKeSUU05hypQp5OTkeB1FEkin+xPITzUm\nyZglEXWpyfi5JIKySNAEfTsKUvvc6tXw8MOYGeXDw04FqX2RBL19JaVOqiQNXeEvIpJaVq9ezctN\nmrBw3Divo4gHVJMqSWP79u1Ur16dtLQ0tmzZQuXKlb2OJClONaki8eV+/ZWczExevv56+tx33/5n\nEN/TOKkSSFWqVOHEE08kJyeHmTNneh1HRETizJ56ivLduqmDmqLUSU0gP9WYJGuW/FP+8apLTdbP\nJd6URYIm6NtRENo3e8oU3BNPwG237fNeENpXnKC3r6TUSZWkorpUEZHU8EX//ozbto31NWt6HUU8\noppUSSo//PADxx57LLVr12bNmjWYBbIcUJKEalJF4uv7uXM5rmlTr2NIDEWz31QnVZKKc45atWqx\nceNGli9fTmZmpteRJIWpkyoiEh1dOOVTfqoxSdYs+YP6Q3xO+Sfr5xJvyiJBE/TtKJnb98Ybb/Cf\n//yHHTt2FDlNMrevJILevpJSJ1WSjupSRUSCq0GDBkyePJkPPvjA6yjiMZ3ul6QzYcIE2rdvz8kn\nn8yMGTO8jiMpTKf7RUSio5rUQrSzDZZt27aRkZFBWloaW7dupVKlSl5HkhSlTqpI7Djn2JOVRYVp\n0+COO7yOI3GimlSf8lONSTJnqVq1Ko0bNyYnJ4dZs2Z5miWelCUyP2WR5BX07SgZ2/ftt98y8dxz\n+WLu3P1Om4zti0bQ21dS6qRKUlJdqohIsDRNT+esatXYedFFXkcRn9DpfklKI0aMoHfv3nTr1o23\n3nrL6ziSonS6XySGLr8cjj1Wp/oDLpr9Zrl4hxGJh4JHUp1zGtRfRCSJffLCC5zz3nukLV3qdRTx\nEZ3uTyA/1Zgke5Zjjz2Wgw46iDVr1rBy5UpPs8SLskTmpyySvIK+HSVT+/Ly8vjxf//j6d272V6+\nfInmSab2lUbQ21dS6qRKUor3oP4iIpIYaWlp9Jk0iUt/+okqVap4HUd8RDWpkrSGDBnC3XffzQ03\n3MBjjz3mdRxJQapJFRGJjoagkpSgK/xFRJLbo48+ysCBA/nll1+8jiI+pE5qAvmpxiQIWU499VTM\njNmzZ7Nr1y5Ps8SDskTmpyySvIK+HSVL+7p27cqWLVtYtGhRVPMlS/tKK+jtKyl1UiVpVatWjUaN\nGpGdnc0333zjdRwREYlSvXr1ePLJJ2nbtq3XUcSHVJMqSa1Pnz48//zzPPTQQ/Tr18/rOJJiVJMq\nUjq5ubnsGDmSaosXw5AhXseRBFJNqqQM1aWKiCSfObNns6h3b97WuKhSDHVSE8hPNSZByVJ4UH8v\ns8SaskTmpyySvIK+Hfm9fS127aL5kUdy2LXXlmp+v7evrILevpJSJ1WS2rHHHktGRgarV69m1apV\nXscREZGSePBByvXvT6vWrb1OIj6mmlRJep06dWLcuHGMHj2aiy++2Os4kkJUkyoSvTGDB9P9ySdJ\nX7kSKlXyOo4kmGpSJaWoLlVEJDnk5eWxe+ZM/p2dzU79EST7oU5qAvmpxiRIWfI7qdOnT/c8Sywp\nS2R+yiLJK+jbkV/bl5aWxt/ff5/b1q+ncuXKpV6OX9sXK0FvX0l52kk1s0PNbJyZ5XmZQ5Jb/qD+\n33zzDbt37/Y6joiI7Ef58uW9jiBJwLOaVDPrBjwE7AEaOOfSo5h3BbApwlv9nHMTIkyv2qqAa9y4\nMQsWLGDq1Kl7j6yKxJtqUkVK7p577uGnn35i4MCB1KtXz+s44pFkqUntB5wNTAei3ck751zzCI99\nOqiSGlSXKiLib9dddx2ZmZls2hTpGJPIvrzspLZxzq3wcP0J56cak6BladWqFVD2utSgfS6xoiwS\nNEHfjnzXPuc4+OCDueuuu2jRokWZF+e79sVY0NtXUp51UnUeSWJJR1JFRPwpOzubtY8+Cjfe6HUU\nSTKej5NqZiOAy5xzJe4wm9lyYAzQBqgJrACedM69X8T06hMHXF5eHgcffDCbN2/mp59+4ogjjvA6\nkqQA1aSK7N/cOXOwk09mVteu9H7rLa/jiMeSpSa1LNYBs5xzrYFGwFhgrJmV7v5qkvTS0tJo2bIl\nEJuhqEREJDaabtxI4/r1OfWee7yOIkkmKTupzrmWzrkx4d9znHNPAx8Bw8ysgrfpiuanGpMgZsmv\nSy3LKf8gfi6xoCwSNEHfjnzVvgcfJK1/fxqdeGLMFumr9sVB0NtXUuW8DhBDXwOdgROA2YXfvPzy\ny8nMzAQgIyODZs2a0a5dO+D3jSHez/Mlan3FPZ8zZ46n6y/4fM6cOTFZXn5d6rhx4zj//PN90z5t\nL7F9HqvtpTTPs7KyGDFiBMDe/YmIFO3FG27gslmzKD92rNdRJAklXU2qmVUE0p1zOwq9PhAYApzq\nnJtZ6D3VVqWAzZs3U6NGDQ444AC2bt1KhQq+PaguAaGaVJGiOed4+6qrmPfhh9yyZAlVqlTxOpL4\nQDLWpBa5JzSz2mZWsDE9gIcjTNoC2AUsjHE2SRIZGRkcf/zx7NmzZ+/RNhER8YaZ0f3FFxm0Zo06\nqFIqfumkRuxRm1lrYDXwVKG3/mpmJxeY7hKgK/CAc25n3FKWUeHTuF4KapayDkUV1M+lrJRFgibo\n25HX7cvL+/1u5388zhQbXrcv3oLevpLyrJNqZk+Hh5LqDjgzW25my8ys4A19txG6/enqAq99BDwI\nPG1ms8PL6A/8wzl3T4Lii09pvFQREe/dfffddOnShXnz5nkdRZKY5zWpiaDaqtSxYMECGjduzFFH\nHcWPP/7odRwJONWkikT222+/8eqrr9KyZUuaNGnidRzxkWj2m+qkSqDk5eVRo0YNtm7dys8//8xh\nhx3mdSQJMC86qWbWDLgWaA3kAOnA58AQ59yGYuY7FLgG+Auhs2jlCNXwD3LOzY8wvfabUjq5uWAG\naX6pKBQ/ScYLp1KCn2pMgpql4KD+pTnlH9TPpayUxVdeBzKAFs65JsA5QEfgy/DoJ0UZROjC087O\nuROBZkAu8JWZNY5zZt8J+nbkVft2797NksGD4cor47oefX+pQZ1UCRzVpUrA5QG3Oed+A3DOrSZU\np9+A0FjRRXHA/c65n8Pz7QZuByoBfeKaWFLG8mXLyBk+nEfXrPE6igSATvdL4Hz88cd07tyZ008/\nnS+//NLrOBJgHp3uL+ecyyn0WifgQ+Aq59xLRcyXDuQV3BmaWSVgB/Cqc+6yQtNrvynRGzcOd+ut\nrHz/fY7WDS8kAp3ul5SWf3vUWbNmsXv3bo/TiMRW4Q5q2LGEjpROKma+3Ai9zmPDP7Nik05S3oMP\nYrfeqg6qxIQ6qQnkpxqTIGepUaMGjRo1Yvfu3cyaNcvTLGWhLJH5KYsfhI+QXgm84JxbEuXsfYD5\nwCsxD+ZzQd+OvGjfY5ddxm/ffou75JK4r0vfX2pQJ1UCqXXr1gA63S+p4C5gN3BjNDOZWXvgYuBi\n51x2PIJJ6nDOcfwRR/BgjRps0xksiRHVpEogvfLKK1x22WX8+c9/ZuzYsV7HkYDyepxUM+sN9APa\nFTf8VIT5mgIfABc556YXMY3r1asXmeHTthkZGTRr1ox27doBvx/p0XM913M9L+55VlYWI0aMACAz\nM5PBgwdrnNSC1ElNPcuWLeOYY46hZs2arFu3Li635RPxspNqZn8ndLe99s65dVHM1wR4F+jpnJta\nzHTab0qJ7Nq1iwoVKmg/KyWiC6d8Kv8vCz8Iepa6detSp04dNmzYwOLFiz3NUlrKEpmfsnjFzHpS\nqINqZl3M7OoC09S2Qr2GSB1UMzvUzJ5JXHp/CPp2lMj2DR8+nFNOOYXp0yMelI8LfX+poZzXAUTi\nwcxo06YNb775JlOmTKFhw4ZeRxKJCTO7FHgeuBPoWKAfegawOjxNa0JX+j8L/Cv82onAeOBNoJ6Z\n1QvPVxPQPxAptbvvvpuTTjqJGjVqeB1FAkan+yWwHnvsMW666SZ69+7NSy9FHDpSpEw8Gid1I6E7\nThVerwMGO+fuDdecjgcec87dF57vLUK3RI2UN8s5d3ah9Wi/Kfu3Z0/oNqiVKnmdRJJENPtNHUmV\nwNIV/hJEzrmDSzDNXEJHSAu+1j1uoSQl7dy5k8W33krTX3/FRo3yOo4EkGpSE8hPNSapkKVZs2ZU\nrlyZxYsXs25dya4rSYXPpTSURYIm6NtRItq3ZtUqarz4Ivf+8kvc11WYvr/UoE6qBFb58uVp2bIl\nAFOnFnkRs4iIlMIxCxZwVJMmXPfGG15HkYBSTaoE2l133cV9993HLbfcwoMPPuh1HAkYr8dJjSft\nN6VYzsHpp0O/fnDhhV6nkSSiIahEwtq0aQPAlClTPE4iIhIMzjmGnHsuW5ctI7tLF6/jSICpk5pA\nfqoxSZUsrVq1wsyYNWsWv/32m6dZoqUskfkpiySvoG9H8W5fxz//mafq1yfHo6Pt+v5SgzqpEmjV\nq1M15JMAACAASURBVFfnxBNPJDs7m5kzZ3odR0Qk6ZkZLa+9lgFffkklDT0lcaSaVAm8a6+9lqef\nfpphw4YxYMAAr+NIgKgmVVLNpk2bqFq1KuXKaQRLKR3VpIoUoPFSRURi4+mnn6ZBgwZMmjTJ6yiS\nAtRJTSA/1ZikUpb8TurUqVPJy8vzNEs0lCUyP2WR5BX07She7Rs4cCCjRo2ibt26cVl+Sen7Sw3q\npErgHXXUURx++OFs2rSJ77//3us4IiLJads22LCBVq1aceSRR3qdRlKAalIlJfTo0YPRo0fz7LPP\n0qdPH6/jSECoJlVSxcaNG1ly5ZW0qFqVcq+84nUcSWKqSRUpRHWpIiKlt239ehqMG8fAjRu9jiIp\nRJ3UBPJTjUmqZSlpJzXVPpeSUhYJmqBvR7FuX+akSRzUvj1D3n03psstLX1/qUGdVEkJTZo0oUqV\nKixdupS1a9d6HUdEJHnk5sJDD8Ftt3HAAQd4nUZSiGpSJWWcc845fP7557z55pt0797d6zgSAKpJ\nlaDLzc1lUKNG/HPXLmp+/z0VKlb0OpIkOdWkikTQpk0bACZPnuxxEhGR5JCenk7PoUMZc9pplCtf\n3us4kmLUSU0gP9WYpGKWtm3bAhQ7CHUqfi4loSwSNEHfjmLZvuO6d+emUaNIT0+P2TLLSt9falAn\nVVJGy5YtKV++PHPmzGHLli1exxER8bWlS5eybds2r2NIClNNqqSUNm3a8OWXX/LBBx9w3nnneR1H\nkpxqUiXIhgwZwuOPP8677767d4QUkbJSTapIEUpyyl9EROCuu+5i2rRpNGnSxOsokqLUSU0gP9WY\npGqW/XVSU/Vz2R9lkaAJ+nZU5vatXAlLllC/fn2qVq0ak0yxpO8vNaiTKimldevWpKWlMXPmTHbs\n2OF1HBER35k3bx6zu3Zl5wsveB1FUpxqUiXlnHLKKcycOZPPPvuMDh06eB1HkphqUiWIVk2dSo2z\nzuKha65h0H/+43UcCZi41aSa2Tgze9rMLjKzWqWLJ+KtM888E1BdqiSO9p2STI4YPZoDr7tOHVTx\nXLSn+/8N7AJuA1ab2QIze8LMupmZbkOxH36qMUnlLPl1qRMnTvQ8S3GUJTI/ZYmC9p0+k6TbUYmV\ntn27V62CV16Bm2+ObaAY0/eXGqLqpDrnJjrnbnbOnQzUJLTDrQH8F/jJzC6IQ0aRmGrTpg1mxldf\nfcWuXbu8jiMpQPtOSQbbt2/n/44/nulHHok79FCv44jEpibVzK4HpgGPAXc758aXeaExpNoqKaxp\n06Z8++23TJw4ce+RVZFolbUm1c/7Tu03U9Pq6dOZ+OWX/LVfP6+jSEDFsyb1HjObHf5Zr+B7zrkZ\nwJnAudEsU8QLGi9VEkn7TkkWh7VqpQ6q+Ea0NanpQH+gLjDPzH4ws1nAaeH36wPLY5gvUPxUY5Lq\nWYrqpKb651IUZSkz7Tt9Jkm3oxKLtn2ffPIJq1evjk+YOND3lxqi7aSuBXDO9QLqANcB9wGXm1kG\nMA84PqYJReIgv5M6depUsrOzPU4jKUD7TvG1qVOn0rhxY5YtW+Z1FJG9oq5JNbM24fkmR3ivIbDa\nObctRvliQrVVEslxxx3HokWLmD59Oi1btvQ6jiShaGqrkm3fqf1m6tm0aRM1atTwOoYEXNxqUgGc\nc1Mi7WTD7y3y005WpDgaL1USSftO8a3PP4f589VBFd/RbVETyE81JsoSebxUfS6RKYsETdC3o5K2\n79mnnmJd9+6sXbgwvoFiTN9falAnVVJWfid1ypQp5ObmepxGRCTx/pqezo7q1ZldtarXUUT2EZNx\nUv1OtVVSlHr16rF8+XJmz55Ns2bNvI4jSaas46T6mfabKSAvD048ER57DM45x+s0kiLiWpMqEiT5\nR1N1akVEUkl2dja/PPMMVKkCHTp4HUckInVSE8hPHSFlCTnrrLMA+OKLLzzPUpiyROanLJK8gr4d\n7a99CxYsYOkNN/BqZiZY8p0MSPXvL1WU8zqAiJfyO6kTJ05UXaqIpIxmzZqxZckSDty0yesoIkVS\nTaqkvPr167N06VJmzJjBySef7HUcSSKqSRURiY5qUkWicPbZZwMwYcIEj5OIiMRXbm4u/fr1Y2GS\nDTklqUmd1ATyU42Jsvwu/5T/hAkTPM9SkLJE5qcskryCvh0V1b6cnBxq1arFFVdcQV5eXmJDxVCq\nfn+pRp1USXn5ndTJkyeTnZ3tcRoRkfipUKECt99+O9OmTSMtTV0A8TfVpIoAjRo1YuHChUyZMoXW\nrVt7HUeShGpSJZns3LGDyv37wx13wOGHex1HUpRqUkWipLpUEQm6e9q25ef//Y9fvA4iUkLqpCaQ\nn2pMlOWP8k/5v/XWWx4n+Z0fPpd8yiJBE/TtaJ/2Oce/K1Tgu+7dyahZ05NMsZRy31+KUidVBPj/\n9u47TIoqbePw7x1yUhSQYBpUQEUQV0WUICKwoiCm1RVWggiua0QRA0ZwTbiKq7ImlKCuimAEJcko\nHxiQqGQX2BUxskqSPOf7o3pwdmygm+nuU13z3Nc1F3RN18xzes5Uv1P1VtWpp56KmbFgwQI2bdrk\nO46ISGpNmUKpNWtoO2wY5cqV851GJCHqSRWJ+d3vfsecOXOYMmXKzsP/IrujnlTJBtM+/JAmV19N\nlf79oWtX33GkhFNPqsheKHwpKhGRqFi7eDFzlyzhncqVfUcRSYqK1AwKU4+JsvxW2E6eCsvrAsoi\n0RP1eVR4fB379KHp2rX8/swz/QVKsZL08yvJVKSKxLRs2ZKcnBw+/fRT1q9f7zuOiEixFG7XKFeu\nHGXKlPGYRiR56kkVKeTkk0/m448/Zvz48XTo0MF3HAm5bOxJNbNywF+BvsBpzrkPd/E8bTez3OjR\no3nyySe57777aNq0qe84IoB6UkX2WkFf6pQpUzwnEYnPzJqY2TNmttDM5pvZAjN71Mz2eF0hMzsG\n+Bg4Dciq4lqSd84559ClSxdWrVrlO4rIXlGRmkFh6jFRlviqVasGhKNIDdProiyh8jJQFTjeOdcY\naAe0B6abWfk9rHsTcAPw9/RGDL+oz6O899+nDNCrVy/OO+8833FSLvI/v4iPL1EqUkUKadSoEeXL\nl2fu3Ll8953uyyKhlA/c5JzbBOCcWw0MBuoBezozprtz7n20FzXStm7dyvIRI3BduviOIlIs6kkV\nKeL3v/89EydO5IUXXqCrrikou+GjJ9XMSjvnthdZ1gEYB1zmnHsuga/RA3gOaK2e1Oj5cskSaNyY\nca1bc+2ECb7jiPwP9aSKFEP79u0BmDRpkuckIr9VtECNqQ84IG7BKSXLEZ98wuEnnMA5Tz3lO4pI\nsahIzaAw9ZgoS3x5eXk7i9SJEyfic09S2F6XsAhTljAws1JAL+BZ59yXvvNki8jOo61b4a67+ODC\nCzk0N9d3mrSJ7M8vJurjS1Rp3wFEwuaYY46hVq1afPPNNyxcuJCGDRv6jiSyO7cDW4DrUv2Fe/To\nQW6s0KlatSpNmjShdevWwK9votn6eO7cuaHKk4rHGzdu5MsbbqDL/vszJz8f8vJClS+Vj6P484vq\n+PLy8hg+fDjAzu1JotSTKhJHt27dGDVqFA8//DB9+/b1HUdCyvd1Us2sJ8HZ+q2dcz8msV4P1JMa\nOc45ZgwYwORFi7hj7FjMdH6chI96UkWKqV27doD6UiW8zOwS4HqgTTIFqkSXmdH83nu58/XXVaBK\nJKhIzaCC3d9hoCzxFWRp27btzsdbtmzxmiUMlCVczOxPQH/gdOfc97FlHc2sd6Hn1DRVKrsUtXk0\ne/Zs8vPzdz6O2viK0vhKBhWpInHUrl2bRo0asWnTJmbMmOE7jshOZtYVeAYYDrQ3sz/FitZOQJ3Y\nc5oDq4En9vTl0hhVMmTHjh1ce+21NG3alM2bN/uOI5Iy6kkV2YV+/frxt7/9jZtvvpn77rvPdxwJ\nIU/XSV1DcMepot/XAXc75waa2bHAFGCIc+6eQut2A+4GKgP7A98Dm4FuzrlpRb6PtptZxDnHzJkz\nadq0qe8oIruVzHbTa5FqZrWB54H2zrm07dXVxlb2xoQJEzjjjDM4/vjj+eyzz3zHkRDyfeJUOmm7\nmUXeew9atYKKFX0nEdmjrDhxyszOA6YDuQR7AJJZt4yZDTKzRWb2uZlNjx3eCrUw9ZgoS3yFs7Rs\n2ZJy5coxe/Zsfvwx8+elhPV18S1MWSR7RWUe3d21K5svvJD8X375n+VRGd+uaHwlg8+e1BuANsDH\nJN8X9RjwB6CFc64RwaVUJsYOcYmkRMWKFWnRogXOOaZMmeI7jojIb1yxahWjatRgjfZ6SwR5O9xv\nsWNJZjacoB8qoYLZzBoAC4FezrnhhZZ/Aax0znWMs44OW8leefDBB7npppu49NJLGTZsmO84EjI6\n3C9ezZgBF10ES5dChQq+04gkJCsO9xdj63cuwZ7XqUWWTyU401VNOZIyBddL9X2LVBGRwpYsXkx+\nv34waJAKVImsbLwEVWNgB/CfIstXENzm9eiMJ0pQmHpMlCW+olmOPfZYatasyapVq1iwYIHXLD4p\ni0RNts+jt/v3Z8msWaxo0SLu57N9fHui8ZUM2VikVgd+ibMndl3s32oZziMRlpOTQ4cOHQAYP368\n5zQiIoF+b73FT2PHcnCS90IXySalfQfIlB49epAb+2WuWrUqTZo0oXXr1sCvf7GUtMcFfOcpWOb7\n9WjdujWtW7f+zecPPfRQIChS+/fv7/310nzxN1/y8vIYPnw4wM7tiWSnwvMpW51y1lm7/FwUxrc7\nGl/J4P1i/ntx4tRLwIVAmcJ7U83seuAhoKlz7rMi6+gEANlrP//8M9WrVwdgzZo17Lvvvp4TSVjo\nxCnJtIEDB1K9enX69OlD6dIlZj+TREhWnDhVDPMIch9cZHldYBvBmf+hVHSPlE/KEl+8LFWrVqV5\n8+bs2LGDSZMmec3ii7JI1GTrPOrcuTOvv/46ixYt2u3zsnV8idL4SoawFKm7/HPdzGqaWeGK+/XY\n808r8tTTgInOuV8QSbEzzzwTUF+qiHjkHMceeyyTJk2iUaNGvtOIpF2oD/fH7iL1IfCUc+4vhZb/\ng6Aobe6cW2NmPYHHgZOdc/PjfB0dtpJi+fzzz2ncuDG1atXi66+/JicnLH/fiU863C+ZsnTpUuoO\nGECZK68E9StKFsuKw/1mNtTMVgDnA87MVpjZcjMrU+hp64GfgNVFVr8aGA1MN7PPgcuA9vEKVJFU\nOOaYYzjooIP49ttvmTt3ru84IlLCzLjvPr59/XXm6ZqoUoL4vJj/X5xzdZ1zVZxzpWL/P8w5t63Q\nc+Y756o75+4psu5259ztzrkjnXONnHPNnXPTMz+K5ISpx0RZ4ttVFjPjrNiZtOPGjfOaxQdlkajJ\nqnm0Ywc95s5l68CB1G/cOKFVsmp8e0HjKxl0zFIkQepLFREvnn0W9tmHw2+5hQrakyoliPee1ExQ\nb5WkwoYNG6hWrRrbtm3j+++/33lZKim51JMq6Tawb1+uf+YZSk+eTPlmzXzHESm2rOhJFck2lStX\n5tRTT8U5x4QJE3zHEZESoOfFFzPqyCNZVqmS7ygiGaciNYPC1GOiLPHtKUsmD/ln0+uSSWHKItkr\nW+bRwU2bcsVnnyV9yalsGd/e0vhKBhWpIkkoKFLfe+89duzY4TmNiETVxx9/zHfffec7hohX6kkV\nSVK9evX48ssvmT59OqeccorvOOKRelIlXR588EEGDx5MXl4eDRs29B1HJGXUkyqSRgWXonr77bc9\nJxGRqOrfvz/Tp0/nyCOP9B1FxBsVqRkUph4TZYkvkSxnn302AG+++ab3LJmiLBI1YZ1HO3bsCC45\n9dVX1K9fn1KlSu3V1wnr+FJF4ysZVKSKJKlly5ZUrVqVRYsWsWzZMt9xRCRC+p9xBuuvuYYN27f7\njiLinXpSRfbCn/70J1588UUGDx5Mv379fMcRT9STKimVn8+2Zs14vXJl2o0Zw3777ec7kUjKqSdV\nJM06d+4MpP+Qv4iUIM88Q5lSpbhw8mQVqCKoSM2oMPWYKEt8iWY544wzKFu2LDNmzOCHH37wmiUT\nlEWiJmzz6JmBA9lx663w9NOQU/y35rCNL9U0vpJBRarIXqhSpQpt2rQhPz+fd955x3ccEclizjmq\nLV/OkG3b2FC3ru84IqGhnlSRvfTkk09yxRVX0LlzZ9544w3fccQD9aRKKm3YsIHKlSv7jiGSVsls\nN1Wkiuyl1atXc+CBB1KhQgV+/PFHKlas6DuSZJiKVCmu5cuXc9hhh/mOIZIxOnEqpMLUY6Is8SWT\npU6dOpx44ols2rSJKVOmeM2SbsoiUROGebR582bat29Pr169SPUfBGEYXzppfCWDilSRYtBZ/iKy\nt8qXL8+cOXM488wzMYvkDnmRYtHhfpFi+OKLL2jUqBE1atTgm2++2eu7w0h20uF+2WubNsGkSRC7\ng51ISaHD/SIZ0rBhQ+rVq8cPP/zAtGnTfMcRkSywfPlyXqpXj7VDh/qOIhJqKlIzKEw9JsoSX7JZ\nzIwLLrgAgNdee81rlnRSFokan/Oo7jffcM769TySxhOmov57ovGVDCpSRYqpoEgdM2YM+fn5ntOI\nSKht3Ij16EHF557jLu1JFdkt9aSKFJNzjsMOO4yVK1cybdo0WrRo4TuSZIh6UiUZn332Gfvedhv1\natSAUaN8xxHxQj2pIhmUzkP+IhIdpbds4ftp03i5eXPfUUSygorUDApTj4myxLe3WdJxyD8Kr0s6\nhCmLZC8f86hJ8+b87scfOadHj7R/r6j/nmh8JYOKVJEUaNq0KQcffDCrVq1i5syZvuOISIjMmzeP\nTZs2AVChQgXKly/vOZFIdlBPqkiKXHfddTz66KP069ePwYMH+44jGaCeVEnEVVddRV5eHlOmTKFm\nzZq+44h4lcx2U0WqSIr83//9Hy1btiQ3N5fly5frDjIlgIpUSYRzjvHjx9OhQwdycnQAU0o2nTgV\nUmHqMVGW+IqT5ZRTTqF27dqsXLmS2bNne82SasoiUZOJebTuxx/h3nuxbds466yzMlqgRv33ROMr\nGVSkiqRITk4O5513HgCvvvqq5zQi4tNPP/3Eq7m5fDV2LJQp4zuOSFbS4X6RFJo2bRqtWrXikEMO\nYcWKFTq0F3E63C+79NprbLnuOp7u04er77jDdxqR0FBPahHa2Eqm5Ofnk5uby1dffaUL+5cAKlKl\nKOcc9q9/wSmnwPjxcMIJviOJhIp6UkMqTD0myhJfcbPk5OTwxz/+EYB//vOfXrOkkrJI1KRrHj39\n6KP856ST2HrrrV4L1Kj/nmh8JYOKVJEU69KlCwCjR49m27ZtntOISCZ1/eMfmXr44Uxv3Nh3FJGs\np8P9IinmnOPoo49m8eLFvPvuu5xxxhm+I0ma6HC/iEhydLhfxCMz4+KLLwaKf8hfRMJvy5YtnHvu\nuSxatMh3FJFIUZGaQWHqMVGW+FKVpaBIff3113feDtFXllRQFomaVM6jcuXK0bFjR/7yl78Qlr3P\nUf890fhKBhWpImlQr149TjjhBNavX8+4ceN8xxGRdFm/HjZupFevXkyePFl3mhNJIfWkiqTJI488\nwvXXX895553HmDFjfMeRNFBPask2Ytgw2gwZwsFdusAtt/iOI5IV1JMqEgIXXXQRZsa4ceP4+eef\nfceRCDCzJmb2jJktNLP5ZrbAzB41s+oJrFvGzAaZ2SIz+9zMpptZ80zkjiTn6Dx5MiuWL2dm69a+\n04hEkorUDApTj4myxJfKLHXq1KFNmzZs2bJlr26TGtXXpbjClMWDl4GqwPHOucZAO6A9MN3Myu9h\n3ceAPwAtnHONgOeAiWZ2bDoDh1Wx59HDD1N1wQJO+Ne/OPHkk1OSKZWi/nui8ZUMKlJF0qhHjx4A\nDB8+3GsOiYx84Cbn3CYA59xqYDBQDzhzVyuZWQOgN3C/c25NbN1hwArgr+kOHSVfffUVT7VoQf4j\nj8A771CxVi3fkUQiSz2pImm0ceNGatWqxYYNG1i8eDENGjTwHUlSKNM9qWZW2jm3vciyDsA44DLn\n3HO7WO9m4F6grnPu34WWPwZcDlR1zv1SZB1tN+PYvn07Uxo3Zv5JJ3Hj88/7jiOSddSTKhISlSpV\n4sILLwRg5MiRntNItitaoMbUBxzw4W5WbQzsAP5TZPkKoDRwdEoClgClS5em3RdfcNXQob6jiESe\nitQMClOPibLEl44sBYf8R44cyY4dO7xm2VvKEk5mVgroBTzrnPtyN0+tDvwSZ9fouti/1eKttHr1\n6uKHDKlk5lF+fj4dO3Zk9uzZAOTk5FChQoU0JUuNqP+eaHwlQ2nfAUSirkWLFhx22GEsX76c999/\nn3bt2vmOJNFxO7AFuC4dX7zr6adz6kUXAVC1alWaNGlC69iZ7AVvotn6eO7cuQk/Pycnh6ZNm9K9\ne3fmz5+PmXnPn8rxZeNjjS97Hufl5e08LyM3N5dkqCdVJAMGDhzInXfeSdeuXXnhhRd8x5EU8Xmd\nVDPrCdwAtHbO/biH574EXAiUKbwxNLPrgYeAps65z4qs41yNGvDuu3D88akfQBbYsmUL5RYsgNxc\n2H9/tm3bRpkyZXzHEslq6kkVCZlu3boBMHbsWNauXes5jWQ7M7sEuB5os6cCNWYewfb+4CLL6wLb\ngIVx13rmGejYkXmvvMKWLVuKkTg73depExtbtYJ58wBUoIpkmIrUDApTj4myxJeuLLm5ubRu3ZpN\nmzYxevRor1n2hrKEh5n9CegPnO6c+z62rKOZ9S70nJr2v/fnfJ3g5KrTiny504CJRc/s36lzZ2b9\n4Q/s36ULKz/4IJXD8G6P82jcOG6fNYt7GzRgw4knZiRTKkX990TjKxlUpIpkSMEJVMOGDfMbRLKW\nmXUFngGGA+3N7E+xorUTUCf2nObAauCJgvWcc0uBp4FbzKxa7Hk9CfakDtjd9yx16aXk3HgjDWbN\nSv2AQmj+/Pls/Mc/oFcvSo0bx19nzaJy5cq+Y4mUSOpJFcmQjRs3UqdOHdatW8f8+fNp1KiR70hS\nTB6uk7qG4I5TRb+nA+52zg2M3UFqCjDEOXdPoXVLA3cS3HVqG8GZ/f2dc9N38b1+s93csWMHDz30\nEH/5y1+oUqVKqoYVKs9360aHV1+l6kcfUf6443zHEYkc9aSKhFClSpW45JJLAHjqqac8p5Fs5Jyr\n5pwr5ZzLKfJRyjk3MPacec656oUL1Njy7c65251zRzrnGjnnmu+qQN2V2267jffee4/SpaN7YZhu\nzz7LWwMGkNOwoe8oIiWeitQMClOPibLEl+4sffr0AWDUqFFs3LjRa5ZkKItAMH/feuutndcI3b49\n3r0FskPheXTdddcxdepUAEqVLUuf22+nbNmynpKlRtR/TzS+kkFFqkgGNW7cmGbNmrFu3TpeffVV\n33FEklK3bt2dh/m/mTmTBw46iP+uWeM5VfF16tSJPn36sG3bNt9RRKQQ9aSKZNjw4cPp2bMnJ510\nEh9//LHvOFIMPq+Tmm572m4OvuYauo0ZQ83TT4enn4by5TOYrnicc4x55RXOXbqUUr17Q+3arF27\nln333dd3NJHIS2a7qSJVJMN++eUX6tSpw9q1a5k7dy7HHnus70iyl0pykeqcg19+wS69FJYt49Wz\nz6bl5ZdTu3btDKbcO/nLlrHoxBMpW7069WbMgAMO8B1JpMTQiVMhFaYeE2WJLxNZKlasmNAJVCXt\ndUlUmLKUZGaGVaoEL7/MotataTtoEPuMHOk71i7t2LGDhfPmwQMPkHPyyaw85xzm3XtvZAvUqP+e\naHwlg4pUEQ8uv/xyAF544QU2bNjgOY1IMZix/003sWr0aCrVqQPAokWLWLp0qedg/2vx55+z9YQT\n2DJhAsycSaUePbjgwgt9xxKR3dDhfhFPmjdvzowZM3jyySd3Fq2SXUry4f5dcc7RqlUrunfvzmWX\nXZaGZImbN28eBx10ENWqVQNg+LXXctTFF3NSs2Zec4mUZDrcL5IFrrzySgAee+wx9EeURMXmzZtp\n06YNPXv2BMDl5/P4gw+yZcuWjGd58sknue+++3Y+7vHooypQRbKIitQMClOPibLEl8ksF1xwAbVr\n12bBggW8//77XrPsibJIoipUqMDdd99NqVKlAPho6FC63HorZQcNgm+/Zfv27Wn7o2zJ4sW82LMn\nDBoEwB133LHL651GfR5pfNkt6uNLlIpUEU/Kli3LFVdcAcCjjz7qOY1IelRq2ZIlw4Zha9bAUUex\nqmlThrVtC+vXF/tr79ixg1defhlmzYKbbuKIM87guJEjWVe5MgC1a9fm3nvvLfb3ERE/1JMq4tH3\n33/PwQcfzLZt21i2bBmHH36470iSBPWkJumnn3iyQwfO3rqVOtdeC927c+ONN9KoUSO6desGwKxZ\nszjooIOoWbMmACtWrKBGjRpUjhWegwcP5oorrqBy5co455hdrhyN69ShTJcucOGFvL9mDc1btKBc\nuXKpzS4iKaGeVJEsccABB9ClSxecczz22GO+44ik13770WfGDA749FPo3h2AadOmkZubu/Mpq889\nFzvrLOjaFS6+mJUnncSmDh3giy8AePPNN/n000+B4M3us1tuYdGbb8K990KTJrQ5/XQVqCIRoSI1\ng8LUY6Is8fnIcs011wDw3HPPsb7QIdCS/rrsSpiySPJycnIoXbr0zscTJkygWaGTmb5o3ZqtffpA\nhw7QqROLjz6anzp02Hk90xtuuGHnXlaAy+++m8Z7cUOMqM8jjS+7RX18iSq956eISDodd9xxtGzZ\nkmnTpjF8+HCuvvpq35FEMqborUhvKXJDgCu6dPmfx+eee27aM4lIOKgnVSQExowZwwUXXMARRxzB\n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\nB0lEQVTo/D9EAVodDt65OwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(11,8))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls='-', lw=2)\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_leapfrog[idx_ground_leapfrog-1]), fontsize=18);\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls=':', lw=2)\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about the observed order of convergence? We'll repeat the process we have used before, with a grid-refinement ratio $r=2$ ... here we go:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 2.186\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " u[1] = rk2_step(u[0], f, dt)\n", + " for n in range(1, N-1):\n", + " u[n+1] = leapfrog_step(u[n-1], u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical evidence that our calculation with the leapfrog method indeed exhibits second-order convergence, i.e., the method is ${\\mathcal O}(\\Delta t^2)$. _The leapfrog method is a second-order method_. Good job!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### But chew on this ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Go back to the cell that re-enters the model parameters, just above the leapfrog-method time loop, and change the following: the initial height `y0` to 25, and the final time `T` to 36. Now re-run the leapfrog calculation and the two code cells below that, which extract the glider's position and plot it.\n", + "\n", + "_What is going on?_\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tobies, R. \"Iris Runge: A life at the crossroads of mathematics, science and industry,\" Springer Basel, 1st ed. (2012). [Read on Google books, page 73](http://books.google.com/books?id=EDm0eQqFUQ4C&lpg=PA73&dq=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&pg=PA73#v=onepage&q=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&f=false)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/01_01_Phugoid_Theory.ipynb b/lecture_22/01_phugoid/01_01_Phugoid_Theory.ipynb new file mode 100644 index 0000000..2d67c76 --- /dev/null +++ b/lecture_22/01_phugoid/01_01_Phugoid_Theory.ipynb @@ -0,0 +1,764 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, C. Cooper, G.F. Forsyth, A. Krishnan." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Motion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome to [**\"Practical Numerical Methods with Python!\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about) This course is a collaborative, online, open education project, where we aim to give a foundation in scientific computing. The focus is on numerical solution of problems modeled by ordinary and partial differential equations.\n", + "\n", + "This IPython Notebook introduces the problem we'll be studying in the **first module** of the course: the _phugoid model of glider flight_. We'll start with some background, explaining the physics, and working out the mathematical model. \n", + "\n", + "First, we'll look at an idealized motion where there is no drag, resulting in a simple harmonic motion. We can plot some interesting trajectories that will pique your imagination. In the next notebook, you'll learn to numerically integrate the differential equation using Euler's method. But hang on ... first things first. \n", + "\n", + "The term \"phugoid\" is used in aeronautics to refer to a motion pattern where an aircraft oscillates up and down —nose-up and climb, then nose-down and descend— around an equilibrium trajectory. The aircraft oscillates in altitude, speed and pitch, with only small (neglected) variations in the angle of attack, as it repeatedly exchanges kinetic and potential energy.\n", + "\n", + "A low-amplitude phugoid motion can be just a nuisance, as the aircraft does not exceed the stall angle of attack and nothing bad happens. But the mode can also be unstable leading to a stall or even a loop!\n", + "\n", + "Look at this video showing a Cessna single-engine airplane in phugoid motion:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz\nODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj\nY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQED\nEQH/xAAaAAACAwEBAAAAAAAAAAAAAAACAwABBAUG/8QAQBAAAgIBAwEDCAgFBAIDAQEBAQIAAxEE\nEiExE0FRBRQiMmFxgZEjQlJTcpKhsRUzYsHRBkOC4SRjovDxNMIW/8QAGQEBAQEBAQEAAAAAAAAA\nAAAAAAECAwQF/8QAKBEBAAIBBAICAQQDAQAAAAAAAAERAgMSMVETIUFhBCJSgaEyYnEU/9oADAMB\nAAIRAxEAPwBlFdfYp9GnqjuEcKqvu0/KJKax2Nf4R+0PYRPpxEU8coKaj/tp8oa01/dp8oPIlhyI\nqCzeyr+6r/KJfY0/cp+UQFsEMWCZ2ra+yp+7T8oliuof7SflkyDB57o2wWaqUfdp+UQxXQf9tPyi\nZt57xJvPuk2ltfYUn/bT8ok7Cn7pPyiZO1Yd8IXtG0to7CodKk/KJDVWf9tPyiKF5MMOTJtLEtVQ\n/wBqv8olGmvORUn5RJuMm4xULYjXSRg1Jn8IgCmjPNSflEvcZecxUFgfT6furT8ok7Cnb/Lr/KIR\nJlFj4RSWUdPVn+Un5RJ2FQ/20/KIRfxEE2CWi1dnV91X+USdjT92n5RL3r3S+090UWX2NP3SflEr\nsqvu0/KI4FD1/SUwTuYy1BZRqq+6T8ogNp6T/tp+URpU9xEEhx3RUJZLaav7tPyiLOnr+7X5TTk+\nEHM0WzHTp92v5RKFNf3a/lmk+6TEIQKqe+tPkIxaqs/yk+Qh9lmEtWIqF9qFFP3afljFop+7T8ol\npXHKoHSZmlL83p7qk/KJR09XdUn5RNG2Q5EgStNXfWn5RD83p+6T8olk5lB8SUWIU1D/AGk/KIa1\n1fdJ+USltHfGKymSltBVV90n5RC7Kr7pPyiECJczRYOwp+6T8ok83q+6T8ohyRRYOwq+6T8ok7Cn\n7pPyiMzKigs0VfdJ+USjRT90n5RG5lEiKCeyo+6T8oldjV90n5RGnEA++WiwGqr7qv8AKJR09P3a\n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\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('ysdU4mnRYdM')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That doesn't look too good! What's happening? \n", + "\n", + "It can get a lot worse when an aircraft enters one of these modes that is unstable. For example, one of [NASA's Helios Solar Powered Aircraft](http://www.nasa.gov/centers/dryden/history/pastprojects/Helios/) prototype broke up in mid air due to extreme phugoid oscillations!\n", + "\n", + "Helios was a proof-of-concept solar electric-powered flying wing that broke the world altitude record for a non-rocket-powered aircraft in August 2001. But in June 26, 2003, it broke something else. The aircraft entered phugoid motion after encountering turbulence near the Hawaiian Island of Kauai. The high speed in the oscillatory movement exceeded the design limits, and it ended up wrecked in the Pacific Ocean. Luckily, the Helios was remotely operated, and nobody got hurt." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The physics of phugoids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The phugoid oscillation has the aircraft pitching up and down, as it decelerates and accelerates. The trajectory might look like a sinusoid, as in the figure below. The assumption is that the forward velocity of the aircraft, $v$, varies in such a way that the angle of attack remains (nearly) constant, which means that we can assume a constant lift coefficient." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/oscillatory_trajectory.png)\n", + "#### Figure 1. Trajectory of an aircraft in phugoid motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the descending portion of the trajectory, the aircraft's velocity increases as it proceeds from a peak to the minimum height—gaining kinetic energy at the expense of potential energy. The contrary happens in the upward segment, as its velocity decreases there.\n", + "\n", + "We measure the pitch angle (between the aircraft's longitudinal axis and the horizontal) as positive when the aircraft's nose is pointing up. In the portion of the trajectory below the center-line, where it curves upwards, the pitch angle $\\theta$ is increasing: $\\dot{\\theta}>0$. And where the trajectory curves down, the pitch angle is decreasing: $\\dot{\\theta}<0$, as shown in the figure.\n", + "\n", + "Let's remind ourselves of the forces affecting an aircraft in a downward glide. Look at the figure below: we show the flight path, the forces on the glider (no thrust), and the _glide angle_ or flight path angle, $\\gamma$, between the flight path and the horizontal." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces.png)\n", + "#### Figure 2. Forces on a glider." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The force of lift, $L$ —created by the airflow around the wings— is perpendicular to the trajectory, and the force of drag, $D$, is parallel to the trajectory. Both forces are expressed in terms of coefficients of lift and drag, $C_L$ and $C_D$, respectively, that depend on the wing design and _angle of attack_—the angle between the wing chord and the flight path.\n", + "\n", + "If you are not familiar with airplane aerodynamics, you might be getting confused with some terms here ... and all those angles! But be patient and look things up, if you need to. We're giving you a quick summary here.\n", + "\n", + "Lift and drag are proportional to a surface area, $S$, and the dynamic pressure: $1/2 \\rho v^2$, where $\\rho$ is the density of air, and $v$ the forward velocity of the aircraft. The equations for lift and drag are:\n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "If the glider were in equilibrium, the forces would balance each other. We can equate the forces in the directions perpendicular and parallel to the trajectory, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "L = W \\cos \\gamma \\quad \\text{and} \\quad D = W \\sin \\gamma\n", + "\\end{equation}$$\n", + "\n", + "where $W$ repesents the weight of the glider.\n", + "\n", + "In the figure, we've drawn the angle $\\gamma$ as the _glide angle_, formed between the direction of motion and the horizontal. We are not bothered with the _sign_ of the angle, because we draw a free-body diagram and take the direction of the forces into account in writing our balance equations. But later on, we will need to be careful with the sign of the angles. It can cause you a real headache to keep this straight, so be patient!\n", + "\n", + "It looks like we've set this up to do a little bit of mathematics. Are you ready?\n", + "\n", + "But before, a short glimpse of the history." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lanchester's Aerodonetics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Phugoid theory\" was first described by the British engineer Frederick W. Lanchester in _\"Aerodonetics\"_ (1909). This book is so old that it is now in the public domain, so you can actually download [from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&dq=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&pg=PA37#v=onepage&q=%22phugoid%20theory%20deals%20with%20the%20longitudinal%20stability%22&f=false) a PDF file of a scan, or read it online. \n", + "\n", + "Lanchester defines phugoid theory as the study of longitudinal stability of a flying machine (aerodone). He first considered the simplification where drag and moment of inertia are neglected. Then he included these effects, obtaining an equation of stability. In addition to describing many experiments by himself and others, Lanchester also reports on _\"numerical work ... done by the aid of an ordinary 25-cm slide rule.\"_ Go figure!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ideal case of zero drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we follow the derivation given by Milne-Thompson (1966), which we find a little bit easier than that of the original in \"Aerodonetics\"!\n", + "\n", + "An aircraft flying in a steady, straight horizontal flight has a lift equal to its weight. The velocity in this condition is sometimes called _trim velocity_ (\"trim\" is what pilots do to set the controls to just stay in a steady flight). Let's use $v_t$ for the trim velocity, and from $L=W$ deduce that:\n", + "\n", + "$$\\begin{equation}\n", + "W = C_L S \\times\\frac{1}{2} \\rho v_t^2\n", + "\\end{equation}$$\n", + "\n", + "The weight $W$ is constant for the aircraft, but the lift at any other flight condition depends on the flight speed, $v$. We can use the expression for the weight in terms of $v_t$ to obtain the ratio $L/W$ at any other flight velocity, as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}= \\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "Imagine that the aircraft experienced a little upset, a wind gust, and it finds itself off the \"trim\" level, in a curved path with an instantaneous angle $\\theta$. In the sketch below, we exaggerate the curved trajectory of flight to help you visualize what we'll do next. The angle $\\theta$ (using the same name as Milne-Thompson) is between the _trajectory_ and the horizontal, positive up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "#### Figure 3. Curved trajectory of the aircraft going up." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can form a free body diagram to determine the balance of forces. \n", + "\n", + "\n", + "\n", + "#### Figure 4. Free body diagram of the aircraft trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the free body diagram, we can see that\n", + "\n", + "\\begin{equation}\n", + "\\vec{L} + \\vec{W} = m\\vec{a} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "where $\\frac{v^2}{R}$ is the centripetal acceleration and $R$ is the radius of curvature of the trajectory.\n", + "If we decompose the lift and weight into their normal and tangential components we get\n", + "\n", + "\\begin{equation}\n", + "L\\hat{n} + W_n\\hat{n} + W_t\\hat{t} = \\frac{mv^2}{R}\\hat{n} + m \\frac{dv}{dt}\\hat{t}\n", + "\\end{equation}\n", + "\n", + "The component of the weight in the normal direction ($W_n$) is\n", + "\n", + "\\begin{equation}\n", + "W_n = -W \\cos \\theta\n", + "\\end{equation}\n", + "\n", + "If we then consider that all of the components in $\\hat{n}$ must balance out, we arrive at\n", + "\n", + "\\begin{equation}\n", + "L - W \\cos \\theta = \\frac{mv^2}{R}\n", + "\\end{equation}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can rewrite this as\n", + "\n", + "$$\\begin{equation}\n", + "L- W \\cos \\theta = \\frac{W}{g} \\frac{v^2}{R}\n", + "\\end{equation}$$\n", + "\n", + "where $g$ is the acceleration due to gravity. Rearrange this by dividing the equation by the weight, and use the expression we found for $L/W$, above. The following equation results:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{v^2}{v_t^2}-\\cos \\theta = \\frac{v^2}{g R}\n", + "\\end{equation}$$\n", + "\n", + "Recall that we simplified the problem assuming that there is no friction, which means that the total energy is constant (the lift does no work). If $z$ represents the depth below a reference horizontal line, the energy per unit mass is (kinetic plus potential energy):\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{2}v^2-g z = \\text{constant}\n", + "\\end{equation}$$\n", + "\n", + "To get rid of that pesky constant, we can choose the reference horizontal line at the level that makes the constant energy equal to zero, so $v^2 = 2 g z$. That helps us re-write the phugoid equation in terms of $z$ as follows:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z}{z_t}-\\cos \\theta = \\frac{2z}{R}\n", + "\\end{equation}$$\n", + "\n", + "Let $ds$ represent a small arc-length of the trajectory. We can write \n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} \\quad \\text{and}\\quad \\sin\\theta = -\\frac{dz}{ds}\n", + "\\end{equation}$$\n", + "\n", + "Employing the chain rule of calculus,\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{1}{R} = \\frac{d\\theta}{ds} = \\frac{dz}{ds}\\frac{d\\theta}{dz} = -\\sin \\theta\\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "Multiply the phugoid equation by $\\frac{1}{2\\sqrt{z}}$ to get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} - \\frac{\\cos\\theta}{2\\sqrt{z}} = \\frac{\\sqrt{z}}{R}\n", + "\\end{equation}$$\n", + "\n", + "Substituting for $1/R$ on the right hand side and bringing the cosine term over to the right, we get:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{\\sqrt{z}}{2z_t} = \\frac{\\cos \\theta}{2 \\sqrt{z}} - \\sqrt{z} \\sin \\theta \\frac{d\\theta}{dz}\n", + "\\end{equation}$$\n", + "\n", + "The right-hand-side is an exact derivative! We can rewrite it as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d}{dz} \\left(\\sqrt{z}\\cos\\theta \\right) = \\frac{\\sqrt{z}}{2z_t}\n", + "\\end{equation}$$\n", + "\n", + "Integrating this equation, we add an arbitrary constant, chosen as $C\\sqrt{z_t}$ which (after dividing through by $\\sqrt{z}$) gives:\n", + "\n", + "$$\\begin{equation}\n", + "\\cos \\theta = \\frac{1}{3}\\frac{z}{z_t} + C\\sqrt{\\frac{z_t}{z}}\n", + "\\end{equation}$$\n", + "\n", + "Taking the derivative of both sides of equation (15) and applying the relations from equation (10) yields:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{z_t}{R} = \\frac{1}{3} - \\frac{C}{2}\\sqrt{\\frac{z_t^3}{z^3}}\n", + "\\end{equation}$$\n", + "\n", + "Make sure you have followed the derivation, and perhaps write it out on paper!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Phugoid Curves" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Equation (15) is non-linear, which usually means we are hard-pressed to write a clean expression for the variable of interest, $z$. In fact, Lanchester himself said that he was unable to _\"reduce this expression to a form suitable for co-ordinate plotting.\"_ If the great polymath couldn't do it, we can't either!\n", + "\n", + "But Lanchester _was_ able to plot a suitable approximation of the phugoid flight path using what he called the \"trammel\" method. If you're interested in seeing how he did it, his explanation begins on page [48 of Aerodonetics](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PA49&lpg=PA48&dq=aerodonetics+the+use+of+the+trammel&source=bl&ots=lB6EVKYQuT&sig=aVE2kiDWZoWftaWczMIrcYftMOs&hl=en&sa=X&ei=gTD_U82fGYjzgwT3moGwCQ&ved=0CCAQ6AEwAA#v=onepage&q=aerodonetics%20the%20use%20of%20the%20trammel&f=false). It's a trip.\n", + "\n", + "Lanchester used Equations (15) and (16) to solve for the constant $C$ and the radius of curvature $R$ and then iteratively plotted small arcs of the phugoid path. By hand.\n", + "\n", + "We wrote a neat little code that duplicates the manual trammel method, but it might be a bit much for you to absorb in the first lesson. If you want to look it over, you are more than welcome to. If you are just starting with Python, skip it for the moment and we'll return to it at the end of this module. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting the flight path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we mentioned, we wrote a Python code to reproduce programmatically what Lanchester did graphically. Here's a neat feature of IPython Notebooks: you can run external programs with the magical keyword ... wait for it ... `run`. And the jargon of IPython _is_ to call this \"magic.\" In fact, there are a bunch of [magic functions](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) that you will learn about. They will make you a happy camper.\n", + "\n", + "Let's do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%run phugoid.py\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This code cell loaded our simulated-trammel code, `phugoid.py`. The code defined a function for you in the background, called `plot_flight_path`, taking three inputs: $z_t$, $z$ and $\\theta$. \n", + "\n", + "Look again at Equation (15), where we take the positive square root. There are several possibilities, depending on the value that the constant $C$ takes. \n", + "\n", + "* There are no physical solutions for $C>2/3$, because it would result in $\\cos\\theta>1$. \n", + "\n", + "* If $C=2/3$, then the solution is a horizontal straight line, because $\\cos\\theta=1$, $\\theta=0$ and $R=\\infty$.\n", + "\n", + "* Any value of $C$ for which $0 < C < \\frac{2}{3}$ will produce \"trochoidal\"-like paths. What does this look like? Let's use our custom function `plot_flight_path` to find out!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n5MgRihQpQt++fQE4fPgw+fLlo1SpUpw8eTLV19+1axfFihULPC5WrBixsbFZ10G/zPQzNefrf0oy\n2tfBgwczdOhQALZu3UpERESq22amn+mtL7XtixcvniM/0wtR4BMRkWxlluFzxf7JuT/a6bV69WqG\nDx9OxYoVyZcvH506daJHjx5/2q5atWqMGDEiQ6+xf/9+Nm7cyJQpUwBo27Ytbdq0oXr16syYMYP7\n77+fCRMmnHcfR44c4aKLLgo8joyM5Pfff0/T66e1j5C5fqbmfP1PSUb6unfvXr799lu+++471qxZ\nw6RJk3j++edT3T4z/UxvfefbPqM/06ykKV0REfG8Zs2a8dVXX9GoUSMKFChAjx49eP3119m/f3+W\nvUaRIkVo0KBB4HHlypWJjo7m22+/5aqrrkrzPoJD7R9//EGJEiXS9L3J+xgVFcXIkSMZP3483333\nXfo6kwGp9f9826e3r4sWLaJr16488MAD3HXXXezZs4cOHTpkSz/TW19q22fmZ5qVNMInIiLZKqOj\nclnt5ZdfZv/+/bz99tuAbzqwbNmySbYJngIMlpYpwHr16rFs2bLA43z58pGQkMC3337LqVOnmDt3\nLsuXL+f06dPMnj07xf1cccUVrFmzJvD48OHDNGnSJEN9fP3112nfvj1NmjShT58+fPrpp1nSz9Sk\n1v/UZKSvO3fupE6dOoBv5Wvnzp355JNPsqWf6a0vte2LFSuWqZ9plsnMio/cfEMrykREsky4/059\n+eWX3bPPPuucc27jxo1u6dKl7oYbbnArVqzIstc4ffq0a9GiReBxq1at3LZt25JsM3z48CSrdH/6\n6SeXmJgYeHzy5EnXoEGDwOOGDRu6/fv3O+eci42NTbJtcsn7+PDDD7tff/3VOefcDTfckImepWz8\n+PGub9++gcfn63/yfjqXsb6OHTvWjR071jnnXOfOnd2OHTvcI488ki39PF996enP+faTktT+L5HJ\nVbrmwuSTV04zM5dX+y4iktVSu+B7OPjPf/7Db7/9RtGiRRk2bBjXXHMNd911F59//jmDBg3K0tea\nP38+y5cvxzlH7dq1ueOOOwLPTZs2jREjRmBmDB06lJtvvpkmTZowbtw4GjduHNhu0qRJbN++Hecc\n1apVC+yjTp06vPXWW1x//fVp6uO+fft45plnqFChAp07d2bOnDlZ1s933nmHqVOnsnPnTvr27cuT\nTz5JkSJFUu1/Sv3MSF+PHz/O888/T4MGDahfvz4tWrTg4Ycf5tlnn82WfqZWX3r7k1p7SlL7v+Rv\nz/ABsQp8IiKSaeEc+FIyefJkqlSpQuXKlbnssstCXU6aJCYm8s0331zw1C7nvP3227Rt25Y6derQ\nt29fPvvss2yuMOukp6+5uZ8pUeDLYgp8IiJZJ7cFvlmzZhEXF0ezZs3Oe664cDJ16lS6devGxRdf\nnKbtDx8+zMcff0yxYsWoX78+LVu2zOYKs056+pqb+5kSBb4spsAnIpJ1clvgy41OnjzJJZdcEuoy\nckRe6mtyCnxZTIFPRCTrKPCJZI3sCnw6D5+IiIiIxynwiYiIiHicAp+IiIiIxynwiYiIiHicAp+I\niIiIx+lauiIikmlVqlT50/VKRST9suu8kDoti4iIiEiY02lZREREROS8FPhEREREPE6BT0RERMTj\nFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RE\nRMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6B\nT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjFPhEREREPE6BT0RERMTjwj7wmdk4\nM9tvZhuC2oqbWbSZbTGz+WZWNOi5oWYWa2abzKxDaKoWERERCR9hH/iAfwIdk7UNARY652oBi4Ch\nAGZWF+gF1AFuAN4zM8vBWkVERETCTtgHPufcMuBIsubuwAT//QlAD//9G4Epzrl459x2IBZonhN1\nioiIiISrsA98qSjjnNsP4JzbB5Txt1cEdgZtt9vfJiIiIpJn5dbAl5wLdQEiIiIi4Sp/qAvIoP1m\nVtY5t9/MygEH/O27gcuCtqvkb0vR8OHDA/ejoqKIiorK+kpFRERE0ikmJoaYmJgs2585F/6DY2ZW\nFfjSOdfA/3gk8JtzbqSZDQaKO+eG+BdtfApchW8qdwFQw6XQSTNLqVlEREQk7JgZzrkML0QN+xE+\nM5sMRAElzexXYBjwCjDNzO4FduBbmYtz7kczmwr8CMQBDynViYiISF6XK0b4soNG+ERERCS3yOwI\nn1cWbYiIiIhIKhT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9E\nRETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxO\ngU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERE\nRDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4\nRERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE4xT4RERERDxOgU9ERETE\n4zwZ+Mysk5ltNrOtZjY41PWIiIiIhJI550JdQ5Yys3zAVuBaYA+wGrjVObc52XbOa30XERERbzIz\nnHOW0e/34ghfcyDWObfDORcHTAG6h7gmERERkZDxYuCrCOwMerzL3yYiIiKSJ3kx8ImIiIhIkPyh\nLiAb7AYqBz2u5G/7k+HDhwfuR0VFERUVlZ11iYiIiKRJTEwMMTExWbY/Ly7aiAC24Fu0sRf4FrjN\nObcp2XZatCEiIiK5QmYXbXhuhM85l2BmjwDR+KasxyUPeyIiIiJ5iedG+NJKI3wiIiKSW+i0LCIi\nIiJyXgp8IiIiIh6nwCciIiLicQp8IiIiIh7nuVW66ZGYmEi+fMq8IuI9Z86c4ddff2Xnzp3s27eP\ns2fPEh8fT6FChShdujTly5enZs2aREZGhrpUEckBeTrwRUREUKJECa644gqqV69O06ZNadWqFU2b\nNtUvQRHJVU6dOsXXX3/N/PnzWbVqFevXrycuLu6835M/f37q1KlDy5Yt6dixI9dccw3FihXLoYpF\nJCfl6dOypPZc4cKF6dy5Mz179qR79+5cfPHFOVmaiEiaJCQksGDBAsaOHctXX33F6dOnA8+ZGZUr\nV6Zy5cpUqFCBiy66iIiICE6ePMmBAwfYtWsX27ZtI/hvQIECBejSpQt33nknN954IwUKFAhFt0Qk\nBZk9LUueDnzx8fEcOnSIn376ic2bN7Ny5UqWLVvGpk3/O09z8eLFufvuu3nwwQepU6dOCCsWEfE5\nfvw477//Pu+++y47d+4MtDdr1oyuXbvStm1bmjZtyqWXXnre/Zw8eZINGzawePFi5s+fz7Jly0hM\nTASgUqVKDBgwgPvvv5+iRYtma39E5MIU+DLofCde/uWXX5g1axaffvopa9asCbR3796d559/nqZN\nm+ZUmSIiAceOHeP111/nzTff5OjRowBUq1aNfv360adPHypWrJip/e/du5fPPvuMsWPHBj74FilS\nhIEDB/LEE09QuHDhTPdBRDJGgS+D0nqljbVr1/LBBx8wceLEwHRJ165defXVVzXiJyI5Ij4+nrFj\nx/K3v/2NgwcPAtC2bVueeeYZOnTokOWLzxITE5k3bx6vvfZa4OLtZcuW5cUXX6Rfv35ERERk6euJ\nyIUp8GVQei+ttm/fPkaPHs17773HqVOniIiI4OGHH2bYsGGUKFEiGysVkbxs8eLFPProo2zcuBHw\nBb2///3vtG3bNkdePyYmhkGDBrF69WoAmjdvzgcffECjRo1y5PVFxEeBL4Myei3dAwcO8PzzzzN2\n7FgSExMpUaIE//jHP7j77rsxy/DPQUQkiaNHjzJo0CA++ugjAC6//HJee+01brrpphz/XeOcY+rU\nqTz55JPs2bOHiIgInnjiCV588UUtahPJIQp8GZTRwHfO+vXreeKJJ1i8eDEAHTt25IMPPqBKlSpZ\nVaKI5FGzZ8+mf//+7Nmzh8jISJ577jkGDhzIRRddFNK6jh8/zvPPP88777xDYmIidevWZdKkSTRu\n3DikdYnkBQp8GZTZwAe+T70TJ07kiSee4MiRIxQuXJhXX32Vv/71rxrtE5F0+/3333n00UcZP348\nAC1atGDcuHHUrVs3tIUls3r1au6++242b95MgQIFePHFFxk4cKCO7RPJRgp8GZQVge+cffv28cgj\njzB9+nQAunXrxscff0ypUqWyZP8i4n1r1qzh9ttvJzY2losuuogRI0bw6KOPhm2IOnXqFIMHD+ad\nd94BICoqis8++4xy5cqFuDIRb1Lgy6CsDHznTJ06lQcffJCjR49Svnx5Jk6cyHXXXZelryEi3pKY\nmMjo0aN59tlniYuLo379+nz22WfUr18/1KWlybx58+jbty/79++nfPnyfP755zm2oEQkL8ls4NOF\nZLNQr169WL9+PW3btmXv3r1cf/31DB48mPj4+FCXJiJh6Pjx49x0000MGjSIuLg4Hn30Ub799ttc\n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\n9dVXqf4eVOBT4Atrq1atcj179nRmluSP++zZs11CQkKoy5MckpiY6ObOnZvkQ4CZuW7durmlS5eG\nujyRTImPj3eTJ092derUCby/K1eu7N566y134sSJUJcnYeTIkSPu73//uytdunTgvVK/fn03c+bM\nC37gVeBT4MsVfvrpJzdgwABXuHDhJFfuGDVqlM5m72GHDx92r7/+epIrYxQqVMg99NBDujqGeE58\nfLybMmWKq1u3buD9Xrx4cffMM8+4PXv2hLo8CaHdu3e7gQMHBhZjAK5p06Zu2rRpaR78UOBT4MtV\njh496kaNGuUqV66cZLr31ltv1ZSeRyQmJrqlS5e6O++8M8m0bYUKFdyIESO0kEc8LyEhwU2fPt21\natUqye+5e+65x/3www+hLk9y0MqVK92dd97pIiMjA++Fa6+91i1YsCDdf+8yG/jC/jx82cXMXF7t\neziIj49nzpw5fPjhh8yZM+dcCKdGjRr069eP22+/ncsuuyzEVUp67NmzhylTpjBu3Dh+/PFHAMyM\nDh068MADD9CtWzcKFCgQ4ipFctZ//vMfRo8ezcyZMwO/59q1a0f//v3p2bMnkZGRIa5QstqZM2f4\n/PPPeeedd1i92ne113z58tGzZ0+GDBnClVdemaH9mhkuE+fhU+CTkPv1118ZN24c48aNC1yqzcxo\n164dd9xxBzfffDPFihULcZWSkuPHjzNjxgw+/fRTvv7668AftHLlynHvvfdy3333cfnll4e4SpHQ\n27ZtG2+88Qbjx4/n5MmTAJQpU4Z+/frxwAMPULVq1dAWKJkWGxvLP//5T8aOHcvBgwcBKFGiBPfd\ndx/9+/fP9M9YgS+DFPjCT3x8PHPnzuWTTz5h9uzZnDlzBoDIyEi6du1K7969ueGGGyhSpEiIK83b\nTp48ybx585g6dSqzZ88OXPYnMjKSLl26cOedd2o0TyQVx48f59NPP+X999/nhx9+AP43Et6nTx+6\nd+9OoUKFQlylpNXvv//OtGnT+Pjjj1m2bFmgvVGjRjz66KPcdtttXHzxxVnyWgp8GaTAF96OHTsW\nGDlatGhRYOQoMjKS6667jp49e9KtWzfKli0b4krzhkOHDvHll1/yxRdfEB0dneTajldffTV33nkn\nN998M8WLFw9hlSK5h3OO//znP4wZM4apU6dy9uxZAIoUKcLNN9/MXXfdRbt27ciXL6SXvJcUJCQk\n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\nKVasGMWKFaNo0aIUK1aMMmXKUL58eSpUqEDx4sU9H+guRIEvgxT4REREJLfIbODTsj0RERERj1Pg\nExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERER\nj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4R\nERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4\nBT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExEREfE4BT4RERERj1PgExER\nEfE4BT4RERERjwvbwGdmr5rZJjP73symm9mlQc8NNbNY//MdgtqbmNkGM9tqZm+EpnIRERGR8BK2\ngQ+IBuo55xoBscBQADOrC/QC6gA3AO+Zmfm/532gn3OuJlDTzDrmfNkiIiIi4SVsA59zbqFzLtH/\ncCVQyX//RmCKcy7eObcdXxhsbmblgCLOudX+7SYCPXKyZhEREZFwFLaBL5l7gTn++xWBnUHP7fa3\nVQR2BbXv8reJiIiI5Gn5Q/niZrYAKBvcBDjgWefcl/5tngXinHOfhaBEERERkVwvpIHPOXf9+Z43\ns75AZ+CaoObdwGVBjyv521JrT9Xw4cMD96OiooiKirpw0SIiIiLZLCYmhpiYmCzbnznnsmxnWcnM\nOgGjgaudc4eD2usCnwJX4ZuyXQDUcM45M1sJPAasBr4C3nLOzUtl/y5c+y4iIiISzMxwztmFt0xZ\nSEf4LuBtIBJY4F+Eu9I595Bz7kczmwr8CMQBDwUlt4eB8cBFwJzUwp6IiIhIXhK2I3zZTSN8IiIi\nkltkdoQvt6zSFREREZEMUuATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER\n8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+AT\nERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGP\nU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhER\nERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgFPhERERGPU+ATERER8TgF\nPhERERGPC9vAZ2Yvmtl6M1tnZvPMrFzQc0PNLNbMNplZh6D2Jma2wcy2mtkboalcREREJLyYcy7U\nNaTIzAo75373338UqOuc629mdYFPgWZAJWAhUMM558xsFfCIc261mc0B3nTOzU9l/y5c+y4iIiIS\nzMxwzllGvz9sR/jOhT2/S4BE//0bgSnOuXjn3HYgFmjuHwEs4pxb7d9uItAjp+oVERERCVf5Q13A\n+ZjZS8DdwFGgvb+5IrAiaLPd/rZ4YFdQ+y5/u4iIiEieFtIRPjNb4D/m7tztB//XbgDOueecc5Xx\nTeE+GspaRURERHKrkI7wOeeuT+Omk4GvgOH4RvQuC3qukr8ttfZUDR8+PHA/KiqKqKioNJYjIiIi\nkn1iYmKIiYnJsv2F86KN6s65bf77jwJtnXO9ghZtXIVvynYB/1u0sRJ4DFiNLyC+5Zybl8r+tWhD\nREREcoXMLtoI52P4XjGzmvgWa+wA/grgnPvRzKYCPwJxwENBye1hYDxwETAntbAnIiIikpeE7Qhf\ndtMIn4iIiOQWnj0ti4iIiIhkDQU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T\n4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+EREREY9T4BMRERHxOAU+ERER\nEY9T4BMRERHxOAU+EREREY9T4BMRERHxOAW+PCYmJibUJYSE+p23qN95i/qdt+TVfmeWAl8ek1f/\no6jfeYv6nbeo33lLXu13ZinwiYiIiHicAp+IiIiIx5lzLtQ1hISZ5c2Oi4iISK7knLOMfm+eDXwi\nIiIieYWmdEVEREQ8ToFPRERExOPyXOAzs05mttnMtprZ4FDXk5XMbJyZ7TezDUFtxc0s2sy2mNl8\nMysa9NxQM4s1s01m1iE0VWeemVUys0VmttHMfjCzx/ztnu67mRU0s1Vmts7f72H+dk/3+xwzy2dm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#zt = 64, z = 16, theta=0\n", + "plot_flight_path(64, 16, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool! Note that the plot title tells us what the calculated value of $C$ was for our input conditions. We have a value of $C$ between $0$ and $\\frac{2}{3}$ and our path is trochoidal, like we announced it would be.\n", + "\n", + "* For negative values of $C$, the resultant flight path consists of a series of loops. Let's try it out!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nUqZMGcLCwrjpppvo0KHDX9arWLEigwYNytZ77Nu3j/Xr1zNlyhQAWrRoQfPmzalcuTKffvop999/\nP2PHjj3nNo4cOUKBAgWSP4+KiiI2NjZT75/ZfYTz28/0nGv/05Kdfd2zZw/Lli1j5cqVrFixggkT\nJvD888+nu34w9nPy5MnMmDGDN998M9vbyOz3Pzs0tSoiInleo0aN+O9//0u9evWIjIykQ4cOvPXW\nW+zbty9o7xEdHU3t2rWTPy9XrhxfffUVy5Yto3HjxpneRsqyGhcXR4kSJTL12tT72LJlS4YMGcKY\nMWOSj0PLSent/7nWz+q+zps3j/bt29OrVy+6du3K7t27adWqVY7uZ6dOnfjggw+46aabsnUbuqx8\n/7NDI3IiIpKjQuXWXa+99hr79u1j2LBhgG9a7pJLLvnTOimn4lLKzFRczZo1+e6775I/DwsLIzEx\nkWXLlnHq1CnmzJnD4sWLOX36NJ9//nma26lUqRIrVqxI/vzQoUM0aNAgW/v41ltvcd1119GgQQO6\nd+/OxIkTg7Kf6Ulv/9OTnX3dtWsX1atXB3xnvLZt25bx48fnyH5+8cUXvPrqqyxevJjo6GguueQS\nPvnkkwzPxE1t6dKlxMXFZer7ny3W2nz58O26iIgEQ6j/m/raa6/Z5557zlpr7fr16+2iRYtsmzZt\n7Pfffx+09zh9+rRt0qRJ8ufNmjWzv/7665/WGThwoH3ppZeSP9+yZYtNSkpK/vzkyZO2du3ayZ/X\nrVvX7tu3z1pr7ebNm/+0bmqp97FPnz52586d1lpr27Rpcx57lrYxY8bYHj16JH9+rv1PvZ/WZm9f\nR48ebUePHm2ttbZt27Z2x44dtm/fvjmyn3PmzEn+eiYlJdmyZcvar776Kt39CUj9dUkp9fc/Len9\nXfIv/0ufMTZEflPKbcYYm1/3PSNnz55l8+bN7Nixg507d7J3715OnDjBmTNnKF26dPJBpiIiAend\n6DsULFmyhMOHD1OsWDFefPFFrr/+erp27crUqVN56qmngvpeX375JYsXL8ZaS7Vq1ejSpUvyc9Om\nTWPQoEEYY+jfvz8dO3akQYMGfPDBB9SvXz95vQkTJrB9+3astVSsWDF5G9WrV+edd97hxhtvzNQ+\n7t27l2effZbLLruMtm3b8sUXXwRtP999910+/vhjdu3aRY8ePejXrx/R0dHp7n9a+5mdfT1+/DjP\nP/88tWvXplatWjRp0oQ+ffrw3HPP5ch+jhw5koSEBHbs2EGVKlV44IEHzrk/6X1dIO3vf1rS+7vk\nX/6XA05V5ITjx4/z7bffMnfuXJYtW8batWuJj49Pc93atWuzdu3aXE4oIqEulItcWiZNmkT58uUp\nV64cZcuWdR0nU5KSkliwYEGmL2ExbNgwWrRoQfXq1enRoweTJ0/O4YTBk5V99fJ+pkVFLpPye5E7\nfvw4M2bMYNKkScybN4+EhIQ/PV+hQgUqVapEuXLlKF26NEWLFuWCCy6gVKlSdOrUyVFqEQlVXity\nn332GWfPnqVRo0bnvNZZKPn444+5+eabKViwYKbWP3ToEB9++CHFixenVq1aNG3aNIcTBk9W9tXL\n+5kWFblMyq9FbsOGDbzzzjuMGzeOuLg4AMLDw2nSpAmtWrWiRYsW1K9fP0euki0ieZfXipwXnTx5\nksKFC7uOkSvy076mpiKXSfmtyK1evZoXXniB2bNnJy9r0aIFXbp0oWPHjiF3+xcR8RYVOZHgyGqR\n0+VH8rjt27fz5JNPJt/CpFChQnTv3p2+fftSo0YNx+lERETkfKjI5VHx8fEMHjyYwYMHc/r0aQoU\nKECfPn146qmnKFWqlOt4IiIiEgQqcnnQmjVr6Nq1K+vWrQOgc+fOvP7665QpU8ZxMhEREQkm3aIr\nD0lMTGTIkCE0atSIdevWUblyZRYsWMDEiRNV4kRERPIgjcjlEYcOHeKuu+7i66+/BuDBBx/kjTfe\nyLdn/YiIiOQHKnJ5wPr167nlllvYunUrpUqVYuzYsdx0002uY4lIPlK+fPm/3M9SRLIuq9c11NSq\nx82ePZsmTZqwdetWGjRowIoVK1TiRCTXBW6z5IXH8OHDk0vnI488wtmzZ51nyu7j+PHjtG/fHoCI\niAjGjx/vPJMe5/fYvn17lv7uqch52Pjx4+nQoQOxsbF06tSJRYsWeeZWMyIiLgwaNIg+ffpgreX1\n11/n7bffJiLCu5NT0dHRzJw5k8cff5yEhAS6devG6NGjXceSXKQi51EjRoygW7duJCYmMmDAACZO\nnEihQoVcxxIRCVmvvfYazz77LMYY/vOf//Dkk0+6jhQU4eHhDB06lNdeew1rLffffz/Dhw93HUty\nie7s4EFDhw5N/gfojTfe4IknnnCcSEQktI0cOZKHHnoIYwwTJkygc+fOriPliLfffpvHHnsM8O1z\n7969HSeSYNEtulLxapH7z3/+Q+/evTHG8N5779GrVy/XkUREQtqkSZO4++67sdby/vvvc//997uO\nlKNSltaPP/6Yjh07uo4kQaAil4oXi9yUKVPo3Lkz1lpGjBjBgw8+6DqSiEhIW7BgAX/7299ISEhg\nyJAhPPXUU64j5YpXX32VAQMGEBUVxZw5c7j++utdR5LzpCKXiteK3Ny5c2nbti0JCQm8+uqrPPvs\ns64jiYiEtG3bttGoUSMOHTrEY489xptvvuk6Uq6x1vLII48wbNgwoqOjWbp0KdWrV3cdS86Dilwq\nXipyv/zyC40bN+bYsWM8/vjjvPHGG7pek4jIOcTGxtKsWTPWrVvHTTfdxOzZswkPD3cdK1clJSVx\n1113MW3aNKpUqcLSpUu58MILXceSbFKRS8UrRe7IkSM0adKETZs2cdttt/HJJ58QFqaTjUVE0mOt\n5a677uLjjz+matWq/PDDDxQvXtx1LCdOnjxJ8+bN+fHHH2ndujX//e9/812hzSvSK3JqBCEsMTGR\nTp06sWnTJurUqcO4ceNU4kREMjB69Gg+/vhjihQpwueff55vSxxA4cKFmTlzJiVLluTLL7/k+eef\ndx1JgkytIIQNGjSIL7/8kosvvpjPP/+cIkWKuI4kIhLSNmzYwCOPPALAe++9R0xMjONE7pUvXz55\nNmfw4MF88803riNJEKnIhahFixbx4osvAjBhwoQs33tNRCS/iY+P56677iIuLo7u3bvTpUsX15FC\nxrXXXssLL7yAtZauXbty4MAB15EkSFTkQtChQ4fo3LkzSUlJPPPMM7Rq1cp1JBGRkPfqq6+ybt06\nKleuzLBhw1zHCTnPPfccLVq0YM+ePdx777144ThxyZhOdghBnTp1YsqUKTRt2pQFCxYQGRnpOpKI\nSEhbs2YNDRs2JCEhgYULF9KiRQvXkULSzp07qVu3LkePHmXcuHF07drVdSTJJJ3s4BGffvopU6ZM\noXDhwkyYMEElTkQkAwkJCdx7770kJCTQp08flbhzKFeuHG+99RYAjzzyCHv37nWcSM6XilwIOXTo\nUPLdGoYMGULFihUdJxIRCX0jRoxg1apVlC9fnkGDBrmOE/K6d+9O69atOXLkCH379nUdR86TplZD\nSPfu3Rk3bhzXXnst8+bN06VGREQycODAAapUqcKxY8f47LPPuOWWW1xH8oQdO3ZQq1YtYmNjmT17\n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\nli5dyh133MG0adNCqiilnFIdNWoU9913n+tIkgs0tZoPXHnllTzxxBNYa+nevbtu3yUikg0RERFM\nmjSJ6Ohopk+fzujRo11HSpZ6SrVnz56uI4ljGpHLY06fPs2VV17Jhg0bPHGwrohIqJo4cSJ33303\nBQsWZOXKlVSvXt11JCZNmkSXLl2Ijo7mp59+oly5cq4jSS5Jb0RORS4PWr16NY0bN+bs2bPMmTOH\nm266yXUkERFP6tatG+PHj6du3br88MMPFChQwFmWnTt3UrduXY4ePaop1XxIU6v5SP369Xn55ZcB\nuPfeezl06JDjRCIi3jR8+HAqVarEmjVreOqpp5zlSExMpFu3bhw9epT27dtrSlWSqcjlUU8++STN\nmzdnz5499O7dW/diFRHJhujoaCZPnkxkZCTDhg3j448/dpLj9ddfZ8GCBVxyySV88MEHIXXyhbil\nqdU8bNu2bdSpU4fY2FjGjBlD9+7dXUcSEfGkYcOG8fDDD1OkSBGWL19OtWrVcu29ly9fTrNmzUhI\nSNDhMvmYplbzoQoVKjBs2DAAHnroIX7++WfHiUREvKlv377cddddxMbG0rFjx1y78HpsbCxdunQh\nISGBRx55RCVO/kIjcnmctZZu3boxYcIEateuzdKlSylYsKDrWCIinhMbG0ujRo34+eef6dKlC+PH\nj8/xKc577rmHMWPGULt2bZYtW+b0ZAtxSyNy+ZQxhhEjRhATE8O6det47LHHXEcSEfGkIkWKMH36\ndAoXLszEiRMZOXJkjr7fRx99xJgxYyhQoACTJk1SiZM0aUQun/jxxx9p0qQJ8fHxTJkyhX/84x+u\nI4mIeNLkyZPp3LkzERERfPPNN1xzzTVBf4+1a9fSuHFjTp8+zYcffsg999wT9PcQb9GIXD5Xr149\n3nrrLQDuv/9+fv31V8eJRES8qVOnTvTr14+EhATuuOMOduzYEdTtHz9+nL///e+cPn2ae+65RyVO\nzkkjcvmItZY777yTTz75hNq1a/P9999TuHBh17FERDwnISGB9u3b8+WXX1KnTh0WL15MkSJFznu7\n1lo6derE1KlTqV27Nj/88AOFChUKQmLxOo3ICcYYPvjgg+Tj5e6//35dX05EJBsiIiKYMmUKMTEx\nrF27lh49epCUlHTe2x0xYgRTp06lSJEiTJs2TSVOMqQil88ULVqUmTNnUqRIESZPnszbb7/tOpKI\niCcVL16czz//nGLFijF9+vTkO+pk18KFC3n00UcBGD16NFWrVg1GTMnjNLWaT3366afccccdhIeH\n8yGE+i0AACAASURBVPXXX9OyZUvXkUREPGnOnDm0a9cOay0TJ06kc+fOWd7Gzp07adiwIQcOHODx\nxx9n6NChOZBUvExTq/Int99+O8888wyJiYnceeed7Nq1y3UkERFPatOmDW+++Sbgu+7bggULsvT6\nU6dO0aFDBw4cOMCNN97I4MGDcyKm5FEakcvHEhMTadOmDXPnzqV+/fosWrRIJz+IiGTTI488wjvv\nvEPx4sVZsmQJ1atXz/A11lq6dOnC5MmTqVixIsuXL6dEiRK5kFa8RiNy8hfh4eFMnjyZypUrs3r1\narp16xaUg3VFRPKjN998kw4dOnD06FHatGnD3r17M3zN0KFDmTx5MkWKFOHzzz9XiZMsU5HL5y66\n6CJmzZpFsWLF+PTTTxkwYIDrSCIinhQeHs7EiRNp3LgxO3bsoF27dsTGxqa7/syZM3n66acBGD9+\nPDVr1sytqJKHqMgJ1apV45NPPiE8PJxBgwYxduxY15FERDypUKFCfP7551SsWJFVq1Zxxx13cObM\nmb+st3z5cjp37oy1lldeeYUOHTo4SCt5gY6Rk2TvvfceDz74IJGRkXzzzTe0aNHCdSQREU/atGkT\nzZs358CBA9x5551MmjSJ8PBwAHbs2EHjxo3Zt28f99xzDx988AHG/OXQJ5E/Se8YORU5+ZPAwbol\nSpRg8eLFVKtWzXUkERFPWrVqFddddx3Hjx+nV69evPfeexw/fpyrr76a9evXc/311zNnzhyioqJc\nRxUPUJFLRUUubQkJCdx2223Mnj2b8uXLs2TJEi677DLXsUREPGnhwoW0bt2a06dP8/jjj7NmzRq+\n/vprqlevzpIlSyhevLjriOIRKnKpqMil7+TJk9xwww0sXbqUunXrsmDBAooVK+Y6loiIJ82ePZtb\nb701+aoApUqVYunSpVxxxRVug4mn6PIjkmmFCxdm9uzZxMTEsGbNGm6//Xbi4+NdxxIR8aR27dpx\n0UUXJX9+0003qcRJ0KjISZpKlizJ//73Py699FLmzZsXtBtCi4jkN4MHD+bAgQPJn48bN46RI0c6\nTCR5iYqcpKtChQrMmTOH6OhopkyZwsMPP4ymo0VEMm/UqFE8++yzGGOYOnUqw4YNA+Chhx7i/fff\n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\nnfuBvr+KXDIqcpLRXL9+nY0bN7J69Wo2btzIkSNH7nm8YMGCNGrUiKeffhofHx9q1qypk9zTIZfL\nxaFDh9zF7bvvvuPcuXP3PKdYsWL4+vri6+tL8+bNdUhdJB2LiooiIiKCyMhI+vbt+8DfR0UuGRU5\nyehOnz7Nt99+y8aNG9m4cSMnT5685/Hs2bNTu3ZtfHx88PHxoW7duhQvXlwzYtPYxYsXCQ8Pd99+\n+OEH9yXd7nrooYdo2LAhDRs2pEmTJjzxxBP6dxLJZFTkklGRk8zEWsvx48cJDQ1l27ZthIWF3XMt\nwruKFClCzZo177mVKVNGpSEFWGs5e/Yse/bsYe/evezdu5ft27ffc57jXcWLF6dBgwY0atSIRo0a\nUalSJf0biGRyKnLJqMhJZnf58mXCw8MJCwsjLCyMnTt3Eh0d/ZvneXt7U6VKFapUqULlypXdH4sV\nK6ZycR9RUVEcPnyYQ4cOsX//fndxu3Tp0m+emydPHmrXrk29evWoV68edevWpWTJkg6kFpH0TEUu\nGRU5kXtZa4mMjGTXrl3u286dO7l48eLvPt/b25uKFSvy2GOP8eijj/LYY4+5b0WLFs3QJc9aS1RU\nFJGRkURGRnL8+HGOHDnCoUOHOHTo0O8WNoACBQpQrVo1qlevTrVq1ahZsyaVK1fW7GIR+UMqcsmo\nyIn8MWst58+fZ//+/Rw4cOCej5cvX77v1+XKlYtSpUpRokQJSpYsSYkSJdz3ixcvTuHChSlcuDD5\n8uVLd4UvNjaW8+fPc+7cud98PH36tLu8xcTE3Pd75M2bl4oVK7pvTz75JNWrV6dkyZLp7r9XRDyD\nilwyKnIiD+5uwTt69Cg///wzP//8M8eOHXPfv98eqeSyZcvmLnWFCxfG29ubvHnzki9fvns+5s2b\nlxw5cpAtWzb3LXv27GTLlo2sWbPicrlwuVzcuXPHfd/lchEbG0tMTAwxMTHcvHnTfT8mJobo6Ggu\nX77M5cuX+fXXX933r1+//qeye3t7U6ZMGcqUKUPp0qUpX748FStWpEKFCpo0IiIpTkUuGRU5kdRz\n9epVTp8+zenTpzlz5gxnzpxx3z979iyXLl0iKiqKGzduOB31N7y8vHj44YcpVqwYxYoVo2jRou77\nxYsXp2zZspQuXRpvb2+no4pIJqIil4yKnIjzbt68yaVLl7h06RIXL17kypUrXL9+nWvXrnHt2jX3\n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\n8zlOaAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,numpy.pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can play around with the input values and see what kind of behavior results. Just note that any value of $C > \\frac{2}{3}$ will result in $\\cos \\theta > 1$, which doesn't exist. Python will probably throw a few errors if you hit that condition, but just try again!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* The last case is $C = 0$. Take another look at Equation (16) and plug in $C = 0$, what should happen? It looks like it will just reduce to \n", + "\n", + "$$R = 3z_t$$\n", + "\n", + "It's a constant radius of curvature! In fact, this solution is a series of semi-circles, with a cusp between them. One way to force $C = 0$ that we can figure out from Equation (15), is to make:\n", + "\n", + "\n", + "$$z = 3z_t\\ \\ \\ ,\\ \\ \\ \\theta = 0$$" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\npZeYNm0a1atXp1mzZpx11lkVUfZWef/99xk5ciQ33ngjAMOHD+eLL75g7dq1tGjRgpNOOmmz70/7\nsZa2vuL6l+txJv29WeX8nVxRklQ2/H/q/9x3332xT58+sX///t9pP++88+LcuXNjjDG2a9cuzpkz\np8j3r1ixInbs2HHT88MOOywuXbq0/AreBvn5+fH444+Pv/rVr2KMMc6fPz/ec889m14///zz4zff\nfFPs+7flWCdMmBAff/zxeO+998avv/56K49g80pbX3H9S7Of4n6Xsu1FZhqnRCVJKqVrrrmGE088\n8Ttts2fPZuHChbRo0QKAUaNG0bJlyyLf/+abb9KuXbtNzzt06MA///nP8it4GwwbNoxu3bptev7l\nl18yZswY1q9fD0C9evXYbrvtin3/1h7r559/zpNPPsl5551HixYteP7557fhKIpX2vqK61/e59Qp\nUUlSlTNr1iz+/Oc/f2c9rI2PQwgcdthh9OrVq1T7fOONN2jYsCGDBg3i66+/pn79+px77rlF9v3i\niy9o1KjRpueNGjVi5syZW308xdnW41y2bBnVqlVjxx13ZNWqVQAceOCB5Ofn88Mf/pALLriAY445\nhpo1axa7j6091p///OfcdNNNAHz66adUr169XI6ztPUV13+HHXYo13NqYJMklYkQilzvs9Q2/oW7\nNSZNmsSAAQNo3rw51apV4yc/+Qm9e/f+Xr899tiDu+66a1vK/J7Fixczbdo0hgwZAsCRRx7Jj370\nI9q0afO9vl9//TXbb7/9pufbbbcd33zzTYk+p6THCNt+nH//+9/52c9+xlNPPfWd9htvvJGBAwdy\n/fXX87vf/W6z+9iaY/3Pf/7DO++8w7vvvsvkyZMZNGgQt956a7H9t+U4S1vf5vpv7TktCadEJUmV\nxsEHH8yrr77KD37wA2rWrEnv3r154IEHWLx4cbl/dv369TnggAM2PW/RogWjRo0qtm/BYLpmzRoa\nN25cos8pfIxdu3blt7/9LU8++STvvvvuth1EAe+88w6HHnro99pnzpzJuHHjGDVqFC+//DK33347\nb7/9drH72ZpjfeONNzjhhBO44IILOOuss1i4cCHHHHNMuRxnaesrrv+2nNOScIRNklQmtmVkrCzd\neeedLF68mIcffhjITKc1bdr0O30KTqEVtC1Tou3atWP8+PGbnlerVo28vLwi++65555Mnjx50/Nl\n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\nSZISMm/ePPr160d+fj633norJ5xwQtIlSZVKoiNsIYTRIYQpBbap2Z89AWKMv4gxtiAzBXp5krVK\nkor27bffcsopp7B06VKOPfZYbrvttqRLkiqdREfYYoxHl7DrYOBVYACZEbXdC7y2W7atSAMGDNj0\nuGvXrnTt2rWUVUqSihNj5IILLmDSpEm0atWKwYMHU7169aTLknLC2LFjGTt2bIn6pvmmgzYxxs+y\njy8Hjowx9i1w08GhZKZCR+NNB5KUiPvuu4/rrruOunXrMnHiRNq3b590SVLO2txNB2m+hm1gCGFv\nMjcbzAUuAogxfhxCGAp8DKwHLjGVSVLFe+2117jhhhsA+Otf/2pYk8pRakfYyoIjbJJUPj755BMO\nPfRQVqxYwW233fady08kbZ3NjbAZ2CRJpbJs2TIOO+wwPvvsM/r06cPzzz9PtWqpXSVKyhkGNklS\nmVi7di1HH300b731FgceeCBvvvkm9erVS7osqVLIyYVzJUnpEmPkZz/7GW+99RbNmjVj+PDhhjWp\nghjYJEklcscdd/D0009Tt25dXnnlFZo3d81yqaI4JSpJ2qJBgwZx1llnEULgpZdeomfPnkmXJFU6\nTolKkrba6NGj6d+/PwAPPPCAYU1KgCNskqRivf/++3Tu3JlvvvmG6667jnvuuSfpkqRKy7tEJUml\nNmfOHDp16sSiRYvo168fgwYNcvkOqRwZ2CRJpfLll19y5JFH8sknn3DUUUcxYsQIatWqlXRZUqVm\nYJMkldjKlSvp1q0b7733Hu3bt+fNN9+kYcOGSZclVXredCBJKpE1a9bQq1cv3nvvPfbcc09Gjhxp\nWJNSwMAmSQJgw4YNnH766YwbN45mzZoxevRodtlll6TLkoSBTZIE5OXl0b9/f15++WUaN27MqFGj\naN26ddJlScoysElSFZefn89FF13EoEGDqFu3LiNGjKBdu3ZJlyWpAAObJFVhMUauvPJKHnvsMWrX\nrs2rr77KoYcemnRZkgoxsElSFRVj5Prrr+eRRx5hu+2248UXX6RLly5JlyWpCAY2SaqCYozccsst\n3HfffdSoUYNhw4ZxzDHHJF2WpGLUSLoASVLFijFy8803M3DgQKpXr86QIUM44YQTki5L0mYY2CSp\nCokxcuONN3L33XdvCmsnn3xy0mVJ2gIDmyRVETFGbrjhBu69915q1KhhWJNyiIFNkqqAGCNXX301\nDz74IDVq1GDo0KH06dMn6bIklZCBTZIquby8PC688EIef/xxatasydChQ+ndu3fSZUkqBQObJFVi\n69ev5+yzz2bIkCFsv/32vPDCC/zkJz9JuixJpWRgk6RK6ttvv+W0007j5Zdfpn79+rzyyit07tw5\n6bIkbQUDmyRVQitXrqRPnz688cYb7LDDDowcOZKDDz446bIkbSUDmyRVMosXL6ZHjx6899577LLL\nLowcOZL27dsnXZakbWBgk6RKZPbs2RxzzDF89tlntGnThpEjR7LHHnskXZakbeRXU0lSJfHhhx9y\n+OGH89lnn3HggQcyfvx4w5pUSRjYJKkSGD16NEceeSSLFi2iW7dujB07lqZNmyZdlqQyYmCTpBz3\n5JNP0qNHD/773//St29fRowYQYMGDZIuS1IZMrBJUo6KMfKrX/2K/v37s2HDBm644QaeffZZtt9+\n+6RLk1TGvOlAknLQunXruOCCC3jqqaeoVq0aDz/8MJdccknSZUkqJwY2ScoxS5cu5aSTTuKtt96i\nTp06DBkyhJ49eyZdlqRyZGCTpBzy8ccf07NnT2bNmkWzZs0YPnw4HTt2TLosSeXMa9gkKUeMHDmS\nTp06MWvWLA466CAmTZpkWJOqCAObJKVcjJH777+fHj16sHLlSk455RTefPNNmjVrlnRpkiqIgU2S\nUmz16tWcddZZXHvtteTn5/OLX/yC5557jjp16iRdmqQK5DVskpRSc+fOpU+fPrz//vvUrVuXp556\nipNPPjnpsiQlwMAmSSn0z3/+k759+7J06VL23HNPXnzxRfbff/+ky5KUEKdEJSlF8vPzueuuu+je\nvTtLly7l2GOPZdKkSYY1qYozsElSSnz99deceOKJ3HzzzZuuV3v11VfZYYcdki5NUsKcEpWkFHjv\nvfc45ZRTmD17NjvssANPP/00xx9/fNJlSUoJR9gkKUExRh5++GE6derE7NmzOeigg3jvvfcMa5K+\nw8AmSQn56quvOOmkk7jiiitYt24dF110EePHj6dVq1ZJlyYpZZwSlaQETJw4kX79+jFv3jwaNmzI\nn//8Z0499dSky5KUUo6wSVIF2rBhA7fffjudO3dm3rx5HHroobz//vuGNUmb5QibJFWQ2bNnc9ZZ\nZzFhwgQArr/+eu644w5q1qyZcGWS0i71I2whhGtDCPkhhMYF2m4KIcwMIUwPIRyTZH2StCUxRp56\n6ik6dOjAhAkTaNasGaNHj+buu+82rEkqkVSPsIUQdgOOBuYWaNsX6AvsC+wGjAkh7BVjjMlUKUnF\nW7p0KRdffDHPP/88ACeffDJ/+tOfaNKkScKVScolaR9hewC4vlDbicCQGOOGGOMcYCZwSEUXJklb\n8uKLL9KuXTuef/556tWrxxNPPMHf/vY3w5qkUkttYAsh9ALmxxinFnqpOTC/wPMF2TZJSoWvv/6a\ns846iz59+rBkyRK6dOnChx9+yLnnnksIIenyJOWgRKdEQwijgaYFm4AI/AK4mcx0qCTljFdeeYUL\nL7yQhQsXUrt2bQYOHMhll11GtWqp/fexpByQaGCLMRYZyEII+wOtgA9D5p+juwHvhRAOITOi1qJA\n992ybUUaMGDApsddu3ala9eu21q2JH3PkiVLuPLKKxkyZAgAnTp14sknn2TvvfdOuDJJaTV27FjG\njh1bor4hF67VDyHMBjrGGL8OIewHPAMcSmYqdDRQ5E0HIQTvRZBUrmKMPPPMM1x11VUsW7aM2rVr\nc/vtt3PllVdSvXr1pMuTlENCCMQYi7xuItV3iRYQyUyXEmP8OIQwFPgYWA9cYiqTlITZs2dz6aWX\n8o9//AOA7t2786c//Yk99tgj4cokVTY5McK2tRxhk1Qe1q1bx3333cdvfvMb1qxZQ6NGjbj//vu9\nqUDSNqkMI2ySlArjxo3j4osvZvr06QD069eP+++/n1122SXhyiRVZt62JEklsGjRIs455xy6du3K\n9OnT2WuvvRg9ejSDBw82rEkqdwY2SdqMjdOfe++9N3/961+pVasWAwYMYMqUKXTv3j3p8iRVEU6J\nSlIxRo0axZVXXsmMGTMAOOGEE3jggQdo06ZNwpVJqmocYZOkQj799FN69+7Nsccey4wZM9hrr714\n9dVXGT58uGFNUiIMbJKUtWzZMq644gratWvHSy+9RN26dRk4cCBTp06lR48eSZcnqQpzSlRSlbd2\n7VoeeeQRbr/9dpYvX04IgfPPP5/f/OY37LrrrkmXJ0kGNklVV15eHoMHD+aXv/wlc+bMATKL3953\n3320b98+2eIkqQADm6QqJ8bIq6++ys0338zUqVMB2G+//bjnnns47rjjXPxWUup4DZukKuWtt96i\nc+fO9OzZk6lTp7L77rvzxBNPMGXKFHr06GFYk5RKjrBJqhImTpzIbbfdxpgxYwBo0qQJv/jFL7jo\noovYfvvtE65OkjbPwCapUvv3v//NbbfdxsiRIwFo0KABV199Nddccw0NGjRIuDpJKhkDm6RKafz4\n8dxxxx289tprANSvX58rr7ySa665hh122CHh6iSpdAxskiqNGCOjRo3ijjvu4K233gKgbt26XHHF\nFVx77bU0adIk4QolaesY2CTlvLy8PF588UUGDhzI5MmTAWjUqBFXXHEFV1xxhUFNUs4zsEnKWatX\nr+bJJ5/k/vvv5/PPPwdgp5124pprruGSSy7xGjVJlYaBTVLOWbJkCY8++iiPPvooy5YtA6B169Zc\nc801nHfeedSpUyfhCiWpbBnYJOWM9957j4ceeohnn32WdevWAXDwwQdz/fXXc9JJJ1G9evWEK5Sk\n8mFgk5Rq69ev54UXXuChhx5iwoQJAIQQ6NmzJ9dddx1HHnmki91KqvQMbJJSaf78+Tz22GM89thj\nLFy4EMisoXb++edz2WWXscceeyRcoSRVHAObpNTIy8tj1KhR/PGPf+SVV14hPz8fgLZt23L55Zdz\n9tlnU69evYSrlKSKZ2CTlLg5c+bw5JNP8uSTTzJ37lwAatasyamnnspFF11Ely5dnPaUVKUZ2CQl\nYvXq1bzwwgv85S9/4Y033tjU3rp1ay688EL69+/PzjvvnGCFkpQeBjZJFSY/P59x48YxaNAgnn/+\neVauXAnA9ttvz8knn8x5551H165dqVatWsKVSlK6GNgklasYI1OnTmXQoEEMHjyYBQsWbHrt4IMP\n5vzzz+e0006jUaNGCVYpSelmYJNULqZNm8bQoUMZOnQoM2bM2NTeqlUrzjzzTM444wzatm2bYIWS\nlDsMbJLKRIyRjz76iGHDhjF06FCmT5++6bXGjRtz2mmnceaZZ9KpUydvIJCkUjKwSdpqeXl5TJw4\nkRdffJEXX3yRWbNmbXqtcePG9OnTh759+9KtWzdq1qyZYKWSlNsMbJJKZcWKFYwePZoRI0YwfPhw\nli5duum1nXbaiZ49e9K3b1+OOuooQ5oklREDm6TNijEybdo0RowYwYgRI5gwYQIbNmzY9Pqee+5J\n79696d27N506dfL7PCWpHBjYJH3PggULeP311xkzZgxjxozhP//5z6bXqlevTufOnenRowfHH388\n7dq185o0SSpnBjZJLF68mDfffJM333yTN954g48//vg7rzdt2pTjjjuOHj16cPTRR7sEhyRVMAOb\nVMXEGJkzZw4TJ07kzTffZNy4cXzyySff6VO3bl26du1K9+7d6d69u6NokpQwA5tUya1atYp3332X\nt99+m7fffpt//etfLF68+Dt96tSpw+GHH06XLl3o0qULhx56KNttt11CFUuSCjOwSZXI6tWr+eCD\nD3j33XeZPHky7777LtOnTyc/P/87/Zo0aUKnTp340Y9+RJcuXTjooIO8o1OSUszAJuWg/Px85syZ\nw5QpU5gyZQpTp05lypQpzJw5kxjjd/pWr16dDh060KlTp01bmzZtnOKUpBxiYJNS7JtvvuHzzz/n\nk08+YcaMGUyfPp0ZM2bwySefsGbNmu/1r169Ou3ateOggw7ihz/8IQcddBDt27endu3aCVQvSSor\nBjYpQWvWrOGLL75g3rx5zJ8/nzlz5vD5559v2pYsWVLse3fddVcOOOAA2rdvv2lr27YttWrVqsAj\nkCRVBAObVMa+/fZbli1bxldffcWyZcv48ssvWbRo0Xe2//znP3zxxRd8+eWXm91XrVq1aN26Nfvs\nsw9t27albdu27Lvvvuyzzz4urSFJVYiBTVXe119/zauvvkp+fj55eXmbtvz8fDZs2MDatWv59ttv\nv7OtWrWKlStX8t///nfTzxUrVvDVV18VOVVZnBo1arDbbrvRokULdt99d1q0aMGee+65aWvevDnV\nqlUrx6OXJOWCUPgC5cokhBAr8/GpbEyZMoUOHTqU2f5q1qxJkyZNaNKkCY0bN2bHHXdk1113ZZdd\ndtm0NW3alN13352mTZsayCRJAIQQiDEWeUeYI2yq8ho3bswZZ5xB9erVqVat2nd+Vq9ene233/57\nW506dWjQoAH169f/zs/GjRtTt25d78CUJJUpR9gkSZJSYHMjbM7FSJIkpZyBTZIkKeUMbJIkSSln\nYJMkSUq51Aa2EMJtIYQvQgjvZbefFHjtphDCzBDC9BDCMUnWKUmSVN5SG9iy7o8xdsxurwGEEPYF\n+gL7AscBvw8pWUNh7NixSZegbeD5y12eu9zm+cttnr+KkfbAVlQQOxEYEmPcEGOcA8wEDqnQqorh\nH9rc5vnLXZ673Ob5y22ev4qR9sB2WQjhgxDCYyGEhtm25sD8An0WZNskSZIqpUQDWwhhdAhhSoFt\navZnT+D3wB4xxh8Ai4D7kqxVkiQpKTnxTQchhJbA8Bhj+xDCjUCMMf42+9prwG0xxn8X8b70H5wk\nSVJWzn2XaAhhlxjjouzTk4CPso9fBp4JITxAZiq0DfBOUfso7qAlSZJySWoDG3B3COEHQD4wB7gQ\nIMb4cQhhKPAxsB64xC8MlSRJlVlOTIlKkiRVZWm/SzQnhBDuzi7i+0EIYVgIoUGB11zkN+VCCD8J\nIcwIIXwaQvh50vVo80IIu4UQ3gghTMveqHRFtn2HEMKoEMInIYSRBe4sV8qEEKplF0R/Ofvcc5cj\nQggNQwh/y/6dNi2EcKjnr2IY2MrGKKBd9o7WmcBNACGE/UjpIr/KCCFUAx4BjgXaAf1CCG2TrUpb\nsAG4JsbYDugEXJo9ZzcCY2KM+wBvkP09VCpdSeaylo08d7njQWBEjHFfoAMwA89fhTCwlYEY45gY\nY3726b+A3bKPe5HSRX61ySHAzBjj3BjjemAImcWZlVIxxkUxxg+yj78BppP5nTsReCrb7SmgdzIV\nanNCCLsBPYDHCjR77nJAdvboyBjjEwDZv9tW4PmrEAa2snceMCL72EV+06/wOfoCz1HOCCG0An5A\n5h9KTWOMiyET6oCdk6tMm/EAcD1Q8AJqz11uaA0sDSE8kZ3S/n8hhDp4/iqEga2EtrDI78Y+twDr\nY4zPJliqVCWEEOoBzwNXZkfaCt9B5R1VKRNCOB5YnB0h3dzlIZ67dKoBdAQejTF2BFaRmQ71d68C\npHlZj1SJMR69uddDCOeSGeY/qkDzAmD3As93y7YpPRYALQo89xzlgBBCDTJh7ekY40vZ5sUhhKYx\nxsUhhF2AJclVqGIcAfQKIfQAagP1QwhPA4s8dznhC2B+jHFy9vkwMoHN370K4AhbGQgh/ITMEH+v\nGOPaAi+9DJweQtguhNCazSzyq8RMAtqEEFqGELYDTidz3pRufwE+jjE+WKDtZeDc7ONzgJcKv0nJ\nijHeHGNsEWPcg8zv2hsxxrOA4XjuUi877Tk/hLB3tunHwDT83asQrsNWBkIIM4HtgGXZpn/FGC/J\nvnYTcD6ZRX6vjDGOSqZKFScbuB8k8w+Yx2OMAxMuSZsRQjgCeBOYSmbqJQI3k/nH0FAyo9pzgb4x\nxuVJ1anNCyF0Aa6NMfYKITTGc5cTQggdyNwwUhOYBfQHquP5K3cGNkmSpJRzSlSSJCnlDGySJEkp\nZ2CTJElKOQObJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElK\nOQObJElSytVIugBJyhUhhAuAHYF9gKeBlsDOwP7ADTHGBQmWJ6kSCzHGpGuQpNQLIfwMmBJj/HcI\n4WBgNHAusAp4DegRYxyZYImSKjFH2CSpZJrEGP+dfdwCyIsxvhhCqA10jTG+lWBtkio5R9gkqZRC\nCA8Bu8cY+yRdi6SqwZsOJKn0ugFjky5CUtVhYJOkLQghVAshdA8ZOwPtKBDYQgg3JFacpCrBwCZJ\nW3YhMArYC+gLrAa+AAgh9AI+Sq40SVWB17BJ0haEEDoA1wMzgA+BBsBRwBxgdoxxUHLVSaoKDGyS\nJEkp55SoJElSyhnYJEmSUs7AJkmSlHIGNkmSpJQzsEmSJKWcgU2SJCnlDGySJEkpZ2CTJElKOQOb\nJElSyhnYJEmSUu7/A9i2e0jPCtaoAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(16,48,0.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks an awful lot like a quarter circle. And what's the radius of the arc? It's $$r = 48 = 3z_t.$$\n", + "\n", + "We can also get a semi-circle out of our simulated trammel by changing to another configuration where $C$ is (near) zero. Here's one example:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nvS8Z0/tyPr0nGdP7kjG9LznDb4/STXNNdhERERGvZozBXsZBG357lK6IiJyvQoUKxMTEOB1DxG+V\nL1+e/fv3e3y9GuETEZFU7lEEp2OI+K3M/g1e7gif9uETERER8XEqfCIiIiI+ToVPRERExMep8ImI\niIj4OBU+ERERkcu0du1aEhISOHv2LOvWrXM6znl0WhYREZF0Tp06xbhx4wgLC+PPP//k2Wef/dfj\nW7duJTIyksGDB2e6jsWLF7Nz504CAwO56qqr6Ny5c07HzpZt27Yxc+ZMJkyYkLrsYtufXl7Z1uzI\n6P3JSEREBDExMZQuXZp33nkHAGstxYsXJyAgIPXI22bNmjF37twcz52eCp+IiEg6Tz75JCNHjiQs\nLIyqVavywAMPUL58ecD1S3z48OHUrl07068/efIkL730Eps3bwagbt263HvvvZQoUSJX8mfV//3f\n/7F+/XqKFSv2r+UX2v70LmdbN2zYwI8//siJEyfo2rXreTmcltn7k5GhQ4fSokULypYtS2BgIAD7\n9+/nrbfe4o477iAgIIBFixZx991353TsDGlKV0REJI1ffvmFw4cPExYWBsDKlSv/VXYWLFhA48aN\nL7iOtWvXUqVKldT7t956K6tXr86ZwJfhmWeeoXXr1v9adrHtTy+727pv3z7ef/99nnjiCcLCwpg/\nf342tyLnZPT+ZCY4OJirr746tewB5M+fn7Zt21KhQgWKFi1KcHAwlStXzqm4F6QRPhER8Tk///wz\n77777r9OYpvyuTGG22+/nVatWmX4tV9++SWhoaF8+OGHnDhxgiJFitClSxcA4uLiCAgIoGTJkpw6\ndSrT1//111//NSpUrFgx9uzZ47kNdLuc7czMhbY/I9nd1ueff54XXngBgN27d/+rKKWXE9vpadHR\n0VhriYuL44YbbqBVq1aULVs29fHJkyfz9NNPO5ZPhU9ERLLEmGyf5P882b2ax8aNGxk1ahTlypUj\nICCAFi1a0KZNm/OeV7FiRcaMGZOt14iNjWXnzp3MmTMHgPr163PnnXdy/fXXs3DhQrp3784HH3xw\nwXWcOHGC/Pnzp97Ply8f8fHxWXr9rG4jXN52ZuZC25+R7Gzrb7/9RnR0NJs3b2bTpk18+OGHDB8+\nPNPn58R2elq3bt2oUaMGANWrV6dhw4aEhoYCrvcoLi6OkJAQx/Kp8ImISJ5x2223sWzZMt566y12\n7dpFmzZteO211+jUqRNXXnmlR16jSJEiVKtWLfV+WFgYK1eu5Pjx49SpUyfL6zh+/Hjq/TNnzlCm\nTJksfW36bWzUqBHjxo3jyiuvpFq1atSsWfPSNugSZbb9mRW+7Gzrl19+yf3330+PHj04ffo0gwYN\nolmzZjm+na+++ioJCQn/WpYyShgREXHBqeuLufXWW1M/L168OFFRUanTwXPnznVsKjeFCp+IiGSJ\nt1xjd/To0cTGxvLGG28ArunA9GUv7RRgWlmZAqxSpQrr169PvR8QEEBSUhLR0dGcPn2a5cuX89VX\nX5GQkMCnn36a4Xquu+46Nm3alHo/Li6O8PDwbG3ja6+9RuPGjQkPDyciIoJZs2Z5ZDszk9n2ZyY7\n23rw4MHUArR48WLuvfdeZs6cmePbOWjQoIs+JztmzZrFZ599lpo5Pj7+X1PUX375JY899liOvHaW\nWWv98ubadBERScvb/28cPXq0HTp0qLXW2p07d9p169bZe+65x3799dcee42EhAR7++23p96/4447\n7N69e//1nFGjRtkXX3wx9f6+fftscnJy6v1Tp07ZatWqpd6/9dZbbWxsrLXW2j179vzrueml38a+\nffvaAwcOWGutveeeey5jyzL2/vvv2y5duqTev9D2p99Oa7O3rVOnTrVTp0611lp777332piYGNuv\nX78c3c7sSv/+WHv++7B+/Xq7Zs0aa6218fHxtkKFCvbUqVOpj1evXt2uWrUqS6+X2b9B9/Js9x4d\npSsiInnChg0bqFatGs2bN6dJkyYsXLiQa665hkaNGnH77bd77HVCQkIYNWoUI0aMYPjw4fTp04fr\nrrsu9fGPP/6YxYsXs3jx4tQjSx944AG+++671OcULFiQQYMG8Z///IeXX36ZgQMHUrp0aQBatmzJ\nqlWrsryNwAUPaLgcb775JtOmTSMqKooXX3yRv/7664Lbn347s7utDz74INu3b2fq1KkMHz6csLAw\nkpOTc2w7syuj9wfOfx/q1avHwYMHmThxIkOHDmXOnDkULFgw9fESJUpQrly5XM+flrFeMkSf24wx\n1l+3XUQkM2mPgswLZs+eTfny5QkLC+Oaa65xOk6WJCcns2bNmoue2iXFG2+8Qf369alcuTJdunTh\no48+yuGEnnMp25qXt9OTMvs36F6e7SOnVPhERCRVXit8ixcvJjExkdtuu+2ydrjPTfPmzaNly5YU\n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\npozTkbyGRvjysB49elC9enUOHDjA2LFjnY4jIiLimISEhNRrz7/44osqex6mET6HffXVV9x5552E\nhITwww8/ULFiRacjiYiI5LqXX36ZESNGULVqVbZu3UpQkKNnjvM6GuHL4+rVq0fnzp05e/Ys/fv3\nxxtKqIiISG7av38/o0ePBuDNN99U2csBKnxe4NVXXyU0NJTPPvuM+fPnOx1HREQk11hr6d27NwkJ\nCXTs2JGGDRs6HcknaUrXS7zzzjv06tWLMmXKsGvXLooVK+Z0JBERkRw3Z84cOnbsSLFixdi1a5f2\n3cuEpnR9RPfu3alXrx6///47gwcPdjqOiIhIjjtx4kTqgRrjx49X2ctBGuHzIjt37qRGjRokJiay\nfv166tWr53QkERGRHNO9e3emTp1KgwYNWL16NQEBGofKjEb4fEiVKlUYNGgQ4Dply99//+1wIhER\nkZyxZs0apk6dSr58+XjnnXdU9nKY3l0vM3ToUK6//np++OEHxowZ43QcERERj0tISKBnz54ADBky\nhJtuusnhRL5PU7peaM2aNTRq1IigoCA2btxI9erVnY4kIiLiMYMGDWL8+PHcdNNNfPfdd4SEhDgd\nyetpStcHNWzYkH79+nHu3Dm6dOlCYmKi05FEREQ8YsOGDUyYMIGAgADef/99lb1cosLnpcaMGcO1\n117Ltm3bUk9GKSIikpedPn2aLl26YK1l0KBB1KlTx+lIfkNTul4sKiqKxo0ba2pXRER8wjPPPMNr\nr71GlSpV2Lx5s0b3LoGmdH1Yo0aN/jW1q6N2RUQkr1q/fj0TJ04kMDBQU7kOUOHzcmPGjKFixYps\n27aNUaNGOR1HRETkksXHx6dO5b7wwgvUqlXL6Uh+R1O6ecD69etp2LAh1lqioqJo0KCB05FERESy\nrFu3bkybNo1bbrmFjRs3ki9fPqcj5Tma0vUDd955Jy+88ALWWjp37swff/zhdCQREZEsWbBgAdOm\nTSN//vzMnj1bZc8hKnx5xMiRI7nttts4cOAAffv2dTqOiIjIRR06dIju3bsDrmvlVqlSxeFE/ktT\nunnI7t27qVGjBqdPn2bWrFl06tTJ6UgiIiIZSk5OplmzZnzxxRfce++9LF26FGOyPSPp9zSl60cq\nVarE66+/DkDv3r3Zv3+/s4FEREQy8dprr/HFF19QqlQppk+frrLnMI3w5THWWtq3b88nn3xC7dq1\nWbdunfaHEBERr7Jx40bq1atHYmIiS5Ys4f7773c6Up6nET4/Y4xh6tSphIWFER0dzeDBg52OJCIi\nkuqPP/6gQ4cOJCYm0q9fP5U9L6ERvjzqm2++oX79+pw7d47FixfTqlUrpyOJiIifSzsLVbNmTb76\n6iudYNlDNMLnp26//XbGjh0LQJcuXYiJiXE4kYiI+LtJkybxySefULRoUebNm6ey50U0wpeHWWtp\n1aoVS5cu5fbbb2ft2rUEBwc7HUtERPxQdHQ0d955J4mJicyfP5/27ds7HcmnaITPjxljeP/997nm\nmmv45ptvGDhwoNORRETEDx0/fpyHHnqIxMREnnzySZU9L6QRPh/w9ddf07BhQxITE3V+PhERyVVJ\nSUncd999REZGUqtWLdavX6+p3BygET6hbt26qefn69atG9u3b3c4kYiI+IsRI0YQGRlJyZIlmT9/\nvsqel9IIn4+w1vLEE0/w/vvvU7FiRTZt2kTx4sWdjiUiIj7sk08+oV27dgQEBPD555/TpEkTpyP5\nLI3wCeD6QXjrrbcIDw/n559/5pFHHiEpKcnpWCIi4qN27drFY489BsCrr76qsuflVPh8SIECBVi4\ncCElSpRg+fLljBw50ulIIiLig/7880/atm1LfHw8Dz/8MM8884zTkeQiNKXrg1atWkXz5s1JTk7m\no48+4uGHH3Y6koiI+IikpCRat27NsmXLuOWWW9iwYQOFChVyOpbP05SunKdp06a89tprADz++ONE\nR0c7nEhERHzFoEGDWLZsGSVKlOCTTz5R2csjNMLno6y19OrViylTplCmTBk2btzI1Vdf7XQsERHJ\nw6ZOnUr37t0JDg5m1apVNGjQwOlIfuNyR/hU+HxYYmIizZo1IyoqivDwcNauXau/xEREJFtWr15N\ns2bNOHfuHNOmTeOJJ55wOpJf0ZSuZCo4OJj58+dz3XXXsWXLFiIiIkhOTnY6loiI5DF79uyhffv2\nnDt3jueee05lLw9S4fNxJUqUYOnSpYSGhrJgwQIGDx7sdCQREclD4uLiuP/++zlx4gQtW7Zk7Nix\nTkeSbFDh8wM33XQT8+fPJygoiPHjx/Pmm286HUlERPKAM2fO0KpVK3bv3s0tt9zCrFmzCAwMdDqW\nZIMKn59o2rQpU6dOBeDJJ59k0aJFDicSERFvlpSUxKOPPsqGDRu4+uqr+eyzzyhSpIjTsSSbVPj8\nSEREBC+99BLWWjp27MjXX3/tdCQREfFC1lqefvppFi5cSGhoKCtWrKBcuXJOx5LLoKN0/Yy1lh49\nejB16lRKlCjB119/zQ033OB0LBER8SITJkxg4MCB5MuXj8jISBo1auR0JL+n07Jkk78WPoBz587R\nqlUrli9fzrXXXsv69eu56qqrnI4lIiJeYPbs2TzyyCMAulqTF9FpWeSSBQUFMW/ePGrVqsUvv/xC\n8+bNOX78uNOxRETEYcuWLSMiIgKA8ePHq+z5EBU+P1W4cGGWL1/OTTfdxI4dO7jvvvs4deqU07FE\nRMQh69at44EHHuDcuXMMHDiQZ5991ulI4kGa0vVzv/76K/Xq1ePAgQM0a9aMTz/9lJCQEKdjiYhI\nLtqyZQuNGzfm5MmTdO/enXfeeQdjsj17KDlAU7pyWa6++mo+//xzSpUqxcqVK+ncuTNJSUlOxxIR\nkVzy008/0aJFC06ePEmHDh14++23VfZ8kAqfUKlSJSIjIylatCgff/wx3bt31yXYRET8QExMDHff\nfTdHjx6lRYsWzJw5UydW9lEqfAJAjRo1WLp0KQUKFOC9996jV69eKn0iIj7swIEDNG7cmIMHD1Kv\nXj0WLFhAvnz5nI4lOUSFT1LVr1+fpUuXkj9/ft5991369euH9nMUEfE9v/76K40bN+aXX36hdu3a\nLFu2jIIFCzodS3KQCp/8S5MmTVIP3Hj77bcZMGCASp+IiA85dOgQjRs35ueff6ZWrVpERkYSGhrq\ndCzJYSp8cp67776bRYsWkS9fPt544w2eeeYZlT4RER9w+PBhmjRpwt69ewkPD2flypUUK1bM6ViS\nC1T4JEMtWrRg4cKFBAcHM3HiRAYNGqTSJyKSh/322280adKE3bt3U716dT7//HOKFy/udCzJJSp8\nkqn77ruP+fPnExQUxIQJE3juuedU+kRE8qDffvuNu+66i59++olbbrmFVatWccUVVzgdS3KRCp9c\nUKtWrZg3bx7BwcH83//9H3369NHRuyIieUhMTAwNGjRg165dVKtWjS+++IISJUo4HUtyma60IVny\n2Wef0b59exISEujcuTPTp08nKCjI6VgiInIBu3fvpmnTphw8eJDw8HAiIyMpWbKk07EkGy73Shsq\nfJJlq1evpmXLlpw6dYr27dsze/ZsnbNJRMRLbd++nWbNmhEbG0u9evVYtmyZjsbNw3RpNck1jRs3\n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\nvMsjiwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_flight_path(64,16,-numpy.pi/2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is so nice. We have reproduced the trajectories that Lanchester found more than a hundred years ago, painstakingly drawing them by hand with a contraption called a \"trammel.\" It must have taken him days!\n", + "\n", + "Here is how the different phugoid curves are drawn in von Kármán's book, _Aerodynamics_ (1957). He never says _how_ he drew them, but we're guessing by hand, also. We did pretty good!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/vonKarman-phugoids.png)\n", + "\n", + "#### Figure 4. Phugoid curves in von Kármán (1957)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the next notebook of this series, we'll look at the differential equation that arises when you consider small perturbations on the horizontal phugoid, and we'll learn to numerically integrate that to get the flight paths." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Lanchester, F. W. _Aerodonetics_, D. van Nostrand Company: New York, 1909. On the public domain. [Get it from Google Books](http://books.google.com/books?id=6hxDAAAAIAAJ&pg=PP1#v=onepage&q&f=false).\n", + "\n", + "2. Milne-Thompson, L. M. _Theoretical Aerodynamics_, Dover 2012 reprint of the revised 1966 edition. [Read on Google Books](http://books.google.com/books?id=EMfCAgAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see section 18.5)\n", + "\n", + "3. Sinha, N. K. and Ananthkrishnan, N. _Elementary Flight Dynamics with an introduction to Bifurcation and Continuation Methods_, CRC Press, 2013. [Read on Google Books](http://books.google.com/books?id=yXL6AQAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false) (see chapter 5)\n", + "\n", + "4. von Kármán, T. _Aerodynamics_, Dover 2004 reprint of the 1957 2nd edition. (see pages 149–151)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Execute this cell to load the notebook's style sheet, then ignore it\n", + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/01_02_Phugoid_Oscillation.ipynb b/lecture_22/01_phugoid/01_02_Phugoid_Oscillation.ipynb new file mode 100644 index 0000000..eb6283b --- /dev/null +++ b/lecture_22/01_phugoid/01_02_Phugoid_Oscillation.ipynb @@ -0,0 +1,949 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth. Partly based on David Ketcheson's pendulum lesson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Oscillation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome back! This is the second IPython Notebook of the series _\"The phugoid model of glider flight\"_, the first learning module of the course [**\"Practical Numerical Methods with Python.\"**](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about)\n", + "\n", + "In the first notebook, _\"Phugoid Motion\"_, we described the physics of an aircraft's oscillatory trajectory, seen as an exchange of kinetic and potential energy. This analysis goes back to Frederick Lanchester, who published his book _\"Aerodonetics\"_ on aircraft stability in 1909. We concluded that first exposure to our problem of interest by plotting the flight paths predicted by Lanchester's analysis, known as _phugoids_.\n", + "\n", + "Here, we will look at the situation when an aircraft is initially moving on the straight-line phugoid (obtained with the parameters $C=2/3$, $\\cos\\theta=1$, and $z=z_t$ in the previous analysis), and experiences a small upset, a wind gust that slightly perturbs its path. It will then enter into a gentle oscillation around the previous straight-line path: a _phugoid oscillation_.\n", + "\n", + "If the aircraft experiences an upward acceleration of $-d^2z/dt^2$, and we assume that the perturbation is small, then $\\cos\\theta=1$ is a good approximation and Newton's second law in the vertical direction is:\n", + "\n", + "$$\\begin{equation}\n", + "L - W = - \\frac{W}{g}\\frac{d^2 z}{dt^2}\n", + "\\end{equation}$$\n", + "\n", + "In the previous notebook, we saw that the following relation holds for the ratio of lift to weight, in terms of the trim velocity $v_t$:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{L}{W}=\\frac{v^2}{v_t^2}\n", + "\\end{equation}$$\n", + "\n", + "This will be useful: we can divide Equation (1) by the weight and use Equation (2) to replace $L/W$. Another useful relation from the previous notebook expressed the conservation of energy (per unit mass) as $v^2 = 2 gz$. With this, Equation (1) is rearranged as:\n", + "\n", + "$$\\begin{equation}\n", + "\\frac{d^2z}{dt^2} + \\frac{gz}{z_t} = g\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look at Equation (3) for a moment. Does it ring a bell? Do you recognize it?\n", + "\n", + "If you remember from your physics courses the equation for _simple harmonic motion_, you should see the similarity! \n", + "\n", + "Take the case of a simple spring. Hooke's law is $F=-kx$, where $F$ is a restoring force, $x$ the displacement from a position of equilibrium and $k$ the spring constant. This results in the following ordinary differential equation for the displacement:\n", + "\n", + "$$\\begin{equation}\n", + " \\frac{d^2 x}{dt^2}= -\\frac{k}{m}x\n", + "\\end{equation}$$\n", + "\n", + "which has the solution $x(t) = A \\cos(\\omega t- \\phi)$, representing simple harmonic motion with an angular frequency $\\omega=\\sqrt{k/m}=2\\pi f$ and phase angle $\\phi$.\n", + "\n", + "Now look back at Equation (3): it has nearly the same form and it represents simple harmonic motion with angular frequency $\\omega=\\sqrt{g/z_t}$ around mean height $z_t$. \n", + "\n", + "Think about this for a moment ... we can immediately say what the period of the oscillation is: exactly $2 \\pi \\sqrt{z_t/g}$ — or, in terms of the trim velocity, $\\pi \\sqrt{2} v_t/g$.\n", + "\n", + "_This is a remarkable result!_ Think about it: we know nothing about the aircraft, or the flight altitude, yet we can obtain the period of the phugoid oscillation simply as a function of the trim velocity. For example, if trim velocity is 200 knots, we get a phugoid period of about 47 seconds—over that time, you really would not notice anything if you were flying in that aircraft.\n", + "\n", + "Next, we want to be able to compute the trajectory of the aircraft for a given initial perturbance. We will do this by numerically integrating the equation of motion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare to integrate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to integrate the differential equation and plot the trajectory of the aircraft. Are you ready?\n", + "\n", + "The equation for the phugoid oscillation is a second-order, ordinary differential equation (ODE). Let's represent the time derivative with a prime, and write it like this:\n", + "\n", + "$$\\begin{equation}\n", + "z(t)'' + \\frac{g \\,z(t)}{z_t}=g\n", + "\\end{equation}$$\n", + "\n", + "There's a convenient trick when we work with ODEs: we can turn this 2nd-order equation into a system of two 1st-order equations. Like this:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z'(t) &=& b(t)\\\\\n", + "b'(t) &=& g\\left(1-\\frac{z(t)}{z_t}\\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Are you following? Make sure you are following the derivations, even if it means writing the equations down in your own notes! (Yes, the old-fashioned paper way.)\n", + "\n", + "Another way to look at a system of two 1st-order ODEs is by using vectors. You can make a vector with your two independent variables, \n", + "\n", + "$$\\begin{equation}\n", + "\\vec{u} = \\begin{pmatrix} z \\\\ b \\end{pmatrix}\n", + "\\end{equation}$$\n", + "\n", + "and write the differential system as a single vector equation:\n", + "\n", + "\\begin{equation}\n", + "\\vec{u}'(t) = \\begin{pmatrix} b\\\\ g-g\\frac{z(t)}{z_t} \\end{pmatrix}\n", + "\\end{equation}\n", + "\n", + "If you call the right-hand-side $\\vec{f}(\\vec{u})$, then the equation is very short: $\\vec{u}'(t) = \\vec{f}(\\vec{u})$—but let's drop those arrows to denote vectors from now on, as they are a bit cumbersome: just remember that $u$ and $f$ are vectors in the phugoid equation of motion.\n", + "\n", + "Next, we'll prepare to solve this problem numerically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initial value problems" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's step back for a moment. Suppose we have a first-order ODE $u'=f(u)$. You know that if we were to integrate this, there would be an arbitrary constant of integration. To find its value, we do need to know one point on the curve $(t, u)$. When the derivative in the ODE is with respect to time, we call that point the _initial value_ and write something like this:\n", + "\n", + "$$u(t=0)=u_0$$\n", + "\n", + "In the case of a second-order ODE, we already saw how to write it as a system of first-order ODEs, and we would need an initial value for each equation: two conditions are needed to determine our constants of integration. The same applies for higher-order ODEs: if it is of order $n$, we can write it as $n$ first-order equations, and we need $n$ known values. If we have that data, we call the problem an _initial value problem_.\n", + "\n", + "Remember the definition of a derivative? The derivative represents the slope of the tangent at a point of the curve $u=u(t)$, and the definition of the derivative $u'$ for a function is:\n", + "\n", + "$$u'(t) = \\lim_{\\Delta t\\rightarrow 0} \\frac{u(t+\\Delta t)-u(t)}{\\Delta t}$$\n", + "\n", + "If the step $\\Delta t$ is already very small, we can _approximate_ the derivative by dropping the limit. We can write:\n", + "\n", + "$$\\begin{equation}\n", + "u(t+\\Delta t) \\approx u(t) + u'(t) \\Delta t\n", + "\\end{equation}$$\n", + "\n", + "With this equation, and because we know $u'(t)=f(u)$, if we have an initial value, we can step by $\\Delta t$ and find the value of $u(t+\\Delta t)$, then we can take this value, and find $u(t+2\\Delta t)$, and so on: we say that we _step in time_, numerically finding the solution $u(t)$ for a range of values: $t_1, t_2, t_3 \\cdots$, each separated by $\\Delta t$. The numerical solution of the ODE is simply the table of values $t_i, u_i$ that results from this process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to execute the process described above and find the numerical solution of the ODE, we start by choosing the values $t_1,t_2,t_3 \\cdots t_n$—we call these values our *grid* in time. The first point of the grid is given by our _initial value_, and the small difference between two consecutive times is called the _time step_, denoted by $\\Delta t$. The solution value at time $t_n$ is denoted by $u_n$.\n", + "\n", + "Let's build a time grid for our problem. We first choose a final time $T$ and the time step $\\Delta t$. In code, we'll use readily identifiable variable names: `T` and `dt`, respectively. With those values set, we can calculate the number of time steps that will be needed to reach the final time; we call that variable `N`. \n", + "\n", + "Let's write some code. The first thing we do in Python is load our favorite libraries: NumPy for array operations, and the Pyplot module in Matplotlib, to later on be able to plot the numerical solution. The line `%matplotlib inline` tells IPython Notebook to show the plots inline." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy \n", + "from matplotlib import pyplot\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, initialize `T` and `dt`, calculate `N` and build a NumPy array with all the values of time that make up the grid." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100.0\n", + "dt = 0.02\n", + "N = int(T/dt)+1\n", + "t = numpy.linspace(0.0, T, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have our grid! Now it's time to apply the numerical time stepping represented by Equation (10)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Write the code above using the NumPy function `arange()` instead of `linspace()`. If you need to, read the documentation for these functions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Enter a question mark followed by any function, e.g., `?numpy.linspace`, into a code cell and execute it, to get a help pane on the notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The approximate solution at time $t_n$ is $u_n$, and the numerical solution of the differential equation consists of computing a sequence of approximate solutions by the following formula, based on Equation (10):\n", + "\n", + "$$u_{n+1} = u_n + \\Delta t \\,f(u_n).$$\n", + "\n", + "This formula is called **Euler's method**.\n", + "\n", + "For the equations of the phugoid oscillation, Euler's method gives the following algorithm that we need to implement in code:\n", + "\n", + "\\begin{align}\n", + "z_{n+1} & = z_n + \\Delta t \\, b_n \\\\\n", + "b_{n+1} & = b_n + \\Delta t \\left(g - \\frac{g}{z_t} \\, z_n \\right).\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To apply the numerical solution method, we need to set things up in code: define the parameter values needed in the model, initialize a NumPy array to hold the discrete solution values, and initialize another array for the elevation values." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# initial conditions\n", + "z0 = 100. #altitude\n", + "b0 = 10. #upward velocity resulting from gust\n", + "zt = 100.\n", + "g = 9.81\n", + "\n", + "u = numpy.array([z0, b0])\n", + "\n", + "# initialize an array to hold the changing elevation values\n", + "z = numpy.zeros(N)\n", + "z[0] = z0 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should pay attention to a couple of things: (1) See how there is a dot after the numbers used to define our parameters? We just want to be explicit (as a good habit) that these variables are real numbers, called \"floats.\" (2) We both _created_ and _initialized_ with zeros everywhere the solution vector `z`. Look up the documentation for the handy NumPy function `zeros()`, if you need to. (3) In the last line above, we assign the _initial value_ to the first element of the solution vector: `z[0]`.\n", + "\n", + "Now we can step in time using Euler's method. Notice how we are time stepping the two independent variables at once in the time iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-loop using Euler's method\n", + "for n in range(1,N):\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make sure you understand what this code is doing. This is a basic pattern in numerical methods: iterations in a time variable that apply a numerical scheme at each step." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the code is correct, we have stored in the array `z` the position of the glider at each time. Let's use Matplotlib to examine the flight path of the aircraft.\n", + "\n", + "You should explore the [Matplotlib tutorial](http://matplotlib.org/users/pyplot_tutorial.html) (if you need to) and familiarize yourself with the command-style functions that control the size, labels, line style, and so on. Creating good plots is a useful skill: it is about communicating your results effectively. \n", + "\n", + "Here, we set the figure size, the limits of the vertical axis, the format of tick-marks, and axis labels. The final line actually produces the plot, with our chosen line style (continuous black line)." + ] + }, + { + "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": [ + "pyplot.figure(figsize=(10,4)) #set plot size\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z, 'k-');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Explore and think" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try changing the value of `v` in the initial conditions. \n", + "\n", + "* What happens when you have a larger gust? \n", + "* What about a smaller gust? \n", + "* What happens if there isn't a gust (`v = 0`)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The equation for phugoid oscillations is a 2nd-order, linear ODE and it has an exact solution of the following form:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "z(t) = A \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + B \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $A$ and $B$ are constants that we solve for using initial conditions. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our numerical solution used the initial conditions:\n", + "\n", + "$$\\begin{eqnarray}\n", + "z(0) = z_0 \\\\\n", + "b(0) = b_0\n", + "\\end{eqnarray}$$\n", + "\n", + "Applying these to the exact solution and solving for $A$ and $B$, we get:\n", + "\n", + "$$\\begin{equation}\n", + "z(t) = b_0 \\sqrt{\\frac{z_t}{g}} \\sin \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + (z_0-z_t) \\cos \\left(\\sqrt{\\frac{g}{z_t}} t \\right) + z_t\n", + "\\end{equation}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We already defined all of these variables for our numerical solution, so we can immediately compute the exact solution. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Pro tip:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The expression is a bit long —if you don't feel like scrolling left and right, you can insert a line break in the code using a backslash '\\' _(without any trailing spaces)_ and Python will treat the next line as a continuation of the first." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the exact solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot our exact solution! Even better, we can plot _both_ the numerical solution *and* the exact solution to see how well Euler's method approximated the phugoid oscillations.\n", + "\n", + "To add another curve to a plot, simply type a second `pyplot.plot()` statement. We also added a legend using the format\n", + "\n", + "```Python\n", + "pyplot.legend([\"line 1\",\"line 2\"])\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nXZ3JngAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10,4))\n", + "pyplot.ylim(40,160) #y-axis plot limits\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase font size for ticks\n", + "pyplot.xlabel('t', fontsize=14) #x label\n", + "pyplot.ylabel('z', fontsize=14) #y label\n", + "pyplot.plot(t,z)\n", + "pyplot.plot(t, z_exact)\n", + "pyplot.legend(['Numerical Solution','Analytical Solution']);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks like pretty good agreement, but what's happening towards the end? We'll come back to this. For now, re-run the previous steps with a different timestep, say $dt=0.01$ and pay attention to the difference.\n", + "\n", + "Euler's method, like all numerical methods, introduces some errors. If the method is *convergent*, the approximation will get closer and closer to the exact solution as we reduce the size of the step, $\\Delta t$. The error in the numerical method should tend to zero, in fact, when $\\Delta t\\rightarrow 0$—when this happens, we call the method _consistent_. We'll define these terms more carefully in the theory components of this course. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compare the two solutions, we need to use a **norm** of the difference, like the $L_1$ norm, for example.\n", + "\n", + "$$ E = \\Delta t \\sum_{n=0}^N \\left|z(t_n) - z_n\\right|$$\n", + "\n", + "The $L_1$ norm is the sum of the individual differences between the exact and the numerical solutions, at each mesh point. In other words, $E$ is the discrete representation of the integral over the interval $T$ of the (absolute) difference between the computed $z$ and $z_{\\rm exact}$:\n", + "\n", + "$$ E = \\int \\vert z-z_\\rm{exact}\\vert dt $$\n", + "\n", + "We check for convergence by calculating the numerical solution using progressively smaller values of `dt`. We already have most of the code that we need. We just need to add an extra loop and an array of different $\\Delta t$ values to iterate through. \n", + "\n", + "You should read the documentation for the function [enumerate](https://docs.python.org/2/library/functions.html#enumerate) and make sure you understand how we're using it below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Warning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The cell below can take a little while to finish (the last $\\Delta t$ value alone requires 1 million iterations!). If the cell is still running, the input label will say `In [*]`. When it finishes, the `*` will be replaced by a number." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# time-increment array\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001, 0.0001])\n", + "\n", + "# array that will contain solution of each grid\n", + "z_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " N = int(T/dt)+1 # number of time-steps\n", + " ### discretize the time using numpy.linspace() ###\n", + " t = numpy.linspace(0.0, T, N)\n", + "\n", + " # initial conditions\n", + " u = numpy.array([z0, b0])\n", + " z = numpy.empty_like(t)\n", + " z[0] = z0\n", + " \n", + " # time loop - Euler method\n", + " for n in range(1,N):\n", + " ### compute next solution using Euler method ###\n", + " u = u + dt*numpy.array([u[1], g*(1-u[0]/zt)])\n", + " z[n] = u[0] # store the elevation at time-step n+1\n", + " \n", + " z_values[i] = z.copy() # store the total elevation calculation grid i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculate the error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical solutions for each $\\Delta t$ in the array `z_values`. To calculate the error corresponding to each $\\Delta t$, we can write a function! " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_error(z, dt):\n", + " \"\"\"Returns the error relative to analytical solution using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " z : array of float\n", + " numerical solution.\n", + " dt : float\n", + " time increment.\n", + " \n", + " Returns\n", + " -------\n", + " err : float\n", + " L_{1} norm of the error with respect to the exact solution.\n", + " \"\"\"\n", + " N = len(z)\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " z_exact = b0*(zt/g)**.5*numpy.sin((g/zt)**.5*t)+\\\n", + " (z0-zt)*numpy.cos((g/zt)**.5*t)+zt\n", + " \n", + " return dt * numpy.sum(numpy.abs(z-z_exact))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: in the last line of the function, we perform an 'array operation': \n", + "\n", + "`z - z_exact`\n", + "\n", + "We are *not* subtracting one value from another. Instead, we are taking the difference between elements at each corresponding index in both arrays. Here is a quick example:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 2, 1])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = numpy.array([1, 2, 3])\n", + "b = numpy.array([4, 4, 4])\n", + "\n", + "b - a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we iterate through each $\\Delta t$ value and calculate the corresponding error. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "error_values = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " ### call the function get_error() ###\n", + " error_values[i] = get_error(z_values[i], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remember, *if* the method is convergent then the error should get smaller as $\\Delta t$ gets smaller. To visualize this, let's plot $\\Delta t$ vs. error. If you use `pyplot.plot` you won't get a very useful result. Instead, use `pyplot.loglog` to create the same plot with a log-log scale. This is what we do almost always to assess the errors of a numerical scheme graphically." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nWtIESavUofkys59KukjSFElDJT0gaaGZbStJ7n6pu+/s7ru4e3Pbl4Yssi9f7eb72p626+75rp7r\nuL6z7aL42rq3P7OQ14XOM591Scqy0Nf2Ns9C1pdLnqX4Xe9sHXnm91xf1hVbnP/uZN/s3XaF5tmV\nSJo4d1/o7pPd/XZJ6zvZ5AxJ17n7Ne7+vLuPl/S6pJO7ek8zu1vSrZJGm9krZrZnX+uMw//ZpWri\nVqxY0W0dIcT5L6KunuvNX0RxzrLQ18bhL/a05BmXJo48wzVxpciyqzpCv47f9XCvLWUTF/klRsxs\npaRT3X1mbrm/pI8lHZlr8lq3u1jSTu6e6ePP45ArAABIjK4uMdKv1IXkYUtJG0t6s8P6tyRt3dc3\n7yoIAACAJOHsVAAAgASKYxP3jqR1kgZ3WD9YLXNxAAAAZS92TZy7r5H0uKQDOjy1v1rOUgUAACh7\nkczEmdlASTvkFjeS9BUzGyrpXXd/RdL/SLrezB5RS+N2klrm4S6Pol4AAIC4ieTsVDPLSGrKLbr+\ndX236e7+s9w2J0s6U9IQSX+SdLq731fiUgEAAGIp8kuMIBnMbIWkD9RyXb/33H2/aCtKPjPbRNKz\nkm51919GXU9SmdkgSYvVcmShv6TL3P3iaKtKptwF1a+X9AVJn0j6jbvfFm1VyWZmsyUNl9To7kdE\nXU8SmdlBki5Uy5G789z9mohLig2aOOTFzF6S9C13/39R15IWZvZbSZWSXnb3M6OuJ6nMbCNJ/d29\nOdcYPyNpD3d/O+LSEsfMtpa0lbs/bWaD1TKfvIO7r4q4tMQys+GSNpV0HE1c4cysn1p+pzOSVkp6\nQtL33P29KOuKi9id2IBY4xp7gZjZDpK+LmmhyLVP3H19m9vvfVbSaknN3bwEXXD3N9z96dyf31TL\n1QK2iLaqZHP3pZI+irqOBNtD0jPu/rq7fyRpgTY88bFs0cQhXy7pXjN7xMyOirqYFLhA0llRF5EW\nZraZmT0l6WVJU919ZdQ1JZ2Z7SppI3d/LepaUNa2kdR2H3xV0hcjqiV24njHBsTTD9z99dzhlrvN\n7E/u/qeoi0oiMztE0gvu/lcz2zvqetLA3T+Q9F0z20rSEjNrcPe/Rl1XUpnZFpJmSBoXdS0oe8x8\ndYNv4lLIzIaZ2Vwze9XM1pvZcZ1sc4qZvWRmq8zssbbNRO65ZWb2hJlVSJK7v5773zfU8nX2LqX6\nPFErQp57SjoyN2d4gaQTzGxy6T5RtIqxf7Zy97ckZSUNLfoHiYFiZGlmAyTNlnSuuz9Uuk8TvSLu\nm2XbiPQ1U0n/UPtv3r6k9t/MlTWauHQaKOlpSRMkrVKHv0DM7KeSLpI0RS3/sXtA0sLcmWly90vd\nfWd336V1WNzMNs299nOSfijpzyX7NNELmqe7n+3uX3b3r0r6v5KucvcpJfw8UQu9f27VZv/cTNI+\nufcvB6GzNEnTJTW5+42l+xixETTPti8tRfEx1adMJT0qaScz2yb3358DJd1Votrjz915pPihlrN5\nju2w7mFJV3RY94Kk33XxHl+V9GTu8SdJ1VF/riTn2WG74ySdH/XnSnKeknaXtCy3fy7r+H7l8giU\n5d5que3hE7ksl6nlrPTIP18S88w9f7ektyR9LOkVSXtG/dmSlqmkgyU9L+lFSeOi/hxxejATV2bM\nrL9aDoWe3+GpBkl7dfYad39JZXJ4qlC9ybMtd59RjLqSqpf756OSdi5yaYnTyyzvk7RxkUtLpN7+\nrrv7iGLWlWT5Zuru8yTNK2FpicHh1PKzpVr+kn6zw/q31HJrMxSGPMMiz3DIMizyDI9M+4gmDgAA\nIIFo4srPO2qZeRncYf1gSa+XvpzEI8+wyDMcsgyLPMMj0z6iiSsz7r5GLbfS6XjF6/3VclYQCkCe\nYZFnOGQZFnmGR6Z9x4kNKWRmAyXtkFvcSNJXzGyopHfd/RVJ/yPpejN7RC2/KCepZf7g8ijqjTvy\nDIs8wyHLsMgzPDItsqhPj+UR/qGWGwWvzz3WtfnztW22OVnSS2q5x+SjkvaOuu64PsiTPOP6IEvy\njPuDTIv7sFyAAAAASBBm4gAAABKIJg4AACCBaOIAAAASiCYOAAAggWjiAAAAEogmDgAAIIFo4gAA\nABKIJg4AACCBaOIAAAASiCYOAApkZgPM7AUz+0HUtQAoXzRxAFC4EyVtLmlKdxuZ2cZm9pyZbVOa\nsgCUE5o4ACiAmW0i6euSzpY03MxGdLP5rpK2cPd/lKQ4AGWFJg4ACnOKpEskXStpuaTfdLPtvpKa\nSlEUgPJDEwcAeTKz/yPpi+7+rLuvk1QnaU8zO6jDdj82s/+VdLqkz5nZ/5rZ1yMoGUCKmbtHXQMA\nJIKZ/UrSLe7+t9yySfqTpDXuvkuHbftLek/SLu7+QsmLBZB6fBMHAHkwsy0kbd7awEmSt/wr+BxJ\nQ81sTIeX/EDShzRwAIqFJg4A8lMt6Q8dV7r7HZKekFSX+2au1f6SsqUpDUA5ookDgB6Y2WBJ/d39\ntS42+S9J35R0VJt1I5Rr4sxsbzMbUNQiAZQdZuIAoAe5kxQelPRWN5tNl7RG0o7uvs7MPpa0l6Tn\nJE109/OKXiiAskITBwDdMLOtJb0kKZ9v0lzSz9x9hpldKGmtpLclXeHuHxexTABliCYOAAAggZiJ\nAwAASCCaOAAAgASiiQMAAEggmjgAAIAEookDAABIIJo4AACABKKJAwAASCCaOAAAgAT6/wsNBajn\noDeVAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pyplot.figure(figsize=(10, 6))\n", + "pyplot.tick_params(axis='both', labelsize=14) #increase tick font size\n", + "pyplot.grid(True) #turn on grid lines\n", + "pyplot.xlabel('$\\Delta t$', fontsize=16) #x label\n", + "pyplot.ylabel('Error', fontsize=16) #y label\n", + "pyplot.loglog(dt_values, error_values, 'ko-') #log-log plot\n", + "pyplot.axis('equal') #make axes scale equally;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the kind of result we like to see! As $\\Delta t$ shrinks (towards the left), the error gets smaller and smaller, like it should." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We calculated the error for several different timestep sizes using two nested `for` loops. That worked, but whenever possible, we like to re-use code (and not just copy and paste it!). \n", + "\n", + "Create a function that implements Euler's method and re-write the error analysis cell to use your function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/01_03_PhugoidFullModel.ipynb b/lecture_22/01_phugoid/01_03_PhugoidFullModel.ipynb new file mode 100644 index 0000000..87184de --- /dev/null +++ b/lecture_22/01_phugoid/01_03_PhugoidFullModel.ipynb @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, I. Hawke. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Full phugoid model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the third IPython Notebook of the series on the _phugoid model of glider flight_, our first learning module of the course [\"Practical Numerical Methods with Python\"](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about). In the first notebook, we described the physics of the trajectories known as phugoids obtained from an exchange of potential and kinetic energy in an idealized motion with no drag. We gave you a neat little code to play with and plot various phugoid curves.\n", + "\n", + "In the second notebook, we looked at the equation representing small perturbations on the straight-line phugoid, resulting in simple harmonic motion. This is a second-order ordinary differential equation, and we solved it numerically using **Euler's method**: the simplest numerical method of all. We learned about convergence and calculated the error of the numerical solution, comparing with an analytical solution. That is a good foundation!\n", + "\n", + "Now, let's go back to the dynamical model, and take away the idealization of no-drag. Let's remind ourselves of the forces affecting an aircraft, considering now that it may be accelerating, with an instantaneous upward trajectory. We use the designation $\\theta$ for the angle, and consider it positive upwards." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image](./figures/glider_forces-lesson3.png)\n", + "#### Figure 1. Forces with a positive trajectory angle." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Figure 1, $L$ is the lift, $W$ is the weight, $D$ is the drag, and $\\theta$ the positive angle of the trajectory, instantaneously. \n", + "\n", + "In lesson 1, we wrote the force balance in the directions perpendicular and parallel to the trajectory for a glider in _equilibrium_. What if the forces are _not_ in balance? Well, there will be acceleration terms in the equations of motion, and we would have in that case:\n", + "\n", + "\\begin{align}\n", + "m \\frac{dv}{dt} & = - W \\sin\\theta - D \\\\\n", + "m v \\, \\frac{d\\theta}{dt} & = - W \\cos\\theta + L\n", + "\\end{align}\n", + "\n", + "We can use a few little tricks to make these equations more pleasing. First, use primes to denote the time derivatives and divide through by the weight:\n", + "\n", + "\\begin{align}\n", + " \\frac{v'}{g} & = - \\sin\\theta - D/W \\\\\n", + "\\frac{v}{g} \\, \\theta' & = - \\cos\\theta + L/W\n", + "\\end{align}\n", + "\n", + "\n", + "Recall, from our first lesson, that the ratio of lift to weight is known from the trim conditions—$L/W=v^2/v_t^2$— and also from the definitions of lift and drag, \n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "we see that $L/D=C_L/C_D$. The system of equations can be re-written:\n", + "\n", + "\\begin{align}\n", + " v' & = - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\\n", + " \\theta' & = - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v\n", + "\\end{align}\n", + "\n", + "It is very interesting that the first equation has the factor $C_D/C_L$, which is the inverse of a measure of the aerodynamic efficiency of the aircraft. It turns out, this is the term that contributes damping to the phugoid model: if drag is zero, there is no damping. Drag is never zero in real life, but as engineers design more aerodynam-ically efficient aircraft, they make the phugoid mode more weakly damped. At altitude, this is nothing but a slight bother, but vertical oscillations are unsafe during final approach to land, so this is something to watch out for!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The initial value problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to visualize the flight trajectories predicted by this model, we are going to need to integrate the spatial coordinates, which depend on both the forward velocity (tangential to the trajectory) and the trajectory angle. The position of the glider on a vertical plane will be designated by coordinates $(x, y)$ with respect to an inertial frame of reference, and are obtained from:\n", + "\n", + "\\begin{align}\n", + "x'(t) & = v \\cos(\\theta) \\\\\n", + "y'(t) & = v \\sin(\\theta).\n", + "\\end{align}\n", + "\n", + "Augmenting our original two differential equations by the two equations above, we have a system of four first-order differential equations to solve. We will use a time-stepping approach, like in the previous lesson. To do so, we do need *initial values* for every unknown:\n", + "\n", + "$$\n", + "v(0) = v_0 \\quad \\text{and} \\quad \\theta(0) = \\theta_0\\\\\n", + "x(0) = x_0 \\quad \\text{and} \\quad y(0) = y_0\n", + "$$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solve with Euler's method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We know how to apply Euler's method from the previous lesson. We replace each of the time derivatives by an approximation of the form:\n", + "\n", + "$$v'(t) \\approx \\frac{v^{n+1} - v^n}{\\Delta t},$$\n", + "\n", + "where we are now using a superscript $n$ to indicate the $n$-th value in the time iterations. The first differential equation, for example, gives:\n", + "\n", + "$$\\frac{v^{n+1} - v^n}{\\Delta t} = - g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2$$\n", + "\n", + "Alright, we know where this is going. At each time iteration $t^n$, we want to evaluate all the known data of our system to obtain the state at $t^{n+1}$—the next time step. We say that we are _stepping in time_ or _time marching_.\n", + "\n", + "The full system of equations discretized with Euler's method is:\n", + "\n", + "\\begin{align}\n", + "v^{n+1} & = v^n + \\Delta t \\left(- g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2 \\right) \\\\\n", + "\\theta^{n+1} & = \\theta^n + \\Delta t \\left(- \\frac{g}{v^n}\\,\\cos\\theta^n + \\frac{g}{v_t^2}\\, v^n \\right) \\\\\n", + "x^{n+1} & = x^n + \\Delta t \\, v^n \\cos\\theta^n \\\\\n", + "y^{n+1} & = y^n + \\Delta t \\, v^n \\sin\\theta^n.\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we've learned before, the system of differential equations can also be written as a vector equation:\n", + "\n", + "$$u'(t) = f(u)$$\n", + "\n", + "where\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix}.\n", + "\\end{align}\n", + "\n", + "It's a bit tricky to code the solution using a NumPy array holding all your independent variables. But if you do, a function for the Euler step can be written that takes any number of simultaneous equations. It simply steps in time using the same line of code:\n", + "\n", + "```Python\n", + "def euler_step(u, f, dt):\n", + " return u + dt * f(u)\n", + "```\n", + "\n", + "This function can take a NumPy array `u` with any number of components. All we need to do is create an appropriate function `f(u)` describing our system of differential equations. Notice how we are passing a _function_ as part of the arguments list to `euler_step()`. Neat!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And solve!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we start by loading the modules and libraries that we need for this problem. We'll need a few transcendental functions, including the $\\log$ for a convergence study later on. And remember: the line `%matplotlib inline` is a magic function that tells Matplotlib to give us the plots in the notebook (the default behavior of Matplotlib is to open a pop-up window). In addition, we are importing the module `rcParams` to define notebook-wide plotting parameters: font family and size. Here we go!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log, ceil\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to set things up to start our numerical solution: the parameter \n", + "values and the _initial values_. You know what the acceleration of gravity is: 9.8 m/s$^2$, but what are good values for $C_D/C_L$, the inverse of the aerodynamic efficiency? Some possible values are given on a table in the Wikipedia entry for [lift-to-drag ratio](http://en.wikipedia.org/wiki/Lift-to-drag_ratio): a modern sailplane can have $L/D$ of 40 to 60, depending on span (and, in case you're interested, a flying squirrel has $L/D$ close to 2).\n", + "\n", + "For the _trim velocity_, the speed range for typical sailplanes is between 65 and 280 km/hr, according to Wikipedia (it must be right!). Let's convert that to meters per second: 18 to 78 m/s. We'll pick a value somewhere in the middle of this range.\n", + "\n", + "Here's a possible set of parameters for the simulation, but be sure to come back and change some of these, and see what happens!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 30.0 # trim velocity in m s^{-1} \n", + "C_D = 1/40 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = v_t # start at the trim velocity (or add a delta)\n", + "theta0 = 0 # initial angle of trajectory\n", + "x0 = 0 # horizotal position is arbitrary\n", + "y0 = 1000 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll define a function `f()` to match the right-hand side of Equation (15), the full differential system in vector form. This function assumes that we have available the parameters defined above. If you re-execute the cell above with different parameter values, you can just run the solution without re-executing the function definition." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the code defining function `f(u)` with the differential equations, and convince yourself that it's right!\n", + "\n", + "\\begin{align}\n", + "u & = \\begin{pmatrix} v \\\\ \\theta \\\\ x \\\\ y \\end{pmatrix} & f(u) & = \\begin{pmatrix} - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\ - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v \\\\ v\\cos\\theta \\\\ v\\sin\\theta \\end{pmatrix} \\nonumber\n", + "\\end{align}\n", + "\n", + "Now, Euler's method is implemented in a simple function `euler_step()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equations.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After defining a final time for the solution, and the time step $\\Delta t$, we can construct the grid in time using the NumPy function [`linspace()`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html). Make sure you study the decisions we made here to build the time grid: why do we add 1 to the definition of `N`, for example?\n", + "\n", + "Look at the code below, and make sure you understand the following aspects of it.\n", + "\n", + "* The NumPy array `u` contains the solution at every time-step, consisting of the velocity, angle and location of the glider. \n", + "* The first element of the array `u` is set to contain the initial conditions. \n", + "* In the `for`-loop, the function `euler_step()` is called to get the solution at time-step $n+1$. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = 100 # final time\n", + "dt = 0.1 # time increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u = numpy.empty((N, 4))\n", + "u[0] = numpy.array([v0, theta0, x0, y0])# fill 1st element with initial values\n", + "\n", + "# time loop - Euler method\n", + "for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the trajectory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to plot the path of the glider, we need the location (`x`, `y`) with respect to time. That information is already contained in our NumPy array containing the solution; we just need to pluck it out. \n", + "\n", + "Make sure you understand the indices to `u`, below, and the use of the colon notation. If any of it is confusing, read the Python documentation on [Indexing](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 3.00000000e+01 -1.11022302e-17 6.00000000e+00 1.00000000e+03]\n", + "[ 1000. 1000. 1000. ..., 1000. 1000. 1000.]\n", + "[ 3.00000000e+01 -1.11022302e-17 6.00000000e+00 1.00000000e+03]\n" + ] + } + ], + "source": [ + "# get the glider's position with respect to the time\n", + "print u[2]\n", + "x = u[:,2]\n", + "y = u[:,3]\n", + "print y\n", + "u[2]=euler_step(u[1],f,dt)\n", + "print u[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to plot the path of the glider and get the distance travelled!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nfEtJjyq+OtMP69J+V0lXFvNcrPSG/neSjlf66Pa0bssvtd9K0meLeS5ROmJ0oKR/VLpQd42kiyRt\nU2qzQ9GvE0vLfpWkFUrnWQ4pnZq0WtI3pvAc7FIs733F8n4oab/S9j+qmG/b4venldb7GqUC6B+L\n7T5R0p8k/aq0/F8X835W6Z/MkNI5qV8slvN9Sdt2eV6q6+r2/D1W0m+VjiC/U9LhShd5LlQqqP4s\n6eU12328pLuUPiJ/TfG8HyZpgaSbO89Faf6/Kfr0m6I/ry8/R5L2rCz/cKUL1SYkLZJ0cPH15mK9\nt0p6cqXNnqUsVkv6pqQLJJ0j6amSDpL0kaJvZxfz/qqYd7TIbZfS8jqZvbfIZajazz7/bnYqlvsv\nRV/+VHnN7F6ad/9Shg/skvFwafpQl3XtpXTB7BpJX5b0jOK1doLSTvt5pfaHFMvcqtR+u9L01xev\nt38o1jtP0qpi+usr671fsayRLsvvfG0/hefKXbbzeZXlPKCYd3bx+/8U851ZWVZ1+jlKf/cnF9k+\nR9JVpdfH9sVzdkKx/hO19rW9sKa/MyV9qZjn68UyD5T0Qkk/Lh6/UNKWG/P9fVN9KRWsqyVdOIV5\nfzHZvEoXcndyPan0+BZKf/vr5Vhp/6xS+6c02I69Su1e1WO++aX59i49fmjp8ef0aP+uYr57JN2v\n7fz4mvpX6x3gi6+pfklaXHpD+ruNtMyuBX5lnl4Ffucf4XclzahMe6BSMdirQP1AMf2bklyZNkPS\neNH2/V3aPrm07O9X33yLImDSAr80/6JieT3bVJ6zayTtUJn+Ia1b4F8r6fM1y/pksZx3Ns2n9Pyu\nljSvS9vHFdP+LOmQyrQnSrq3mHZQTdt7JI13mXZtsdwX93iOHqF0XmvXf55KI2msUdq5mN0ji3sl\nvbcybUtJd0h6Y/H7a4t5b5G0dU1/fiHpPzfG30xluUcV6769xzxdC/zS9HIB3q3A/3Yx/Wtdpu1e\nbPdUl/8rVYpypZ3NNUo7XOsVMJP1v8Fz1XM7K/N+Rj0Kw2J65/VxRGXafsW0P0v6L0mPrkx/dun1\nsl6RrnTR6BpJX+wy7X6Sfl70bWkfz8F/Srqhz69fbqTXbJMC/+5i3mU95tm9lOsbS4/v0e3xLu0P\nLs13QoPtePxU2mnte81qSU8qPf6P3R7v0v61pfkesjEy4GvTfHGKDqaT8njDd7TWi4LTaD7PVPqI\n9N8jYnV5eqQL5N7Xo/0jJb1MNRdgFct7p9IRwHnuPd7y0oiongf9AqU38fvS2RFxe+WxBUoFdMcZ\nSgVrNx9S2r4X9bHuBSqO7kbEeqedRDp/9OtKR9JeW5n8LqUdqC9GxKU1bb/VR5863qp09PSKiPh8\nl+Wfr/QJzw7FvHUs6W2Vtn+R9Eilo/JSOv3sHqWj6sevtwD7GZIerh6vxVzZfqrSJzKhLs9TpNMv\nPthgkR+N9Uc6ubj4vqOk2uEOM/XriPhq+YGI+LlSQbyF0qc5V1bafE3p+dxJldFkilNMXlhMX+/C\n9uI95t1Kr8tXuMfwizV2krRbn19TGm9+Y3E6dbBzjcl656eXlKftUPr5/jXzTLX9ZDZ0+fd1/9Ay\nCnygfyOln79VM88lPdo/X+kf5d1Kp+N007kw7H5Kp4/U+W71gYi4NSJu6tFmY+i23tsj4nel38+M\niP+taX998X03Nx/nvjM8Y6/neKXSc/yUzgO2H6J0qouUdgDqnCxpvXOzJ+M0lvtI0bdey7+o6NvR\nrr8ZzdURcXP1wYj4XWfHKiJWKZ3+5Jr+vkLSpRHx46lvRTY6f2N/VpfXWqFX/lXrnQsdEXconUoh\nlYbSnSbGah6/qW56pIspOzvle1YmH1t8/2NEXFGz7M570rZKp3lMWUQ8PyJm9Pm1Y5N1AZs7xsHH\ndFIudHoeSbB9s9LRorKIiI15I51HFd9XRf0FWL/v0f6xxfdtJN1VXBNXFVo7pFuvO+GuVwRuIpOu\ntyh4X6p0Lu/+Srl0e+/ZXumUlUk5Xfz6MKXnZp7tk+pmLebZ3vYDIo2lXz5q+avuzaSI+KUaXJhd\n8gilTKPX8pVO9ZFSofQIpVMfqqaa6/uVjrwO2T6o86lEsTNzpKbvCBidv7HfVj8hK+n1N1Z1S83j\ndynlsE2DZbUtVL89fym+TzZ968rjnfeknWzXjYw01fekaS0i/mz7XqWDK71eF+Vp5U8z76iZZ6rt\nJ7Ohy7+v+4eWUeBjOikfUdpH6fz0Ok9UOgVDSkdiX66Nf3Oizk7GXT3m6TV8YOeI1I1KF2RONnRe\n7WgQ1dN7NqG6okvSX8eR/qbSzaquUvrY/+da+49iL6Uj2VKzoQPLR/M+pCkMmVpaZ7ltr+z6NdXl\nl3cK645O9nx+OyLi+7Z/orTz8gqt/UToX5R2mj4zleVkaEP/xqqm9HxOI2s2cHpV53V4rdK5+pP9\nTd7QcPnTzfVKp7f1Oj2oPO3/Sj/fpPTp7NZ9tp9K37otY6rLb9r+L2q2M42WUeBjOvmG0j/zLZU+\nGv5U3YxRGvPY9n11mkqnYJzZY571hoAs6Qybt01x3uwgWqxU3N+qdCHXqvJE93+n39tKP98dET/r\ns+22fa5/qsvv9dooT7utdq6pe7/Szs7zbZ+qdIRunqSPxEa8Q+wmtqF/Y2im8zrc6r54T7L9n0qj\nxvTjzoj4m43Znym4Qmn0rL17zFOe9teDUBGxxvbPlEZ8mmr7ulMZ1xMRv7N9i9JgA1NZ/h0R8evK\nuqIyT6/2V3W5zgsZ4xx8TBsR8UdJH1U6qnScu4yfvol1isqdXRovvaLXOb2d8bV3tL1b3Uy2D7T9\nEncZN30a+HulfyLfrxb3GyIi7tTa01/27TWv7eNtH1t66Celnx/Wo939ijHMm96U6GqtPeJcu/zS\ntImizYb6pFKBto3SDWyeqzQEapOLUHPT+Rvby/aMmnmm23nzOev8bezV4z1Ntg8p3pMe2HD50+Yi\n20LnTsz72q7byTyw+H5DRFQ/Vf6y0v+rx/VYR6f9pRFRd0pVna9Mcfmhtdsi6a/XnnSua+nV/nFF\n+y827BtaNm0LfNuHOt2cpvYGOBhIiyX9TqlweWPvWe9z5TsbPrVmnl4XxnaGupN6H9X6oNKIKf0e\n7Z6qznm56xS0to+zPdznMjvvMXVF8t59LleSzi+We5jt7bvNYPtvlcZJ/+vzG+mOj98v2j69x/K/\nqfSRdLXQWe95sj27eJ4eUBwt/8IUlv90pX+cFxQj42yQ4jqQTxTrfbnSqWlfiYjrezbMW+dv7H5K\no+l00+tvbGMoZ1PO/Am2j94IyzmgeO3k8P/4/OL7ZDc2+pjSCF/VEYl6moYX2X5O6V4WM5TundDN\nMUp/x+d0mfZxpdx3t31IdWJxkOqoov1H+uhfp82Bth/UZfm7ae2F0N1ucPcRFTfBsl29HkPF+/4s\npVPbPt5H/9CiHN5QGrG9je3TlcZGfoSmeF617YOd7rZ5U3H3wittn1ZcADhZ22cVbX/ndBfFG5zu\nwvkfdUdVi7sLLnW68+JdRdtzbe/TaIOxjmJYvKOVTvn4N9uv7DV/Ufg9qtc8G9CXH2ntEZp/qx5h\ntL2L0k1G6tpfpVS8W9Jp3Y6G2Z6n9BHvmV2G99vYOudX/rUfth+sdAOlfu9ieInS9j2puOCzqvb5\nmYJ3KY2Dv62kt1cnFnm8V2ms8CWVya9R+sd7lO3Hd2n7DKV/jJ/o8ryv9zwpXeA6qrVDz71J6RSZ\nR9teb6hS2y9QuuD4NtUPIdqP9xffZyvdpbLntQm2H+O1d0Xt9WlDKyLiW0rv9Zb0hup023sqXcB9\nXypf+1LO/HRJb5nqQiLiHq09Baa8nNdJ+nBEND1ffqOLiMu1didxcbdhMG3/P6XTVt41jU/9mpKI\nuE3pQJIlvdH2Ohej2n6h0o2ufqv132MUEdcovQdZ0tu67MQtVHot/FhdCnCnu4BfXdQPT+6y/O8o\n7YRsIenfu2zCvyvtnPx3RHQb0etcpfsC7KDKsKjFJ5dvV6qx3l8+7RXTRL8D6LfxpfSR9kqlj+YP\n1yQ3KCq1O17p3O0VSv+0Z0s6Vekf/w8kzaxpt4XSXuutkl6tVCjOUro99E+Kdf99l3Z7KN0A6DZJ\nL1a6Wc/TlS4uvFNdbpjEV+PXwkOVjrCuVnqD+n9KR/Ieq1TYnKg0PvitxTw3Snpzqf1MpQJrTul1\n9PTisZlK5/nvr8pdCovHdiwtZ1elcxlXK10jcJRSQf7CIu9PdFn+dqX291O6Gc1qpdM05irdkXKO\nUrH2Z6Wbad2vS9/nlpa9f/G11wY8pw9WOrXkz8W2HiTp08XfyQGl56Tbc7Z3zTL31No72V6rVIwd\nVDxPFypdAFpd1paVnHvdKGz/0vI/XfxtDiuN///Dou8n1vTtWKXTY27V2jvZPlnpTrOdj6+36dJu\nQdGnHysdVT5K6eK1yyrzPbVY9oRSIfj44ustxfO8SpX3guL19Ogi+85dhTvZ7thtO7r07+Ki7dVT\nmLdzp+C/qMFdKiU9oOjTK7T2Tradfj68mGf74vfOjaRWK/1t7q904eFWxc8HlqYfWzx2/9K6HqR0\ngfZqSV8tMu7cNfkqpcK/251y3WP5WxfzPLJ4vjvvE/9aXX8x37eL6cuK5Z1S/L644d/Yx4t2X1T6\nOzhB6X/Cx4rpDyv68z9Fn88r+vOQ0t9ot+l7VNp33pOWlrdnKturdIrXBcX0nxV9HCqe948Ur5XP\nStpiU73fb+hXsd37l56bzs0F13nN9mj/3uL5+IHSxccHKhXEdytdaPy3PdrOUCrCVyudUvN0pfeB\ndxWP/ULSg2ravqn02j2vZp7tlN6rVhevh8OU3pc+VrT9QfX1XGm/h9bevOwMpbs1P614ja5W+hRt\nRq/nh688v1rvQKPOpj+ss1Xc1l5TKPCLN7y7lE7rqL5pv75Yxodq2r5TqUAYrlnubyU9ocu0rxX9\nOq7y+OyiLzf2+oPjq9Fr4jBJZyoVWzcXed0m6TqlMchPVypIq3d5fXLp9VP9OkzrFpbVrxdXlrWd\nUtF2VZHvLcU/j2OL5VTbz+myHc8q3khvULpp0S1KOwwndpm3V98/uoHP5xHFP4Q7lT6a/qGkkWJa\nr+ek9u63knZWujnOL5T+If5J6WK0f1cqHKrLmlVq27PAL+bZvvhbvqzo891KRf/HJT12ku2dLems\nIrs7i76NK90Ya73ivmizpdKRrWuLrH6jtJPWbQdkd6Uje1cWy/5T8fN/SNqty/yLpvq667FNzyuW\nceoU5l1czPulhq+Tk3v084pinqN6zDOkde8QW/16TmV9O0h6h9Ze33CTpP9WOmDzt6XlbF9qs12v\n9Rfz3DzF9T9I6ZS6m4v1X620IzjlnaJiOTsq7STcULxOr1V6/9qhmH5ZTX8uLKZ/pmb6mZO0f06T\n7S3mfa5Skfd7pdf5KqX/bS/YkPeYNr56bPc6r9lJlnGk0ie2NyrttF+ltAO1yxT78CKl+6XconQA\n4QqlAr7rAcaizX5K75u/UY8Dg0oHI+crvV//Uel/4GVKO3CTFudKO3WnKf0fvUNpB/A7kk5qOzu+\n+v9yEe60YNtR6rDtNUofH82OmvNMbS9TOhr5HxFxWmXaDkp/rFsWy/hNado+Snea/FREnNCgj09U\n+sP4bUQ8pMv0/1K6dfQbIuIdU10usDmy/VClIiiUPiVoMozcZsn2fKWdigdFujC9br4dlI7c7Sbp\n8Egf9087tp+kdIT9roiovTAUADYn0+oc/Gi4N1Kc73ZM8es3uizvdqW93C2UjnqVvbR4/KvVdpN4\nfvH9WzXTv65iFJiGywUGmu3H2q5erFy+u+3GGEpyc/BSSaOTFPfbKl1QuYek1+Vc3Nt+hu0Te8zS\nGQFkxaboDwBMB9OqwO/DPlp7N9OVNfN0bmV/YOXxpxXff2n7hba/afv3xcUuXysurunmYKWjjb3W\nJ0n7d7tqHdiMHS3pfZXHDi6+X1HskKPE9nzbJ5d+f6rSKStnTtJ0J6WRqI6PiNPvwy5uDE+TdFa3\nAQ2KTyHmK73n5r4dALDJDPqNrh5e+rnuDmydO/H9dd7iyP/+xa9LlM7TfZ2ky5Uuclok6VzbR3Q5\nfaeznMnWt0Wx3LodAWBz9Ejb71E6p/1hSuc5/1npInes77GSnmX7aqVzid+vdFrhFb0aRcQNWv+g\nRs62k3SJ7XcqXST5Z6Vtf7XSUKtvjIiL6psDwOZl0Av8zm3OV0fE6pp5OreLL4+xu6PW3h3xSZL+\nrvQPc6Xt7ypdKHe87W9HRHn82slurT6V29MDm6NPSdpL6eLMlyn9DX1P0lsj4tI2O5axnypdRH6h\n0ilMFyqNKDVI3qk0KtlRSgX97koXBd6kNHrIP0XE99rrHgDkZ9AL/H517lgXki6pHg2LiLucbrn9\ndqXh0vq5QQWAkkjjLP9z2/2YTiLiPZLe03Y/7ksRcZPS/SKm8x15AWCTGvQCv3PO7gzbM2qO4neK\n+fIFfOWj7z9Td2PF9/1tbxMRd5fW+UClm+90U77dddeLBm3vLOkZSkP93d1tHgAAALRqG6XTBP8n\nIm5puS/rGPQC/5rSz3sojVtftWeXeTtjaW+tNB5sN3cU3610wVrnnPtrlAr8PWradda3RqmA7+YZ\nkj5ZMw0AAAD5eKHStWPZGPQC/xdKR8l3kLSvuhf4+yqdinNZ54GIWGP7CqWL0NYbuaHQeTyUdgg6\nLlW6Q+G+Ne06j/+0dNS/6teSdN5552m//farmQVtOvXUU3XGGWe03Q10QTb5Ipu8kU++yCZPP//5\nz/WiF71Iqj9g25qBLvCLQv3zkuZKOlzpFu5/VQyx1rmN+ecqzZcrFeqPrVl8Z5SdH1cK9c8oDdv2\nlJp2T1faKfh0j67fLUn77befhoaGesyGtuy4445kkymyyRfZ5I188kU22cvudOpBHwdfShfC3itp\nru37V6bNVzoN55wud8j8kNItpYdtH1yeYHsrSS9Xl7GXI+ISSd+UtJft4yrtHqY01vcqSWdvyEah\nXZdeyqAuuSKbfJFN3sgnX2SDpqZdgW97F9u72y6f475b8dh6p9NExDVKd3bcRdJXbB9qe7btV0ta\nrHRqzqld2v1B6W6zd0v6rO3n2X6I7UMlfVlpOL/3RsRol26+SNJ1kj5s+yTbe9ueI+lLSp8WHMtN\ne6a32bNnt90F1CCbfJFN3sgnX2SDpqbjKTqXSZpV/BzF9x8qXewakmZUG0TEebZ/Ien1SqfebC/p\nWqWb6LwzIu7ttqKI+Ibtx0r6N0nvlrSb0sW1l0p6dkR8uabdDbYPkPQGSadJ+oCkPyidInR0MRwg\nprFdd9217S6gBtnki2zyRj75Ihs0Ne0K/Ijoaze2uFHOMX20+6WkeX20u13SwuILA+YFL3hB211A\nDbLJF9nkjXzyRTZoyhEx+VzYpGwPSRobGxvjohoAAIAMjY+Pa3h4WJKGI2K87f6UTbtz8IEcLF++\nvO0uoAbZ5Its8kY++SIbNEWBD/RhdLTbtdXIAdnki2zyRj75Ihs0xSk6GeIUHQAAgLxxig4AAACA\nTYICHwAAABggFPgAAADAAKHAB/owd+7ctruAGmSTL7LJG/nki2zQFAU+0Ic5c+a03QXUIJt8kU3e\nyCdfZIOmGEUnQ4yiAwAAkDdG0QEAAACwSVDgAwAAAAOEAh/ow4oVK9ruAmqQTb7IJm/kky+yQVMU\n+EAfli5d2nYXUINs8kU2eSOffJENmuIi2wxxkW3+JiYmNHPmzLa7gS7IJl9kkzfyyRfZ5ImLbIEB\nwxttvsgmX2STN/LJF9mgKQp8AAAAYIBQ4AMAAAADhAIf6MOCBQva7gJqkE2+yCZv5JMvskFTFPhA\nH2bNmtV2F1CDbPJFNnkjn3yRDZpiFJ0MMYoOAABA3hhFBwAAAMAmQYEPAAAADBAKfKAPK1eubLsL\nqEE2+SKbvJFPvsgGTVHgA31YuHBh211ADbLJF9nkjXzyRTZoigIf6MPZZ5/ddhdQg2zyRTZ5I598\nkQ2aosAH+sCQZfkim3yRTd7IJ19kg6Yo8AEAAIABQoEPAAAADBAKfKAPS5YsabsLqEE2+SKbvJFP\nvsgGTVHgA32YmJhouwuoQTb5Ipu8kU++yAZNOSLa7gMqbA9JGhsbG9PQ0FDb3QEAAEDF+Pi4hoeH\nJWk4Isbb7k8ZR/ABAACAAUKBDwAAAAwQCnygD6tWrWq7C6hBNvkim7yRT77IBk1R4AN9mDdvXttd\nQA2yyRfZ5I188kU2aIoCH+jD4sWL2+4CapBNvsgmb+STL7JBUxT4QB8Y3ShfZJMvsskb+eSLbNAU\nBT4AAAAwQCjwAQAAgAFCgQ/0YdmyZW13ATXIJl9kkzfyyRfZoCkKfKAP4+NZ3bAOJWSTL7LJG/nk\ni2zQlCOi7T6gwvaQpLGxsTEurAEAAMjQ+Pi4hoeHJWk4IrLaC+MIPgAAADBAKPABAACAAUKBDwAA\nAAwQCnygDyMjI213ATXIJl9kkzfyyRfZoCkKfKAP8+fPb7sLqEE2+SKbvJFPvsgGTTGKToYYRQcA\nACBvjKIDAAAAYJOgwAcAAAAGCAU+0Ifly5e33QXUIJt8kU3eyCdfZIOmKPCBPoyOjrbdBdQgm3yR\nTd7IJ1+yUh9NAAAgAElEQVRkg6a4yDZDXGQLAACQNy6yBQAAALBJUOADAAAAA4QCHwAAABggFPhA\nH+bOndt2F1CDbPJFNnkjn3yRDZqiwAf6MGfOnLa7gBpkky+yyRv55Its0NS0HUXH9qGSzpH0CEl7\nR8T1m2CdQ5IuVdoxekpEfOc+XA+j6AAAAGSKUXQ2Itvb2D5d0reVivsp7aHYPtj2BbZvsj1h+0rb\np9neaortZ0j6qCRPZZ22d7C91PbVtu+y/Tvb59reZyrrAwAAAPoxrQp82w+T9GNJx0g6okG74yWt\nkLSrpKMl7S9pmaRFkr5je+YUFvM6SQ+VdNsU1reHpMsl/bOkt0raV9KJkh4n6XLbh0217wAAAEAT\n06rAVyrMvy5p/4i4eCoNip2CZZJulvTMiPheRFwbEWcoFfgHSTpjkmU8UtIbJL1WUyjwJZ0raW9J\nL4uIT0TEdRHxNUlHKj3nn7F9/6n0H3lasWJF211ADbLJF9nkjXzyRTZoaroV+F+MiPkRcVeDNqdJ\n2krSORFxR2Xa+yTdI2me7Qf3WMZHJP0gIj482cpsP1HS4ZJ+FxHnl6dFxLWSLpC0i6T5U98E5Gbp\n0qVtdwE1yCZfZJM38skX2aCpaVXgR8Mrgm1voXQ6jyR9o8vybpd0mdLz8LyaZcyXNCTppVNc7fOL\n79+qmf51pfP4j5vi8pChT33qU213ATXIJl9kkzfyyRfZoKlpVeD3YR9JOxU/r6yZZ6VSwX1gdYLt\nWZLeLunNEXHNFNd5sNJFuL3WJ0n72956istEZmbOnMplG2gD2eSLbPJGPvkiGzQ16AX+w0s//75m\nnhu6zNvxQUlXS3pXH+ucbH1bSJrdYLkAAADApLZsuwP3sR2K76sjYnXNPBPF9x3LD9o+QdLTJB0U\nEWv6WGfddQITpZ93rJkHAAAA6MugH8Hvi+1dJb1b0ukR8eO2+4P8LFiwoO0uoAbZ5Its8kY++SIb\nNDXoBf7txfcZxY2quumc2FYe/vIsSX+QtHgD1rntJOurrhPTyKxZs9ruAmqQTb7IJm/kky+yQVOD\nXuCXL4zdo2aePbvMe6ykWZJW2b6j/FU8LklfLR673fYLuqxzsvWtkfTrXp0/8sgjNTIyss7XIYcc\nouXLl68z30UXXaSRkZH12p988slatmzZOo+Nj49rZGREq1atWufxRYsWacmSJes8dv3112tkZEQr\nV657vfBZZ5213tGEiYkJjYyMrDdW7+joqObOnbte34477rhpvR2nnHLKQGxHxyBtx0Me8pCB2I5B\nyaO8HaeccspAbIc0GHlUt6Pzvjbdt6NsULZj5cqVA7Ed0zmP0dHRv9Zis2fP1gEHHKBTTz11veXk\nwg1HnsyK7TVKI9bMjojru0zfQtItSufFz+l2cyzb35H0BEmvjoj3FI89rMdqvy1pL0kvlHRp8diN\nEXFn0fZMpTHuPxkRJ3RZ3zylcfWviIgDarZrSNLY2NiYhoaGenQFAAAAbRgfH9fw8LAkDUfEeNv9\nKRvoI/jFxbGfVxoG8/DqdNs7KA2PuUbS50rtflX3JekvxWy/Kz1+Z2mxnym+P6WmW09X2in59IZs\nGwAAANDNQBf4hbdLulfSXNv3r0ybL2lrpbvc/t/GWFlEXCLpm5L2sr3OzayKTwaOlrRK0tkbY31o\nR/XjQeSDbPJFNnkjn3yRDZqadgW+7V1s7267fI77bsVju1fnL25Q9VJJu0j6iu1Dbc+2/Wqli2gv\nk9TzJCrb25XW2blYd+fisV26NHmRpOskfdj2Sbb3tj1H0peUPi04triLLqaphQsXtt0F1CCbfJFN\n3sgnX2SDpqbdOfi2r9XaC13XmSQpIqLraDm2D5L0eqXz7beXdK2k/5L0zoi4d5J1LpK0SOnUmqrr\nImK9c/aL03/eIOkYSQ9WGpXnYklvi4irJlkf5+Bn7vrrr2dUg0yRTb7IJm/kky+yyVPO5+BPuwJ/\nc0CBDwAAkLecC/xpd4oOAAAAgHoU+AAAAMAAocAH+lC9+QbyQTb5Ipu8kU++yAZNUeADfZiYmGi7\nC6hBNvkim7yRT77IBk1xkW2GuMgWAAAgb1xkCwAAAGCToMAHAAAABggFPtCHVatWtd0F1CCbfJFN\n3sgnX2SDpijwgT7Mmzev7S6gBtnki2zyRj75Ihs0RYEP9GHx4sVtdwE1yCZfZJM38skX2aApCnyg\nD4xulC+yyRfZ5I188kU2aIoCHwAAABggFPgAAADAAKHAB/qwbNmytruAGmSTL7LJG/nki2zQFAU+\n0Ifx8axuWIcSsskX2eSNfPJFNmjKEdF2H1Bhe0jS2NjYGBfWAAAAZGh8fFzDw8OSNBwRWe2FcQQf\n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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualization of the path\n", + "pyplot.figure(figsize=(8,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'x', fontsize=18)\n", + "pyplot.ylabel(r'y', fontsize=18)\n", + "pyplot.title('Glider trajectory, flight time = %.2f' % T, fontsize=18)\n", + "pyplot.plot(x,y, 'k-', lw=2);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grid convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's study the convergence of Euler's method for the phugoid model. In the previous lesson, when we studied the straight-line phugoid under a small perturbation, we looked at convergence by comparing the numerical solution with the exact solution. Unfortunately, most problems don't have an exact solution (that's why we compute in the first place!). But here's a neat thing: we can use numerical solutions computed on different grids to study the convergence of the method, even without an analytical solution.\n", + "\n", + "We need to be careful, though, and make sure that the fine-grid solution is resolving all of the features in the mathematical model. How can we know this? We'll have a look at that in a bit. Let's see how this works first.\n", + "\n", + "You need a sequence of numerical solutions of the same problem, each with a different number of time grid points.\n", + "\n", + "Let's create a NumPy array called `dt_values` that contains the time-increment of each grid to be solved on. For each element `dt_values[i]`, we will compute the solution `u_values[i]` of the glider model using Euler's method. If we want to use five different values of $\\Delta t$, we'll have five solutions: we put them in an array ... but each one is also an array! We'll have an array of arrays. How meta is that?\n", + "\n", + "We have one more trick up our sleeve: `enumerate()`. To get all the numerical solutions—each with its value of $\\Delta t$—done in one fell swoop, we will loop over the elements of the array `dt_values`. Within the loop, we need to access both `dt_values[i]` and the index `i`. It turns out, `enumerate()` is a built-in Python function that will give us consecutive `index, value` pairs just like we need. \n", + "\n", + "Read the code below carefully, and remember: you can get a help pane on any function by entering a question mark followed by the function name. For example, add a new code cell below and type: `?numpy.empty_like`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), we compared our numerical result to an analytical solution, but now we will instead compare numerical results from different grids. \n", + "\n", + "For each solution, we'll compute the difference relative to the finest grid. You will be tempted to call this an _\"error\"_, but be careful: the solution at the finest grid is _not the exact_ solution, it is just a reference value that we can use to estimate grid convergence.\n", + "\n", + "To calculate the difference between one solution `u_current` and the solution at the finest grid, `u_finest`, we'll use the $L_1$-norm, but any norm will do.\n", + "\n", + "There is a small problem with this, though. The coarsest grid, where $\\Delta t = 0.1$, has 1001 grid points, while the finest grid, with $\\Delta t = 0.001$ has 100001 grid points. How do we know which grid points correspond to the same location in two numerical solutions, in order to compare them? \n", + "\n", + "If we had time grids of 10 and 100 steps, respectively, this would be relatively simple to calculate. Each element in our 10-step grid would span ten elements in our 100-step grid. \n", + "\n", + "Calculating the _ratio_ of the two grid sizes will tell us how many elements in our fine-grid will span over one element in our coarser grid.\n", + "\n", + "Recall that we can _slice_ a NumPy array and grab a subset of values from it. The syntax for that is\n", + "\n", + "```Python\n", + "my_array[3:8]\n", + "```\n", + "\n", + "An additional slicing trick that we can take advantage of is the \"slice step size.\" We add an additional `:` to the slice range and then specify how many steps to take between elements. For example, this code\n", + "\n", + "```Python\n", + "my_array[3:8:2]\n", + "```\n", + "\n", + "will return the values of `my_array[3]`, `my_array[5]` and `my_array[7]`\n", + "\n", + "With that, we can write a function to obtain the differences between coarser and finest grids. Here we go ..." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = ceil(N_fine/N_current)\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the function has been defined, let's compute the grid differences for each solution, relative to the fine-grid solution. Call the function `get_diffgrid()` with two solutions, one of which is always the one at the finest grid. Here's a neat Python trick: you can use negative indexing in Python! If you have an array called `my_array` you access the _first_ element with\n", + "\n", + "`my_array[0]`\n", + "\n", + "But you can also access the _last_ element with \n", + "\n", + "`my_array[-1]`\n", + "\n", + "and the next to last element with\n", + "\n", + "`my_array[-2]`\n", + "\n", + "and so on. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.1\n", + "dt = 0.05\n", + "dt = 0.01\n", + "dt = 0.005\n", + "dt = 0.001\n" + ] + } + ], + "source": [ + "# compute difference between one grid solution and the finest one\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " print('dt = {}'.format(dt))\n", + "\n", + " ### call the function get_diffgrid() ###\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Time to create a plot of the results! We'll create a *log-log* plot with the Matplotlib function [`loglog()`](http://matplotlib.org/api/pyplot_api.html?highlight=loglog#matplotlib.pyplot.loglog). Remember to skip the difference of the finest-grid solution with itself, which is zero." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAGNCAYAAACrEY57AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYVNW19/HvamYERAQFoqJBHBMjjuCUhlwFghhocABF\nuBFRo4DBKBoVWzMYIsaJwVwVCIoyCNJIC4L3plEE8SqQiMMNoAyvgAwXRW3G7vX+UQUXmh6rq+qc\nqvp9nqcfqXN2nbPgKXvV3mufvc3dERERCaOsoAMQEREpi5KUiIiElpKUiIiElpKUiIiElpKUiIiE\nlpKUiIiEVs2gAwgbM9OcfBGRKnJ3S8R11ZMqhbun/M9DDz2UFveMxzVjuUZV3lPZthW1q+75VPkJ\n6u8Rxs9nqnw2K2qTSEpSaSo7Ozst7hmPa8Zyjaq8p7JtK2pX0fk1a9ZU6j5hF8RnM1H3re41U+Wz\nWdX7xpMlOgumGjNz/ZtIGPXv358JEyYEHYbIYcwM13Bf8uTm5lJQUBB0GCKH6N+/f9AhiByioKCA\n3NzchN5DPakS1JMSEaka9aRERL17yUhKUiIiEloa7itBw30iIlWj4T4REclISlIiKUI1KclESlIi\nIhJaqkmVoJqUiEjVqCYlIiKhk5+fT6dOnRJ6DyUpkRShmpSESX5+PkOGDGHevHkJvY+SlIiIVNnT\nTz/N6tWrE34fJSmRFBHUKtQipdm9e3dS7qMkJSIiVbZz586k3EdJSiRFqCYlYbFp0yZWrlyZlHsp\nSYmISKXt3buXa665hu3bt3PmmWdyxRVXJPR+ek6qBD0nJSJStqFDh/LEE0/QsmVLPvzwQ5o3b57Q\n56SUpEpQkhIRKd3kyZPp3bs3NWvWZMGCBVx00UWAHuYVEVSTkmB9/PHH3HTTTQA88cQTBxJUoilJ\niYhIub755htycnIoLCzkhhtu4Pbbb0/avTXcV4KG+0RE/k9xcTE9e/Zk5syZnHXWWSxevJj69esf\n0kbDfSIiEog///nPzJw5kyOPPJLp06cflqASLW5Jysx+aGZtzUyJTyQBVJOSZHvrrbe4//77AXjp\npZc4+eSTkx5DlROKmfUwsy/MbP5Bx54AVgEfAh+Z2TFxjFFERJJs3bp19O7dm+LiYh588EGuvPLK\nQOKock3KzKYDtYF73f1jM7sIWAi8B7wM9AaWufsd8Q42GVSTEpFMt2vXLi699FI++OADOnXqRH5+\nPjVq1CizfSJrUjVjeM85wLnu/r/R1wOAPUCOu28ys2nA4ngFKCIiyTV48GA++OADTjzxRF5++eVy\nE1SixVI/qrM/QZlZTeAqIM/dNwG4+1dA3fiFKCKgmpQkxwsvvMBzzz1H3bp1mT59Ok2aNAk0nliS\n1Hdm1jz65+5AE2Dy/pNm1gDYG4fYREQkiT788MMDz0CNHTuWc845J+CIYqtJPQp0Bt4C+gM7gR+6\n+z4zawqMAJq7e9c4x5oUqkmJSCbatm0b5557LmvXruWWW27h2WefrfR7w1aT+h3Qgkgt6ivg36MJ\nqiawOdqmX5ziC0Rubi7Z2dnaZE5EMkJRURF9+vRh7dq1XHDBBTz11FOVel9BQUHCh6G14kQJ6klJ\nWBUUFOiLkyTEgw8+yO9//3uaNm3K0qVLOf7446v0fq04ISIiCTFr1ix+//vfk5WVxZQpU6qcoBIt\npp6UmRmRSROdgabu3tPM2gA/Ama5e1F8w0we9aREJFOsXLmS8847jx07djBixAjuueeemK4Tqv2k\nzKwekA9kRw995+6NzKwtkckU/wSucvdv4xlosihJiUgm+P7772nXrh0rVqygR48eTJ8+nUj/o+rC\nNtz3IHAqcDtwIVAI4O7LgOOAbcBv4xWgiEToOSmJF3dn4MCBrFixglNPPZUJEybEnKASLZbZfVcT\nWV1iCUR6HvtPuPtOM7sVWATcF58QRUQknkaNGsXLL7/MEUccwYwZM2jUqFHQIZUpluG+be5+9EGv\nN7p7ixJtNrh7yzjFmFQa7hORdLZw4UI6dOjAvn37mDJlCtdcc021rxm24b49ZtairJNm1hoojj0k\nERFJhI0bN3L11Vezb98+hg4dGpcElWixJKk3gKlmdtjGImZ2CfAq8Hp1AxORQ6kmJdWxd+9err32\nWjZt2sRPf/pTRowYEXRIlRJLknoAOAH4l5mtBpqY2VIz+wp4GzgSeCiOMYqISDXdc889vPPOO7Rs\n2ZIpU6ZQs2YsUxKSL9bnpI4B/gj0AvZX3L4BpgL3u/vWuEWYZKpJiUi6mTx5Mr1796ZWrVosWLCA\n9u3bx/X6oXpO6pA3R7aKbxZ9ucXdU74WpSQlIulkxYoVXHjhhRQWFjJq1KgDq5zHU9gmThzg7sXu\n/lV0D6ka0W06RCQBVJOSqvrmm2/IycmhsLCQG264gV/96ldBh1RlVU5SZnaVmW03s/81sw4HnToW\n+MrMHo5feCIiEovi4mL69evHypUrOeuss/jrX/8a2gd2yxNLT+pGYBXQFSg46PiXRNbz62lmg6sf\nmogcTCugS1WMGDGCvLw8GjduzIwZM6hfv37QIcUklod5VwKXu/uaMs63IbKd/BnVDy/5VJMSkVQ3\nf/58OnfuTHFxMbNnz6Zr18TuQRu2mlTDshIUgLuvBI6KOSIRKZVqUlIZa9eupXfv3hQXFzN8+PCE\nJ6hEiyVJ7a1gxYkWQMpu1SEikqp27dpFr1692LZtG507d2b48OFBh1Rtsa44Md3MTi95wszOBaYR\n2cpDROJINSmpyODBg/nggw848cQTmTRpEjVq1Ag6pGqLpSbVHFgCHA+sBzYAtYEWQHNgHXBhdFp6\nylFNSkRS0QsvvMCAAQOoW7cuixYtom3btkm7d6hqUu6+CTgfGEdkCaQLgbZAfeAF4PxUTVAiYaaa\nlJTlgw8+OPCQ7rPPPpvUBJVoMS3e5O6bgQFmNpBSVpwws9Pd/dM4xSgiImXYunUrPXv2ZPfu3dx6\n663069cv6JDiqlrLIpV5Ue0nJSKScEVFRXTp0oX58+dz4YUXsmDBAurUqZP0OBI53BdTT8rMugO/\nAFoCtUqeBo4+7E0iIhJXDz30EPPnz6dZs2a8+uqrgSSoRItl4sSdwF+AfcBWYE8pzX7g7iWTV0pQ\nT0rCqqCgQDP85IC8vDy6d+9OVlYW8+fPp2PHjoHFErae1B3Ab4G/uHtpCQoz21itqEREpEwrV67k\nxhtvBODRRx8NNEElWiw9qS3AMeV1N8ws290LqhlbINSTEpEw+/7772nXrh0rVqwgJyeHV199NfCF\nY0M1BR34GGiSgOuKiEg53J2bb76ZFStWcNpppzF+/PjAE1SixZJM7gDGmNlZ5bSZFGM8IlIGPScl\nzzzzDK+88goNGjRgxowZNGrUqOI3pbhYalKvAw2Aq82skMjkiYN35DWgaRxiExGRqIULF3LXXXcB\nMG7cOE4//bCV6dJSLDWp3cAiIsmoLO3cvW51AguKalIiEjYbN27knHPOYdOmTdx1112MHDky6JAO\nkciaVCxJaqO7l7kKemXbhJWSlIiEyd69e+nYsSMLFy4kOzub+fPnU7NmTI+4JkzYJk70rUSbzjFc\nV0TKoZpUZrr77rtZuHAhP/jBD5g8eXLoElSixbLA7FuVaPOP2MIREZH9XnnlFZ566ilq1arFtGnT\nOPbYY4MOKeliWrvPInMeuxPpMTV1957RbeN/BMxy95Td9FDDfSISBitWrODCCy+ksLCQ0aNH86tf\n/SrokMoUqhUnzKwekU0Ns6OHvov+twHwPPBPM7vK3b+NS4QiIhnmm2++IScnh8LCQvr27cttt90W\ndEiBiaUm9SBwKnA7kb2kCgHcfRlwHLCNyLJJIhJHqkllhuLiYvr168fKlSv5yU9+wrPPPpv2D+yW\nJ5YK3NVAjrsvgcjw2P4T7r7TzG4lMkX9vviEKCKSOUaMGEFeXh6NGzdm+vTp1K9fP+iQAhXLFPRt\n7n70Qa8Pm26u/aRERKpu/vz5dO7cmeLiYmbPnk3Xrl2DDqlSwjYFfY+ZlfkMlJm15tAVKELBzGqZ\n2TAz+87MTgg6HhGRg61du5bevXtTXFzMQw89lDIJKtFiSVJvAFPN7OSSJ8zsEuBVIksnhc0tQAGQ\n2X1nSVmqSaWvXbt20bNnT7Zt20aXLl0YPnx40CGFRiw1qQeA94B/mdkXQBMzWwr8AGgGrAEeiluE\nceLuo4CMLkCKSDgNGjSIDz/8kJNOOomXXnqJrCxtJLFfLA/zbgTOB8YR2Sa+FnA2UBt4DrjA3TfH\nK0Aza2Fmc80sdEOIIsmkXXnT0/PPP8/zzz9P3bp1mT59Ok2aVLQTUmaJaX2NaBIaYGYDifSeALa4\ne1wTiZnlACOJbFFf3iaLxwBPAOdGD30E3OnuX8YzHhGReMjPz+fpp59m69atLFu2DIBnn32Wtm3b\nBhxZ+FS5J2Vm481snJn9m7sXu/tX0Z9E9HTuAjoSGV4sdZzOzGoD84kk3DOiP98DfzezIxIQk0gg\nVJNKD/n5+QwZMoR58+axdOlS3J1GjRrRtKl2OCpNLAOf/YgM8W2KcyylucTd11TQph/wY2BYNGkW\nA8OAHwJlPaatwpSIBOLpp59m9erVhxzbsWMHzzzzTEARhVssSWqzu/d19xVxj6aESj6w1BNYe3Ay\nc/evgE+i5wAws0vN7Bkiw4a5ZvaLOIcrklCqSaWHXbt2Vel4poslSa0ws3If1DWzv8UYTyzOAr4o\n5fgaIj0sANz9HXcf5O413P3f3T0vWQGKiOz35Zell8rr1k3JfWITLpYkNRgYa2bnldPmihjjiUVT\noLTFbHcA9c2sThJjEUkY1aRS34QJEw4b6gNo3bo1gwYNCiCi8Itldl8+kRXP3zezncAWDl1hwogk\njmTRGkYiEnrz5s3j5ptvBuC2227j888/Z9euXdStW5dBgwZphYkyxJKkWhJZQLa8yQfJ3Dp+K9Cw\nlOONgO/dfXdVL9i/f39OPPFEABo3bszZZ599oB6w/9usXut1sl9nZ2eHKh69rvzrxo0b07NnT/bt\n28d1113HmDFjQhVfVV/v//OaNWtItFgWmD1sQdlY2lTxnhOAG939sOFJM5sDnObuJ5U4/hHwrbtf\nVMV7aYFZEYmbdevW0a5dOzZu3Ejv3r3TckWJsC0w27cSbTrHcN2KlJU5ZgCtzKzV/gNmdixwGjA9\nAXGIBOLgb7GSGrZv306XLl3YuHEj2dnZjB8/Pu0SVKLFsizSWxbRw8z+ambTAcysTfRYDXf/R/xD\nLXN4cQKRFSZGmFkNM8sC/gR8DoxNQBwiIhXavXs3PXr04JNPPuGMM87gtddeo04dzeOqqliG+w7b\nPt7dG5lZW+At4J9AXLaPN7MxQBciEzHqA+uI9KhOdfe9B7XbvyzSedHzMS+LpOE+Eamu4uJibrjh\nBl555RVatGjBe++9xwknpO8OQYkc7oslSf2RyCoPvwc+AF539+bRc/WAF4GV7p6SO/MqSYlIdd17\n772MGDGCBg0a8M4773D22WcHHVJCha0mtX/7+LHu/t8cVCty953ArRy00oOIxIdqUqlh9OjRjBgx\ngpo1azJ9+vS0T1CJFkuSauLuS8o66e5biTxHlbJyc3P1C0FEqmzWrFkMHjwYgOeee44rrkjmugbJ\nV1BQQG5ubkLvEdMUdOCc6L5Sh003j24fv8Ddj4trpEmi4T4RicWSJUvo0KEDO3fu5OGHH86o3XXD\nNtyXqtvHi4gkxKpVq7jyyivZuXMnN910Ew8++GDQIaWNWHpSLYjs73Q8kYVdjwM+5tDt49vFc3fe\nZFJPSsKqoKDgwJP/Eh5btmzhoosuYtWqVXTq1InXX3+dWrVqBR1WUoWqJ5Xs7eNFRMKqsLCQq666\nilWrVtG2bVumTZuWcQkq0SrsSZnZA0R2x73a3beVOJdFArePD4J6UiJSGUVFRfTs2ZO8vDxatWrF\n4sWLadEimcuWhkfQPal/J9JD2h4Npt/+E0nYPl5EJHTcnTvvvJO8vDwaN27MnDlzMjZBJVplktQR\n7v7KQUnoTxW9wcyWVy8sESlJj0WEx+OPP86oUaOoXbs2eXl5nH766UGHlLYqk6QKzax9Fa97bCzB\niIiE3eTJk7n77rsBmDhxIpdddlnAEaW3yuwnNQl418y+AnYBzczs83LaJ3vTw7jLzc09sH+PSFjo\n8xi8BQsW0K9fpOLx2GOPce211wYcUbAKCgoS3sOvzMSJGsBtwM+Ao4D2wOIKrtvO3evGJcIk08QJ\nESnNJ598wsUXX8zXX3/NoEGDeOqppzBLyFyBlBO2BWaTvulhMilJSVjpOangbNiwgfbt27Nu3Tp6\n9OjBtGnTqFGjRtBhhUags/vM7AEz+y8zOzp66IZKXLcyGyOKiITet99+S9euXQ/ssDtp0iQlqCSq\nzHDfauABYIq7F5tZP3f/W1KiC4B6UiKy3969e+nWrRtvvvkmJ598MosWLaJZs2YVvzHDBP2clKag\ni0jGcXduvfVW3nzzTZo1a8bcuXOVoAKgKegiKULPSSXXI488wrhx46hXrx6zZ8+mdevWQYeUkTQF\nXUSkhPHjx5Obm0tWVhaTJ0/mggsuCDqkjFWZmlQW8CuqNgW9vbvXiUuESaaalEhmmzdvHl27dmXf\nvn2MGTOG2267LeiQQk9T0JNISUokcy1fvpxLL72U7777jmHDhvGnP1VYgheCnzhRUmWml98Tw3VD\nQ9vHSxjpM5lY69at4+c//znfffcdvXv35o9//GPQIYVeKLePr9RFzTa4e8u4XzgJ1JOSsNLDvImz\nfft2LrnkEj755BOys7OZO3cudeqkZMUiEIEO95lZLtDE3QdHX38BlPcmA45z95Tc+UtJSiSz7N69\nm06dOrFgwQLOPPNMFi5cSOPGjYMOK6UEnaQ2AI2Apu6+y8z2AO8SSUZl0dp9IhJ6xcXFXH/99Uye\nPJmWLVuyePFiTjjhhKDDSjmJTFKVmYJ+DlDH3XdFX29z9w7lvcHMNlY7MhE5hIb74u++++5j8uTJ\nNGjQgPz8fCWoEKowSbn7phKHbq3EdSvTRkQkMKNHj+bPf/4zNWvWZPr06Zx99tlBhySlSMjEiVSm\n4T6R9JeXl0dOTg7FxcWMHz+e/v37Bx1SSgvbFPQKmdlHibiuiEh1LVmyhN69e1NcXMzDDz+sBBVy\nFQ73mVk/yp/Nd9hbgONjjkhESqWaVPWtWrWKK6+8kp07d3LTTTfx4IMPBh2SVKAyEyfGJzwKEZEE\n27JlC126dGHr1q107tyZsWPHamfdFFCZKejbgBz+b8p5PeBR4L+BAmD/xIrmQDZwOXCnu8+Mf7iJ\np5qUSPopLCykY8eOLFmyhLZt27JgwQIaNmwYdFhpI+gp6AvdfcFBwTwF/N7dXy2l7SQzywGuBFIy\nSUFkWaTs7GwNrYikgaKiIvr06cOSJUto1aoV+fn5SlBxUlBQkPDlumJZYPZzoHVZ3Y3oqulfuHur\nOMSXdOpJSVipJlV17s6gQYMYPXo0Rx11FO+++y6nn3560GGlnbDN7msKlLdmSGMiW3qIiARq5MiR\njB49mtq1a5OXl6cElYJi6UktAPYCv3b3j0qcOwv4C1DT3bPjFWQyqSclkh4mT55M7969D/z52muv\nDTii9BW2/aTOBf4ONAA2Rn+MyMSJFsB3QLa7L41vqMmhJCWS+hYsWMAVV1zBnj17GDlyJHfddVfQ\nIaW1UA33ufuHwPnAdOBIImv7tY3+eRpwXqomKJEw035SlfPJJ5/QvXt39uzZw6BBgxg6dGjQIUk1\nVGZ232Hc/X+Aq82sBtAseniLuxfFLTIRkSrasGEDXbp04euvv6ZHjx488cQTehYqxWntvhI03CeS\nmr799lsuu+wyli9fTvv27fnP//xP6tWrF3RYGSFUw30iImGzd+9err76apYvX06bNm2YNWuWElSa\nUJISSRGqSZXO3bnlllt48803adasGXPmzKFp06ZBhyVxoiQlIintkUceYfz48dSrV4/Zs2fTunXr\noEOSOFJNqgTVpERSx/jx4/nlL39JVlYWM2fOpFu3bkGHlJFUkxIRKeHNN9/k5ptvBmDUqFFKUGlK\nmx6WIjc3V+P/Ejr6TP6fZcuW0atXL4qKihg2bBi33XZb0CFlpIKCAnJzcxN6j8ps1RHLpodPuXt5\n6/uFlob7JKy0wGzE2rVrad++PRs3bqRPnz68+OKLZGVpUChIgS6LZGbFsVzY3VPyU6MkJRJe27dv\n5+KLL+bTTz8lOzubuXPnUqdOnaDDynhB7ye1nRg2PYxnkCIiu3fvpkePHnz66aeceeaZvPbaa0pQ\nGaAyPak8d//FQa+fAt4pY9NDopse/tzdB8Q10iRRT0rCKpOH+4qLi7n++uuZPHkyLVu2ZPHixZxw\nwglBhyVRgc7uOzhBRXUjsrhsWWYS6U2JiMTFfffdx+TJk2nYsCFvvPGGElQGiWWrjh1AK3ffXsb5\nJsAad28Uh/iSTj0pkXAZPXo0d9xxBzVr1uSNN97g8sv1HThswvac1DJgmpn9uOSJ6KaHUwFt1SEi\n1ZaXl8fgwYMBeP7555WgMlAsW3UMJbLp4T/MrMxND+MVoIhEZFpN6r333qN3794UFxfzyCOP0K9f\nv6BDkgBo00MRCZ1Vq1bRrVs3du7cyYABA3jggQeCDkkCUq21+9Jx00PVpESCtWXLFtq3b8/q1avp\n3Lkzs2bNolatWkGHJeUIW03qAHcvcvdN0Z8DCcrMbqh+aCKSaQoLC+nWrRurV6/mnHPOYdq0aUpQ\nGS5Rq0I8lqDrimSsdF+7r6ioiD59+rBkyRJatWpFfn4+DRo0CDosCViFEyfMLBdo4u6Do6+/oPy1\n/AzQjmMiUmnuzpAhQ8jLy+Ooo45izpw5NG/ePOiwJAQqs+LEBqAR0NTdd5nZHmBRBddt5+514xRj\nUqkmJZJ8jz32GPfccw+1a9fmrbfe4tJLLw06JKmCoBeYbQ7Ucfe10dcb3b1FBe+psE1YKUmJJNcr\nr7xCnz59AJgyZQrXXHNNwBFJVQW9LNKm/Qkqqo6ZjTOzfyvnbbdWP7TgaD8pCaN0/EwuWLCA/v37\nAzBy5EglqBQTiv2kDntDZOuOScAId1+RkKgCpJ6UhFW6Pcz7ySefcPHFF/P1118zePBgnnzyScwS\n8mVcEizQ4b5Sgtnk7mlb0VSSEkm8DRs20L59e9atW0ePHj2YNm0aNWrUCDosiVHYnpNaYWYty2tg\nZn+LMR4RSXPffvstXbt2Zd26dbRv355JkyYpQUmZYklSg4GxZnZeOW2uiDEeESlDOtSk9u7dS69e\nvVi+fDlt2rRh1qxZ1KtXL+iwJMRiWWA2H2gAvG9mO4EtwMFbzOs5KRE5jLtzyy23MG/ePJo1a8ac\nOXNo2lS/KqR8sdSkdhN5Tqq88Uc9JyUih8jNzeXhhx+mXr16FBQUcMEFFwQdksRJ2CZO6DkpEamS\ncePGcdNNN5GVlcXMmTPp1q1b0CFJHIVt4kTfSrTpHMN1RaQcqVqTevPNNxk4cCAQ2WVXCUqqIpb9\npN6qRJt/xBaOiKSTZcuW0atXL4qKirj33nu59daUfs5fAhDLcN9H7n7Y1vHpQsN9IvGxdu1a2rVr\nx6ZNm+jTpw8vvvgiWVmJ2nhBghS2mtTXRKahl6cY2Aa85+7bY4wtEEpSItW3fft2Lr74Yj799FM6\ndOjAnDlzqFOnTtBhSYKELUkVV9zqgN3An939oSrdJEBKUhJWqbIs0u7du7niiit4++23OfPMM1m4\ncCGNGzcOOixJoEQmqViek+oFPAHMAwqATdHjzYFs4FzgAaAh0B4YamYb3P2v1Q1WRMKtuLiYfv36\n8fbbb9OyZUvmzJmjBCXVEktP6gVgjru/Wsb5HOAyd78z+ro7kOvuZ1c32GRQT0okdvfccw+PPfYY\nDRs25J133uEnP/lJ0CFJEoRtuG8NcFJZv8nNLAtY5e4/jL6uAWxz95T4OqUkJRKbUaNGMWjQIGrW\nrMkbb7zB5ZdfHnRIkiRhe06qCVBewmnMocsiFQOFMdxHRA4S5uekZs6cyeDBkflUzz//vBKUxE0s\nSWoZMM3MDpuGbmZnAVOBpQcdvhrYGlt4IhJ27733Hr1798bdeeSRR+jXr1/QIUkaiWW471zg70QW\nmd0Y/TEiEydaAN8B2e6+1MyeA/oDj7v7vXGMO2E03CdSeStXruSiiy5i69atDBgwgP/4j//QxoUZ\nKFQ1KQAzOxX4PdAFqB89XEhkhfQH3f1f0XY/Bo4A/idVnpdSkhKpnM2bN3PRRRexevVqunTpwqxZ\ns6hZM5YJw5LqQpekDrw5MimiWfTlFncviktUAVKSkrAK03NShYWFdOjQgffff59zzjmHBQsW0KBB\ng6DDkoCE7TmpA6JJaVOFDVNMbm4u2dnZofmFIBImRUVF9OnTh/fff58TTzyR/Px8JagMVVBQkPAJ\nPdXqSaUj9aREyubu3HHHHYwZM4ajjjqKRYsWcdpppwUdlgQsbFPQRSRDPfbYY4wZM4Y6deqQl5en\nBCUJpyQlkiKCfk7qlVdeYdiwYQBMnDiRSy+9NNB4JDMoSYlIhQoKCujfvz8Ajz/+ONdcc02wAUnG\nUE2qBNWkRA718ccfc/HFF/PNN98wePBgnnzyST0LJYcI3RR0i3xCuxPZJr6pu/c0szbAj4BZqTwV\nXUlK5P9s2LCBdu3asX79enr06MG0adOoUaNG0GFJyIRq4oSZ1QP+E5gO3AzsX6SrAfA88JaZNYxb\nhCICJL8mtWPHDn7+85+zfv162rdvz6RJk5SgJOliqUk9CJwK3A5cSHTxWHdfBhxHZEfe38YrQBFJ\nvr1799KrVy/+8Y9/0KZNG2bNmkW9evWCDksyUCxr960EbnD3JdHXG929xUHnmwKL3P2UuEaaJBru\nk0zn7vzyl79kwoQJNGvWjMWLF9O6deugw5IQC9VwH9Bkf4IqjbtvJTL0JyIp6OGHH2bChAnUr1+f\n/Px8JSgJVCxJao+ZtSjrpJm1JrKHlIjEUTJqUuPGjePhhx8mKyuLKVOmcP755yf8niLliSVJvQFM\nNbOTS577NYS7AAAar0lEQVQws0uAV4HXqxuYiCTX3LlzGThwIACjR4/myiuvDDgikdhqUi2A94Dj\ngS+ITJb4GPgBkRXR1wDt3H1zXCNNEtWkJBMtW7aMyy67jO+++457772XRx99NOiQJIWE8TmpY4A/\nAr2ARtHD3xDZlff+aF0qJSlJSaZZu3Yt7dq1Y9OmTVx//fVMnDiRrCwtRiOVF7okdeDNZlkcup9U\nyteilKQkrBKxn9T27du5+OKL+fTTT+nQoQNz586ldu3acb2HpL+wze47wN2L3f2r6M+BBGVmp1c/\nNBFJpN27d9O9e3c+/fRTzjzzTGbMmKEEJaGTkLX7zGyDu7eM+4WTQD0pyQTFxcX06dOHKVOm0LJl\nS9577z2OP/74oMOSFBW6nXnNrDvwC6AlUKvkaeDoasYlIgk0bNgwpkyZQsOGDZkzZ44SlIRWlZOU\nmd0J/AXYB2wF9pTSTFVXkTiLV01q1KhRjBw5kpo1azJ9+nTOOuus6gcnkiCx9KTuAO4FnnT30hIU\nZraxWlGJSELMnDmTwYMHA/DCCy9w+eWXV/AOkWDF8pzUFuCY8go3Zpbt7gXVjC0QqklJulq8eDEd\nO3Zk165d/O53v+OBBx4IOiRJE2Gb3fcx0CQB1xWRBFm5ciXdunVj165dDBgwgPvvvz/okEQqJZZk\ncgcwxsx+Uk6bSTHGIyJliHXtvs2bN9OlSxe2bdtGly5dGDt2rHbWlZRRYU3KzL4ASo5/NQSuNrNC\nIpMnDn6I14CmcYtQRGJWWFhIt27dWL16Neeccw5Tp06lZs2YJvWKBKLCmpSZ7QYWEUk+ldXO3etW\nJ7CgqCYl6aKoqIicnBxmzZrFiSeeyOLFi2nevHnQYUkaCvo5qf919w5Vuahm94kEy90ZPHgws2bN\n4qijjmLOnDlKUJKSKlOT6lvZi5lZ/egfO8UWjoiUpSo1qccee4wxY8ZQp04dZs2axWmnnZa4wEQS\nqMIk5e5vHfzazMaU0/zPZraVyDYeIhKAl19+mWHDhmFmvPjii1xyySVBhyQSs1iek9ro7qXuzBvd\nwqMT8Ft3T8lFZlWTklRWUFDAFVdcwd69e3n88ccZOnRo0CFJBgjbc1Jlim50+BIpvnZfbm5uUrbq\nFomnjz/+mO7du7N3716GDBnCr3/966BDkjRXUFBAbm5uQu9RqZ6UmY0nMg3dgGuByWU0rQmcBtR2\n97PjFWQyqSclYVXe2n0bNmygXbt2rF+/npycHKZOnUqNGjWSG6BkrKBn9wH0K/G6fxntCoFPgdti\nDUhEqmbHjh38/Oc/Z/369Vx00UW89NJLSlCSNuJak0oH6klJKtm7dy9du3Zl/vz5tGnThkWLFtG0\nqZ6ll+QKW03qt3GPQkSqzN0ZOHAg8+fP55hjjmHu3LlKUJJ2qpyk3H18IgIRkfKVnMyTm5vLhAkT\nqF+/PrNnz+aHP/xhMIGJJJBWKxdJQS+88AKPPPIIWVlZTJkyhfPPPz/okEQSoso1qXSnmpSE3dy5\nc7nyyispKiri2Wef5ZZbbgk6JMlwYatJiUhAli5dSq9evSgqKuK+++5TgpK0p55UCepJSdjk5+fz\n9NNPs379elavXs2ePXu4/vrrefHFF7UvlIRCoM9JmdkDQEfganffloggRKR0+fn5DBkyhNWrVx84\nVq9ePXr16qUEJRmhMsN9/w48B2wHMLOSD/aKSII8/fTThyQogJ07d/Lss88GFJFIclUmSR3h7q+4\n+/7dd/9U0RvMbHn1whIRgF27dlXpuEi6qUySKjSz9lW87rGxBCMih9q0aVOpx+vWTcmNr0WqrDJr\n900C3jWzr4BdQDMz+7yc9gbosXeRapo1axb/+te/DjveunVrBg0aFEBEIslXmST1EPAV8DPgKKAl\nsK6C96Tt2n4iybB8+XL69OkDQN++fdm8eTO7du2ibt26DBo0iK5duwYcoUhyJGSB2VRehFZT0CVo\nmzZt4oILLmD9+vXccMMNTJw4UTP5JNTC9jBv3zi1EZESdu7cSffu3Q9su/Hcc88dSFDaiFMyUWX3\nkzrA3d+yyP81NwLXAK2jp1YCU939RXd/K44ximQEd+emm25iyZIlnHDCCbz22muaICEZL5bhvtpA\nHtCpjCZvAle5+95qxhYIDfdJUH73u98xfPhwGjRowKJFi/jxj38cdEgilRK24b57gbbA3cCpQKPo\nz2nAPdFz98UrQJFMMG3aNIYPH46Z8corryhBiUTF0pP6F3Cduy8t4/y5wGR3bxOH+JJOPSlJtg8+\n+IDLLruMnTt38vjjjzN06NBS2xUUFJCdnZ3c4EQqIWw9qUZlJSgAd/8QaBh7SCKZ48svv+Sqq65i\n586d3HTTTfz6178OOiSRUImlJ7UeOM/dvyrjfHPgA3c/Lg7xJZ16UpIs33//PZdddhlLly7lpz/9\nKfPmzaN27dpBhyVSZWHrSc0FXjWzc0qeiA71vQrMqW5gIumsuLiYG2+8kaVLl9K6dWumT5+uBCVS\niliS1IPACcAHZrbBzD6M/mwE/hs4LtpGRMowfPhwZsyYwZFHHsns2bM5+uijK3yPnpOSTFTlJOXu\nm4DzgXFAfSKz+doC9YAXgPOjbUSkFC+99BJ/+MMfqFGjBlOnTuW0004LOiSR0KrWzrxmlgU0i77c\nctB2HilLNSlJpMWLF5Odnc2ePXsYNWoUt99+e9AhiVRbImtS2j6+BCUpSZS1a9dywQUXsHnzZm6/\n/XZGjRoVdEgicRG2iRMiUkXffvst3bp1Y/PmzVx++eU8+eSTVb6GalKSiZSkRBKsqKiIPn368NFH\nH3HqqacydepUatas8rKZIhlJw30laLhP4u3uu+9m5MiRNGnShCVLlnDyyScHHZJIXGm4TyRFvfDC\nC4wcOZKaNWsyffp0JSiRKlKSEkmQBQsWcOuttwIwduzYaq+7p5qUZKKEJCkz+30iriuSKlavXk1O\nTg779u1j6NChDBgwIOiQRFJSdZ+Takrkgd5DDgP/7e7HVCewoKgmJdX19ddf0759ez777DO6du1K\nXl4eNWrUCDoskYRJZE2qylOMoonpKSAHqFNGM/2Wl4y0b98+rr32Wj777DN+9KMf8fLLLytBiVRD\nLPNg/wP4KTAV+BLYU0qbu6oTlEiq+vWvf828efNo1qwZr7/+Oo0aNYrbtbWflGSiWJJUB+ACd19Z\nVgMzuyr2kERS05gxYxg1ahS1a9fmtdde48QTTww6JJGUF8t+Up+6++kJiichzOw44BlgE3A88FB0\nc8bS2qomJVU2f/58unTpQlFRERMnTqRv375BhySSNGF7TmqMmQ0sr4GZfRBjPIkyBpjm7rcBvwWm\nRhfHFam2zz77jKuvvpqioiLuu+8+JSiROIppdp+ZPQlcBLwPbAUOXv3cgN+4eyi2kDezJsAW4Ch3\n3xE9tgbo5+4LSmmvnpRU2rZt22jXrh2rVq0iJyeHadOmkZWVmO8/qklJWIVtdt91wCAiyei8MprF\n5be8mbUAxgNXuHus/+efCOzZn6CiNkWPH5akRCprz5499OrVi1WrVtG2bVsmTpyYsAQlkqlimTiR\nC8wARgEbKX123/vViAkAM8sBRkavX2bSM7NjgCeAc6OHPgLudPcvqxuDSFncnTvuuIOCggJatGjB\nrFmzOOKIIxJ6T/WiJBPFkqSOAXq7+76yGpjZyNhDOuAuoCORpHhKGfepDcwHPgPOiB4eB/zdzNq6\n+/fAWqC2mTU6qDfVHFgThxglQz355JM899xz1K1bl7y8PI477rigQxJJS7GMTXxEZKv48iyK4bol\nXeLuaypo0w/4MTDM3YujOwMPA34I3Abg7tuAfKAbgJn9BCgC3o5DjJKB8vPz+c1vfgPA3/72N84/\n//yk3Fdr90kmiiVJ3Q6MMrMzymkzNcZ4Dqjk7IWewNqDk5m7fwV8Ej2336+Aq81sLPBH4DrNjpBY\nrFixgt69e1NcXMzDDz/MNddcE3RIImktluekvgAaAEcD3wPbOHx23/HuHpdd3cxsAnBjaRMnzGwD\n8Jm7dyxxfBbQ0d0bxHA/5S8p1ebNm7nwwgtZs2YN1113HS+//DJmCZnQJJJSQjW7D2hJZDivvIBa\nxBZOlTUFvi3l+A6gvpnVcffdSYpF0tju3bvJyclhzZo1XHjhhYwbN04JSiQJYklS/+vuHcprYGYb\nY4ynqtTlkYRzdwYOHMi7777L8ccfz8yZM6lXr6KybPzpOSnJRLEkqRsq0aZzDNeNxVagtIeGGwHf\nx9qL6t+//4F11xo3bszZZ5994JfD/uK1XmfO65dffpmJEydyxBFHMHz4cD777DOaN28emvj0Wq+T\n/Xr/n9esWUOixVKTGk+kB/Oyu7+VkKgOvd8Eyq5JzQFOc/eTShz/CPjW3S+K4X6qSckBr732Gjk5\nOZgZM2bMoHv37kGHJBI6YVu7rx9Qi8iqDclSVtaYAbQys1b7D5jZscBpwPRkBCbpa9myZdxwQ2Tg\n4NFHH1WCEglALElqs7v3dfcVcY+mbGVl6AlEntsaYWY1oovG/gn4HBibpNgkDW3cuJGrrrqKwsJC\n+vXrxz333BN0SIcMtYhkiliS1Aoza1leAzP7W4zxHHyNMdHp7j0BN7MvzOxzM6u1v4277wUuJ/Jw\n7ifRnwZEpp8XVjcGyUw7d+7kF7/4Bf/v//0/LrnkEv76179qJp9IQGKpSZ0BPAr8zt1L3ZLDzDa6\ne7KmoceValKZzd3p3bs3U6ZM4aSTTmLJkiU0a9Ys6LBEQi1sz0nlE+mtvG9mO4lsg1HyYd6mcYhN\nJOkeeeQRpkyZQsOGDXn99deVoEQCFktPajcVP8zbzt3rViewoKgnlbmmTJnCddddR1ZWFrNnz6ZL\nly5Bh3SIAj0nJSEVtp5UmB7mTYjc3Fyys7P1CyGDvP/++/Tv3x+Av/zlL6FLUCJhVFBQkPAJPbH0\npP6touejzOwn7v6PakUWEPWkMs/69eu54IIL2LRpEwMHDuTZZ5/VRAmRKkhkTyqm7ePTmZJUZvnu\nu++49NJLWb58OR07dmTu3LnUqlWr4jeKyAFhe5gXi+hnZvlm9ln053Uz6xvvAEUSpbi4mL59+7J8\n+XLatGnDtGnTQp2g9JyUZKIq16Siu+HmAZ1KnDoF6GpmfYCros8wiYTW/fffz8yZM2ncuDGzZ8+m\nSZMmQYckIiXE0pO6F2gL3A2cSmQx10ZEliK6J3ruvngFKJIIEydO5E9/+hM1atTg1Vdf5ZRTTgk6\npAppIo9kolgmTvyLyM62S8s4fy4w2d3bxCG+pFNNKv0tXLiQn/3sZ+zZs4exY8dy6623Bh2SSEoL\nW02qUVkJCsDdP6T07TNEArdmzRp69OjBnj17GDx4cEolKNWkJBPFkqT2RlcaL5WZNQf2xR5S8HJz\nc/ULIQ3t2LGDK6+8kq1bt9KpUycef/zxoEMSSWkFBQXk5uYm9B6xDPc9R6T+NKRkjyo61PcU8Km7\n3xy3KJNIw33pqaioiKuuuoo33niD008/ncWLF3PkkUcGHZZIWgjVc1LRntIS4Hgie0rtX12iJXAs\nsI7IskjJ3G8qbpSk0tPQoUN54oknOProo1myZAmtW7cOOiSRtBGqmlQ0+ZwPjAPqE5nN1xaoB7wA\nnJ+qCUrSS35+Pp06deKUU07hiSeeoEaNGrz22mspm6A0BC2ZKJa1+3D3zcAAMxsI7F8meou7FwOY\n2enu/mmcYhSpsvz8fIYMGcLq1asPHDv66KPZsWNHgFGJSFUlZFkkM9vg7uVujBhWGu5LD506dWLe\nvHmlHp87d24AEYmkr7Ctgo6ZdQd+QaQOVXIdGQOOrmZcItWye/fuUo/v2rUryZGISHXEsizSncBf\niEwz3wrsKaVZTGsCisRLnTp1Sj1et25KbnMGaD8pyUyxJJM7gN8CDdy9pbufWPKHSPISCczgwYMP\nmyDRunVrBg0aFFBEIhKLWKagbwGOKa9wY2bZ7l5QzdgCoZpU+sjPz+eZZ55h165d1K1bl0GDBtG1\na9egwxJJO2GrSX0MNAG2ldMmpYf7tDNveujatauSkkgChXVn3h8BDwJ/cPd/ltFmo7u3iEN8Saee\nlISValISVmHrSb0ONACuNrNCIvWn4oPOG9A0DrGJiEiGi6UntRtYRCQZlaWdu6fkNCr1pEREqiZs\nPan/dfcO5TUws43lnRcREamMWCY49K1Em84xXFdEyqG1+yQTxbLA7FsHvzazdqW0+Ud1ghIREYE4\nrN2XyjP5SqOalIhI1YRqqw4REZFkUZISSRGqSUkmUpISEZHQikeS6hmHa4RKbm6uvrVK6Gi1CQmb\ngoICcnNzE3qPhGx6mMo0cUJEpGo0cUJE1LuXjKQkJSIioZWU4T4zO8Xd/5XwG8WBhvtERKomHYb7\nbkzSfUREJI3EpSdlZuOAk8pp8mN3T4ntO9STkrDSflISVmFbBb00fwAeACZQ+hYev4nTfUREJIPE\nJUm5+2oz+9DdF5R23szaxOM+IplMvSjJRHpOqgQN94mIVE3oJ06Y2eVm1tXMNKVdJEH0nJRkorgk\nFXefH73W62b2ZzM7PR7XFRGRzFbp4T4za+vuyypoUwuYCnRz93hNykgqDfeJiFRNWIb77q6ogbvv\nBQYAe2KOKAS0wKyISMVCtcCsmf2nu/+skm3fcvd/q1ZkAVFPSsJKz0lJWIWlJ9XBzP5uZveb2UVm\nVqOctl9VNzAREZGq9KS+Ab4ETose+g54F/g78F/Ah/u7IGb2orv3jX+4iaeelIhI1YRlxYk33f0a\nM2sOdDzop1P0/Ddm9jaRpNUqvmGKiEgmqkpP6lx3/7CU4634v4TVAWgJuLuXNxwYWupJSVipJiVh\nFYqaVGkJKnp8rbuPd/e+7n4ccAawMl4BiohI5krIskhmNtndr4v7hZNAPSkRkapJZE8qUUkqZTY5\nLElJSkSkakIx3FcVqZqgRMJMD5hLJtKCsCIiElraqqMEDfeJiFRNyg33iYiIxIOSlEiKUE1KMpGS\nlIiIhJZqUiWoJiUiUjWqSYmISEZSkiqFNj2UMNJnUsImVJseZgoN90lYaYFZCauUWxYplSlJiYhU\njWpSIiKSkZSkRFKEalKSiZSkREQktFSTKkE1KRGRqlFNSkREMpKSlEiKUE1KMpGSlIiIhJZqUiWo\nJiUiUjWqSYmISEZSkhJJEapJSSZSkhJJEcuXLw86BJGkU5ISSRFff/110CGIJJ2SVJoKYmgoEfeM\nxzVjuUZV3lPZthW1y5ThvKD+nmH8fKbKZ7Oq940nJak0pSRVvWuEMUmtWbOmUvcJOyWp6r0/05KU\npqCXYGb6BxERqSLtJyUiIhlHw30iIhJaNYMOIBWZ2ZNAQ2A7cDYw3t0nBRuVCJhZE2Ak8B3gwA+B\noe6+MtDARGKknlRs9rj7Te7+G+C3wPNmpn9LCYPjgUJ3H+zuQ4A3gXEBxyRygJnVMrNhZvadmZ1Q\nUXv9Yo2Bu99z0MvTgI/dvTioeET2c/d/uPsdBx36AvhBUPGIlOIWoACoX5nGaZ2kzKyFmc01s7gn\nEDM7y8ymAoOBq+N9fUl/ifx8HqQbMCqB1xepEncf5e5LKts+bZOUmeUA7wInEhmbL6vdMWY2ycw+\ni/5MM7MfHHR+sJmtjP503H/c3f/p7tcAtwNvR2sBIpWS6M9n9FxXoIG7/yVBfw1JY0n6ElWhtE1S\nwF1AR+A9oNT5+2ZWG5hPZALJGdGf74G/m9kRAO7+tLu3if78l5ll7T8XPb8E2AlcltC/jaSbhHw+\nD3pvVyK9qL4J/VtIWkrGl6jKSuckdYm7r6mgTT/gx8Awdy+O1pWGEZkRdVsZ7zkBeH7/CzM7GmgO\nrK52xJJJEvX5xMyuBi5391vd3c3sqXgFLRkjoV+iqiJtk1Qldy7sCaw9+JeFu38FfBI9V5ptgJnZ\neDN7HHgRGOLuH1UzZMkgifp8mtlZwMvANWa20cw2AgOqH7FkmIR9iSqhwlUqMv05qbOAz0o5vobI\nt4jDuPu3wHUJjElkv1g+n/8EaiUwJskA1fkSZWb7v0SNLO1NZnYpcA2RYcRcM5vp7nll3STTk1RT\n4NtSju8A6ptZHXffneSYRPbT51PCrMpfogDc/R3gHWBQZW6StsN9laSFCyXM9PmUMKvwS1Q8bpLp\nSWorkeWNSmoEfK9vqRIwfT4lzJLyJSrTk9Q/gZNKOX4SoIkQEjR9PiXMkvIlKlOSVFkZfwbQysxa\n7T9gZscSWepoejICE0GfT0lNSfkSlSlJqqxpjhOI/GOOMLMa0UVi/wR8DoxNUmwi+nxKmAX6JSpt\nk5SZjTGzL4hMhXQz+8LMPjezA9Nz3X0vcDlQROTZk0+ABkBHdy8MIm7JDPp8SgoJ9EuUduYVEZFD\nmNkYoAuRGXz1gXVEelSnRr887W93DPAEcF70/EfAne7+ZdxiUZISEZGwStvhPhERSX1KUiIiElpK\nUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIiElpKUiIh\nZGatzGyLmZ1Sibanm9nPkhGXSLIpSYmE0/1AE+APlWj7Z6BHYsMRCYaSlEjImNmPgM3ANKCnmZ1X\nTtss4GLgv5IUnkhSaasOkZAxs/HAEOAYIhsdvu3u/1ZG27bAB8Cx7r41eVGKJId6UiIhYmYXA/90\n9x3uvgp4DuhoZpeXaJdjZi8CfwO2AE+Y2ejkRyySWOpJiYSImU0C/t3d90RfHwusAv7H3Q8b9jOz\nmcB6dx+U3EhFkkM9KZGQMLNuwJv7ExSAu39FZHvuc8zsmhLtawA/BRYkNVCRJFJPSiQEohMgXnT3\n60s51xBYDWwHznD3oujxC4D3gObuvjmZ8Yoki3pSIuFwAzCptBPu/i2RqehtgJsOOtWRyDCgEpSk\nLSUpkYCZWW2go7u/UU6zMcAaYLiZ1Y0e60h0qM/MapvZgwkNVCQANYMOQES4DXAzu7OCdp8CXYhM\nTx8BNAdmRc/dCbyYsAhFAqKalEiAor2itUCzSr7Fga+BVkA3oDewFHjL3RcmJEiRAClJiYhIaKkm\nJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIioaUkJSIi\nofX/ARE7ZqFnKYAXAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# log-log plot of the grid differences\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel('$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='-', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Order of convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The order of convergence is the rate at which the numerical solution approaches the exact one as the mesh is refined. Considering that we're not comparing with an exact solution, we use 3 grid resolutions that are refined at a constant ratio $r$ to find the *observed order of convergence* ($p$), which is given by:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "p = \\frac{\\log \\left(\\frac{f_3-f_2}{f_2-f_1} \\right) }{\\log(r)}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "where $f_1$ is the finest mesh solution, and $f_3$ the coarsest. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is p = 1.014\n" + ] + } + ], + "source": [ + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values2 = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values2 = numpy.empty_like(dt_values2, dtype=numpy.ndarray)\n", + "\n", + "diffgrid2 = numpy.empty(2)\n", + "\n", + "for i, dt in enumerate(dt_values2):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + "\n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values2[i] = u\n", + " \n", + "\n", + "#calculate f2 - f1\n", + "diffgrid2[0] = get_diffgrid(u_values2[1], u_values2[0], dt_values2[1])\n", + "\n", + "#calculate f3 - f2\n", + "diffgrid2[1] = get_diffgrid(u_values2[2], u_values2[1], dt_values2[2])\n", + "\n", + "# calculate the order of convergence\n", + "p = (log(diffgrid2[1]) - log(diffgrid2[0])) / log(r)\n", + "\n", + "print('The order of convergence is p = {:.3f}'.format(p));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See how the observed order of convergence is close to 1? This means that the rate at which the grid differences decrease match the mesh-refinement ratio. We say that Euler's method is of *first order*, and this result is a consequence of that." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Paper airplane challenge" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose you wanted to participate in a paper-airplane competition, and you want to use what you know about the phugoid model to improve your chances. For a given value of $L/D$ that you can obtain in your design, you want to know what is the best initial velocity and launch angle to fly the longest distance from a given height.\n", + "\n", + "Using the phugoid model, write a new code to analyze the flight of a paper airplane, with the following conditions:\n", + "\n", + "* Assume $L/D$ of 5.0 (a value close to measurements in Feng et al. 2009)\n", + "* For the trim velocity, let's take an average value of 4.9 m/s.\n", + "* Find a combination of launch angle and velocity that gives the best distance.\n", + "* Think about how you will know when the flight needs to stop ... this will influence how you organize the code.\n", + "* How can you check if your answer is realistic?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Feng, N. B. et al. _\"On the aerodynamics of paper airplanes\"_, AIAA paper 2009-3958, 27th AIAA Applied Aerodynamics Conference, San Antonio, TX. [PDF](http://arc.aiaa.org/doi/abs/10.2514/6.2009-3958)\n", + "\n", + "* Simanca, S. R. and Sutherland, S. _\"Mathematical problem-solving with computers,\"_ 2002 course notes, Stony Brook University, chapter 3: [The Art of Phugoid](https://www.math.sunysb.edu/~scott/Book331/Art_Phugoid.html). (Note that there is an error in the figure: sine and cosine are switched.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/01_04_Second_Order_Methods.ipynb b/lecture_22/01_phugoid/01_04_Second_Order_Methods.ipynb new file mode 100644 index 0000000..dfe6da7 --- /dev/null +++ b/lecture_22/01_phugoid/01_04_Second_Order_Methods.ipynb @@ -0,0 +1,1187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth, C.D. Cooper. Partly based on content by David Ketcheson, also under CC-BY." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid model: bonus!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_The phugoid model of glider flight_ has been such a fun problem to showcase the power of numerical solution of differential equations, we thought you'd enjoy a bonus notebook. The previous lessons were:\n", + "\n", + "* [Phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_01_Phugoid_Theory.ipynb) —Lays the groundwork for our fun problem, with some context, a little history and a description of the physics of phugoids: curves representing the trajectory of a glider exchanging potential and kinetic energy, with no drag.\n", + "* [Phugoid oscillation](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb) —Develops the simple harmonic motion of an aircraft experiencing a small perturbation from the horizontal trajectory: our opportunity to introduce Euler's method, and study its convergence via an exact solution.\n", + "* [Full phugoid motion](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb) —The full model takes into account the force of drag and results in a system of two nonlinear equations. We obtain the trajectories using Euler's method in vectorized form, introduce grid-convergence analysis and finish with the paper-airplane challenge!\n", + "\n", + "That is a fantastic foundation for numerical methods. It's a good time to complement it with some theory: the first screencast of the course uses Taylor series to show that _Euler's method is a first-order method_, and we also show you graphical interpretations. Many problems require a more accurate method, though: second order or higher. Among the most popular higher-order methods that we can mention are the _Runge-Kutta methods_, developed around 1900: more than 100 years after Euler published his book containing the method now named after him!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Euler's method is a first-order method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this screencast, we use a Taylor series expansion to analyze Euler's method and show that it incurs a truncation error of first order. We also use a graphical interpretation to motivate the _modified_ Euler method, which achieves second order." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('6i6qhqDCViA')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Second-order methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The notebook on phugoid oscillation (lesson 2) included a study of the accuracy obtained with Euler's method, using the exact solution for the simple harmonic motion. We made a _convergence plot_ and saw that as $\\Delta t$ gets smaller, the error also gets smaller. \n", + "\n", + "We could have drawn a line with a slope equal to 1 on that log-log plot, and you would have seen that it was parallel to the convergence line. A slope equal to 1 on a log-log convergence plot is an indication that we have a first-order method: the error scales as ${\\mathcal O}(\\Delta t)$. \n", + "\n", + "In lesson 3, using the full phugoid model (which is nonlinear and does not have an exact solution), we did a _grid-convergence study_ with three different grids, and obtained the _observed_ order of convergence—it was very close to 1, indicating a slope of 1 on a log-log plot.\n", + "\n", + "Another way to look at an ${\\mathcal O}(\\Delta t)$ method is to say that the error scales _linearly_ with the step size, or that they are proportional:\n", + "\n", + "$$ e \\propto \\Delta t.$$\n", + "\n", + "where $e$ stands for the error. To get more accuracy, we could use a _second-order_ method, in which the error is ${\\mathcal O}(\\Delta t^2)$. In general, we say that a method is of order $p$ when the error is proportional to $(\\Delta t)^p$.\n", + "\n", + "In the screencast titled \"Euler's method is a first-order method,\" we used a graphical interpretation to get an idea for improving it: by estimating an intermediate point, like the **midpoint**, we can get a better approximation of the area under the curve of $u^\\prime$. The scheme has two steps and is written as:\n", + "\n", + "\\begin{align}\n", + "u_{n+1/2} & = u_n + \\frac{\\Delta t}{2} f(u_n) \\\\\n", + "u_{n+1} & = u_n + \\Delta t \\,\\, f(u_{n+1/2}).\n", + "\\end{align}\n", + "\n", + "This method is known as the *explicit midpoint method* or the *modified Euler method*, and it is a second-order method. Notice that we had to apply the right-hand side, $~f(u)$, twice. This idea can be extended: we could imagine estimating additional points between $u_{n}$ and $u_{n+1}$ and evaulating $~f(u)$ at the intermediate points to get higher accuracy—that's the idea behind Runge-Kutta methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge-Kutta methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the modified Euler method, we improve the accuracy over Euler's method by evaluating the right-hand side of the differential equation at an intermediate point: the midpoint. The same idea can be applied again, and the function $f(u)$ can be evaluated at more intermediate points, improving the accuracy even more. This is the basis of the famous *Runge-Kutta (RK) methods*, going back to Carl Runge and Martin Kutta. The modified Euler method corresponds to _second-order_ Runge-Kutta.\n", + "\n", + "Here's a bit of historical coincidence that will blow your mind: Carl Runge's daughter Iris—an accomplished applied mathematician in her own right—worked assiduously over the summer of 1909 to translate Lanchester's _\"Aerodonetics.\"_ She also reproduced his graphical method to draw the phugoid curves (Tobies, 2012)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Phugoid model with 2nd-order RK" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's compute the motion of a glider under the full phugoid model using the second-order Runge-Kutta method. We'll build on the _paper airplane challenge_ of lesson 3 now, and look for the horizontal distance that the plane travels until the moment it touches the ground. \n", + "\n", + "As usual, let's start by importing the libraries and modules that we need, and setting up the model parameters. We also set some default plotting formats using the [`rcParams`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.rcParams) module. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from math import sin, cos, log\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the paper-airplane challenge of lesson 3, we suggested an $L/D=5.0$ as a realistic value for paper airplanes, according to experiments, and a trim velocity of 4.9 m/s. Let's start with those values, but you could experiment changing these a bit. _What do you think will happen if you make $L/D$ higher?_" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Among the initial parameters that we suggest for your first experiment, we are starting with a velocity a little higher than the trim velocity, launch the paper airplane with a negative initial angle, and take the initial height to be 2 meters—all sound like reasonable choices.\n", + "\n", + "Now, we can define a few functions to carry out the computation:\n", + "* The right-hand side of the phugoid model from [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb),\n", + "* One step of the Euler's method that we learned in [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb), and\n", + "* Differences with respect to a fine grid, as in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])\n", + "\n", + "\n", + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)\n", + "\n", + "\n", + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = int(numpy.ceil(N_fine/N_current))\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we also need to define the function `rk2_step()` that computes the next time step using the *modified Euler* method of equations $(1)$ and $(2)$, above, otherwise known as 2nd-order Runge-Kutta or RK2. This function will be called over and over again within the time loop." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def rk2_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using 2nd-order Runge-Kutta.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at the next time step.\n", + " \"\"\"\n", + " u_star = u + 0.5*dt*f(u)\n", + " return u + dt*f(u_star)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we first need to set up the time discretization, then initialize arrays to save the solution and we are set to go! The only difference this time is that we are using _both_ Euler's method and 2nd-order Runge-Kutta to get a solution, to compare the two. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "\n", + "# set initial conditions\n", + "u_euler = numpy.empty((N, 4))\n", + "u_rk2 = numpy.empty((N, 4))\n", + "\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_euler[0] = numpy.array([v0, theta0, x0, y0])\n", + "u_rk2[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "\n", + "# use a for loop to call the function rk2_step()\n", + "for n in range(N-1):\n", + " \n", + " u_euler[n+1] = euler_step(u_euler[n], f, dt)\n", + " u_rk2[n+1] = rk2_step(u_rk2[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get the position of the glider in time, according to both Euler's method and the 2nd-order Runge-Kutta method, by extracting the appropriate portions of the solution arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x_euler = u_euler[:,2]\n", + "y_euler = u_euler[:,3]\n", + "x_rk2 = u_rk2[:,2]\n", + "y_rk2 = u_rk2[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### How far will it fly before touching the ground?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As the $y$-axis measures the vertical coordinate with respect to the ground, negative values of $y$ don't have any physical meaning: the glider would have hit the ground by then! To find out if there are any negative $y$ values we can use the handy function [`numpy.where`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html). This function returns the **indices** of the elements in an array that match a given condition. For example, `numpy.where(y_euler<0)[0]` gives an array of the indices `i` where `y_euler[i]<0` (the `[0]` is necessary as `numpy.where` returns an array, which in this case contains a single line). If no elements of the array match the condition, the array of indices comes out empty. \n", + "\n", + "From the physical problem, we know that once there is one negative value, the glider has hit the ground and all the remaining time-steps are unphysical. Therefore, we are interested in finding the _first_ index where the condition applies, given by `numpy.where(y_euler<0)[0][0]`—do read the documentation of the function if you need to! " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_euler = numpy.where(y_euler<0.0)[0]\n", + "if len(idx_negative_euler)==0:\n", + " idx_ground_euler = N-1\n", + " print ('Euler integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_euler = idx_negative_euler[0]\n", + " \n", + "idx_negative_rk2 = numpy.where(y_rk2<0.0)[0]\n", + "if len(idx_negative_rk2)==0:\n", + " idx_ground_rk2 = N-1\n", + " print ('Runge-Kutta integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_rk2 = idx_negative_rk2[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Do Euler and RK2 produce the same solution?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An easy way to compare the numerical results obtained with the Euler and 2nd-order Runge-Kutta methods is using [`numpy.allclose`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html). This function compares each element of two arrays and returns `True` if each comparison is within some relative tolerance. Here, we use the default tolerance: $10^{-5}$." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Are the x-values close? False\n", + "Are the y-values close? False\n" + ] + } + ], + "source": [ + "# check to see if the paths match\n", + "print('Are the x-values close? {}'.format(numpy.allclose(x_euler, x_rk2)))\n", + "print('Are the y-values close? {}'.format(numpy.allclose(y_euler, y_rk2)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hmmm, they do differ. Maybe $10^{-5}$ is too tight a tolerance, considering we're using a somewhat coarse grid with first- and second-order methods. Perhaps we can assess this visually, by plotting the glider's path? Study the code below, where we are plotting the path twice, taking a closer look in the second plot by \"zooming in\" to the beginning of the flight." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n+eWXL1nerVu3i92pp06dMq1atTKNGzc2x9PpOsjI4cOHjYiY0qVLZysHb3mznwlAdyrQBfgFKOFF\n2RbAH8BB3IdmAAAgAElEQVT6VK/tWN2pu+z3T6Szbo6+L6WC3d69e02FChXMlClT/lm4caMxVata\nP4PF6tXGtGqVbpfuuHHjzI033mhOnTqV46q8PYdpd6qfrVixgh07djB69GhmzJgR8KcbBGIOoHr1\n6rF79252797tSP0qYxcuXCA+Ph4R4ZZbbvFY5tChQzRu3JiCBQuyaNEiChYsmOV6VtkDgDt06JCj\neEOBiNwLDAXijDGH7GWtRaRXqjIlxZ57xxiz0BhT1hhzY8oLSLml7Ul72bOBziPQ3HI+cEse4Hwu\nf/31Fy1atOC+++7jgQce+OeDqlXh55+tn17yey5168KXX6bbpTtkyBCqVatG79690x2q4mvaiPOz\npC1bWNysGU888USOHswbzHLlykXr5s2Z/9lnToei0ti/fz99+vRh7969DBo0iFq1anks16NHDzZs\n2MDIkSMvn0jTC8YYXnzxRWJiYhgxYkROww5qItIZmAG8CTQXkXvtRl0boLRdpgGwD5ia0abS/FQq\nrJw5c4a2bdvSpEkThg8ffnmBXKE14ktEeO2119iwYQMzZswITKXeXK4L9RdOdUecPGmOFi9uRleu\n7Mpu1NT233CDeaJ2bUdjyPZ+HjXKGOtm8ktfo0b5tnx6n/tASndqVFSUKVWqlClVqpTJly+fERFT\nu3Zt88MPP3hcL6U7tU6dOkZETJkyZcz27duzXP/kyZNNdHS0+fbbb3OaSqa82c/4sTsVOAokYXWF\npn4lASPtMjWAI3joIgVKATuB/fY6h+33ddKpL+dfmlJBJikpydx1112mY8eOrvv9uHnzZlOsWDGz\nfv36bG/D23OY4w2sQLycOgkeu+su80FUlNmxY4cj9QfS6aefNq/nzm3+/vtvx2II5192nsbEnT59\n2owYMcKIiGnVqpXHaWBSGnErVqwwvXv3NiJirr76avPbb795XffHH39soqOjzWeffeaTXDLjdCMu\n0K9wPq6Vew0fPtw0aNDAnDlzxhprtnix0yFlz4ULxniY2uTtt982VapUMadPn87WZr09h2l3qp8k\nfvghJz//nB969qRixYqOxRGo8Q55O3TgvyIsWbTIkfrV5fLmzcuzzz5LXFwcCxYs4PXXX0+3rIgw\n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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(10,6))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler[:idx_ground_euler], y_euler[:idx_ground_euler], 'k-', label='Euler')\n", + "pyplot.plot(x_rk2[:idx_ground_rk2], y_rk2[:idx_ground_rk2], 'r--', label='RK2')\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_rk2[idx_ground_rk2-1]))\n", + "pyplot.legend();\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler, y_euler, 'k-', label='Euler')\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From far away, the Euler and RK2 methods seem to be producing similar answers. However, if we take a closer look, small differences become evident. Keep in mind that we are solving the same equation and both methods will converge to the same solution as we refine the grid. However, they converge to that solution at different rates: RK2 gets more accurate faster, as you make $\\Delta t$ smaller." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Grid-convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just like in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), we want to do a grid-convergence study with RK2, to see if we indeed observe the expected rate of convergence. It is always an important step in a numerical solution to investigate whether the method is behaving the way we expect it to: this needs to be confirmed experimentally for every new problem we solve and for every new method we apply!\n", + "\n", + "In the code below, a `for`-loop computes the solution on different time grids, with the coarsest and finest grid differing by 100x. We can use the difference between solutions to investigate convergence, as before." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for-loop to compute the solution on different grids\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once those runs are done, we compute the difference between each numerical solution and the fine-grid solution." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# compute diffgrid\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "for i, dt in enumerate(dt_values):\n", + "\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now we plot!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nicaKFSu44YYbWLVqFR9//HHU4UgBmUymza7Dqqy9lhRJb+kkfdpm0qUpfxdffDGTJk3iuOOO449/\n/GPU4VQs6bkLe/aaiEjNNDc3M2XKFMyMa665JupwpEJq6RSR9JaOSByMGDGCX/3qV5x++un86le/\nijocKYFaOiISW4cffji9e/fm6quvjjoUCYGKToql+VmBJEhL/i666CKam5vp27dv1KGEJi25y6cq\nRcfMZlfjviKSTttsU9FEW6kjpeynE2QTt0nu3rWSwOqBmfn48eM1ZVpEpAQtU6YnTJgQfMFPbeKm\niQQiIuWodCLB+8BRwODcayjwMnAHMILspm1H5/77DmAx2U3fpM6luV85CZKav08++YR7772XjRsT\ntcDJpyQ1d6UopaP0L+7+RMsbM5tEdhO3+/NcO93MTia7idvvQopRRFLkrrvu4vzzz+f444/noYce\nijocCZk2cStC3WsitbVmzRoGDhzIkiVLuOeee/j2t78ddUgSQNjP6ewCFJsk0BXYKcB9RSTlbrnl\nFpYsWcLBBx/Mt771rajDkSrQJm4pluZ+5SRIWv7ef/99Jk6cCMA111xDu3axn4tUUNJyV44gk98v\nAR4nu4nbUmAp2WnSPYCewCqgIawARSQdpk6dygcffMBRRx3FMcccE3U4UiWB1l4zs32AnwDHAZ1z\nh1cDTcA4d58bWoQR0piOSO1s2rSJe+65h/32249DDjkk6nCkAsXGdLSJWxF6OFREpHShPBwahJmd\n4e6xXw426S2dpO/pkXTKX3wlPXdRrDJ9Q5XuKyIiMVbKMjiNwM7uPir3vpnia7EZ0NvdO4QVZFSS\n3tIREamGisZ0zOxtYEdgF3dfa2brgafb+MzD3b1ToGjriIqOSPW4O8OHD+dLX/oSF154IZ06xf5X\nhuRUWnR6AB3d/c3c+6Xu3rONr2nzmjhIetFJer9y0sU9fzNnzuS4445jp512YuHChXTtGvuF6UsW\n99y1paIxHXdf1lJwcjqa2VQz+1qRL/t+uUGKSHps2rSJyy+/HIAxY8akquCkXZC11zYB04Hr3P2V\nqkRVJ5Le0hGJyvTp0znjjDPo3bs38+bNU9dawoT6nI6ZLXP3HqFEVudUdETCt379evbdd1+am5u5\n4447OPfcc6MOSUIW9pTpV8ysVxsfeFeA+0qNpXn9pySIa/5WrFhB79692X///TnzzDOjDicScc1d\n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\nzP8H50NbGbioopAAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot using the matplotlib function loglog()\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel(r'$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.xlim(1e-4,1)\n", + "pyplot.ylim(1e-4,1)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='--', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is looking good! The difference relative to our fine-grid solution is decreasing with the mesh size at a faster rate than in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), but *how much faster?* When we computed the observed order of convergence with Euler's method, we got a value close to 1—it's a first-order method. Can you guess what we'll get now with RK2?\n", + "\n", + "To compute the observed order of convergence, we use three grid resolutions that are refined at a constant rate, in this case $r=2$. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 1.983\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " ### call rk2_step() ###\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probably you're not too surprised to see that the observed order of convergence is close to $2$. Because we used a second-order method! This means that the numerical solution is converging with the grid resolution twice as fast compared with Euler's method in [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb), or in other words, the error scales as ${\\mathcal O}(\\Delta t^2)$. That is a lot faster! However, we are paying a price here: second-order Runge-Kutta requires more computations per iteration." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Challenge task" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How much longer does it take to get the solution with RK2, compared to Euler's method? Run the same solution (same time grid, same parameters), but find a way to *time* the calculation with Python, and compare the runtimes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multi-step methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The screencast *\"Euler's method is a first-order method\"* motivated graphically an idea to get increased accuracy: using intermediate points between $u_{n}$ and $u_{n+1}$ and evaluating the right-hand side of the differential equation at those intermediate points. The idea is to somehow get a better approximation using more data from the function $f(u)$.\n", + "\n", + "Another way to bring more information about $f(u)$ into the numerical solution is to look at time data $t\\lt t_{n}$. For example, we can involve in the calculation of the solution $u_{n+1}$ the known solution at $u_{n-1}$, in addition to $u_{n}$. Schemes that use this idea are called _multi-step methods_.\n", + "\n", + "\n", + "A classical multi-step method achieves second order by applying a _centered difference_ approximation of the derivative $u'$:\n", + "\n", + "$$ u'(t) \\approx \\frac{u_{n+1} - u_{n-1}}{2\\Delta t}.$$\n", + "\n", + "Isolate the future value of the solution $u_{n+1}$ and apply the differential equation $u'=f(u)$, to get the following formula for this method:\n", + "\n", + "$$ u_{n+1} = u_{n-1} + 2\\Delta t \\, f(u_n),$$\n", + "\n", + "This scheme is known as the **leapfrog method**. Notice that it is using the right-hand side of the differential equation, $f(u)$, evaluated at the _midpoint_ between $u_{n-1}$ and $u_{n+1}$, where the time interval between these two solutions is $2\\Delta t$. Why is it called \"leapfrog\"? If you imagine for a moment all of the _even_ indices $n$ of the numerical solution, you notice that these solution values are computed using the slope estimated from _odd_ values $n$, and vice-versa.\n", + "\n", + "Let's define a function that computes the numerical solution using the leapfrog method:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def leapfrog_step(unm1, u, f, dt):\n", + " \"\"\"Returns the solution time-step n+1) using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " unm1 : array of float\n", + " solution at time-step n-1.\n", + " u : array of float\n", + " solution at time-step n.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at time-step n+1.\n", + " \"\"\"\n", + " return unm1 + 2.0*dt*f(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But wait ... what will we do at the _initial_ time step, when we don't have information for $u_{n-1}$? This is an issue with all multi-step methods: we say that they are _not self-starting_. In the first time step, we need to use another method to get the first \"kick\"—either Euler's method or 2nd-order Runge Kutta could do: let's use RK2, since it's also second order.\n", + "\n", + "For this calculation, we are going to re-enter the model parameters in the code cell below, so that later on we can experiment here using the leapfrog method and different starting values. At the end of this notebook, we'll give you some other model parameters to try that will create a very interesting situation!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude\n", + "\n", + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# set initial conditions\n", + "u_leapfrog = numpy.empty((N, 4))\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_leapfrog[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "# first step using RK2\n", + "u_leapfrog[1] = rk2_step(u_leapfrog[0], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we have all the required information to loop in time using the leapfrog method. The code cell below calls the leapfrog function for each time step." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# use a for loop to call the function leapfrog_step()\n", + "for n in range(1,N-1):\n", + " \n", + " u_leapfrog[n+1] = leapfrog_step(u_leapfrog[n-1], u_leapfrog[n], f, dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like before, we extract from the solution array the information about the glider's position in time and find where it reaches the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# get the glider position in time\n", + "x_leapfrog = u_leapfrog[:,2]\n", + "y_leapfrog = u_leapfrog[:,3]\n", + "\n", + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_leapfrog = numpy.where(y_leapfrog<0.0)[0]\n", + "\n", + "if len(idx_negative_leapfrog)==0:\n", + " idx_ground_leapfrog = N-1\n", + " print ('The glider has not reached the ground yet!')\n", + "else:\n", + " idx_ground_leapfrog = idx_negative_leapfrog[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the glider's trajectory with both the leapfrog and RK2 methods, we find that the solutions are very close to each other now: we don't see the differences that were apparent when we compared Euler's method and RK2." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqkAAAIKCAYAAAAArtaHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8FHX+x/HXJwEpUoKCYA8IooIUUUFBREFOEI8TLNzJ\niVg478SKooiKiHDYPdvPLncqCFasWMBQBBQQkKIgTURAinQEUr6/P3aDMWxCNtndmZ19Px+PfSS7\nO+X93R2Gb2Y+8x1zziEiIiIi4idpXgcQERERESlMnVQRERER8R11UkVERETEd9RJFRERERHfUSdV\nRERERHxHnVQRERER8R11UuPEzMaa2UYzyzOzXoXeu9fMfjazQ7zKJ7FlZh3MbI2Z7Taz5TFcbmZ4\nuTvNLC+Gy73MzDab2ctRzPNIeHseFOW6csNtKPz4sph5jjWz6cW12cxGhNsQadk7zGxHNDlFRMRf\n1EmNE+dcV6Bb/tNCb9cAqgEVol2umd0T7igcVcaIvmRm7SJ17P3OOfe5c+5QYCr7ft9lWe6K8HJH\nx2K5ZlbLzN4GBhHaBku0TDM7Gbg+P1aUq13pnDs0wqN1Eeu6DpgM1N3PuhxwfaRlA7OBt6LMKSIi\nPqJOanxZpBedc9cBtZxzPyU4TzJJ1rtMRPzOY7TcWCx7BLAA+FOJV2xWDngBeDMG69/fuv4GXAi0\nAr7bz+TzgJ8jLKMBcDrwUswDiohIwpTzOkCqcs7tKuMi4tUZ8ougt88rVzrn1ppZZhTz3AJsBZ4B\nLo5HqAI+d86NBDArfhNwzj1SxFuXA8ucc1kxTSYiIgmlI6kxYmYtzGyimW01s2Vm9h+gUoTpJhdT\nq3qBmU0zs1XhmtWpZnabmVUPv78A6BeefEaB+rt64ffbmtlIM1tqZuvMbLWZvWBmNQutZ1yBDL3N\nbJCZ/WBmm8LvZUbIfYCZ3Wlm35vZWjNbaWafm9m/zOyAAtOZmV1nZvPC61hnZm+bWeMSfIbP8/sp\n2v8UaF9PM2tfsObTzE4Ir39tuB0vh5fxZzN7NzzNBjNbYWYPmVnlgusJ1yzmhfM9Gn49Pby8nWa2\nxcxuLjDP38xsZrhNG83sEzNrs782FZj/UDN7MdyGjeHPe5iZRdpGbgxvQxvMbI6ZXVTS9eyPc25t\nNNObWX3gNqBPrDIUxzm3rizzm1ka8HdCR4xFRCSZOef0KOMDaEjoSNPnhOpNjdApyzlAHnBZoenP\nLPw6cBaQDXQOPzfg6vB0bQtMNyj82lERcrwJTCBUSgBQH5gbfqQXkWE2cEn4tSOApcCcQtOmAR8C\n64BTw69VAV4OL6NJgWmfAbYBncLPMwh1PLcBjUvwWe7z2RR6/wtgPTAWOCz82ivAS+HfZwKjgCrh\n5y2AlcCHhZZzRXg9l0RYxwKgVYHntwM5hDo/RuiPjyeAPcA5hebNInQUr+BrhwA/EqqzPDT8WktC\np6onAFZg2jvCua4r8DmPABYBuRGyVsz/vqPcZjPD63lpP9NNAO4O/94uPM/dUa5rXfjz+g74hdC/\ni3uAyvuZLytSm/czzznh7+qIsv671kMPPfTQw9uHjqTGxn2EOhM3Oec2uZA3gRlFTB/pPOafgS3O\nuY8Awst4Hngf2LmfefMtAW5xzq0PL2MJ0B84ETi3iAzLnXOjw9OvAl4DmpjZ0QWm/RvQCRjknPs6\nPO124B+EOp+hBYaOLPYBHnPOfRyebjOhznY6MLSY7CVpX/77BwNDnHOrw6/dD4wM/74AuDmcD+fc\nrPB6O5lZowLLGUPoc+39h4WbtSTUoZ8efp5J6Psd5Zx7Jfy9/AbcRKjD9VAJ2jQMOBLo7ZxbE871\nVXi57YC/hNd1MHA3MNs590R4uu3Av4DaRSx7FrDazFqVIEdUzOzK8HqHlXFR1YH5QDPgKOBeQhdh\nTSp4hDtGLidUMrAqxssVEZEEUye1jMwsnVAHbo1zbl6ht7OiWNQvwEEWGuZn79BUzrmuzrmZJVmA\nc+5259w3hV7+IfzzhCJmm1roef5/7ocVeO2S8M9xhda3h9CRq2WFpvus0HS/AsuBDuHTsWX1W8HP\nxDk33zn3efj3XvkdwQL2+QzCnb83w5kOLzBtb/54wU13Qv9OCrcpB/gWONHMDi0qaLi9FxL6Y2BJ\nobfz25D/B0QH4AD2/Zx3UvQfPMuBjcDmojKUhpnVJtT57xNua1kc6px71jm3O/x4m1Bn/CRCnf2Y\nMLNqhDr8umBKRCQA1Ektu1pAZaBwxwggmvq/JwgdNb0R+NnMxpvZFWZWsaQLMLM64U7u3HBt5Rpg\nevjtfWofwzYUer4n/LN8gdfqE7rafnWhaXHOfZ1/1DI8HcCbVmjcSuBwIBc4qKTtKcb6ot4ws/rh\nmtMFBT6DN8JvF/4MXib0b6BXeN5KhDqU/yswTX6bHo3QptOA7fyxQ19YLUJDPR0RYf73w/Pn1wzX\nDf8salva5yizc66Lc66Oc+77YjKUxuPAG865SGOZRnVRW/iPlMLeC/88L9pgxbgE+A14J4bLFBER\nj+jq/tgp09XozrkdQFczO5HQ6fWehIb9udXMznT7uaDEzKrwe4f0wvwjjeHT9sUNLh/NAPEHALtL\nMF0H59y3USw3WhEzm9kRhI5OLgW653fczOxMQrWsf+Ccm2ihgfd7ETql3Q34ykW+uKi3c+69CK+X\n1ALn3EklnNYPIxt0AnaZ2V8KvJZ/gdwtZnYNoaqU4jroxcnfnmN5Q4vLgZHOuewYLlNERDyiI6ll\nt55QbWOdCO9Fei0is9B4O865ec65AcDRhE6JNgT6lmARHQjV+z1ZqDwgFh2eH8LL2adDYma1wx1k\nCF3cA6ELsCJN1y4GWYpzIaGjlv8udGSxuM/gv0ADM2tN6FR/4TswFdem6ha601R6MctfD2whdCR5\nH2bW3ELjesLvZRNFbUsJGzvWOVfNOXeI++MA+fk3p3gw/Np+O6hm9hcL3QigsPwa28JH8ksl/Bme\nhk71i4gEhjqpZeScyyV05fuhZtak0NvtoljUy2Z2S4Hl5gGPhZ9WLzBd/q0eywGY2eXhIYqKGnc1\nFnemGh3+2aXgi2ZWFVhB6Er1gtN1Y1+DKFn9YeH2tTazO0qYs6ijvMV9Bv8l1Pm7G2hCaNSAgt4m\ndLV4pDb9A3gkvA1EFP4exwC1Cg9ZFS4v+BzIH57rM0LfY6dC0x0IROroYWYVzaxWUeuPsWL/4DGz\nGgX+YMn3F0KjIhSWf5p/XIT3SuNyQqNSzInR8kRExGOedFLNrFm4bnChmX0brh/8jxUaz7OIeVeY\n2ewIj7MTkb0IdxGqLXzEzA4yszQz60booiIo+j/3gq874FozOwH23uWnL6E6zjEFplsY/tnIzCoA\ntxI6yjaVUM1o3wLLOBx4IIoMRb0+EviIUOnByeFlZwAvAtOcc+MBnHPTgKeAv5vZJeHPId3MehMq\nYbi7iHUVtJRQXWz+lfhXEBpGqiSZPyLUyR1gZkeGcx5H6PuJOJ9z7kdCpQDnAK8XPlXsnFsJDADO\nNrMbzKy8hZxHaLio/hFyFF7PQEKd+SfM7JhwrpqEhs76lnB9pnNuEzAEaGahsWbTwp2+pwh1XiO1\nexahGubSXt1fmiPt+8wTHgXhZ+AH++PYrw7oY2YXhreFdDPrTOgK/++Ah8uaz34fGzXwR1EDuO8U\nESlaosa6KvgAvid0MUul8PPDCP2HtQiouJ95l3uRuQRtOonQ1fxbCY2J+QKho0h5hK68nheebjKh\nq7Fzw6/PCb/eFHg6/DmsJvQf/mfAWYXWY8D/EbqQZjWhMUErht87AfiA0CnUZcAk4J/hDNuA78LT\nvVIow0fh1z8MP88Nv/9igfWWJ9TZWhRe93JCR3qrRfgs/kFoLMwNhDpnY4HmUXyWV4c/w7Xhz6tB\n+PNZQ6izlh3+/b8R5j09/D1sBhYDnxAajD7/e/g0wjyXhtt8UjGZLgSmhdu0ktAR0LMKvN8hQr6e\nBd4/JPy9rQp/b4uBfwNVI6zrekKd9Q2EhtS6mt/HpF0D3Flg2o/Dn9NxJfxsLyd0cdGucJtzws+X\nFTPPX8PT7A7Pkx1+/lSBaWqFt4kZQLkCrx8J3Al8RWib3kyofOSBIrad9HC238Lryg3//hvQvoh8\nHcLv1/B6PxDvBwHcd+qhhx56FPUw5xJ/i3QzWwh0cc4tK/DaFYQ6dhe60BA1Rc273DlXt6j3RUSC\nSvtOEUklXl3d38TtO/Zi/rA7GYkOIyKSJLTvFJGU4UlNaoSdLMCxhOrXJu1vfjO738y+NLNFFrqH\n+vkxDyki4jPad4pIKvHF1f3hIXyuBF5w+96Vp7B1wCznXGtCF9eMBcaa2bVxjiki4ivad4pIkHlS\nk7pPCLN7CA1J09aF7ose7fwfAGcAhzjn9hmGyMy8b6SIBJJzzrObL8Rz36n9pojES0n3m54fSQ0P\nT3Qh0Kk0O9mwr4GqFH1/es+vUHPOMWjQIM8zKIuyKEvsHl5KxL7T6883VbYjtU/tS6X2RcPTTqqZ\n/R24GTjbObffO8+EBy4/MMJb+YOpF3fnH8+tWLHC6wh7KUtkyhKZsvhLqu074yHo25Hal9yC3r6S\n8qyTamY9CQ2E3t6F70tvZl3M7OoC09Q2s4KHhHsQefDvFoTGVlwY4T0RkcDQvlNEUoVXd5y6FHge\nGAF0NLOe4R3v+YTvD2+he6mvJnS3nYL+agXuBW5mlwBdgQecczsTEL/ULr/8cq8j7KUskSlLZMri\nD6m674yHoG9Hal9yC3r7Ssqrwfw3EhrTr3DhrAMGO+fuNbOmwHjgMefcfeH5DgH6AH8mdAekDOBX\n4P+ccy8Usz7nRTtFJNjMDJfAC6cSue/UflNE4iGa/aZX46Qe7JxLd86lFXqkO+fuDU8z1zlXM38n\nG35tnXPuPufcqc655s65us65FsV1UP0kKyvL6wh7KUtkyhKZsvhDqu474yHo25Hal9yC3r6S8vzq\nfhERERGRwnwxTmq86bSViMRDok/3J5L2myISD74/3S8iIiIiUhx1UhPITzUmyhKZskSmLBI0Qd+O\n1L7kFvT2lZQ6qSIiIiLiO6pJFREpJdWkiohERzWpIiIiIpLU1ElNID/VmORn2bFjB3v27PFFFj9Q\nlsiURYIm6NuR2pfcgt6+klInNcXk5OQwatQo7rzzTmrUqEGVKlWoUKECRx55JFdddRWzZs3yOqKI\niIiIalJTySeffELfvn1ZsmTJ3tcqVKhAdnY2eXl5e1+76KKLePrpp6lZs6YXMUWShmpSRUSio5pU\n+YPs7Gz69u3Lueeey5IlS6hfvz5PPvkkK1eu5LfffiM7O5u5c+dyyy23ULlyZd544w2aNGnC7Nmz\nvY4uIiIiKUqd1ATyosZk69atdOzYkaeeeooDDjiA4cOH891339GoUSOOPPJIzIy0tDSaNGnCgw8+\nyIIFC2jTpg1r1qzhzDPPZMqUKXHP6KfaG2WJTFkkaIK+Hal9yS3o7SspdVIDbPPmzXTs2JGsrCwO\nPfRQJk2axG233Ua5cuWKnCczM5Px48fTo0cPtm3bxvnnn8/8+fMTmFpERERENamBtXv3bs4991yy\nsrLIzMzkiy++IDMzs8Tz5+bmctFFF/HOO++QmZnJN998Q40aNeIXWCQJqSZVRCQ6qklNcc45rr76\n6r1HUPM7qtFIT09n5MiRtGjRghUrVtC7d2/0H5aIiIgkijqpCZSoGpNhw4bxyiuvcOCBB/LBBx9w\n9NFHlypLxYoVeeONN8jIyGDs2LH897//jUNaf9XeKEtkyiJBE/TtSO1LbkFvX0mpkxowEydO5O67\n78bMeP311znppJPKtLy6devy+OOPA3DTTTexZs2aWMQUERERKZZqUgNk/fr1NGvWjNWrV3PHHXcw\ndOjQmCzXOUeXLl346KOP6NWrFyNGjIjJckWSnWpSRUSiE81+U53UgHDO0bVrV95//31at25NVlZW\nsVfxR2vp0qUcf/zx5OTkMGvWLJo3bx6zZYskK3VSRUSiowunfCqeNSavvfYa77//PhkZGYwaNWq/\nHdRosxxzzDFcd911OOfo169fTC+i8lPtjbJEpiwSNEHfjtS+5Bb09pWUOqkBsHbtWq6//noAHnnk\nEY488si4rOfOO+/koIMO4osvvuCjjz6KyzpEREREQKf7A+HCCy/krbfeomPHjowbNw6z+J19fPjh\nh7nlllto1aoVU6dOjeu6RPxOp/tFRKKjmtRCgryz/eijjzjvvPOoUqUK8+fPjzjcVCxt376dzMxM\nNm7cyIQJEzjrrLPiuj4RP1MnVUQkOqpJ9alY15js3r2bG264AYB77rknqg5qabNUqVJl7zqHDRtW\nqmXEKks8KEtkyiJBE/TtSO1LbkFvX0mpk5rEHn30UZYsWcLxxx+/tyY1Efr27UuVKlX4/PPPmTFj\nRsLWKyIiIqlDp/uT1KpVq2jYsCE7d+7ks88+o0OHDgld/6233spDDz1Ez549eeWVVxK6bhG/0Ol+\nEZHoqCa1kCDubHv06MHo0aPp3r07b775ZsLXv3z5co455hjKly/PTz/9xCGHHJLwDCJeUydVRCQ6\nqkn1qVjVmHz11VeMHj2aihUr8vDDD3uSpW7dunTu3Jk9e/bw4osvlmlZfqq9UZbIlEWCJujbkdqX\n3ILevpJSJzUJDRw4EICbbrop7lfzF6dv374APPPMM+Tm5nqWQ0RERIJHp/uTzIQJE2jfvj3Vq1dn\n+fLl1KhRw7MseXl5NGzYkCVLlvD+++/TpUsXz7KIeEGn+0VEoqPT/QHlnNt7FPXWW2/1tIMKkJaW\nxtVXXw3AiBEjPM0iIiIiwaJOagKVtcbkww8/ZPr06dSqVWvvWKVeZcnXs2dP0tLSeO+999i4caOn\nWWJBWSJTFgmaoG9Hal9yC3r7Skqd1CSRl5e39yjqHXfcQZUqVTxOFHLYYYfRsWNHsrOzGTVqlNdx\nREREJCBUk5okRo8eTY8ePTjiiCP44YcfqFixoteR9srP1qJFC2bOnOl1HJGEUU2qiEh0NE5qIcm+\ns83JyaFRo0YsXryY5557bm8dqF/s2rWLOnXqsGXLFubNm0fjxo29jiSSEOqkiohERxdO+VRpa0z+\n97//sXjxYo455hguv/xyT7NEUrFiRS655BIAXn/9dU+zlJWyRKYsEjRB347UvuQW9PaVlDqpPrd7\n924GDx4MwL333kv58uU9ThRZfid19OjR6OiLiIiIlJVO9/vcE088wfXXX0/jxo2ZO3cuaWn+/Lsi\nNzeXww8/nF9++YVZs2Zx0kkneR1JJO50ul9EJDo63R8QO3bsYOjQoQDcd999vu2gAqSnp3PhhRcC\noaOpIiIiImXh315PAEVbY/LEE0/wyy+/cOqpp/LnP//Z0ywlkX/Kf8yYMVGd8vdT7Y2yRKYsEjRB\n347UvuQW9PaVlDqpPrV582YeeOABAIYOHYqZ/88otm7dmsMPP5wVK1YwY8YMr+OIiIhIElNNqk/d\ndddd3HfffbRr144JEyYkRScV4Prrr+eJJ55gwIABDBs2zOs4InGlmlQRkehonNRCkm1nu27dOurV\nq8eOHTv48ssvOf30072OVGLjx4+nQ4cOnHDCCSxYsMDrOCJxpU6qiEh0dOGUT5W0xmT48OHs2LGD\n8847L24d1HjVu7Rt25aMjAwWLlzIDz/84GmW0lCWyJRFgibo25Hal9yC3r6SUifVZ1atWsXTTz8N\nhK7oTzbly5enc+fOAIwdO9bjNCIiIpKsdLrfZ/7xj3/w3HPPcfHFFyftUE5jxozhkksuoU2bNkye\nPNnrOCJxo9P9IiLRUU1qIcmys12yZAnHH388eXl5LFy4kIYNG3odqVS2bt1KzZo1yc3NZe3atdSq\nVcvrSCJxoU6qiEh0VJPqU/urMbnnnnvIycmhV69ece+gxrPepVq1apx99tnk5eXxwQcfeJolWsoS\nmbJI0AR9O1L7ktv+2rdhwwb27NmTmDAeUifVJ+bPn8/IkSMpX748gwYN8jpOmXXt2hVQXaqIiEi0\nnHN/uClO+/btWb58+d7no04+mfWXXQaPPQYffcToxx/nu+++8yJqXOl0v09ccMEFvPvuu/Tt25cn\nnnjC6zhl9vPPP3PEEUdQuXJlNm7cSMWKFb2OJBJzyXq638zuA+4Aejvn/lvENL7fb4oEUk4Od7Ro\nwU1HH02tAQPgtNPo3Lkz11xzzd67Tw5p2pSr2rfn0OxsWLSILePHU6FePSp++inUrcuMGTNo3rw5\n5cqV87gx+1JNaiF+39nOmDGDU089lUqVKrFs2TLq1KnjdaSYaNasGXPnzuWzzz6jQ4cOXscRiblE\nd1LNrBlwLdAayAHSgc+BIc65DSVcxhHAYqACoU7q/4qYztf7TZEgWb58OWmbNnH02LHw/POsNOP7\nk06i4/PPQ506rFmzhoMOOogKFSrsM29ubi7/98QTXHv66djJJ7N9506OOOIIZs2axTHHHONBa4qn\nmlSfKqrG5M477wRCd2tKVAc1EfU85557LgDjxo3zPEtJKUtkyuIbrwMZQAvnXBPgHKAj8KWZlfR0\nxTBgPJB0R4BjKejbkdqXXKbffz8Hn3Ya/PwzfPYZ859/nrPfeQfCfYJDDz00YgcVID09nb433oid\neiqkpfHzzz9z7bXX7u2gbtu6lWnTpiWsLbGkTqrHvvjiCz799FOqVatG//79vY4TU506dQLg448/\n9jiJSGDkAbc5534DcM6tBh4EGgCd9zezmbUATgeSv6ZIJMnNmzdv7+/n33MPwy+5hLznnoNGjahc\nuXKpT9U3bNiQoUOH7n3+5Xnnkf33v8PmzWXOnGg63e8h5xytWrXi66+/5r777mPgwIFeR4qpPXv2\nULNmTbZt28aPP/7IUUcd5XUkkZjy4HR/OedcTqHXOgEfAlc5517az/xZwNPAOmACcLlO94sk3pYt\nWzjuuON466234n7r84fuvpt/rVxJ5awsePVVslu2pHz58nFdZ3F0uj9JvP3223z99dfUqVOHG2+8\n0es4MXfAAQfQvn17AD755BOP04gkv8Id1LBjAQdMKm5eM/sLUME5NyYe2URk/5xzsGUL1atX55ln\nnmHVqlVxX+ct995L5REj4MknybngAh48/HA2b9oU9/XGgjqpCVSwhiYnJ2fvkdO7776bAw880LMs\n8VSSulQ/1RYpS2TK4k9mlg5cCbzgnFtSzHTlgeFAv0Rl87ugb0dqn/98OXEi7zZsiOvcGZyja9eu\nXHzxxRGnjUv7unTh4Ysuos8BB5DxyiuxX34cqJPqkZdffplFixZxzDHHcNVVV3kdJ27yO6mff/45\n2dnZHqcRCZy7gN3A/k7F/BOY75ybGv9IIrKPrVs5behQDl+/ngnXXw/mzXWL/Z96iprffw+XXQbA\n119/jZ/LelST6oGdO3fSoEEDVq9ezahRo+jRo4fXkeLqhBNO4LvvvmPixIm0bdvW6zgiMePlOKlm\n1pvQkdF2xQ0/ZWYZwEKgbf7RVjNrR6gmtdhxUnv16kVmZiYAGRkZNGvWjHbt2gG/H+nRcz3X86Kf\nt2rVijUzZvBjr17QuDGtRo6kYpUqvsj34YcfMmbMGObMmcPcuXPjtr6srCxGjBgBQGZmJoMHD9Y4\nqQX5rZN6//33c/vtt9O8eXNmzpxJWlqwD2jffPPNPProowwYMIBhw4Z5HUckZrzqpJrZ34H+QHvn\n3Lr9THsu8BywscDLVYBjgJ+AX4G3nHP3FZrPV/tNkWT06TvvcNxFF1Ht9tvJGDLEsyOokbz99ts0\nbtyYY489NqHr1YVTPpWVlcWmTZsYPnw4AMOHD/esg5r/V04idOzYEQid8vc6y/4oS2TK4h9m1pNC\nHVQz62JmVxeYprZZ6H9D59w459xRzrnm+Q8gv8borvBr9xVeT9AFfTtS+/yh4wUXMGPQIFb16BFV\nBzUR7evWrdveDuru7dv56N13477OaKmTmmBDhw5l8+bNnH322Zxzzjlex0mIM844g3LlyjFr1iw2\nJ+E4bSJ+YWaXAs8DI4COZtYz3Gk9HzgsPE1rYDXwVHGLKvRTRGJk586df7hYuPtdd9G4cWMPExUv\nLy+PkSedRKXrriMvN9frOH+g0/0JtHjxYho3bkxOTg4zZsygRYsWXkdKmDPOOIMpU6bw7rvv0rVr\nV6/jiMSEB+OkbiR0x6nC63TAYOfcvWbWlNAdpR6LcAq/DjANqAgcQuhU/3bgEufc14Wm9cV+UyTZ\nLFmyhDPPPJP777+fnj17eh2nRL748EPaDRqEXXABxHnM9mj2m6W7nYGUSr9+/cjOzuaKK65IqQ4q\nQPv27ZkyZQrjx49XJ1WklJxzB5dgmrlAzSLeWwvUjXUuEQlzjvr165OVlUWuz45KFues886D5s2h\nVSvWH3QQed26Ubt2ba9j6XR/oowbN44PPviAqlWr/uF2ZV5JdD1P/qD+EyZM8DxLcZQlMmWRoAn6\ndqT2JZZzjjdfeIG8s86C1atp0KABxx13XKmX50n7DjuMuYMHk3bttXzz2muJX38E6qQmQHZ2Njfd\ndBMAd911F3Xq1PE4UeK1bNmSypUrs2DBAtauXet1HBERkZjJ2bGDhrfdxgcrV+KS+P/4Q849l423\n3kqnxYu9jgKoJjUhHn/8cW644Qbq16/P/PnzqVChgmdZvHTuuefyySef8Nprr/G3v/3N6zgiZebl\nOKnx5vV+UyRpOAe9epG3fTszbrmFlqef7nWissvLg7Q0tm7dSrVq1WK6aA1B5SPr169n0KBBADzy\nyCMp20EFOPvss4HIp/xFRESSzcKFC/l1wABYsIC0V18NRgcVyM7NpX///px99tme3pFKndQ4u/nm\nm9m8eTN/+tOfqFKlitdx9vKi3iW/LnX8+PGeZymKskSmLBI0Qd+O1L7EWPjxx/z24IMsuv9+qFw5\nZsv1un1paWlUrFiRjz/+GPPwBgTqpMbRp59+yquvvkrFihV56qmnPP2i/aBZs2bUqFGDFStWsGzZ\nMq/jiIiIlMmF/frx48cfc1Tr1l5Hian09HTuvfdeatWq5WkO1aTGyc6dO2ncuDHLly9n+PDh3Hbb\nbQldv19Xw4PyAAAgAElEQVR169aNd955h+eff56rrrpq/zOI+JhqUkVS0w8//ECDBg28jpEQK6dO\n5dVbb+WKt96KyYXfqkn1gcGDB7N8+XKaNGnCzTff7HUc3yjqlL+IiEgy2L59O+eccw533nmn11ES\n4qnhw7lxzhxq7tiR8HWrkxoH06dP5+GHH8bMeP755ylfvjzgfY1JQV5lKTheav5RGn0ukSlLZH7K\nIskr6NuR2hc/VapUYcaMGTRq1Chu6/DT9zd87FgqDxxIuX/9KzSSQQKpkxpj27dvp2fPnuTm5tKv\nXz9OPfVUryP5SsOGDalTpw7r1q1j0aJFXscREREpkby8PHIWLIBPPqFWrVr89a9/9TpSQpgZ3Hor\nrFnDwsGD2bZtW+LWnQo1R4msrbr66qt54YUXaNq0KV999VVKDzlVlEsuuYQxY8bw7LPP0qdPH6/j\niJSaalJFUseol1/m5Ouu4+CBAzlowACv4yTcf6++mo4vv8yGSZM4sQxDbakm1SPvvvsuL7zwAhUq\nVODVV19VB7UIbdu2BWDixIkeJxERESmZHvPmkZeZyVdNm3odxRNt77iDmpddxolbtiRsneqkxsiP\nP/7IlVdeCcDw4cNp3LjxPtP4qcbEyywFO6nOOX0uRVCWyPyURZJX0LcjtS/GJkzARo+m4cSJdOrc\nOe6r8+P3V7duXcq/+CJ06oRzLiGD/HvSSTWzZmb2vJktNLNvzWyBmf3HzGqWYN7yZjbEzL4zs3lm\n9qWZeTpA2a5du+jevTu//vornTp14vrrr/cyju81atSIgw46iJ9//pkVK1Z4HUdERKRID9xxB7/1\n6AEvvggHH+x1HG+ZMWvWLNq2bZuQUXo8qUk1s++BecBlzrnfzOwwYDyhTnNT59yuYuZ9BmgHtHbO\nbTSzK4HHgdOdc3OLmCdutVXOOa688kpefvll6taty8yZMznooIPisq4g+ctf/sLYsWMZMWIEvXr1\n8jqOSKmoJlUk+Ga8+CJT+/fngtmzOeqoo7yO47mXXnoJ5xyXX3456enpUc8fzX7Tq07qQqCLc25Z\ngdeuAF4ALnTOvV3EfA2BhcCVzrkRBV6fD6xwznUpYr647WyHDRvGwIEDqVixItOmTaNZs2ZxWU/Q\nPPLII/Tr14/evXvz0ksveR1HpFTUSRVJDTk5OZQrV87rGIGQDBdONSnYQQ1bE/6ZUcx8FwAGfFHo\n9S+AjmYWuxvnlsBrr73GwIEDMTNGjhy53w6qn2pMvM5y5plnAjBp0iTPsxSkLJEpiwRN0Lcjta/s\nPvvsM3JycgAS3kFNhu/POcf4UaPiOiSVJ51U51xOhJePBRwwqZhZmwC5wMpCry8HygEnxCRgCbz5\n5pt7T1M/8sgjXHDBBYladSA0bdqUqlWrsnTpUtavX+91HBERkb1ycnJ4+OGHadOmzd6OqvzR/Zdd\nxgmXXcZPixfHbR2+GCfVzNKB2cA059w/ipnuU6Clc656odevAp4DOjnnPokwX0xPW7355pv06NGD\n3NxcBgwYwLBhw2K27FTSqVMnxo0bx6hRo+jRo4fXcUSiptP9IsHlnOObb76hRYsWXkfxpTVr1lD7\nn/8k7YwzoF+/Es+XDKf7C7sL2A3cGK8V7Ny5s8zLcM7x6KOPcvHFF5Obm8vtt9/O0KFDY5AuNeUP\nRTVpUnEHz0VERBIne8sWGD4cc04d1GIceuihpA0dCvffD3EaO9XzKmAz6w1cCLRzzv22n8k3AAfa\nvn/iVwv/3FjUjEcffTS9evWiSpUqZGRk0KxZM9q1awf8XvtR3PNdu3bxzjvv8NxzzwFwxRVXMGzY\nMMysRPPna9euXYmnj+fzOXPmcOONN3q2fvi9LvXtt9/m4osv9vTzyH9e+LvyMk/hTKm+veQ/f+yx\nx6L+9xur51lZWYwYMQKAzMxMJHllZWXt/Y6DSO0rnfXr1/Nm/fp0btSIo2+/PebLL6mk+f4aNeKn\nE0/kkxNPpMvXX1OnTp3YLj9/QFYvHsDfCQ1FdUgJp78NyAOOKvT6E4SOxFYuYj4HuNq1a7uxY8e6\naH311VeuYcOGDnAVKlRwI0eOjHoZzjn3xRdflGq+ePBDlt27d7uKFSs6wK1bt87rOM45f3wu+ZQl\nMj9lCe1CvduHxvMRbltg+Wk7ige1r5TmznV7atRwjw0YEJ/ll1AyfX8P9OnjdlWr5nI3bizR9NHs\nNz2rSTWznoQ6ne2dc+vCr3UBDnXOPR9+XhtYF24UZnYs8B1whXPuvwWWNR9Y7pw7v4h1uTPPPHPv\nbTgvueQSBg4cyIknnlhsxu+//55BgwYxZswYAE444QReffVVmjdvXpamSwFnn302X3zxBW+99Rbd\nunXzOo5IVFSTKhIgeXlwxhnQqxf06eN1muTywQdw1llw4IH7ndT3NalmdinwPDCC0NBRPcOd1vOB\nw8LTtAZWA0/lz+ecW0zoAqkBZnZweLreQF1gYHHrnDBhAo899hgVK1Zk9OjRNGnShA4dOvDAAw8w\nefJkFixYwKJFixg3bhwPPPAALVu25Pjjj2fMmDFUqFCB/v37M2vWLHVQY+yMM84A4Msvv/Q4iYiI\npKpff/2VDy68kLzsbLjqKq/jJJ8uXcirVIm5cyPeU6n0SnrINZYPQrWjuYRO3Rd85AJ3h6dpSqgG\n9c5C85YDhgD5d636ktDdp0p02mr58uWub9++rlKlSo5wGUBRjwMPPND16dPHrVy5skSHsPfHT4fv\n/ZLlk08+cYBr2bKl11Gcc/75XJxTlqL4KQs63Z+0/LQdxYPaF521a9e6T+rVcwM7d47pcksr2b6/\nnTt3uiZNmrg2bdq43NzcYqeNZr/pyYVTzrn93vzWhW5xWjPC6zmERgO4qzTrzszM5IknnuCee+5h\n3LhxTJo0idmzZ7N9+3b27NnDUUcdxXHHHUe7du3o0qULlSsn9P4AKadVq1ZY+F7AO3fu1OctIiIJ\nV7t2bTouXUqbGIwElIoqVarEyy+/TPPmzTGLXQWUL8ZJjTfVVvlb8+bNmTNnDllZWXuv+BdJBqpJ\nFUlueXl5bNy4kVq1ankdJWX4viZVpKDWrVsDqksVEZHEmj17NieccAIvvvii11ECISc7m4k33cQr\nMfo81UlNoILjX3rNT1lq1KgB+KOT6qfPRVki81MWSV5B347UvpJp0aIFkydP5uijj47J8mIlWb+/\nSZMnc+CIEZy8aFFMlqdOqniucePGAEydOpW8vDyP04iISErYtg0WLeK4446jQ4cOXqcJhLPOOouT\nR4/m+I8/hhiUC6kmVXzhyCOPZNWqVcyfP59GjRp5HUekRFSTKpKcli1bxrIePTijfn0qjBzpdZxg\ncQ6aNiV3+HDSOnXa50Iq1aRK0lFdqoiIJEr1TZto9e23DDngAK+jBI8ZU087jWkXXsiUKVPKtCh1\nUhPITzUmfsvil06q3z4Xv1AWCZqgb0dqX/EOfuABqgwYwL0vvRSbQDGW7N/f+g4dOOXAA2lTrVqZ\nluPJOKkihfmlkyoiIsGVl5fHhrFjOWTqVHj5ZdLSdKwuHrpedBE0agQNGpRpOapJFV/IyckhIyOD\nHTt2sHbtWmrXru11JJH9Uk2qSHL59ttv2dKiBdu6d6fz6697HSfwdu/ezezZs2nVqtXe11STKkmn\nXLlyezdiHU0VEZF4aNKkCQ2++opq//qX11ECb8uWLWRmZnL//fdT2j941UlNID/VmPgxS/4p/7IW\nWsciix8oS2R+yiLJK+jbkdpXtDonnUSbtm1jFyYOgvD9Va9ena+++op33nmn1LdKVSdVfKNNmzaA\njqSKiEhsbdiwgWuuuYZVq1Z5HSWlHHXUUWWaXzWp4hvbtm0jIyODtLQ0tmzZQuXKlb2OJFIs1aSK\nJIetW7cyfPhwli9fzqhRo7yOk1I2rV3LlDvuoOpll9GuXTvVpEpyqlq1Kk2aNCEnJ4cZM2Z4HUdE\nRAKiWrVqDBs2jJEauD/hXhs5kjajRlFn06ao51UnNYH8VGPi1yxeD0Xl18/Fa8oiQRP07Ujt+926\nOXPgwgvBuVLXRiZakL6/vjffTI1+/TiuFG1SJ1V8Jb+TOnXqVI+TiIhIstuyZQsfn346ny1ZgopX\nPHT11fDqq7jt26OaTTWp4isrVqygbt26HHzwwaxfvz5p/uqV1KSaVBGfW7yYvNNO49PHH+fcSy/1\nOk3K2r17N8saN+b1Xbu4d9Uq1aRKcjr66KOpU6cOGzduZMmSJV7HERGRZDZoEGk33aQOqscOOOAA\n5rduze01akQ1nzqpCeSnGhO/ZjGzvYP6T5s2zdMsXlOWyPyURZJX0LejVG+fc47/u+Yacj77DG68\nMTGhYiho35+ZcdGLL1Lp8cejmk+dVPGd0047DfCmkyoiIskvLy+POjt3ck+5cuwuX97rOAKQng7t\n2kU1i2pSxXcmT55M27Ztadq0KXPmzPE6jkiRVJMq4m+5ubmkp6d7HUPCnnvuOf7xj3+UeL+pTqr4\nzs6dO6levTp5eXls2bKFKlWqeB1JJCJ1UkX8Z+fOnboZjE/lXxytC6d8yE81Jn7OUrlyZZo2bUpe\nXl7CB/X38+fiJWWRoAn6dpTK7evWrRvdunXjl19+SVygGAvq95eZmRnV9Oqkii+pLlVERErjnXfe\noX379lSvXt3rKFJGOt0vvjRy5EguvfRSunTpwvvvv+91HJGIdLpfxGfWrYOaNSFNx+D8Kpr9pr5F\n8aX8I6nTp09H/1GKhJhZMzN73swWmtm3ZrbAzP5jZjX3M9+BZna7mU02s5nh+eaZ2U2Jyi4Sb+M/\n/5ztZ50FH3/sdRSJEXVSE8hPNSZ+z5KZmckhhxzChg0bWLp0qadZvKIskfkpiwdeBzKAFs65JsA5\nQEfgSzOrWMx8dYEhwL+dcyc75xoBtwEPmtnAeIf2o6BvR6nYvvKffspPP/zAJwE4ihr076+kkv+b\nlEAyM9WliuwrD7jNOfcbgHNuNfAg0ADoXMx824H/c859lP9C+Pd5QLf4xRVJEOdoO2EC9f/3P9qf\nc47XaSRGVJMqvnX//fdz++23889//pOnn37a6zgi+0h0TaqZlXPO5RR6rRPwIXCVc+6lKJe3DFjk\nnOsU4T3tNyUpOOewDz6AO++E2bNVj+pzqkmVQNCRVJE/KtxBDTsWcMCkki4nXKN6H1AJGBCjeCKe\nGP366yy+9FJ++Nvf1EENGH2bCeSnGpNkyNKiRQvS09P59ttv2bFjh6dZvKAskfkpi9fMLB24EnjB\nObekhPNMAX4FLgC6O+dS8rZuQd+OUql93S+4gJ//+lcWNGjgXaAYC/r3V1LqpIpvHXjggZ4N6i+S\nJO4CdgM3lnQG51wboDIwHBhvZn3jlE0kIcpXrMhZzz7LX7qpvDpoVJMqvta3b1+eeuophg0bxoAB\nOisp/uLlOKlm1hvoB7Rzzm0o5TKeAS4HjnbO/VLoPderV6+9d4jJyMigWbNmtGvXDvj9SI+e67lX\nz3NzcylfvjxnnHEGEydO9DyPnkd+npWVxYgRI4DQyD2DBw8u8X5TnVTxtddee42ePXty/vnn8957\n73kdR+QPvOqkmtnfgf5Ae+fcuhJMXx7Ic87lFnr9X8CTwDnOufGF3tN+U3ztxx9/5E9/+hMtWrTg\ntdde8zqOlJAunPKp/L8s/CBZsrRq1QpI3KD+yfK5JJqy+IeZ9aRQB9XMupjZ1QWmqW1mBf8TGAjc\nGmFxmeGfG+MU17eCvh2lQvuOPvpoFixYwJAhQ7yOE3NB//5KSp1U8bV69epRq1Yt1q9fz7Jly7yO\nI+IpM7sUeB4YAXQ0s57hTuv5wGHhaVoDq4GnCszqgGvN7PgCy2oDXANMTNWLpySJOQdvvUW6c9Sr\nV8/rNBInOt0vvte1a1fee+89XnnlFXr27Ol1HJG9PBgndSOhO04VXqcDBjvn7jWzpsB44DHn3H3h\n+TIJdUj/FJ63HJALjAIed87tjLAu7TfFl/Ly8niwUyeuXbCAA1eswMqV8zqSREGn+yVQNF6qSIhz\n7mDnXLpzLq3QI905d294mrnOuZr5HdTwayucc7c755o755o55xo755o654ZH6qCK+F3vn3/mmYMO\nYk9u7v4nlqSlTmoC+anGJJmyFKxL9TpLIilLZH7KIskr6NtRkNuXNm0aCzdu5JZZs6hQoYLXceIi\nyN9fNNRJFd875ZRTSE9PZ+7cuQkb1F9ERPxnw4YNuKFD4W9/g/LlvY4jcaaaVEkKJ510ErNnzyYr\nK4szzzzT6zgigLfjpMab9pviR4O7d+cf77/P5hkzOK5pU6/jSCmoJlUCR3WpIiJy9xtvsPDZZzlc\nV/SnBHVSE8hPNSbJliVRdanJ9rkkirJI0AR9Owpq+ywtjbN792bWrFleR4mroH5/0VInVZJCwSOp\nOgUpIpJa5s2bx+uvv06uruZPKapJlaTgnKN27dqsX7+epUuXavBm8QXVpIokxowZM7jxxhvp1KkT\nd955p9dxpAyi2W9qBFxJCmZGq1ateP/995k2bZo6qSIiKeSUU05hypQp5OTkeB1FEkin+xPITzUm\nyZglEXWpyfi5JIKySNAEfTsKUvvc6tXw8MOYGeXDw04FqX2RBL19JaVOqiQNXeEvIpJaVq9ezctN\nmrBw3Divo4gHVJMqSWP79u1Ur16dtLQ0tmzZQuXKlb2OJClONaki8eV+/ZWczExevv56+tx33/5n\nEN/TOKkSSFWqVOHEE08kJyeHmTNneh1HRETizJ56ivLduqmDmqLUSU0gP9WYJGuW/FP+8apLTdbP\nJd6URYIm6NtRENo3e8oU3BNPwG237fNeENpXnKC3r6TUSZWkorpUEZHU8EX//ozbto31NWt6HUU8\noppUSSo//PADxx57LLVr12bNmjWYBbIcUJKEalJF4uv7uXM5rmlTr2NIDEWz31QnVZKKc45atWqx\nceNGli9fTmZmpteRJIWpkyoiEh1dOOVTfqoxSdYs+YP6Q3xO+Sfr5xJvyiJBE/TtKJnb98Ybb/Cf\n//yHHTt2FDlNMrevJILevpJSJ1WSjupSRUSCq0GDBkyePJkPPvjA6yjiMZ3ul6QzYcIE2rdvz8kn\nn8yMGTO8jiMpTKf7RUSio5rUQrSzDZZt27aRkZFBWloaW7dupVKlSl5HkhSlTqpI7Djn2JOVRYVp\n0+COO7yOI3GimlSf8lONSTJnqVq1Ko0bNyYnJ4dZs2Z5miWelCUyP2WR5BX07SgZ2/ftt98y8dxz\n+WLu3P1Om4zti0bQ21dS6qRKUlJdqohIsDRNT+esatXYedFFXkcRn9DpfklKI0aMoHfv3nTr1o23\n3nrL6ziSonS6XySGLr8cjj1Wp/oDLpr9Zrl4hxGJh4JHUp1zGtRfRCSJffLCC5zz3nukLV3qdRTx\nEZ3uTyA/1Zgke5Zjjz2Wgw46iDVr1rBy5UpPs8SLskTmpyySvIK+HSVT+/Ly8vjxf//j6d272V6+\nfInmSab2lUbQ21dS6qRKUor3oP4iIpIYaWlp9Jk0iUt/+okqVap4HUd8RDWpkrSGDBnC3XffzQ03\n3MBjjz3mdRxJQapJFRGJjoagkpSgK/xFRJLbo48+ysCBA/nll1+8jiI+pE5qAvmpxiQIWU499VTM\njNmzZ7Nr1y5Ps8SDskTmpyySvIK+HSVL+7p27cqWLVtYtGhRVPMlS/tKK+jtKyl1UiVpVatWjUaN\nGpGdnc0333zjdRwREYlSvXr1ePLJJ2nbtq3XUcSHVJMqSa1Pnz48//zzPPTQQ/Tr18/rOJJiVJMq\nUjq5ubnsGDmSaosXw5AhXseRBFJNqqQM1aWKiCSfObNns6h3b97WuKhSDHVSE8hPNSZByVJ4UH8v\ns8SaskTmpyySvIK+Hfm9fS127aL5kUdy2LXXlmp+v7evrILevpJSJ1WS2rHHHktGRgarV69m1apV\nXscREZGSePBByvXvT6vWrb1OIj6mmlRJep06dWLcuHGMHj2aiy++2Os4kkJUkyoSvTGDB9P9ySdJ\nX7kSKlXyOo4kmGpSJaWoLlVEJDnk5eWxe+ZM/p2dzU79EST7oU5qAvmpxiRIWfI7qdOnT/c8Sywp\nS2R+yiLJK+jbkV/bl5aWxt/ff5/b1q+ncuXKpV6OX9sXK0FvX0l52kk1s0PNbJyZ5XmZQ5Jb/qD+\n33zzDbt37/Y6joiI7Ef58uW9jiBJwLOaVDPrBjwE7AEaOOfSo5h3BbApwlv9nHMTIkyv2qqAa9y4\nMQsWLGDq1Kl7j6yKxJtqUkVK7p577uGnn35i4MCB1KtXz+s44pFkqUntB5wNTAei3ck751zzCI99\nOqiSGlSXKiLib9dddx2ZmZls2hTpGJPIvrzspLZxzq3wcP0J56cak6BladWqFVD2utSgfS6xoiwS\nNEHfjnzXPuc4+OCDueuuu2jRokWZF+e79sVY0NtXUp51UnUeSWJJR1JFRPwpOzubtY8+Cjfe6HUU\nSTKej5NqZiOAy5xzJe4wm9lyYAzQBqgJrACedM69X8T06hMHXF5eHgcffDCbN2/mp59+4ogjjvA6\nkqQA1aSK7N/cOXOwk09mVteu9H7rLa/jiMeSpSa1LNYBs5xzrYFGwFhgrJmV7v5qkvTS0tJo2bIl\nEJuhqEREJDaabtxI4/r1OfWee7yOIkkmKTupzrmWzrkx4d9znHNPAx8Bw8ysgrfpiuanGpMgZsmv\nSy3LKf8gfi6xoCwSNEHfjnzVvgcfJK1/fxqdeGLMFumr9sVB0NtXUuW8DhBDXwOdgROA2YXfvPzy\ny8nMzAQgIyODZs2a0a5dO+D3jSHez/Mlan3FPZ8zZ46n6y/4fM6cOTFZXn5d6rhx4zj//PN90z5t\nL7F9HqvtpTTPs7KyGDFiBMDe/YmIFO3FG27gslmzKD92rNdRJAklXU2qmVUE0p1zOwq9PhAYApzq\nnJtZ6D3VVqWAzZs3U6NGDQ444AC2bt1KhQq+PaguAaGaVJGiOed4+6qrmPfhh9yyZAlVqlTxOpL4\nQDLWpBa5JzSz2mZWsDE9gIcjTNoC2AUsjHE2SRIZGRkcf/zx7NmzZ+/RNhER8YaZ0f3FFxm0Zo06\nqFIqfumkRuxRm1lrYDXwVKG3/mpmJxeY7hKgK/CAc25n3FKWUeHTuF4KapayDkUV1M+lrJRFgibo\n25HX7cvL+/1u5388zhQbXrcv3oLevpLyrJNqZk+Hh5LqDjgzW25my8ys4A19txG6/enqAq99BDwI\nPG1ms8PL6A/8wzl3T4Lii09pvFQREe/dfffddOnShXnz5nkdRZKY5zWpiaDaqtSxYMECGjduzFFH\nHcWPP/7odRwJONWkikT222+/8eqrr9KyZUuaNGnidRzxkWj2m+qkSqDk5eVRo0YNtm7dys8//8xh\nhx3mdSQJMC86qWbWDLgWaA3kAOnA58AQ59yGYuY7FLgG+Auhs2jlCNXwD3LOzY8wvfabUjq5uWAG\naX6pKBQ/ScYLp1KCn2pMgpql4KD+pTnlH9TPpayUxVdeBzKAFs65JsA5QEfgy/DoJ0UZROjC087O\nuROBZkAu8JWZNY5zZt8J+nbkVft2797NksGD4cor47oefX+pQZ1UCRzVpUrA5QG3Oed+A3DOrSZU\np9+A0FjRRXHA/c65n8Pz7QZuByoBfeKaWFLG8mXLyBk+nEfXrPE6igSATvdL4Hz88cd07tyZ008/\nnS+//NLrOBJgHp3uL+ecyyn0WifgQ+Aq59xLRcyXDuQV3BmaWSVgB/Cqc+6yQtNrvynRGzcOd+ut\nrHz/fY7WDS8kAp3ul5SWf3vUWbNmsXv3bo/TiMRW4Q5q2LGEjpROKma+3Ai9zmPDP7Nik05S3oMP\nYrfeqg6qxIQ6qQnkpxqTIGepUaMGjRo1Yvfu3cyaNcvTLGWhLJH5KYsfhI+QXgm84JxbEuXsfYD5\nwCsxD+ZzQd+OvGjfY5ddxm/ffou75JK4r0vfX2pQJ1UCqXXr1gA63S+p4C5gN3BjNDOZWXvgYuBi\n51x2PIJJ6nDOcfwRR/BgjRps0xksiRHVpEogvfLKK1x22WX8+c9/ZuzYsV7HkYDyepxUM+sN9APa\nFTf8VIT5mgIfABc556YXMY3r1asXmeHTthkZGTRr1ox27doBvx/p0XM913M9L+55VlYWI0aMACAz\nM5PBgwdrnNSC1ElNPcuWLeOYY46hZs2arFu3Li635RPxspNqZn8ndLe99s65dVHM1wR4F+jpnJta\nzHTab0qJ7Nq1iwoVKmg/KyWiC6d8Kv8vCz8Iepa6detSp04dNmzYwOLFiz3NUlrKEpmfsnjFzHpS\nqINqZl3M7OoC09S2Qr2GSB1UMzvUzJ5JXHp/CPp2lMj2DR8+nFNOOYXp0yMelI8LfX+poZzXAUTi\nwcxo06YNb775JlOmTKFhw4ZeRxKJCTO7FHgeuBPoWKAfegawOjxNa0JX+j8L/Cv82onAeOBNoJ6Z\n1QvPVxPQPxAptbvvvpuTTjqJGjVqeB1FAkan+yWwHnvsMW666SZ69+7NSy9FHDpSpEw8Gid1I6E7\nThVerwMGO+fuDdecjgcec87dF57vLUK3RI2UN8s5d3ah9Wi/Kfu3Z0/oNqiVKnmdRJJENPtNHUmV\nwNIV/hJEzrmDSzDNXEJHSAu+1j1uoSQl7dy5k8W33krTX3/FRo3yOo4EkGpSE8hPNSapkKVZs2ZU\nrlyZxYsXs25dya4rSYXPpTSURYIm6NtRItq3ZtUqarz4Ivf+8kvc11WYvr/UoE6qBFb58uVp2bIl\nAFOnFnkRs4iIlMIxCxZwVJMmXPfGG15HkYBSTaoE2l133cV9993HLbfcwoMPPuh1HAkYr8dJjSft\nN6VYzsHpp0O/fnDhhV6nkSSiIahEwtq0aQPAlClTPE4iIhIMzjmGnHsuW5ctI7tLF6/jSICpk5pA\nfqoxSZUsrVq1wsyYNWsWv/32m6dZoqUskfkpiySvoG9H8W5fxz//mafq1yfHo6Pt+v5SgzqpEmjV\nq1M15JMAACAASURBVFfnxBNPJDs7m5kzZ3odR0Qk6ZkZLa+9lgFffkklDT0lcaSaVAm8a6+9lqef\nfpphw4YxYMAAr+NIgKgmVVLNpk2bqFq1KuXKaQRLKR3VpIoUoPFSRURi4+mnn6ZBgwZMmjTJ6yiS\nAtRJTSA/1ZikUpb8TurUqVPJy8vzNEs0lCUyP2WR5BX07She7Rs4cCCjRo2ibt26cVl+Sen7Sw3q\npErgHXXUURx++OFs2rSJ77//3us4IiLJads22LCBVq1aceSRR3qdRlKAalIlJfTo0YPRo0fz7LPP\n0qdPH6/jSECoJlVSxcaNG1ly5ZW0qFqVcq+84nUcSWKqSRUpRHWpIiKlt239ehqMG8fAjRu9jiIp\nRJ3UBPJTjUmqZSlpJzXVPpeSUhYJmqBvR7FuX+akSRzUvj1D3n03psstLX1/qUGdVEkJTZo0oUqV\nKixdupS1a9d6HUdEJHnk5sJDD8Ftt3HAAQd4nUZSiGpSJWWcc845fP7557z55pt0797d6zgSAKpJ\nlaDLzc1lUKNG/HPXLmp+/z0VKlb0OpIkOdWkikTQpk0bACZPnuxxEhGR5JCenk7PoUMZc9pplCtf\n3us4kmLUSU0gP9WYpGKWtm3bAhQ7CHUqfi4loSwSNEHfjmLZvuO6d+emUaNIT0+P2TLLSt9falAn\nVVJGy5YtKV++PHPmzGHLli1exxER8bWlS5eybds2r2NIClNNqqSUNm3a8OWXX/LBBx9w3nnneR1H\nkpxqUiXIhgwZwuOPP8677767d4QUkbJSTapIEUpyyl9EROCuu+5i2rRpNGnSxOsokqLUSU0gP9WY\npGqW/XVSU/Vz2R9lkaAJ+nZU5vatXAlLllC/fn2qVq0ak0yxpO8vNaiTKimldevWpKWlMXPmTHbs\n2OF1HBER35k3bx6zu3Zl5wsveB1FUpxqUiXlnHLKKcycOZPPPvuMDh06eB1HkphqUiWIVk2dSo2z\nzuKha65h0H/+43UcCZi41aSa2Tgze9rMLjKzWqWLJ+KtM888E1BdqiSO9p2STI4YPZoDr7tOHVTx\nXLSn+/8N7AJuA1ab2QIze8LMupmZbkOxH36qMUnlLPl1qRMnTvQ8S3GUJTI/ZYmC9p0+k6TbUYmV\ntn27V62CV16Bm2+ObaAY0/eXGqLqpDrnJjrnbnbOnQzUJLTDrQH8F/jJzC6IQ0aRmGrTpg1mxldf\nfcWuXbu8jiMpQPtOSQbbt2/n/44/nulHHok79FCv44jEpibVzK4HpgGPAXc758aXeaExpNoqKaxp\n06Z8++23TJw4ce+RVZFolbUm1c/7Tu03U9Pq6dOZ+OWX/LVfP6+jSEDFsyb1HjObHf5Zr+B7zrkZ\nwJnAudEsU8QLGi9VEkn7TkkWh7VqpQ6q+Ea0NanpQH+gLjDPzH4ws1nAaeH36wPLY5gvUPxUY5Lq\nWYrqpKb651IUZSkz7Tt9Jkm3oxKLtn2ffPIJq1evjk+YOND3lxqi7aSuBXDO9QLqANcB9wGXm1kG\nMA84PqYJReIgv5M6depUsrOzPU4jKUD7TvG1qVOn0rhxY5YtW+Z1FJG9oq5JNbM24fkmR3ivIbDa\nObctRvliQrVVEslxxx3HokWLmD59Oi1btvQ6jiShaGqrkm3fqf1m6tm0aRM1atTwOoYEXNxqUgGc\nc1Mi7WTD7y3y005WpDgaL1USSftO8a3PP4f589VBFd/RbVETyE81JsoSebxUfS6RKYsETdC3o5K2\n79mnnmJd9+6sXbgwvoFiTN9falAnVVJWfid1ypQp5ObmepxGRCTx/pqezo7q1ZldtarXUUT2EZNx\nUv1OtVVSlHr16rF8+XJmz55Ns2bNvI4jSaas46T6mfabKSAvD048ER57DM45x+s0kiLiWpMqEiT5\nR1N1akVEUkl2dja/PPMMVKkCHTp4HUckInVSE8hPHSFlCTnrrLMA+OKLLzzPUpiyROanLJK8gr4d\n7a99CxYsYOkNN/BqZiZY8p0MSPXvL1WU8zqAiJfyO6kTJ05UXaqIpIxmzZqxZckSDty0yesoIkVS\nTaqkvPr167N06VJmzJjBySef7HUcSSKqSRURiY5qUkWicPbZZwMwYcIEj5OIiMRXbm4u/fr1Y2GS\nDTklqUmd1ATyU42Jsvwu/5T/hAkTPM9SkLJE5qcskryCvh0V1b6cnBxq1arFFVdcQV5eXmJDxVCq\nfn+pRp1USXn5ndTJkyeTnZ3tcRoRkfipUKECt99+O9OmTSMtTV0A8TfVpIoAjRo1YuHChUyZMoXW\nrVt7HUeShGpSJZns3LGDyv37wx13wOGHex1HUpRqUkWipLpUEQm6e9q25ef//Y9fvA4iUkLqpCaQ\nn2pMlOWP8k/5v/XWWx4n+Z0fPpd8yiJBE/TtaJ/2Oce/K1Tgu+7dyahZ05NMsZRy31+KUidVBPj/\n9u47TIoqbePw7x1yUhSQYBpUQEUQV0WUICKwoiCm1RVWggiua0QRA0ZwTbiKq7ImlKCuimAEJcko\nHxiQqGQX2BUxskqSPOf7o3pwdmygm+nuU13z3Nc1F3RN18xzes5Uv1P1VtWpp56KmbFgwQI2bdrk\nO46ISGpNmUKpNWtoO2wY5cqV851GJCHqSRWJ+d3vfsecOXOYMmXKzsP/IrujnlTJBtM+/JAmV19N\nlf79oWtX33GkhFNPqsheKHwpKhGRqFi7eDFzlyzhncqVfUcRSYqK1AwKU4+JsvxW2E6eCsvrAsoi\n0RP1eVR4fB379KHp2rX8/swz/QVKsZL08yvJVKSKxLRs2ZKcnBw+/fRT1q9f7zuOiEixFG7XKFeu\nHGXKlPGYRiR56kkVKeTkk0/m448/Zvz48XTo0MF3HAm5bOxJNbNywF+BvsBpzrkPd/E8bTez3OjR\no3nyySe57777aNq0qe84IoB6UkX2WkFf6pQpUzwnEYnPzJqY2TNmttDM5pvZAjN71Mz2eF0hMzsG\n+Bg4Dciq4lqSd84559ClSxdWrVrlO4rIXlGRmkFh6jFRlviqVasGhKNIDdProiyh8jJQFTjeOdcY\naAe0B6abWfk9rHsTcAPw9/RGDL+oz6O899+nDNCrVy/OO+8833FSLvI/v4iPL1EqUkUKadSoEeXL\nl2fu3Ll8953uyyKhlA/c5JzbBOCcWw0MBuoBezozprtz7n20FzXStm7dyvIRI3BduviOIlIs6kkV\nKeL3v/89EydO5IUXXqCrrikou+GjJ9XMSjvnthdZ1gEYB1zmnHsuga/RA3gOaK2e1Oj5cskSaNyY\nca1bc+2ECb7jiPwP9aSKFEP79u0BmDRpkuckIr9VtECNqQ84IG7BKSXLEZ98wuEnnMA5Tz3lO4pI\nsahIzaAw9ZgoS3x5eXk7i9SJEyfic09S2F6XsAhTljAws1JAL+BZ59yXvvNki8jOo61b4a67+ODC\nCzk0N9d3mrSJ7M8vJurjS1Rp3wFEwuaYY46hVq1afPPNNyxcuJCGDRv6jiSyO7cDW4DrUv2Fe/To\nQW6s0KlatSpNmjShdevWwK9votn6eO7cuaHKk4rHGzdu5MsbbqDL/vszJz8f8vJClS+Vj6P484vq\n+PLy8hg+fDjAzu1JotSTKhJHt27dGDVqFA8//DB9+/b1HUdCyvd1Us2sJ8HZ+q2dcz8msV4P1JMa\nOc45ZgwYwORFi7hj7FjMdH6chI96UkWKqV27doD6UiW8zOwS4HqgTTIFqkSXmdH83nu58/XXVaBK\nJKhIzaCC3d9hoCzxFWRp27btzsdbtmzxmiUMlCVczOxPQH/gdOfc97FlHc2sd6Hn1DRVKrsUtXk0\ne/Zs8vPzdz6O2viK0vhKBhWpInHUrl2bRo0asWnTJmbMmOE7jshOZtYVeAYYDrQ3sz/FitZOQJ3Y\nc5oDq4En9vTl0hhVMmTHjh1ce+21NG3alM2bN/uOI5Iy6kkV2YV+/frxt7/9jZtvvpn77rvPdxwJ\nIU/XSV1DcMepot/XAXc75waa2bHAFGCIc+6eQut2A+4GKgP7A98Dm4FuzrlpRb6PtptZxDnHzJkz\nadq0qe8oIruVzHbTa5FqZrWB54H2zrm07dXVxlb2xoQJEzjjjDM4/vjj+eyzz3zHkRDyfeJUOmm7\nmUXeew9atYKKFX0nEdmjrDhxyszOA6YDuQR7AJJZt4yZDTKzRWb2uZlNjx3eCrUw9ZgoS3yFs7Rs\n2ZJy5coxe/Zsfvwx8+elhPV18S1MWSR7RWUe3d21K5svvJD8X375n+VRGd+uaHwlg8+e1BuANsDH\nJN8X9RjwB6CFc64RwaVUJsYOcYmkRMWKFWnRogXOOaZMmeI7jojIb1yxahWjatRgjfZ6SwR5O9xv\nsWNJZjacoB8qoYLZzBoAC4FezrnhhZZ/Aax0znWMs44OW8leefDBB7npppu49NJLGTZsmO84EjI6\n3C9ezZgBF10ES5dChQq+04gkJCsO9xdj63cuwZ7XqUWWTyU401VNOZIyBddL9X2LVBGRwpYsXkx+\nv34waJAKVImsbLwEVWNgB/CfIstXENzm9eiMJ0pQmHpMlCW+olmOPfZYatasyapVq1iwYIHXLD4p\ni0RNts+jt/v3Z8msWaxo0SLu57N9fHui8ZUM2VikVgd+ibMndl3s32oZziMRlpOTQ4cOHQAYP368\n5zQiIoF+b73FT2PHcnCS90IXySalfQfIlB49epAb+2WuWrUqTZo0oXXr1sCvf7GUtMcFfOcpWOb7\n9WjdujWtW7f+zecPPfRQIChS+/fv7/310nzxN1/y8vIYPnw4wM7tiWSnwvMpW51y1lm7/FwUxrc7\nGl/J4P1i/ntx4tRLwIVAmcJ7U83seuAhoKlz7rMi6+gEANlrP//8M9WrVwdgzZo17Lvvvp4TSVjo\nxCnJtIEDB1K9enX69OlD6dIlZj+TREhWnDhVDPMIch9cZHldYBvBmf+hVHSPlE/KEl+8LFWrVqV5\n8+bs2LGDSZMmec3ii7JI1GTrPOrcuTOvv/46ixYt2u3zsnV8idL4SoawFKm7/HPdzGqaWeGK+/XY\n808r8tTTgInOuV8QSbEzzzwTUF+qiHjkHMceeyyTJk2iUaNGvtOIpF2oD/fH7iL1IfCUc+4vhZb/\ng6Aobe6cW2NmPYHHgZOdc/PjfB0dtpJi+fzzz2ncuDG1atXi66+/JicnLH/fiU863C+ZsnTpUuoO\nGECZK68E9StKFsuKw/1mNtTMVgDnA87MVpjZcjMrU+hp64GfgNVFVr8aGA1MN7PPgcuA9vEKVJFU\nOOaYYzjooIP49ttvmTt3ru84IlLCzLjvPr59/XXm6ZqoUoL4vJj/X5xzdZ1zVZxzpWL/P8w5t63Q\nc+Y756o75+4psu5259ztzrkjnXONnHPNnXPTMz+K5ISpx0RZ4ttVFjPjrNiZtOPGjfOaxQdlkajJ\nqnm0Ywc95s5l68CB1G/cOKFVsmp8e0HjKxl0zFIkQepLFREvnn0W9tmHw2+5hQrakyoliPee1ExQ\nb5WkwoYNG6hWrRrbtm3j+++/33lZKim51JMq6Tawb1+uf+YZSk+eTPlmzXzHESm2rOhJFck2lStX\n5tRTT8U5x4QJE3zHEZESoOfFFzPqyCNZVqmS7ygiGaciNYPC1GOiLPHtKUsmD/ln0+uSSWHKItkr\nW+bRwU2bcsVnnyV9yalsGd/e0vhKBhWpIkkoKFLfe+89duzY4TmNiETVxx9/zHfffec7hohX6kkV\nSVK9evX48ssvmT59OqeccorvOOKRelIlXR588EEGDx5MXl4eDRs29B1HJGXUkyqSRgWXonr77bc9\nJxGRqOrfvz/Tp0/nyCOP9B1FxBsVqRkUph4TZYkvkSxnn302AG+++ab3LJmiLBI1YZ1HO3bsCC45\n9dVX1K9fn1KlSu3V1wnr+FJF4ysZVKSKJKlly5ZUrVqVRYsWsWzZMt9xRCRC+p9xBuuvuYYN27f7\njiLinXpSRfbCn/70J1588UUGDx5Mv379fMcRT9STKimVn8+2Zs14vXJl2o0Zw3777ec7kUjKqSdV\nJM06d+4MpP+Qv4iUIM88Q5lSpbhw8mQVqCKoSM2oMPWYKEt8iWY544wzKFu2LDNmzOCHH37wmiUT\nlEWiJmzz6JmBA9lx663w9NOQU/y35rCNL9U0vpJBRarIXqhSpQpt2rQhPz+fd955x3ccEclizjmq\nLV/OkG3b2FC3ru84IqGhnlSRvfTkk09yxRVX0LlzZ9544w3fccQD9aRKKm3YsIHKlSv7jiGSVsls\nN1Wkiuyl1atXc+CBB1KhQgV+/PFHKlas6DuSZJiKVCmu5cuXc9hhh/mOIZIxOnEqpMLUY6Is8SWT\npU6dOpx44ols2rSJKVOmeM2SbsoiUROGebR582bat29Pr169SPUfBGEYXzppfCWDilSRYtBZ/iKy\nt8qXL8+cOXM488wzMYvkDnmRYtHhfpFi+OKLL2jUqBE1atTgm2++2eu7w0h20uF+2WubNsGkSRC7\ng51ISaHD/SIZ0rBhQ+rVq8cPP/zAtGnTfMcRkSywfPlyXqpXj7VDh/qOIhJqKlIzKEw9JsoSX7JZ\nzIwLLrgAgNdee81rlnRSFokan/Oo7jffcM769TySxhOmov57ovGVDCpSRYqpoEgdM2YM+fn5ntOI\nSKht3Ij16EHF557jLu1JFdkt9aSKFJNzjsMOO4yVK1cybdo0WrRo4TuSZIh6UiUZn332Gfvedhv1\natSAUaN8xxHxQj2pIhmUzkP+IhIdpbds4ftp03i5eXPfUUSygorUDApTj4myxLe3WdJxyD8Kr0s6\nhCmLZC8f86hJ8+b87scfOadHj7R/r6j/nmh8JYOKVJEUaNq0KQcffDCrVq1i5syZvuOISIjMmzeP\nTZs2AVChQgXKly/vOZFIdlBPqkiKXHfddTz66KP069ePwYMH+44jGaCeVEnEVVddRV5eHlOmTKFm\nzZq+44h4lcx2U0WqSIr83//9Hy1btiQ3N5fly5frDjIlgIpUSYRzjvHjx9OhQwdycnQAU0o2nTgV\nUmHqMVGW+IqT5ZRTTqF27dqsXLmS2bNne82SasoiUZOJebTuxx/h3nuxbds466yzMlqgRv33ROMr\nGVSkiqRITk4O5513HgCvvvqq5zQi4tNPP/3Eq7m5fDV2LJQp4zuOSFbS4X6RFJo2bRqtWrXikEMO\nYcWKFTq0F3E63C+79NprbLnuOp7u04er77jDdxqR0FBPahHa2Eqm5Ofnk5uby1dffaUL+5cAKlKl\nKOcc9q9/wSmnwPjxcMIJviOJhIp6UkMqTD0myhJfcbPk5OTwxz/+EYB//vOfXrOkkrJI1KRrHj39\n6KP856ST2HrrrV4L1Kj/nmh8JYOKVJEU69KlCwCjR49m27ZtntOISCZ1/eMfmXr44Uxv3Nh3FJGs\np8P9IinmnOPoo49m8eLFvPvuu5xxxhm+I0ma6HC/iEhydLhfxCMz4+KLLwaKf8hfRMJvy5YtnHvu\nuSxatMh3FJFIUZGaQWHqMVGW+FKVpaBIff3113feDtFXllRQFomaVM6jcuXK0bFjR/7yl78Qlr3P\nUf890fhKBhWpImlQr149TjjhBNavX8+4ceN8xxGRdFm/HjZupFevXkyePFl3mhNJIfWkiqTJI488\nwvXXX895553HmDFjfMeRNFBPask2Ytgw2gwZwsFdusAtt/iOI5IV1JMqEgIXXXQRZsa4ceP4+eef\nfceRCDCzJmb2jJktNLP5ZrbAzB41s+oJrFvGzAaZ2SIz+9zMpptZ80zkjiTn6Dx5MiuWL2dm69a+\n04hEkorUDApTj4myxJfKLHXq1KFNmzZs2bJlr26TGtXXpbjClMWDl4GqwPHOucZAO6A9MN3Myu9h\n3ceAPwAtnHONgOeAiWZ2bDoDh1Wx59HDD1N1wQJO+Ne/OPHkk1OSKZWi/nui8ZUMKlJF0qhHjx4A\nDB8+3GsOiYx84Cbn3CYA59xqYDBQDzhzVyuZWQOgN3C/c25NbN1hwArgr+kOHSVfffUVT7VoQf4j\nj8A771CxVi3fkUQiSz2pImm0ceNGatWqxYYNG1i8eDENGjTwHUlSKNM9qWZW2jm3vciyDsA44DLn\n3HO7WO9m4F6grnPu34WWPwZcDlR1zv1SZB1tN+PYvn07Uxo3Zv5JJ3Hj88/7jiOSddSTKhISlSpV\n4sILLwRg5MiRntNItitaoMbUBxzw4W5WbQzsAP5TZPkKoDRwdEoClgClS5em3RdfcNXQob6jiESe\nitQMClOPibLEl44sBYf8R44cyY4dO7xm2VvKEk5mVgroBTzrnPtyN0+tDvwSZ9fouti/1eKttHr1\n6uKHDKlk5lF+fj4dO3Zk9uzZAOTk5FChQoU0JUuNqP+eaHwlQ2nfAUSirkWLFhx22GEsX76c999/\nn3bt2vmOJNFxO7AFuC4dX7zr6adz6kUXAVC1alWaNGlC69iZ7AVvotn6eO7cuQk/Pycnh6ZNm9K9\ne3fmz5+PmXnPn8rxZeNjjS97Hufl5e08LyM3N5dkqCdVJAMGDhzInXfeSdeuXXnhhRd8x5EU8Xmd\nVDPrCdwAtHbO/biH574EXAiUKbwxNLPrgYeAps65z4qs41yNGvDuu3D88akfQBbYsmUL5RYsgNxc\n2H9/tm3bRpkyZXzHEslq6kkVCZlu3boBMHbsWNauXes5jWQ7M7sEuB5os6cCNWYewfb+4CLL6wLb\ngIVx13rmGejYkXmvvMKWLVuKkTg73depExtbtYJ58wBUoIpkmIrUDApTj4myxJeuLLm5ubRu3ZpN\nmzYxevRor1n2hrKEh5n9CegPnO6c+z62rKOZ9S70nJr2v/fnfJ3g5KrTiny504CJRc/s36lzZ2b9\n4Q/s36ULKz/4IJXD8G6P82jcOG6fNYt7GzRgw4knZiRTKkX990TjKxlUpIpkSMEJVMOGDfMbRLKW\nmXUFngGGA+3N7E+xorUTUCf2nObAauCJgvWcc0uBp4FbzKxa7Hk9CfakDtjd9yx16aXk3HgjDWbN\nSv2AQmj+/Pls/Mc/oFcvSo0bx19nzaJy5cq+Y4mUSOpJFcmQjRs3UqdOHdatW8f8+fNp1KiR70hS\nTB6uk7qG4I5TRb+nA+52zg2M3UFqCjDEOXdPoXVLA3cS3HVqG8GZ/f2dc9N38b1+s93csWMHDz30\nEH/5y1+oUqVKqoYVKs9360aHV1+l6kcfUf6443zHEYkc9aSKhFClSpW45JJLAHjqqac8p5Fs5Jyr\n5pwr5ZzLKfJRyjk3MPacec656oUL1Njy7c65251zRzrnGjnnmu+qQN2V2267jffee4/SpaN7YZhu\nzz7LWwMGkNOwoe8oIiWeitQMClOPibLEl+4sffr0AWDUqFFs3LjRa5ZkKItAMH/feuutndcI3b49\n3r0FskPheXTdddcxdepUAEqVLUuf22+nbNmynpKlRtR/TzS+kkFFqkgGNW7cmGbNmrFu3TpeffVV\n33FEklK3bt2dh/m/mTmTBw46iP+uWeM5VfF16tSJPn36sG3bNt9RRKQQ9aSKZNjw4cPp2bMnJ510\nEh9//LHvOFIMPq+Tmm572m4OvuYauo0ZQ83TT4enn4by5TOYrnicc4x55RXOXbqUUr17Q+3arF27\nln333dd3NJHIS2a7qSJVJMN++eUX6tSpw9q1a5k7dy7HHnus70iyl0pykeqcg19+wS69FJYt49Wz\nz6bl5ZdTu3btDKbcO/nLlrHoxBMpW7069WbMgAMO8B1JpMTQiVMhFaYeE2WJLxNZKlasmNAJVCXt\ndUlUmLKUZGaGVaoEL7/MotataTtoEPuMHOk71i7t2LGDhfPmwQMPkHPyyaw85xzm3XtvZAvUqP+e\naHwlg4pUEQ8uv/xyAF544QU2bNjgOY1IMZix/003sWr0aCrVqQPAokWLWLp0qedg/2vx55+z9YQT\n2DJhAsycSaUePbjgwgt9xxKR3dDhfhFPmjdvzowZM3jyySd3Fq2SXUry4f5dcc7RqlUrunfvzmWX\nXZaGZImbN28eBx10ENWqVQNg+LXXctTFF3NSs2Zec4mUZDrcL5IFrrzySgAee+wx9EeURMXmzZtp\n06YNPXv2BMDl5/P4gw+yZcuWjGd58sknue+++3Y+7vHooypQRbKIitQMClOPibLEl8ksF1xwAbVr\n12bBggW8//77XrPsibJIoipUqMDdd99NqVKlAPho6FC63HorZQcNgm+/Zfv27Wn7o2zJ4sW82LMn\nDBoEwB133LHL651GfR5pfNkt6uNLlIpUEU/Kli3LFVdcAcCjjz7qOY1IelRq2ZIlw4Zha9bAUUex\nqmlThrVtC+vXF/tr79ixg1defhlmzYKbbuKIM87guJEjWVe5MgC1a9fm3nvvLfb3ERE/1JMq4tH3\n33/PwQcfzLZt21i2bBmHH36470iSBPWkJumnn3iyQwfO3rqVOtdeC927c+ONN9KoUSO6desGwKxZ\nszjooIOoWbMmACtWrKBGjRpUjhWegwcP5oorrqBy5co455hdrhyN69ShTJcucOGFvL9mDc1btKBc\nuXKpzS4iKaGeVJEsccABB9ClSxecczz22GO+44ik13770WfGDA749FPo3h2AadOmkZubu/Mpq889\nFzvrLOjaFS6+mJUnncSmDh3giy8AePPNN/n000+B4M3us1tuYdGbb8K990KTJrQ5/XQVqCIRoSI1\ng8LUY6Is8fnIcs011wDw3HPPsb7QIdCS/rrsSpiySPJycnIoXbr0zscTJkygWaGTmb5o3ZqtffpA\nhw7QqROLjz6anzp02Hk90xtuuGHnXlaAy+++m8Z7cUOMqM8jjS+7RX18iSq956eISDodd9xxtGzZ\nkmnTpjF8+HCuvvpq35FEMqborUhvKXJDgCu6dPmfx+eee27aM4lIOKgnVSQExowZwwUXXMARRxzB\n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\nB0lEQVTo/D9EAVodDt65OwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(11,8))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls='-', lw=2)\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_leapfrog[idx_ground_leapfrog-1]), fontsize=18);\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_leapfrog[:idx_ground_leapfrog], y_leapfrog[:idx_ground_leapfrog], color='k', ls=':', lw=2)\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What about the observed order of convergence? We'll repeat the process we have used before, with a grid-refinement ratio $r=2$ ... here we go:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The order of convergence is alpha = 2.186\n" + ] + } + ], + "source": [ + "# check convergence rate\n", + "r = 2\n", + "h = 0.001\n", + "\n", + "dt_values = numpy.array([h, r*h, r**2*h])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " u[1] = rk2_step(u[0], f, dt)\n", + " for n in range(1, N-1):\n", + " u[n+1] = leapfrog_step(u[n-1], u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + " \n", + "# calculate the order of convergence\n", + "alpha = (log(get_diffgrid(u_values[2], u_values[1], dt_values[2])) \n", + " - log(get_diffgrid(u_values[1], u_values[0], dt_values[1]))) / log(r)\n", + "\n", + "print('The order of convergence is alpha = {:.3f}'.format(alpha))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have numerical evidence that our calculation with the leapfrog method indeed exhibits second-order convergence, i.e., the method is ${\\mathcal O}(\\Delta t^2)$. _The leapfrog method is a second-order method_. Good job!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### But chew on this ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Go back to the cell that re-enters the model parameters, just above the leapfrog-method time loop, and change the following: the initial height `y0` to 25, and the final time `T` to 36. Now re-run the leapfrog calculation and the two code cells below that, which extract the glider's position and plot it.\n", + "\n", + "_What is going on?_\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tobies, R. \"Iris Runge: A life at the crossroads of mathematics, science and industry,\" Springer Basel, 1st ed. (2012). [Read on Google books, page 73](http://books.google.com/books?id=EDm0eQqFUQ4C&lpg=PA73&dq=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&pg=PA73#v=onepage&q=%22I%20have%20been%20making%20good%20progress%20with%20Lanchester.%20The%20second%20chapter%20is%20already%20on%20your%20desk%22&f=false)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lecture_22/01_phugoid/README.md b/lecture_22/01_phugoid/README.md new file mode 100644 index 0000000..c7c2701 --- /dev/null +++ b/lecture_22/01_phugoid/README.md @@ -0,0 +1,43 @@ +#Module 1: The phugoid model of glider flight. + +##Summary + +The phugoid model motivates the learning of numerical time integration methods. The model is described by a set of two nonlinear ordinary differential equations, representing the oscillatory trajectory of an aircraft subject to longitudinal perturbations. + +* [Lesson 1](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_01_Phugoid_Theory.ipynb) presents the physics of phugoids in the assumption of zero drag (following Lanchester, 1909). Plotting the flight path gives fascinating curve shapes. +* [Lesson 2](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_02_Phugoid_Oscillation.ipynb) develops a single-equation model for zero-drag oscillations, leading to simple harmonic motion. The lesson defines initial-value problems, demonstrates Euler's method, and uses the exact solution to study the numerical convergence. +* [Lesson 3](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb) develops the full phugoid model and solves it with (vectorized) Euler's method. In the absence of an exact solution, the study of convergence uses a grid-refinement method, obtaining the observed order of convergence. The lesson ends with the paper-airplane challenge. +* [Lesson 4](http://nbviewer.ipython.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_04_Second_Order_Methods.ipynb) starts with the screencast "Euler's method is a first-order method" and develops second-order methods: explicit midpoint (modified Euler) and Runge-Kutta. It ends with a grid-refinement study. + +##Badge earning + +Completion of this module in the online course platform can earn the learner the Module 1 badge. + +###Description: What does this badge represent? + +The earner completed Module 1 "The phugoid model of glider flight" of the course "Practical Numerical Methods with Python" (a.k.a., numericalmooc). + +###Criteria: What needs to be done to earn it? + +To earn this badge, the learner needs to complete the graded assessment in the course platform including: answering quiz about basic numerical Python commands; answering quiz about basics of initial-value problems; completing the individual coding assignment "Rocket flight" and answering the numeric questions online. Earners should also have completed self-study of the four module lessons, by reading, reflecting on and writing their own version of the codes. This is not directly assessed, but it is assumed. Thus, earners are encouraged to provide evidence of this self-study by giving links to their code repositories or other learning objects they created in the process. + +###Evidence: Website (link to original digital content) + +Desirable: link to the earner's GitHub repository (or equivalent) containing the solution to the "Rocket flight" coding assignment. +Optional: link to the earner's GitHub repository (or equivalent) containing other codes, following the lesson. + +###Category: + +Higher education, graduate + +###Tags: + +engineering, computation, higher education, numericalmooc, python, gwu, george washington university, lorena barba, github + +###Relevant Links: Is there more information on the web? + +[Course About page](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about) + +[Course Wiki](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/wiki/GW.MAE6286.2014_fall/) + +[Course GitHub repo](https://github.com/numerical-mooc/numerical-mooc) diff --git a/lecture_22/01_phugoid/Rocket_Assignment.ipynb b/lecture_22/01_phugoid/Rocket_Assignment.ipynb new file mode 100644 index 0000000..2839d18 --- /dev/null +++ b/lecture_22/01_phugoid/Rocket_Assignment.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, G.F. Forsyth." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Coding Assignment: Rocket" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The equations of motion for a rocket in purely vertical flight are given by\n", + "\n", + "\\begin{align}\n", + "\\frac{dh}{dt} &= v\\\\\n", + "(m_s+m_p) \\frac{dv}{dt}& = -(m_s+m_p)g + \\dot{m}_pv_e - \\frac{1}{2}\\rho v|v|AC_D\n", + "\\end{align}\n", + "\n", + "$h$ is the altitude of the rocket\n", + "\n", + "$m_s = 50kg$ is the weight of the rocket shell\n", + "\n", + "$g = 9.81 \\frac{m}{s^2}$\n", + "\n", + "$\\rho = 1.091 \\frac{kg}{m^3}$ is the average air density (assumed constant throughout flight)\n", + "\n", + "$A = \\pi r^2$ is the maximum cross sectional area of the rocket, where $r = 0.5 m$\n", + "\n", + "$v_e = 325 \\frac{m}{s}$ is the exhaust speed\n", + "\n", + "$C_D = 0.15 $ is the drag coefficient\n", + "\n", + "$m_{po} = 100 kg$ at time $t = 0$ is the initial weight of the rocket propellant\n", + "\n", + "The mass of the remaining propellant is given by:\n", + "\n", + "$$m_p = m_{po} - \\int^t_0 \\dot{m}_p d\\tau$$\n", + "\n", + "where $\\dot{m}_p$ is the time-varying burn rate given by the following figure:\n", + "\n", + "Propellant Burn Rate\n", + "\n", + "![burn rate](./burn.rate.png)\n", + "\n", + "Using Euler's method with a timestep of $\\Delta t=0.1s$, create a Python script to calculate the altitude and velocity of the rocket from launch until crash down. \n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assessment:\n", + "\n", + "To check your answers, you can register for [MAE 6286: Practical Numerical Methods with Python](http://openedx.seas.gwu.edu/courses/GW/MAE6286/2014_fall/about).\n", + "\n", + "1. At time $t=3.2s$, what is the mass (in kg) of rocket propellant remaining in the rocket?\n", + "\n", + "2. What is the maximum speed of the rocket in $\\frac{m}{s}$?\n", + " At what time does this occur (in seconds)? \n", + " What is the altitude at this time (in meters)? \n", + " \n", + "3. What is the rocket's maximum altitude during flight (in meters)? At what time (in seconds) does this occur?\n", + "\n", + "4. At what time (in seconds) does the rocket impact the ground? What is the velocity of the rocket (in $\\frac{m}{s}$) at time of impact?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivation of the rocket equations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In case you are kind of confused about the rocket equations, here we show how to get to them. \n", + "\n", + "Newton's second law states that the acceleration of the vehicle times its mass is equal to all the forces acting on it. Therefore,\n", + "\n", + "\\begin{equation}\n", + "(m_s + m_p)\\frac{d\\bf{v}}{dt}=\\sum {\\bf F}.\n", + "\\end{equation}\n", + "In the above formula we have assumed that the propellant inside the rocket and the rocket move at the same velocity (in other words, their relative velocity is negligible). \n", + "\n", + "Two of the external forces acting on the rocket are,\n", + "\n", + "\\begin{align}\n", + "{\\bf F}_g&= (m_s+m_p)\\bf{g} \\quad (\\rm{Gravity}),\\\\\n", + "{\\bf F}_d&= - \\frac{1}{2} \\rho_a \\mathbf{v} |\\mathbf{v}| A C_D \\quad (\\rm{Drag}).\n", + "\\end{align}\n", + "\n", + "We also need to consider the force resulting from the ejection of the propellant. During an interval $dt$, the engine of the rocket ejects downwards a mass of propellant given by $\\dot m_p dt$. Relative to the rocket, the speed of the ejected burning gas is assumed constant and equal to $v_e$ (the exhaust speed). The momentum variation induced on the exhaust gas by the engine during that interval is therefore, $d{\\bf p}_{gas} = \\dot m_p {\\bf v}_e dt$. Again using Newton's second law we conclude that the force applied by the rocket on the gas is,\n", + "\n", + "\\begin{align}\n", + "{\\bf F}_{rocket\\rightarrow gas} = \\frac{d{\\bf p}_{gas}}{dt} = \\dot m_p {\\bf v}_e\n", + "\\end{align}\n", + "\n", + "Using Newton's third law (|action| = |reaction|), the force exerted by the exhaust gas on the rocket is then,\n", + "\n", + "\\begin{align}\n", + "{\\bf F}_{gas\\rightarrow rocket} = -{\\bf F}_{rocket\\rightarrow gas} = -\\dot m_p {\\bf v}_e\n", + "\\end{align}\n", + "\n", + "If we collect all the forces acting on the rocket we finally have:\n", + "\n", + "\\begin{align}\n", + "(m_s + m_p)\\frac{d\\bf{v}}{dt}=(m_s+m_p){\\bf g}- \\frac{1}{2} \\rho_a \\mathbf{v} |v| A C_D -\\dot m_p {\\bf v}_e\n", + "\\end{align}\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "###### The cell below loads the style of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import HTML\n", + "css_file = '../../styles/numericalmoocstyle.css'\n", + "HTML(open(css_file, \"r\").read())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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 +} diff --git a/lecture_22/01_phugoid/burn.rate.png b/lecture_22/01_phugoid/burn.rate.png new file mode 100644 index 0000000..d2cd935 Binary files /dev/null and b/lecture_22/01_phugoid/burn.rate.png differ diff --git a/lecture_22/01_phugoid/figures/glider_forces-lesson3.png b/lecture_22/01_phugoid/figures/glider_forces-lesson3.png new file mode 100644 index 0000000..6d73dd7 Binary files /dev/null and b/lecture_22/01_phugoid/figures/glider_forces-lesson3.png differ diff --git a/lecture_22/01_phugoid/figures/glider_forces.png b/lecture_22/01_phugoid/figures/glider_forces.png new file mode 100644 index 0000000..ac036d5 Binary files /dev/null and b/lecture_22/01_phugoid/figures/glider_forces.png differ diff --git a/lecture_22/01_phugoid/figures/glider_forces_fbd.svg b/lecture_22/01_phugoid/figures/glider_forces_fbd.svg new file mode 100644 index 0000000..47a1d34 --- /dev/null +++ b/lecture_22/01_phugoid/figures/glider_forces_fbd.svg @@ -0,0 +1,465 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trajectory + + + + + + + + + + + + diff --git a/lecture_22/01_phugoid/figures/glider_forces_nodrag.png b/lecture_22/01_phugoid/figures/glider_forces_nodrag.png new file mode 100644 index 0000000..969042c Binary files /dev/null and b/lecture_22/01_phugoid/figures/glider_forces_nodrag.png differ diff --git a/lecture_22/01_phugoid/figures/glider_forces_nodrag.svg b/lecture_22/01_phugoid/figures/glider_forces_nodrag.svg new file mode 100644 index 0000000..00942f4 --- /dev/null +++ b/lecture_22/01_phugoid/figures/glider_forces_nodrag.svg @@ -0,0 +1,368 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trajectory + diff --git a/lecture_22/01_phugoid/figures/oscillatory_trajectory.png b/lecture_22/01_phugoid/figures/oscillatory_trajectory.png new file mode 100644 index 0000000..6e7dca9 Binary files /dev/null and b/lecture_22/01_phugoid/figures/oscillatory_trajectory.png differ diff --git a/lecture_22/01_phugoid/figures/rocket_CV.png b/lecture_22/01_phugoid/figures/rocket_CV.png new file mode 100644 index 0000000..5686f4f Binary files /dev/null and b/lecture_22/01_phugoid/figures/rocket_CV.png differ diff --git a/lecture_22/01_phugoid/figures/vonKarman-phugoids.png b/lecture_22/01_phugoid/figures/vonKarman-phugoids.png new file mode 100644 index 0000000..e3c6414 Binary files /dev/null and b/lecture_22/01_phugoid/figures/vonKarman-phugoids.png differ diff --git a/lecture_22/01_phugoid/phugoid.py b/lecture_22/01_phugoid/phugoid.py new file mode 100755 index 0000000..0f99fd6 --- /dev/null +++ b/lecture_22/01_phugoid/phugoid.py @@ -0,0 +1,112 @@ +# Script to plot the flight path of the phugoid using Lanchester's model. +# It uses the sign convention and formulae provided by Milne-Thomson (1958). + +import numpy +from matplotlib import pyplot + +numpy.seterr(all='ignore') +''' +see http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html for explanation. ignore over/underflow errors that pop up in the radius_of_curvature function +''' + +def radius_of_curvature(z, zt, C): + """Returns the radius of curvature of the flight path at any point. + + Parameters + --------- + z : float + current depth below the reference horizontal line. + zt : float + initial depth below the reference horizontal line. + C : float + constant of integration. + + Returns + ------- + radius : float + radius of curvature. + """ + return zt / (1/3 - C/2*(zt/z)**1.5) + +def rotate(x, z, xCenter, zCenter, angle): + """Returns the new position of the point. + + Parameters + --------- + x : float + previous x-position of the point + z : float + previous z-position of the point. + xCenter : float + x-location of the center of rotation. + zCenter : float + z-location of the center of rotation. + angle : float + angle of rotation + + Returns + ------- + xCenter_new : float + new x-location of the center of rotation. + zCenter_new : float + new z-location of the center of rotation. + """ + dx = x - xCenter + dz = z - zCenter + # the following formulae take into account the orientation of the axes + xNew = dx*numpy.cos(angle) + dz*numpy.sin(angle) + zNew = -dx*numpy.sin(angle) + dz*numpy.cos(angle) + return xCenter + xNew, zCenter + zNew + +def plot_flight_path(zt, z0, theta0): + """Plots the flight path. + + Parameters + --------- + zt : float + trim height of the glider. + z0 : float + initial height of the glider. + theta0 : float + initial orientation of the glider. + + Returns + ------- + None : None + """ + # arrays to store the coordinates of the flight path + N = 1000 + z = numpy.zeros(N) + x = numpy.zeros(N) + + # set initial conditions + z[0] = z0 + x[0] = 0. + theta = theta0 + + # calculate the constant C + C = (numpy.cos(theta) - 1/3*z[0]/zt)*(z[0]/zt)**.5 + # incremental distance along the flight path + ds = 1 + + #obtain the curve coordinates + for i in range(1,N): + # minus sign for the second coordinate because the z-axis points downwards + normal = numpy.array([numpy.cos(theta+numpy.pi/2.), -numpy.sin(theta+numpy.pi/2.)]) + R = radius_of_curvature(z[i-1], zt, C) + center = numpy.array([x[i-1]+normal[0]*R, z[i-1]+normal[1]*R]) + dtheta = ds/R + x[i], z[i] = rotate(x[i-1], z[i-1], center[0], center[1], dtheta) + theta = theta + dtheta + + # generate a plot + pyplot.figure(figsize=(10,6)) + pyplot.plot(x, -z, color = 'k', ls='-', lw=2.0, label="$z_t=\ %.1f,\\,z_0=\ %.1f,\\,\\theta_0=\ %.2f$" % (zt, z[0], theta0)) + pyplot.axis('equal') + pyplot.title("Flight path for $C$ = %.3f" % C, fontsize=18) + pyplot.xlabel("$x$", fontsize=18) + pyplot.ylabel("$z$", fontsize=18) + pyplot.legend() + pyplot.show() + +# End of File diff --git a/lecture_22/figures/glider_forces-lesson3.png b/lecture_22/figures/glider_forces-lesson3.png new file mode 100644 index 0000000..6d73dd7 Binary files /dev/null and b/lecture_22/figures/glider_forces-lesson3.png differ diff --git a/lecture_22/figures/glider_forces.png b/lecture_22/figures/glider_forces.png new file mode 100644 index 0000000..ac036d5 Binary files /dev/null and b/lecture_22/figures/glider_forces.png differ diff --git a/lecture_22/figures/glider_forces_fbd.svg b/lecture_22/figures/glider_forces_fbd.svg new file mode 100644 index 0000000..47a1d34 --- /dev/null +++ b/lecture_22/figures/glider_forces_fbd.svg @@ -0,0 +1,465 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trajectory + + + + + + + + + + + + diff --git a/lecture_22/figures/glider_forces_nodrag.png b/lecture_22/figures/glider_forces_nodrag.png new file mode 100644 index 0000000..969042c Binary files /dev/null and b/lecture_22/figures/glider_forces_nodrag.png differ diff --git a/lecture_22/figures/glider_forces_nodrag.svg b/lecture_22/figures/glider_forces_nodrag.svg new file mode 100644 index 0000000..00942f4 --- /dev/null +++ b/lecture_22/figures/glider_forces_nodrag.svg @@ -0,0 +1,368 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trajectory + diff --git a/lecture_22/figures/oscillatory_trajectory.png b/lecture_22/figures/oscillatory_trajectory.png new file mode 100644 index 0000000..6e7dca9 Binary files /dev/null and b/lecture_22/figures/oscillatory_trajectory.png differ diff --git a/lecture_22/figures/rocket_CV.png b/lecture_22/figures/rocket_CV.png new file mode 100644 index 0000000..5686f4f Binary files /dev/null and b/lecture_22/figures/rocket_CV.png differ diff --git a/lecture_22/figures/vonKarman-phugoids.png b/lecture_22/figures/vonKarman-phugoids.png new file mode 100644 index 0000000..e3c6414 Binary files /dev/null and b/lecture_22/figures/vonKarman-phugoids.png differ diff --git a/lecture_22/lecture_22.ipynb b/lecture_22/lecture_22.ipynb new file mode 100644 index 0000000..b986828 --- /dev/null +++ b/lecture_22/lecture_22.ipynb @@ -0,0 +1,829 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initial Value Problem\n", + "\n", + "## Euler's method\n", + "\n", + "$\\frac{dy}{dt}=f(t,y)$\n", + "\n", + "$y_{i+1}=y_{i}+f(t_{i},y_{i})h$\n", + "\n", + "The error of this method is:\n", + "\n", + "$E_{t}=\\frac{f'(t_i , y_i )}{2!}h^2 + \\cdots + O(h^{n+1})$\n", + "\n", + "or\n", + "\n", + "$E_{a}=O(h^2)$\n", + "\n", + "### Example: Freefalling problem\n", + "\n", + "An object is falling and has a drag coefficient of 0.25 kg/m and mass of 60 kg\n", + "Define time from 0 to 12 seconds with `N` timesteps \n", + "function defined as `freefall`\n", + "\n", + "Using the Euler ODE solution results in a conditionally stable solution *(at some point the time steps are too large to solve the problem)*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function [v_analytical,v_terminal,t]=freefall(N,tmax)\n", + " t=linspace(0,tmax,N)';\n", + " c=0.25; m=60; g=9.81; v_terminal=sqrt(m*g/c);\n", + "\n", + " v_analytical = v_terminal*tanh(g*t/v_terminal);\n", + " v_numerical=zeros(length(t),1);\n", + " delta_time =diff(t);\n", + " for i=1:length(t)-1\n", + " v_numerical(i+1)=v_numerical(i)+(g-c/m*v_numerical(i)^2)*delta_time(i);\n", + " end\n", + " % Print values near 0,2,4,6,8,10,12 seconds\n", + " indices = round(linspace(1,length(t),7));\n", + " fprintf('time (s)| error (m/s)\\n')\n", + " fprintf('-------------------------\\n')\n", + " M=[t(indices),abs(v_analytical(indices)-v_numerical(indices))];\n", + " fprintf('%7.1f | %10.2f\\n',M(:,1:2)');\n", + " plot(t,v_analytical,'-',t,v_numerical,'o-')\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time (s)| error (m/s)\n", + "-------------------------\n", + " 0.0 | 0.00\n", + " 2.3 | 0.46\n", + " 4.0 | 0.95\n", + " 6.3 | 1.03\n", + " 8.0 | 0.80\n", + " 10.3 | 0.46\n", + " 12.0 | 0.28\n", + "\n", + "O(h^2)=0.33\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t12\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "[v_an,v_t,t]=freefall(22,12);\n", + "fprintf('\\nO(h^2)=%1.2f',min(diff(t).^2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Heun Method\n", + "\n", + "Increase accuracy with *predictor-corrector approach*\n", + "\n", + "$y_{i+1}=y_{i}^{m}+f(t_{i},y_{i})h$\n", + "\n", + "$y_{i+1}^{j}=y_{i}^{m}+\n", + "\\frac{f(t_{i},y_{i}^{m})+f(t_{i+1},y_{i+1}^{i-1})}{2}h$\n", + "\n", + "This is analagous to the trapezoidal rule\n", + "\n", + "$\\int_{t_{i}}^{t_{i+1}}f(t)dt=\\frac{f(t_{i})+f(t_{i+1})}{2}h$\n", + "\n", + "therefore the error is\n", + "\n", + "$E_{t}=\\frac{-f''(\\xi)}{12}h^3$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Example with Heun's method**\n", + "\n", + "Problem Statement. Use Heun’s method with iteration to integrate \n", + "\n", + "$y' = 4e^{0.8t} − 0.5y$\n", + "\n", + "from t = 0 to 4 with a step size of 1. The initial condition at t = 0 is y = 2. Employ a stopping criterion of 0.00001% to terminate the corrector iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dy =\n", + "\n", + " 3\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + "\n", + "y =\n", + "\n", + " 2\n", + " 5\n", + " 0\n", + " 0\n", + " 0\n", + "\n" + ] + } + ], + "source": [ + "yp=@(t,y) 4*exp(0.8*t)-0.5*y;\n", + "t=linspace(0,4,5)';\n", + "y=zeros(size(t));\n", + "dy=zeros(size(t));\n", + "dy_corr=zeros(size(t));\n", + "y(1)=2;\n", + "dy(1)=yp(t(1),y(1))\n", + "y(2)=y(1)+dy(1)*(t(2)-t(1))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dy_corr =\n", + "\n", + " 4.70108\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "y =\n", + "\n", + " 2.00000\n", + " 6.70108\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n" + ] + } + ], + "source": [ + "% improve estimate for y(2)\n", + "dy_corr(1)=(dy(1)+yp(t(2),y(2)))/2\n", + "y(2)=y(1)+dy_corr(1)*(t(2)-t(1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This process can be iterated until a desired tolerance is achieved" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "n=0;\n", + "e=10;\n", + "while (1)\n", + " n=n+1;\n", + " yold=y(2);\n", + " dy_corr(1)=(dy(1)+yp(t(2),y(2)))/2;\n", + " y(2)=y(1)+dy_corr(1)*(t(2)-t(1));\n", + " e=abs(y(2)-yold)/y(2)*100;\n", + " if e<= 0.00001 | n>100, break, end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 2.00000\n", + " 6.36087\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "dy_corr =\n", + "\n", + " 4.36087\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + " 0.00000\n", + "\n", + "n = 11\n", + "e = 6.3760e-06\n" + ] + } + ], + "source": [ + "y\n", + "dy_corr\n", + "n\n", + "e" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y_an =\n", + "\n", + "@(t) 4 / 1.3 * exp (0.8 * t) - 1.0769 * exp (-t / 2)\n", + "\n", + "dy_an =\n", + "\n", + "@(t) 0.8 * 4 / 1.3 * exp (0.8 * t) + 1.0769 / 2 * exp (-t / 2)\n", + "\n" + ] + } + ], + "source": [ + "\n", + "y_euler=zeros(size(t));\n", + "for i=1:length(t)-1\n", + " y_euler(i+1)=y_euler(i)+dy(i)*(t(i+1)-t(i));\n", + "end\n", + "\n", + "y_an =@(t) 4/1.3*exp(0.8*t)-1.0769*exp(-t/2)\n", + "dy_an=@(t) 0.8*4/1.3*exp(0.8*t)+1.0769/2*exp(-t/2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "yp=@(t,y) 4*exp(0.8*t)-0.5*y;\n", + "t=linspace(0,4,5)';\n", + "y=zeros(size(t));\n", + "dy=zeros(size(t));\n", + "dy_corr=zeros(size(t));\n", + "y(1)=2;\n", + "for i=1:length(t)-1\n", + " dy(i)=yp(t(i),y(i));\n", + " dy_corr(i)=yp(t(i),y(i));\n", + " y(i+1)=y(i)+dy_corr(i)*(t(i+1)-t(i));\n", + " n=0;\n", + " e=10;\n", + " while (1)\n", + " n=n+1;\n", + " yold=y(i+1);\n", + " dy_corr(i)=(dy(i)+yp(t(i+1),y(i+1)))/2;\n", + " y(i+1)=y(i)+dy_corr(i)*(t(i+1)-t(i));\n", + " e=abs(y(i+1)-yold)/y(i+1)*100;\n", + " if e<= 0.00001 | n>100, break, end\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y =\n", + "\n", + " 2.0000\n", + " 6.3609\n", + " 15.3022\n", + " 34.7433\n", + " 77.7351\n", + "\n", + "y_euler =\n", + "\n", + " 0\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + "\n", + "ans =\n", + "\n", + " 2.0000\n", + " 6.1946\n", + " 14.8439\n", + " 33.6772\n", + " 75.3390\n", + "\n" + ] + } + ], + "source": [ + "y\n", + "y_euler\n", + "y_an(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t70\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3.5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ty\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ttime\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tHeuns method\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tHeuns method\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tEuler\n", + "\n", + "\t\n", + "\t\tEuler\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tanalytical\n", + "\n", + "\t\n", + "\t\tanalytical\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(t,y,'o',t,y_euler,'s',linspace(min(t),max(t)),y_an(linspace(min(t),max(t))))\n", + "legend('Heuns method','Euler','analytical','Location','NorthWest')\n", + "xlabel('time')\n", + "ylabel('y')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_22/lecture_22_python.ipynb b/lecture_22/lecture_22_python.ipynb new file mode 100644 index 0000000..276a7a0 --- /dev/null +++ b/lecture_22/lecture_22_python.ipynb @@ -0,0 +1,807 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phugoid Oscillation example\n", + "\n", + "[phugoid lessons in numerical methods with python](https://github.com/numerical-mooc/numerical-mooc/tree/master/lessons/01_phugoid)\n", + "\n", + "![Image](./figures/glider_forces-lesson3.png)\n", + "#### Figure 1. Forces with a positive trajectory angle.\n", + "\n", + "[folder with original 4-part lesson in \"01_phugoid\"](./01_phugoid)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Figure 1, $L$ is the lift, $W$ is the weight, $D$ is the drag, and $\\theta$ the positive angle of the trajectory, instantaneously. \n", + "\n", + "\\begin{align}\n", + "m \\frac{dv}{dt} & = - W \\sin\\theta - D \\\\\n", + "m v \\, \\frac{d\\theta}{dt} & = - W \\cos\\theta + L\n", + "\\end{align}\n", + "\n", + "We can use a few little tricks to make these equations more pleasing. First, use primes to denote the time derivatives and divide through by the weight:\n", + "\n", + "\\begin{align}\n", + " \\frac{v'}{g} & = - \\sin\\theta - D/W \\\\\n", + "\\frac{v}{g} \\, \\theta' & = - \\cos\\theta + L/W\n", + "\\end{align}\n", + "\n", + "\n", + "Ratio of lift to weight is known as the trim conditions—$L/W=v^2/v_t^2$— and also from the definitions of lift and drag, \n", + "\n", + "$$\\begin{eqnarray}\n", + "L &=& C_L S \\times \\frac{1}{2} \\rho v^2 \\\\\n", + "D &=& C_D S \\times \\frac{1}{2} \\rho v^2\n", + "\\end{eqnarray}$$\n", + "\n", + "we see that $L/D=C_L/C_D$. The system of equations can be re-written:\n", + "\n", + "\\begin{align}\n", + " v' & = - g\\, \\sin\\theta - \\frac{C_D}{C_L} \\frac{g}{v_t^2} v^2 \\\\\n", + " \\theta' & = - \\frac{g}{v}\\,\\cos\\theta + \\frac{g}{v_t^2}\\, v\n", + "\\end{align}\n", + "\n", + "It is very interesting that the first equation has the factor $C_D/C_L$, which is the inverse of a measure of the aerodynamic efficiency of the aircraft. It turns out, this is the term that contributes damping to the phugoid model: if drag is zero, there is no damping. Drag is never zero in real life, but as engineers design more aerodynamically efficient aircraft, they make the phugoid mode more weakly damped. At altitude, this is nothing but a slight bother, but vertical oscillations are unsafe during final approach to land, so this is something to watch out for!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To visualize the flight trajectories predicted by this model, integrate the spatial coordinates, which depend on both the forward velocity (tangential to the trajectory) and the trajectory angle. The position of the glider on a vertical plane will be designated by coordinates $(x, y)$ with respect to an inertial frame of reference, and are obtained from:\n", + "\n", + "\\begin{align}\n", + "x'(t) & = v \\cos(\\theta) \\\\\n", + "y'(t) & = v \\sin(\\theta).\n", + "\\end{align}\n", + "\n", + "Augmenting our original two differential equations by the two equations above, we have a system of four first-order differential equations to solve. We will use a time-stepping approach, like in the previous lesson. To do so, we do need *initial values* for every unknown:\n", + "\n", + "$$\n", + "v(0) = v_0 \\quad \\text{and} \\quad \\theta(0) = \\theta_0\\\\\n", + "x(0) = x_0 \\quad \\text{and} \\quad y(0) = y_0\n", + "$$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Euler's Method\n", + "\n", + "Apply Euler's method: replace each of the time derivatives by an approximation of the form:\n", + "\n", + "$$v'(t) \\approx \\frac{v^{n+1} - v^n}{\\Delta t},$$\n", + "\n", + "where we are now using a superscript $n$ to indicate the $n$-th value in the time iterations. The first differential equation, for example, gives:\n", + "\n", + "$$\\frac{v^{n+1} - v^n}{\\Delta t} = - g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2$$\n", + "\n", + "At each time iteration $t^n$, we want to evaluate all the known data of our system to obtain the state at $t^{n+1}$—the next time step. We say that we are _stepping in time_ or _time marching_.\n", + "\n", + "The full system of equations discretized with Euler's method is:\n", + "\n", + "\\begin{align}\n", + "v^{n+1} & = v^n + \\Delta t \\left(- g\\, \\sin\\theta^n - \\frac{C_D}{C_L} \\frac{g}{v_t^2} (v^n)^2 \\right) \\\\\n", + "\\theta^{n+1} & = \\theta^n + \\Delta t \\left(- \\frac{g}{v^n}\\,\\cos\\theta^n + \\frac{g}{v_t^2}\\, v^n \\right) \\\\\n", + "x^{n+1} & = x^n + \\Delta t \\, v^n \\cos\\theta^n \\\\\n", + "y^{n+1} & = y^n + \\Delta t \\, v^n \\sin\\theta^n.\n", + "\\end{align}" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from math import sin, cos, log, ceil\n", + "import numpy\n", + "from matplotlib import pyplot\n", + "%matplotlib inline\n", + "from matplotlib import rcParams\n", + "rcParams['font.family'] = 'sans-serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set the parameter values and the _initial values_. \n", + "\n", + "Acceleration of gravity is: 9.8 m/s$^2$, but what are good values for $C_D/C_L$, the inverse of the aerodynamic efficiency? Some possible values are given on a table in the Wikipedia entry for [lift-to-drag ratio](http://en.wikipedia.org/wiki/Lift-to-drag_ratio): a modern sailplane can have $L/D$ of 40 to 60, depending on span (and, in case you're interested, a flying squirrel has $L/D$ close to 2).\n", + "\n", + "For the _trim velocity_, the speed range for typical sailplanes is between 65 and 280 km/hr, according to Wikipedia (it must be right!). Let's convert that to meters per second: 18 to 78 m/s. We'll pick a value somewhere in the middle of this range.\n", + "\n", + "#### Possible set of parameters for the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 30.0 # trim velocity in m s^{-1} \n", + "C_D = 1/40 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1 # for convenience, use C_L = 1\n", + "pi = numpy.pi\n", + "\n", + "### set initial conditions ###\n", + "v0 = v_t # start at the trim velocity (or add a delta)\n", + "theta0 = pi/12 # initial angle of trajectory\n", + "x0 = 0 # horizotal position is arbitrary\n", + "y0 = 1000 # initial altitude" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def f(u):\n", + " \"\"\"Returns the right-hand side of the phugoid system of equations.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " array containing the solution at time n.\n", + " \n", + " Returns\n", + " -------\n", + " dudt : array of float\n", + " array containing the RHS given u.\n", + " \"\"\"\n", + " \n", + " v = u[0]\n", + " theta = u[1]\n", + " x = u[2]\n", + " y = u[3]\n", + " return numpy.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2,\n", + " -g*cos(theta)/v + g/v_t**2*v,\n", + " v*cos(theta),\n", + " v*sin(theta)])" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# ?f accesses help documentation of code" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def euler_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using Euler's method.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equations.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " approximate solution at the next time step.\n", + " \"\"\"\n", + " \n", + " return u + dt * f(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d=numpy.array([1,2,3,4,5])\n", + "d[-3] # note negative indices are fun" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "T = 100 # final time\n", + "dt = 0.1 # time increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u = numpy.empty((N, 4))\n", + "u[0] = numpy.array([v0, theta0, x0, y0])# fill 1st element with initial values\n", + "\n", + "# time loop - Euler method\n", + "for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nv7Qni1QDd999N0pLnXSEFStWYNOmTVFfu379eundHzZsWFiFHltQo+FeUlRUhAsvvBCAk9yZbKRr\ny5YtMlJ69dVXp9QmWAKxNmlpabjgggsAOJFNr+pKqyI/VSL5I0aMkH8bFRUVrvXb03nj5/KZQPiG\nWLZ48uMR+bquayqqiBblkk1jo11n7dq1YcmsNop8cY0lq44d9BaRL54ZRXu2Jc4UBmCG8v2/dH7v\nMcZYrnoAY+yfAIwHsB3AR8r3CwCM6/xyY5TxNnb2Wxbj/FOCwsJCPPLII/LrBx98MGKlnY6ODnz9\n61+XXz/00ENW1nh+6qmntI119dVXy7aIwifKX//6V9m+9tprk+rLVtS1US0727Zt82S8VIzkZ2Vl\nSZG9Z88e1zYp6um88XNlHYEQ1YcPH5Y79+omUZGv87omUDfqUnfpNYkQ+enp6dZUiXnqqaeQkZEh\nbyJts+u0tbWhqakJAFXWsYXeIvLFLXm0Twz1+2roaDEcQT4fQBVj7HXG2AuMsR0Afg3Hq/8Fzrl6\nFR+ltKsQGXH19V+YKkn++Z//WX5wf/DBB3jiiSfOec1TTz0lxdi0adPwjW98Q+scY0WU9tSB6st/\n5513kuqrN4h8dW10+PJFv/n5+b6MPkdDbOrV1NQUtntqMvR03vjdrgOctey0t7cbi7YKkV9SUoK8\nvLyYj9N5XRPk5OSguLgYgD0iX9iGSktLpV3SNGJthGXHtkg+Jd3ahx1/ud4jjMwXMsamRfj5PUq7\nj2hwzo/D8eU/B6AfgBsA3AJgEoDDcKrtdD3LCpV2U5T5iC39+kT5ecqSlZWF3/3ud/Ki+fjjj4dt\nkPXHP/4R3/ve9wAAjDH85je/sba6RjwfnMkyd+5c5OY6D5PefPPNhKODra2tsrLOyJEjMXbsWNfm\naBPq2ngdyT916hQOHjwox0ol+9OECRNke/fu3a702dN5o1qD/CryTVfYCQaD0ioUrx9f53VNRdTy\nP3r0qGtPjRKFcy4j+bZYdYCzayNEfl1dnfaN6rqDymfaR68Q+Zzz1QD+Buf9vs4Y+xJjrA9jbDRj\n7CcA/gFAe+fLpXpijJ0Hp+zml+DcCAwHUASn7GYNgJ8BeJNRdklcXHHFFViyZAkAIBQK4c4778RV\nV12FK6+8El/72tfkBf6RRx7BxRdfbHKq1pCbm4trrnGKPx09ehRbtmxJqJ/33nsPra1Oqsm1117b\n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\n8VBdkh3KTXYpN9mm/GRXObkp3A0YoiK/vVTkVzYV+SJlGj486TYIkjblJruUm2xTfrKrnNwceeSR\n9OvXD+hYkd+/f3+NrFOBeszoOpVGo+uIiIhIRx133HEsW7YMgI0bNzJ06NA2xW3ZsoUhQ4YAMHny\n5Kb3kOY0uo6IiIiIdLv4KTsrV65sc1xNTU3Tc52qU5lU5IuIiIjkVLnn5et8/MqnIl+kTGvWrEm7\nCZJAucku5SbblJ/sKjc35Rb5jz/+eNNzFfmVSUW+SJlmzpyZdhMkgXKTXcpNtik/2VVuboYPH87+\n++8PwB/+8Afq6upajamrq2sq8g844AAOPfTQsrYt6VKRL1KmG264Ie0mSALlJruUm2xTfrKr3NyY\nGccffzwQ3cE2fhpOktraWrZu3QrAlClTMLOyti3pUpEvUiYNNZddyk12KTfZpvxkV0dyM3Xq1Kbn\nDz3U+n1BH3744abnU6ZMKXu7ki4V+SIiIiI5duKJJzY9f+CBB1pdf8mSJU3P418QpLKoyBcRERHJ\nsREjRjB69GgAli9fzsaNGxPXfeutt1i+fDkAhx12GCNHjuyWNkrnU5EvUqbZs2en3QRJoNxkl3KT\nbcpPdnU0N9XV1QC4O4sXL05cb8mSJTQ2NgJwyimndGibki4V+SJl2r59e9pNkATKTXYpN9mm/GRX\nR3NTKPIBFixYkLje/Pnzm57PmDGjQ9uUdJm7p90GKcHMxgM1NTU1jB8/Pu3miIiISAVrbGxk5MiR\nvPbaa1RVVbFu3TqGDRvWbJ1NmzYxbNgw6uvrOeigg1i7di1VVToe3JLa2lomTJgAMMHda9NuT5wy\nJyIiIpJzVVVVnHPOOUBU8N922227rXPzzTdTX18PwBlnnKECv8IpeyIiIiI9wLnnnttUuM+dO5ed\nO3c2Lfvwww/52c9+BkRj619wwQWptFE6j4p8kTJt3rw57SZIAuUmu5SbbFN+sqszcjNy5Eg+//nP\nA7Bx40bmzJnTtGzu3LmsX78egOnTp2tUnRxQkS9SpvPOOy/tJkgC5Sa7lJtsU36yq7Nyc+WVVzYd\nzf/+97/PihUrWLVqFbNmzQKio/hXXXVVp2xL0qUiX6RM+iOYXcpNdik32ab8ZFdn5Wbs2LFcfPHF\nAOzcuZNjjz2Wo48+umn0ngsuuIBx48Z1yrYkXRpdJ6M0uo6IiIh0hR07djBt2jQeffTRZvMnTZrE\n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\nbaq84r/f6wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get the glider's position with respect to the time\n", + "\n", + "x = u[:,2]\n", + "y = u[:,3]\n", + "\n", + "# visualization of the path\n", + "pyplot.figure(figsize=(8,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'x', fontsize=18)\n", + "pyplot.ylabel(r'y', fontsize=18)\n", + "pyplot.title('Glider trajectory, flight time = %.2f' % T, fontsize=18)\n", + "pyplot.plot(x,y, 'k-', lw=2);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grid Convergence\n", + "\n", + "Convergence of Euler's method for the phugoid model\n", + "\n", + "We need to be careful, though, and make sure that the fine-grid solution is resolving all of the features in the mathematical model. How can we know this? We'll have a look at that in a bit. Let's see how this works first.\n", + "\n", + "You need a sequence of numerical solutions of the same problem, each with a different number of time grid points.\n", + "\n", + "1. Create a NumPy array called `dt_values` that contains the time-increment of each grid to be solved on. \n", + "\n", + "2. For each element `dt_values[i]`, we will compute the solution `u_values[i]` of the glider model using Euler's method. \n", + "\n", + "3. If we want to use five different values of $\\Delta t$, we'll have five solutions: we put them in an array ... but each one is also an array\n", + "\n", + "To get all the numerical solutions—each with its value of $\\Delta t$, we will loop over the elements of the array `dt_values`. Within the loop, we need to access both `dt_values[i]` and the index `i`. \n", + "\n", + "`enumerate()` is a built-in Python function that will give us consecutive `index, value` pairs just like we need. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt) + 1 # number of time-steps\n", + "\n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " \n", + " u[n+1] = euler_step(u[n], f, dt) ### call euler_step() ###\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_diffgrid(u_current, u_fine, dt):\n", + " \"\"\"Returns the difference between one grid and the fine one using L-1 norm.\n", + " \n", + " Parameters\n", + " ----------\n", + " u_current : array of float\n", + " solution on the current grid.\n", + " u_finest : array of float\n", + " solution on the fine grid.\n", + " dt : float\n", + " time-increment on the current grid.\n", + " \n", + " Returns\n", + " -------\n", + " diffgrid : float\n", + " difference computed in the L-1 norm.\n", + " \"\"\"\n", + " \n", + " N_current = len(u_current[:,0])\n", + " N_fine = len(u_fine[:,0])\n", + " \n", + " grid_size_ratio = ceil(N_fine/N_current)+1\n", + " \n", + " diffgrid = dt * numpy.sum( numpy.abs(\\\n", + " u_current[:,2]- u_fine[::grid_size_ratio,2])) \n", + " \n", + " return diffgrid" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.1\n", + "dt = 0.05\n", + "dt = 0.01\n", + "dt = 0.005\n", + "dt = 0.001\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:24: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n" + ] + }, + { + "ename": "ValueError", + "evalue": "operands could not be broadcast together with shapes (100001,) (50001,) ", + "output_type": "error", + "traceback": [ + "\u001b[0;31m--------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m### call the function get_diffgrid() ###\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mdiffgrid\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_diffgrid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu_values\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu_values\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mget_diffgrid\u001b[0;34m(u_current, u_fine, dt)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mgrid_size_ratio\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mceil\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mN_fine\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mN_current\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mdiffgrid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdt\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mu_current\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m-\u001b[0m \u001b[0mu_fine\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mgrid_size_ratio\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdiffgrid\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (100001,) (50001,) " + ] + } + ], + "source": [ + "# compute difference between one grid solution and the finest one\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " print 'dt = ', dt\n", + "\n", + " ### call the function get_diffgrid() ###\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nDFN3QvMo/QcYWWBfYW5iH2rnCK1BJyIiEewf//gHffr0yd9+7LHH+P3vf+8xkYgfRS2YFhAqdr49\nyj4RkaiVnp5O27ZtfceIKJ9++ik33XQTOTk5APTr14++fft6TiXihzmnWqcsmFkcsL5169bUqVOH\npKQkkpKSfMcSkbCOHTuSlpbmO0bE2LFjBy1btuSDDz4A4Pe//z1/+ctfqFw50IerRY4rNTWV1NRU\nsrOzWbt2LUBz55yXdYxUMJWRQwXT+vXriYuL8x1HROSYcnNziY+P569//SsA55xzDv/85z+pW7eu\n52RSUWVlZdG8eXPwWDCV+FcFM2sd/vJfzrntJT2fiIj4NWTIkPxiqV69eqxatUrFklR4QVxbfQnI\n5X8ze4uISJSaPXs2jz76KACVK1dm+fLl/OxnP/OcSsS/IAqmbCDXObctgHOJiIgnL774Iv369cvf\nnjlzJldddZXHRCKRI4iJK/8L1DKzqgGcS0TEix49eviO4NWGDRu4+eabOXjwIACDBg3i9ttv95xK\nJHIEUTAtBmKBDgGcS0TEi4o80/f27duJj49n27bQjYIbbriBhx56yHMqkcgSRME0DXgNmG5mNwRw\nPhGRMldRp/k4ePAgHTp04D//+Q8A5513HqmpqVSqVMlzMpHIEsQYphHAWuACINPM3gdeAb4nNBj8\nqJxz9wfQt4iIlMD//d//8dxzzwFw6qmnsmrVKmrXru05lUjkCaJgGsuRS6OcD/yyEMepYBIR8WjG\njBnMmDEDgNjYWFasWMHZZ5/tOZVIZAqiYFqLlkYRkSi3bt06WrVq5TtGmXnuuecYOHBg/vbs2bMr\n1PcvUlQlLpicc1cGkENExKvJkydXmILho48+on379uTmhkZNDBs2jO7du/sNJRLhghj0LSIS9RYv\nXuw7Qpn44YcfuPHGG8nOzgYgISGBiRMnek4lEvlUMImIADVq1PAdodQdOHCAW265hU8++QSACy+8\nkIULF+qJOJFCCGItublFPGQfsB14H3jeOfddSTOIiMjxOefo378/L730EgANGjQgMzOTk046yW8w\nkSgRxKDv7hRt0Lcd1v6gmaUAdzvndgWQRUREjmLatGnMmTMHgKpVq5Kenk6TJk08pxKJHkHcklsQ\nfm0nVAztBdYBaeHXuvA+A7aF22YCXxOaIbwXofmbdE1YRLwZOnSo7wil5i9/+QuDBw/O305OTqZl\n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\ngUmSJKmG/w8oV6sCANpbvgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# log-log plot of the grid differences\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel('$L_1$-norm of the grid differences', fontsize=18)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1], color='k', ls='-', lw=2, marker='o');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Second Order Runge-Kutta\n", + "\n", + "Estimate average slope along time step\n", + "\n", + "\\begin{align}\n", + "u_{n+1/2} & = u_n + \\frac{\\Delta t}{2} f(u_n) \\\\\n", + "u_{n+1} & = u_n + \\Delta t \\,\\, f(u_{n+1/2}).\n", + "\\end{align}\n", + "\n", + "This method is known as the *explicit midpoint method* or the *modified Euler method*, and it is a second-order method. Notice that we had to apply the right-hand side, $~f(u)$, twice. This idea can be extended: we could imagine estimating additional points between $u_{n}$ and $u_{n+1}$ and evaulating $~f(u)$ at the intermediate points to get higher accuracy—that's the idea behind Runge-Kutta methods." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# model parameters:\n", + "g = 9.8 # gravity in m s^{-2}\n", + "v_t = 4.9 # trim velocity in m s^{-1} \n", + "C_D = 1/5.0 # drag coefficient --- or D/L if C_L=1\n", + "C_L = 1.0 # for convenience, use C_L = 1\n", + "\n", + "### set initial conditions ###\n", + "v0 = 6.5 # start at the trim velocity (or add a delta)\n", + "theta0 = -0.1 # initial angle of trajectory\n", + "x0 = 0.0 # horizotal position is arbitrary\n", + "y0 = 2.0 # initial altitude" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def rk2_step(u, f, dt):\n", + " \"\"\"Returns the solution at the next time-step using 2nd-order Runge-Kutta.\n", + " \n", + " Parameters\n", + " ----------\n", + " u : array of float\n", + " solution at the previous time-step.\n", + " f : function\n", + " function to compute the right hand-side of the system of equation.\n", + " dt : float\n", + " time-increment.\n", + " \n", + " Returns\n", + " -------\n", + " u_n_plus_1 : array of float\n", + " solution at the next time step.\n", + " \"\"\"\n", + " u_star = u + 0.5*dt*f(u)\n", + " return u + dt*f(u_star)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Solve with both RK2 and Euler (or RK1)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# set time-increment and discretize the time\n", + "T = 15.0 # final time\n", + "dt = 0.01 # set time-increment\n", + "N = int(T/dt) + 1 # number of time-steps\n", + "\n", + "\n", + "# set initial conditions\n", + "u_euler = numpy.empty((N, 4))\n", + "u_rk2 = numpy.empty((N, 4))\n", + "\n", + "\n", + "# initialize the array containing the solution for each time-step\n", + "u_euler[0] = numpy.array([v0, theta0, x0, y0])\n", + "u_rk2[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + "\n", + "# use a for loop to call the function rk2_step()\n", + "for n in range(N-1):\n", + " \n", + " u_euler[n+1] = euler_step(u_euler[n], f, dt)\n", + " u_rk2[n+1] = rk2_step(u_rk2[n], f, dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x_euler = u_euler[:,2]\n", + "y_euler = u_euler[:,3]\n", + "x_rk2 = u_rk2[:,2]\n", + "y_rk2 = u_rk2[:,3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How far will the glider travel before reaching ground?" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# get the index of element of y where altitude becomes negative\n", + "idx_negative_euler = numpy.where(y_euler<0.0)[0]\n", + "if len(idx_negative_euler)==0:\n", + " idx_ground_euler = N-1\n", + " print ('Euler integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_euler = idx_negative_euler[0]\n", + " \n", + "idx_negative_rk2 = numpy.where(y_rk2<0.0)[0]\n", + "if len(idx_negative_rk2)==0:\n", + " idx_ground_rk2 = N-1\n", + " print ('Runge-Kutta integration has not touched ground yet!')\n", + "else:\n", + " idx_ground_rk2 = idx_negative_rk2[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the results" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nN9FJJ5100kmnYJr0ipmXiUgxrG/+E3se251yGWPM31gP+nsi6ZhZf3tYR4YZY6KxrrjkxXp2xE4c\n0M9mXuJzWmFYV46SisK6ogTwkjHmXxexJKR4qxdW/ucYY1bblDmD9TcQoLVt9N61yxgzOSMVuMq7\nMeY4sBJrm6JSlwasq22JV2o/SzHvWayrT3FANxdhDMP60uFGrDGn3NXTEdtGY4zTq1rGmKtYVxYF\neFxEkl59jOD6PtHfGHPeSfm1WLeD2jLGrDfGhDqmN9MRvy9MxmoQjzXG/OqjdewHhgK1sa5Q58K6\net8c2Ir1v9IY8HZnJkkVcKynMNatrH851l8Q64p4IyBx+18TkRd9GItSSikVkLRh5n0PcT2vrj4g\nevQhyBhzCjiE9cH1LRGp5Uk97hCRkiLypoh87+hk4XKKDi6KORYt76KaHx2NIGf2JPn5phTz6jte\nDxtjnHaAYhNzHq43WL4RkRvsJuA3x3KFRaSsu+vIgK/cWSiDeU9sbN0tIlWczG/reN1ljNmeYl5i\nzjcBxkXeQoHELxzS0xFIPawP52vS+LvsciwfAlRLUj5xX78IfO1iPb5sYHiNiDwHPAIcxGo4+YQx\n5jljzHBjzA/GmMPGmKvGmFhjzBKs/5UvHIs+KiK++pIi8ZiYE6tR/4gxZokx5qwx5qLjC5Q6wGGs\nY9swEcnpo1iUUkqpgKQNM+8rk+TnXXYLOa6anfZwHa9h3fJzJ7BBRA6LyBwR6SIi5TysMxkRaYIV\n/yCs55sKYX0gNykmsH9WzmA9G+Z8pjEXkvwanmJ24uC6P6cz9NuwPvyBdUXurItpS5JyxfC9/Wkt\n4IW8L8fq2Q9SXDVz9FjY2FF+ppOyFRyv9XGdtzNYDSbBzbw5GlwlHb8OS6P+f5IUTVp/GcfrXuO6\nV7/fXMwLCI7nGkdj/S16pPhfyDSOPL6AdTsx2F9pzahzWPuLwbpN9oCTWE5iPUcJ1tXYh3wUi1JK\nKRWQtGHmfXmT/HwujWXTmu+UscZPqofVw1881zsVmQD87rjS8qAndYPVJTzXO934E6vTjfuxno0r\nwPVOLg47irgaD8/dbrFTdnSSeAvbWTfLJ0raWEnZmHE15U7nejzhcnBfb+TdGHMZWIiVz1YpZrfE\narQaYLaTEBJvN0vPlMvVNqWo+1qYbk6Q/O+S+L/lk/+rTDYSq9G91BjzZVoL+5LjFtjvsfaZqj5a\nzbEkP3/nYrkNSX5Oc1gRpZRSKivRAaa9L+mHwrxYHS3YyetinkvGmPXAesczODWxvl1ujHUloybw\nrYjUMcZscVGNnU5YH4hPAzWMMcecLZTi+R9vS7z9MV86yyXNf4Qxxq3bBwOEt/L+GdZVkBIiUs9c\nHxy4LVaDZ50x5rCTcom5W2KMcTlOnQeS/l1eNsZMyEAdaf3fePx/lYkSb519WlKMe5eCAB2SjE3X\nwRjj7GpnRiU+w5nusf3ctAt4zPGzq2Ni0nm+PL4opZRSAUevmHnfgSQ/p+ruO5GIJF4FyRBjzBlj\nTLQxZogx5gGsK2kXsTrUGOBhtfc6Xr9x0Ti4Fd9+cNqL9aE0ZacgaTmAdZsnWD3eBROv5N0Ys5Hr\n+2GUo9xtXH/2zu6D/X6snN/ufsjucTxneNzxq6f1H3C8lhORUBfLVfKw/szmzhXDlMv5SuIznq4a\nTRnxU5Kfi7hYLum8U7ZLKaWUUlmQNsy87weuNwyauljuGV+s3BizDvgG6wN2hRSzryT+ICJ2Y6SB\ndXuaIXkPkCm18zBEdyX2plhSROq6W8jRANiMtf3P+iIwB3dzmR7ezPssrBw0FZHcXO/04wL2nWNE\nO16riEjKfccbViWJyZOr9Rsdr7mxrg7baeZB3ZntOazhA1xNYO0Py5O8t8zbgYhIcawr7gbY5u36\nHVZw/X+mjovlHk3yc8rOaZRSSqksTRtmXmaMicUaE0iAl2wGyb0ZGIgH34CLSBERKexifgjXO0k4\nnmJ20qswrgYgTrxy8h9HhxEp13E3Vhf4vvwGfw5Wt/ACfORqEGgnV0/edbzWEBG7rvqTlr/Tg/jc\nzWV6eDPvib0z5sX6gqC1o9znzrqZd5iF1fFGCDA9rVsmRaRMOnvOe8/xeiswLq0GrWOg9qSWY+Vd\ngP+KSMoOYxCR+liDYgc0Y8x+Y8wOV1OSxU8keT9dV5HSGGgcEQnDGpA78Vm+lEMoeIUx5jTWlVoB\n2jr52yY2EHs5ft1L8s55lFJKqSwvoBtmIpJDROqKyDsiskVETjq6Dv9bRL4Qkcc9qHNI0q7HnUzx\nHn5QT6ov1oCx4cA6EXlOREqIyI0i0hzr4fcwPLtV527gLxGZLSLPikh5ESnkqP9RrG/UK+EYxytF\n2e1c74xjsKNMDhEJTdG4me94LQysEpH6IlLM8UG8J7Aeq1MOX932lNhj43OO7bgTiBGRbiJSTkQK\niMitIhIhIp8CH6YouwSrkQHWB/gVjmVLikh+EbnFsV8NE5FdwBgPQnQ3l+nhtbwbY/7g+gfbEcAd\njp9nOS9xLecdsLbrAeBnEekuIhVFpKAjlvtE5AUR+RL4g3Q8A2iMieH6+H1dgI0i0kJESjv+piVE\npJaI9BWRGKxOTJKWv4z1vwVWxxAbRaSR48uKUiLyKrAEq+MUWyJSJ8n/+2B343dSz20iUiNxIvkt\nmpWSzhORknb1ZIQb29JHRHaIyABHbm92/A+UEZF2WLcYJvbUucYYM89mPUVTbGvSTkJuSbGtdrdw\nv4HV8E88LrZ3xFNMRJpiHReLY91x8Ioxxpdf/HgsiM9LSimlAlygd/5RB+uWNgMcxTpxn8dqeDwJ\nRIjIJGNMFw/q/p9jSsngeTf2VgXG7BGRZ7F62CsKfJJikTigBVYvip48bJ8b6za9lL3uXQsB65vv\nj1PEFSsis7Buh3vBMSUV4lhuvYhMALpifQBblWK541iDw87G6lnOToZu8TPGrBCRVsBUrKtS450t\nBsxw8n5HrAZMd6wPnnYflgzXB7ZNT2xu5TKddXor74k+w2pglXH8ftRJnSljiBaRSKyrG6WAD+wW\nBa7ifq+bifW/ISJxWF3mP4j94OROb6szxkwX62pLX6znD1N27nIQq0H/rTvhuBu3jcE4v7VUgI9S\nvDcU8OVg1q625S7sB7RPfHZtEVbnM3ae4PqA8EkJ8LxjSrQOSHX7sTHmqIg8gfXl0c1O6jPAZaBb\ngHfaE5TnJaWUUoEv0BtmCVgfGMYaY35IOsNx5WkO8KKIfG+Msb0SYGOpMcZnH5SMMV+IyL1YtyzW\nx3qoPRbrA+NoY8xOSfvRJGcP/H/vqK8e1oC7t2J9yxwC/I31fNU0x4CtzjwP7MT6gF8e61a3xPGF\nksbfQ0S2AC8BlR31H8b6IPyuMeb/PIzfbjnnM4xZICLrsbqOb4Q1TllurA9Ef2J9yFvgpFw80FNE\nPgFexPowVQqrK/qzjrI/ObZnpRsxOuNWLhNDcqdCL+U90Tys2zoTbzec485VCGPMSrE6C3kBq0F7\nN1ZD8DLWPvYr1lANixy3qKWqAtd/0/+KyBysq2b1sP6m+bA+3B7CapBFc33g45TlB4jIt1i3vT0A\n5AH+ciw/iutX8Vxtqzeuxvi6Q46k6/F0/iSsv1lNrH20KFanQ3FYOdsEzDTGfO+FONJczhizTUTu\nwvrbPYXVO2UO4P+ANcA4x9XeQBa05yWllFKBTQL0bhG3OD50P4d1C04DN8sMAYYAQ/UEqJRSypv0\nvKSUUspTAf2MmRsSe+26NZ3lgrc1qpRSKpDpeUkppZRHAv1WxrQkdmjwdzrLCVBNRP6L1dHCaayT\n6XJjzDmXJZVSSil7el5SSinlkaBtmInVtXIHrj+4nh4G6yHtJ5NWCZwWkZeNMT7pMloppVTWpecl\npZRSGRGUtzI6uiOfjfUQ+w5gcjqK78PqkOM+rG8lC2N1orEcyI81fpNdb4dKKaVUKnpeUkoplVFB\n2fmHiEzB6to5FnjIGLPPS/WOw+r971/gFmPMVW/Uq5RSKmvT85JSSqmMCrqGWZKT1HGgnjFmhxfr\nLoR18gsBHrbrQlpEigANgQPARW+tXymlVJpyY43NF22MOe7nWIDAOC85ltVzk1JK+YdXzk1B9YyZ\niLyLdfI7ATTw5skPwBhzUkT+BW4CbnGxaEOsW1aUUkr5RxusMcP8KoDOS6DnJqWU8rcMnZuCpmEm\nIqOBV4CTWCe/7WkU8WQdIVjPB4A1CLGdAwCzZs2iYsWK3g7DJ1555RXef/99f4fhNo3XtzRe39J4\nfWfXrl1ERUWB4zjsTwF2XoIgPDdllmDaxzOb5sY5zYs9zU1q3jo3BUXDTERGAr2xTn6PGWO2+WhV\nTYBwIAHY6mK5iwAVK1akatWqPgrFuwoUKBA0sYLG62sar29pvJnCr7fqBeB5CYLw3JRZgnQfzxSa\nG+c0L/Y0Ny5l6NwU8L0yisgIoC/Xv5FM8+QnIt1EZJeITE/x/q0i0kZEcjkp8xTwCVaXxbOMMf96\nZQMCxJYtW/wdQrpovL6l8fqWxpu16Xkp+Og+bk9z45zmxZ7mxncC+oqZiERgdSFsgL1AdxFxtugx\nY0yfJL8XBcqTeoDPwsBnwMcish04DOQBKmENCmqAb4CuXtyMgFC2bFl/h5AuGq9vaby+pfFmXXpe\nCk66j9vT3DinebGnufGdgG6YYZ2wEruNvN8xOXMA6JPiPZOkbKK/gJFAdaAc1pgxYcAxrPFiZhtj\nFmQ46gBUrFgxf4eQLhqvb2m8vqXxZml6XgpCuo/b09w4p3mxp7nxnYBumBljZgAzPCg3DBjm5P0T\nWN90ZjutWgXX2KQar29pvL6l8WZdel4KTrqP29PcOKd5sae58Z2gG8csEIhIVSAmJiZGH35USqlM\ntG3bNqpVqwZQzYcdbgQlPTcppZR/eOvcFPCdfyjvWLp0qb9DSBeN17c0Xt/SeJUKLLqP29PcOKd5\nsae58R1tmGUTc+fO9XcI6aLx+pbG61sar1KBRfdxe5ob5zQv9jQ3vqO3MnpAbxdRSin/0FsZ7em5\nSSml/ENvZVRKKaWUUkqpLCKge2VU2Zcxht9//53Nmzdz5MgRLly4QNGiRbnrrruoWbMmefLk8XeI\nQevQoUMcO3bM32EoBUDRokUpVaqUv8NQSiml/E4bZiqg/Pvvv0yePJkpU6Zw8OBBAAoVKkSePHk4\nduwYly9fJleuXLRs2ZJevXpx3333+Tni4HLo0CEqVqxIXFycv0NRCoDw8HB27dqljTOllFLZnjbM\nsomOHTsybdo0f4dh68KFC7z77ruMGjWKhIQESpYsyVdffUWtWrXIly8fAAkJCezcuZMvv/ySSZMm\nMXPmTJ5//nlGjhxJkSJF/Bp/oOc30bFjx4iLi2PWrFlUrFjR3+GobG7Xrl1ERUVx7NgxbZgpnwqW\nY7Q/aG6c07zY09z4jjbMsokGDRr4OwRb27ZtIyoqin379tGjRw8GDhxIdHQ0jRs3vr7Qv/8S8uST\nVK5Vi8otWtCnd28mTZ7M66+/TnR0NIsXL6Z69ep+24ZAzq8zFStW1M4BlFLZRrAdozOT5sY5zYs9\nzY3vaOcf2USgjtI+depUHnzwQXKFhbF9+3bGjBlD4cKFU8cbGgoVKsCCBVCzJqEPPEDXO+5gx44d\n3HzzzdSqVYslS5b4ZyMI3PwqpZTSY7QrmhvnNC/2NDe+ow0z5RfGGHr37s3zzz/PlIceIiZ3bird\ncYd9gSJFYOZMOHQIVq6EG26ABg249dVX2fDFFzz11FO0aNGCefPmZd5GKKWUUkop5SV6K6PKdAkJ\nCXTr1o1FEyfyZ8WKlFm/Htq3hwsXIGdO14VDQqBRI2jYEObPhy5dyPXgg8xZtIhOuXMTFRVFoUKF\naNiwYeZsjFJKKaWUUl6gV8yyiY0bN/o7BMBqlHXu3JnNEyeyv0gRyhw7BitWwPTpkD//teXSjFcE\nnn0W/vc/KFmS0NOnmTp1Ko0aNeKZZ57h559/9u2GpBAo+VVKKZWaHqPtaW6c07zY09z4jjbMsonR\no0f7OwSMMXTv3p39U6awOVcu8pUuDVu3whNPpFrW7XhLl4aNG6FePXLkyMG8efMoV64czZo14/Tp\n017eAnuBkF+llFLO6THanubGOc2LPc2N72jDLJsIhGevxowZw8GPPyY6Rw5y1qkD330HNl1kpyte\nkWs/5s2bl0WLFhEbG8vzzz+PMSajYbslEPKrlFLKOT1G29PcOKd5sae58R1tmGUT4eHhfl3/woUL\n6du3Lx/eeis5nnwSli0DFzFlJN7bb7+dTz/9lEWLFjFz5kyP60kPf+dXKaWUPT1G29PcOKd5sae5\n8R1tmCmf++mnn2jbti2tWrWi9I4dVpf3uXL5dJ3NmjWjbdu29OzZk8OHD/t0XUoppZRSSmWUNsyU\nTx0/fpxnnnmGe++9l2nTphFSsGDaPS96ydixY8mTJw9du3bNlPUpBTBjxgxCQkLcnsqWLev1GMqU\nKUNISAhvvvmm1+tWSimllG9owyyb6NOnT6avMyEhgaioKM6fP8/ChQvJlY6rZN6It/CpU8zs1Ytl\ny5bx5ZdfZrg+V/yRXxXYRMStKSTE+4fhxLqVUhY9RtvT3DinebGnufEdHccsmyhl08mGL40YMYLo\n6Giio6O59dZb01XWK/F260b93bt5ok4devbsSb169cidO3fG63XCH/lVgW/lypXUqlXL5TK+aJgp\npZLTY7Q9zY1zmhd7mhvf0U8E2USPHj0ydX0bNmxg6NChDB06lMceeyzd5b0S74cfIkePMuO22zh4\n8CAffPBBxuu0kdn5VcEhd+7chIeHu5x89WWBUuo6PUbb09w4p3mxp7nxHW2YKa87deoUA1q1onbt\n2rz++uv+C+T222HIEIrMnMmwp59m5MiRnDp1yn/xKKWUUkopZUMbZsrr3n/2Wb49coSFHToQGhrq\n32Beew0qVqT3gQNcvHCBMWPG+DcepdLgTscdBw8evNZ5yIYNGzxaT0JCAjNnzuTJJ5+kRIkS5MqV\ni6JFi/Loo4/yySefEB8f77Tc+vXrCQkJITQ0lEOHDnH69GneeOMNqlSpQoECBTIUk1JKKZWdacMs\nm9i9e3emrGfR1Kl0iI7mdLly3BgV5XE9Xos3Z054/33CfvqJSY0aMXbsWP755x/v1J1EZuVXZX3p\n6bjD0w4+Dh8+TPXq1enQoQMrV67kn3/+4erVq5w8eZINGzbQuXNnatWqxYkTJ1zWs2/fPqpUqcLb\nb7/Nzp07OXfunD4zpwKSHqPtaW6c07zY09z4jp5Bs4m+ffv6fB1/HzmCdOlC8Zw5KbpqVYa6xfdq\nvPXrQ+PGtN6xgzyhobz99tveq9shM/KrlDecPXuWRx99lO3bt1OsWDHee+89du7cyYkTJ9i3bx/j\nxo2jYMGCbN68mRYtWrisq3379pw/f55x48axb98+YmNjWbduHbfddlsmbY1S7tFjtD3NjXOaF3ua\nG9/RXhmziQ8//NDn61gcGUn3K1c4+8knSAbHZvJ6vKNHE3rvvXzQqhUdJ01i4MCBFC9e3GvVZ0Z+\nVfC5cOEC58+fd7lMWFgYOTNpbD+AN954g71791KiRAl+/PFHbrnllmvzChQoQPfu3alduzYPPvgg\n3377LZ9//jlPP/10qnqMMcTGxrJlyxYqV6587f20eqFUyh/0GG1Pc+Oc5sWe5sZ3tGGWTfi6a9OV\nH35Ih5gY9tety23PP5/h+rwe7913w759NMqfn5xLl/LBBx/w1ltvea367NZ1bFxcXEDfylChQgXC\nw8P9HQaNGzdOc5mhQ4cyePDgTIjG+rtNnToVEWH48OHJGmVJ3XPPPbRq1Yrp06cze/Zspw0zEeG5\n555L1ihTKlBlt2N0emhunNO82NPc+I42zFSGHY+NpeCrr3IuPJyyS5f6Oxx7pUtTCHjxxRf56KOP\n6N+/P/ny5fN3VEFp9+7dVKtWzd9h2IqJiaFq1ar+DsOtZ8AycyDoTZs2cf78eUSEOnXquLyaV6VK\nFQB++ukn22Uef/xxr8eolFJKZVfaMFMZ9n6nTvS/coVL8+YhQdDQeeWVVxg/fjyTJ0/mtdde83c4\nQalChQrExMT4OwxbFSpU8HcIAKxbt47atWv7O4xrkl7lLFeunFtlYmNjbefps2RKKaWU92jDLJsY\nNWoU/fr183q9K1eu5K0VK6j4wQe0adrUa/X6Kl6AW265hTZt2vD+++/To0cPwsLCMlynL+MNROHh\n4QFxRSrQGWP8HUIyp0+fvvazu1fqLl++bDsvEG4XVcod2e0YnR6aG+c0L/Y0N76jvTJmE3FxcT6p\ns0uXLjz22GO07t7d63X7Up8+fTh8+DDz58/3Sn2+jldlH+40mK5evepR3Xnz5r3289mzZ4mPj09z\n8nRdSgUSPUbb09w4p3mxp7nxHW2YZRPDhg3zep1vvfUWR48e5aOPPvL6czK+iDepSpUq8dhjjzFh\nwgSv1OfreFX2kTt3bsDq0dHOkSNHPKo76a2He/fu9agOpYKRHqPtaW6c07zY09z4jjbMlEd2797N\nO++8w4ABA9x+ViXQdOvWjc2bNwf0s1Iq+7n55psB2LNnj+0yK1eu9KjuOnXqkCtXLgDmzZvnUR1K\nKaWU8g018yu5AAAgAElEQVRtmKl0M8bQrVs3SpUqFbz3GMfHE/HTT7QvVsxrV82U8oYaNWpgjGH1\n6tX8888/qebv3r3b4zFk8uXLxwsvvIAxhrFjx7Ju3TqXy1+6dIlDhw55tC6llFJKpY82zLKJY8eO\nea2uefPm8c033/Dhhx9eu+3K27wZr1OhoYR89x3Dw8OZO3cux48fz1B1Po9XBaXEAabTmpJq3749\noaGhxMXF0bBhQ7799ltOnjzJwYMH+eijj3j44Ye56aabPI7prbfeomLFily6dIkGDRrQvXt3Nm7c\nSGxsLKdOnWLfvn188cUXdOvWjVtvvZVFixZlNA1K+Z0eo+1pbpzTvNjT3PiONsyyiU6dOnmlnjP7\n9zOve3eaNWtGo0aNvFKnM96K16Vevbj14EHuvXqVadOmZaiqTIlXBRVjDI0bNyZfvnxpTkmvSpUv\nX57hw4cD8Msvv1CvXj2KFClC2bJl6d69O8WLF2fWrFkex5UvXz7WrVtHnTp1iI+Pv9bYK168OIUL\nF+aOO+7g6aef5uOPP+b48eNe6bVUKX/TY7Q9zY1zmhd7mhvf0YZZNjF06FCv1LP7ySf59MQJxo4Y\n4ZX67HgrXpciI6FMGcbccguTJk3KUNfmmRKvChoi4vYUEpL6MNy/f3+WLFnCI488QoECBQgPD6dS\npUq8+eabbNmyheLFi19bjyeKFSvGN998w4oVK2jdujVly5YlPDycsLAwihcvTu3atenfvz8//PAD\n3Z30uJoYu1LBQo/R9jQ3zmle7GlufEfHMcsmvDHm1N7Jk3lg1y6in3mGhj4ewDdTxsgKDYWXX6Zm\nnz6ci4/n+++/p1atWh5VpWN6qUTt27enffv2Ga6nSZMmNGnSxOm80qVLk5CQYFv2zz//dGsdjRs3\npnHjxumKK/FKm1LBRI/R9jQ3zmle7GlufEevmCm3JMTFEdazJ1vDw6mbgduoAk7HjkhYGK8VKsSn\nn37q72iUUkoppVQ2pQ0z5ZafW7TgposXYeJEcjq6284SChZEWrbkOWNYOH8+586d83dESimllFIq\nG9KGWTYxdepUj8ue3LiRu7/8kq+qVOH+tm29GJW9jMSbbp07U+jUKWrExbFw4UKPqsjUeJVSSqWL\nHqPtaW6c07zYSys3Fy9e5LfffmPt2rUsXbqUWbNmMW/ePJYtW8a6des4cOCA3hJvQxtm2cS2bds8\nK5iQwPFmzfgzJISay5Z5NygXPI7XEzVqwHffEVq/vse3M2ZqvEoppdJFj9H2NDfOaV7sJc1NQkIC\nMTExjB07lmeeeYYyZcoQHh7OXXfdRf369Xn66adp27YtrVq1okmTJjz66KOULVuWPHnyULlyZTp3\n7szMmTM5evSoH7cocGjnH9mEp4Mo75g1i3L//suqXr14qnRpL0dlL1MHfRaBWrXo0KkTrVu35o8/\n/uCOO+5IVxU6SLVSSgUuPUbb09w4p3mx9+GHH/L9998zf/58lixZwuHDh8mdOzcPPPAALVu2pHz5\n8txxxx2UKFGC/PnzkzdvXq5evUpcXBynTp3iwIED7Nu3j59//pmNGzcyefJkRIRatWrRvHlzoqKi\nKFSokL830y+0YaZsxcfH03HcOApWrsyqMWP8HY7PPfXUU+TLl485c+YwZMgQf4ejlFJKKRUwzpw5\nw8yZM5k4cSI7d+7klltuoVmzZjz99NPUrFmTXGn0QZAvXz6KFy9O+fLlk71/7Ngxli9fzuLFi3nt\ntdfo168fUVFR9OzZk7vuusuXmxRw9FZGZWvy5Mls27aNtz/5hNDQUH+H43N58uShadOmzJkzJ0Nj\nmimllFJKZRWnTp3izTffpHTp0vTq1Yvy5cuzevVqDh48yLhx43jkkUfSbJS5UrRoUTp27MiKFSv4\n66+/GDhwIF9++SWVK1emTZs27N2714tbE9i0Yaacio2NZeDAgTz//PPUqFHD3+FkmtatW/P777/r\nveVKKaWUytYuXbrEO++8Q5kyZXj77bdp27YtBw4cYPHixdSvX5+QEO83I4oXL86gQYM4cOAAEydO\nZP369VSoUIGePXty5swZr68v0GjDLJuIjIxM1/L9+/dHRPjvf//ro4hcS2+83lK3bl2KFy/OnDlz\n0lXOX/EqpZRKmx6j7WlunMvueVm+fDl33303AwYMICoqij///JMPPviAW265JVNykzNnTl588UX+\n+OMP3nrrLaZMmUKlSpVYsmSJz9ftT9owyya6d+/u9rKbNm3i008/5e2336Zo0aI+jMpeeuL1phw5\nctCyZUvmzZuXrq5c/RWvUkqptOkx2p7mxrnsmpd//vmH5s2bExkZSdmyZfn555/58MMPufnmm68t\n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\nacMLL7zA6NGj6dChQ8HMOyBa/6NTXWJTbfyjjlma6N69e9AR4qK8/kpE3n/961+sXbuWcdOmQfv2\n8MwzsCW3nQKxqb7+Sra8YWNmg4H2wC9AY+fcN3G8fHPkPreLSJeO3P+elxnu2bkzjj+fHgpqGd/w\n++9c2KQJU6ZMYfz48bRpE8/gm+Gk9T861SU21cZHzjnd4rwBNQGXmZnpksXq1auDjhAX5fVXovI2\nbNjQnXfeec6tWuVckSLODRqUr/movv5KpryZmZkO7xyumi4c7cHjeMPZbwDOzMfrq0Zevxs45AB/\n440DzKsm4MoWKuQuu+QS17x5879uZ599ths3btw+tZwyZYpr3rz5fjW+/fbb3YgRI/are/Pmzd3P\nP/+8z+P333+/69+//z6PrV692jVv3twtXbp0n8efeuop17Vr130e27Jli2vevLmbOXPmPo+/9tpr\nrm3btvtlu/LKK/P1PrKW8YN5H19//bWrXLmyK126tLv22msDeR9ZCvL/kX39T+b3kV1BvI+XX345\nJd6HH/+P1atXp8T7yHov8b6P3r177/P5WrNmTVe+fPkCaZs0KmM+aOQrkbwZN24cl19+OfPmzaPO\n00/DrFmwYgUU0s56yZ8wjcpoZgOBrsCveHvK4s4TGS7/V6Ak0Mg5NyPKNDOAesC9zrkBucyrJpA5\nEziqbFlOXLyY4sccE28kiWLu3LlkZGRw+OGHM2nSJE4++eSgI4lIiGhURhEJvYyMDE488UQGDx4M\nffvC9OnqlElKMLP+HGSnDMA5txOYgHdR6tZR/s4JwLmRX8flZZ7L7rqLwzdu5OdTTmHbl1/mJ1b6\n2rMH3njDu48YNWoUDRs2pHLlynzyySfqlImIb7SFJCK+KVy4MJ07d2bs2LF8X6QIHJena+6KhJqZ\nPQR0x+uUNclLp8zMOprZUjN7McrT/fEOgWlnZk2zvaYkMBKvrX7LObc8L/lqXncd3778Mn9u28a2\nGjXY9M47eXmZ/PIL/OMfcPXVMH06O3fupHPnzrRv354bbriBadOmceSRRwadUkRSmDpmaWLAgJhH\nv4SS8vorkXnbt29PiRIleOqpp/I9D9XXX8mWN0hm1hy4F68j9TXQycxGRbk9muOlRwJVgONzztM5\ntwjoAhQGJprZNDN7PTL/C4BlQFxD/51z3XVsmjCBL4DSLVqw8rXX4nynqeWAy/icOXDmmfDJJzBh\n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\ns7Ps1oEAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the glider path\n", + "pyplot.figure(figsize=(10,6))\n", + "pyplot.subplot(121)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler[:idx_ground_euler], y_euler[:idx_ground_euler], 'k-', label='Euler')\n", + "pyplot.plot(x_rk2[:idx_ground_rk2], y_rk2[:idx_ground_rk2], 'r--', label='RK2')\n", + "pyplot.title('distance traveled: {:.3f}'.format(x_rk2[idx_ground_rk2-1]))\n", + "pyplot.legend();\n", + "\n", + "# Let's take a closer look!\n", + "pyplot.subplot(122)\n", + "pyplot.grid(True)\n", + "pyplot.xlabel('$x$')\n", + "pyplot.ylabel('$y$')\n", + "pyplot.plot(x_euler, y_euler, 'k-', label='Euler')\n", + "pyplot.plot(x_rk2, y_rk2, 'r--', label='RK2')\n", + "pyplot.xlim(0,5)\n", + "pyplot.ylim(1.8,2.5);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Convergence rates" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:24: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n" + ] + }, + { + "ename": "ValueError", + "evalue": "operands could not be broadcast together with shapes (15001,) (7501,) ", + "output_type": "error", + "traceback": [ + "\u001b[0;31m--------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdt_values\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0mdiffgrid\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_diffgrid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu_values\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu_values\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mget_diffgrid\u001b[0;34m(u_current, u_fine, dt)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mgrid_size_ratio\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mceil\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mN_fine\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mN_current\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mdiffgrid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdt\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mu_current\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m-\u001b[0m \u001b[0mu_fine\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mgrid_size_ratio\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdiffgrid\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (15001,) (7501,) " + ] + } + ], + "source": [ + "diffgrid1=diffgrid\n", + "# use a for-loop to compute the solution on different grids\n", + "dt_values = numpy.array([0.1, 0.05, 0.01, 0.005, 0.001])\n", + "\n", + "u_values = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", + "\n", + "for i, dt in enumerate(dt_values):\n", + " \n", + " N = int(T/dt)+1 # number of time-steps\n", + " \n", + " ### discretize the time t ###\n", + " t = numpy.linspace(0.0, T, N)\n", + " \n", + " # initialize the array containing the solution for each time-step\n", + " u = numpy.empty((N, 4))\n", + " u[0] = numpy.array([v0, theta0, x0, y0])\n", + "\n", + " # time loop\n", + " for n in range(N-1):\n", + " u[n+1] = rk2_step(u[n], f, dt)\n", + " \n", + " # store the value of u related to one grid\n", + " u_values[i] = u\n", + "\n", + "# compute diffgrid\n", + "diffgrid = numpy.empty_like(dt_values)\n", + "for i, dt in enumerate(dt_values):\n", + "\n", + " diffgrid[i] = get_diffgrid(u_values[i], u_values[-1], dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nC/0/o8Jji7c0W23ky8nJYdzQoXRr2ZKrmzalW8uWjBs6tOh2VGl+/PFHnvT34alRowajRo0KR7il\nUq65R7euRMqwaNEiOnXqVOY2bhQ6EhnUby6y5eTkcF3HjtydlUVaQQEGsMB76elct3Qp81avJikp\nqcR9f/rpJ0477TT+7//+jzvvvJNTTz01rLEfT7nmHhU6ImWoUaMGiYmJXochIiV4dPRo7s7K4opi\nfXAMcEVBATYri8fGjCGtlOUe2rdvz5dffsncuXPp1q1bmCIWL+hPURERiUqrFi6kRykdja8oKGDV\nggVl7p+QkECfPn1o0KCBG+FJhFChE8dK7LgXASI1rkAF0pH4u+++K+rM/OGHH1aqnYKCAl566SWu\nuuoqGjVqRPXq1alXrx5dunThueeeK3VK+xUrVuDz+UhISGDbtm3s3buXsWPH0rZtW2rXrh1UTLFm\n5cqVXocgpbDWUjMvj9J6shkgMS8vas4nyjX3qNCJM5XtuBevcVVGRToSV7bD8fbt27ngggv4y1/+\nwqJFi9ixYwdHjhxhz549fPjhhwwaNIhOnTqxe/fuMo+zZcsW2rZty4MPPsiGDRvYv3+/+hwV8/DD\nD3sdgpTCGENu1aqUVsZYILdq1ajp1K9cc4/OaHGksONex/R03v/2W97avp33v/2WjunpXNexo2dF\nRaTGFalycnLo0qUL69ato379+kyZMoUNGzawe/dutmzZwvTp06lTpw6ffPIJN954Y5nH6tevH7m5\nuUyfPp0tW7awa9culi9fzmmnnRambxPZ5syZ43UIUoaLmjThvVI+e9fno1NycljjCYZyzT3qjBxH\ngum4F49xARw8eJDc3Nwyt6lWrRpVq1YNU0QwduxYNm/eTKNGjfj4449p0qRJ0We1a9dmyJAhXHzx\nxfzhD39g2bJlvPnmm1xzzTUnHMday65du/j000/5/e9/X/R+eaPM4ok6okewt9/m7ytXch3O1Zsr\noGjU1bs+H1PbtGHexImehlgRyjX36IpOHCm34156OjRpcvTRtWv5B+3a9dh9jn9MmVL2/ps2serJ\nJ4PqUOimK6+8kqSkpDIfDz30UNjiOXDgADNnzsQYw4QJE44pcopr164dKSkpWGuZPXt2idsYYxg4\ncOAxRY5IVFi/HlJSSALmAZ/8z//QvUULejduTPcWLfhkyJAThpbv2bOn1H5rEtt0RSdOBNRxLz8f\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot using the matplotlib function loglog()\n", + "pyplot.figure(figsize=(6,6))\n", + "pyplot.grid(True)\n", + "pyplot.xlabel(r'$\\Delta t$', fontsize=18)\n", + "pyplot.ylabel(r'normalized $L_1$-norm', fontsize=18)\n", + "pyplot.xlim(1e-4,1)\n", + "pyplot.ylim(1e-4,1)\n", + "pyplot.axis('equal')\n", + "pyplot.loglog(dt_values[:-1], diffgrid[:-1]/max(diffgrid), color='k',\\\n", + " label='RK2',ls='--', lw=2, marker='o');\n", + "pyplot.loglog(dt_values[:-1], diffgrid1[:-1]/max(diffgrid1), color='r',\\\n", + " label='Euler',ls='--', lw=2, marker='o');\n", + "pyplot.legend(loc='upper left')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_22/octave-workspace b/lecture_22/octave-workspace new file mode 100644 index 0000000..fa1e782 Binary files /dev/null and b/lecture_22/octave-workspace differ diff --git a/lecture_23/.ipynb_checkpoints/lecture_23-checkpoint.ipynb b/lecture_23/.ipynb_checkpoints/lecture_23-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_23/.ipynb_checkpoints/lecture_23-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_23/boussinesq_lookup.m b/lecture_23/boussinesq_lookup.m new file mode 100644 index 0000000..65b35a1 --- /dev/null +++ b/lecture_23/boussinesq_lookup.m @@ -0,0 +1,32 @@ +function sigma_z=boussinesq_lookup(q,a,b,z) + % function that determines stress under corner of an a by b rectangular platform + % z-meters below the platform. The calculated solutions are in the fmn data + % m=fmn(:,1) + % in column 2, fmn(:,2), n=1.2 + % in column 3, fmn(:,2), n=1.4 + % in column 4, fmn(:,2), n=1.6 + + fmn= [0.1,0.02926,0.03007,0.03058 + 0.2,0.05733,0.05894,0.05994 + 0.3,0.08323,0.08561,0.08709 + 0.4,0.10631,0.10941,0.11135 + 0.5,0.12626,0.13003,0.13241 + 0.6,0.14309,0.14749,0.15027 + 0.7,0.15703,0.16199,0.16515 + 0.8,0.16843,0.17389,0.17739]; + + m=a/z; + n=b/z; + if n < 1.3 + f=fmn(:,2); + elseif n > 1.5 + f=fmn(:,4); + else + f=fmn(:,3); + end + [~,i_fit]=sort(abs(m-fmn(:,1))); + x=fmn(i_fit(1:4),1); + y=f(i_fit(1:4)); + f_out = Newtint(x,y,m); + sigma_z=q*f_out; +end diff --git a/lecture_23/coriolis.m b/lecture_23/coriolis.m new file mode 100644 index 0000000..e2ff5b2 --- /dev/null +++ b/lecture_23/coriolis.m @@ -0,0 +1,63 @@ +function [t,r] = coriolis(L) + % In class we ran this function using L=41.8084 (the latitude of Storrs, CT). This + % function takes the latitude (L) in degrees and mass (m) and calculates the trajectory + % of a particle with a 100 N load directed North. The initial conditions are set as L + % (in radians) * radius of Earth, 0 m/s initial x-velocity, 0 m E-W position (add to + % -72.261319 degrees for longitude of Storrs), 0 m/s initial E-W velocity, 10 m initial + % altitude, 0 m/s initial z-velocity [L*pi/180*R 0 0 0 10 0], the force is given as 100 + % N North, 0 West and 9.81*m z (neutrally buoyant) [100 0 9.81*m] + % + % the output of myode is ddr=[dx/dt d2x/dt2 dy/dt d2y/dt2 dz/dt d2z/dt2]' and the input + % to myode is r=[x dx/dt y dy/dt z dz/dt]' + % using ode23 solver solves for r as a function of time, here we solve from 0 to 200 s + % r(:,1) = x (the north-south position from 0 to 200 s) + % r(:,3) = x (the West-East position from 0 to 200 s) + % r(:,5) = x (the altitude from 0 to 200 s) + + % define ordinary differential equation in terms of 6 first order ODE's + function ddr = myode(t,r,R,L) + g=9.81; % acceleration due to gravity m/s^2 + l=10; % 10 m long cable + we=2*pi/23.934/3600; % rotation of Earth (each day is 23.934 hours long) + ddr=zeros(4,1); % initialize ddr + + ddr(1) = r(2); % x North(+) South (-) + ddr(2) = 2*we*r(4).*sin(L)-g/l*r(1); % dx/dt + ddr(3) = r(4); % y West (+) East (-) + ddr(4) = -2*we*(r(2).*sin(L))-g/l*r(3); % dy/dt + end + + R=6378.1e3; % radius of Earth in m + L=L*pi/180; + [t,r]=ode45(@(t,r) myode(t,r,R,L),[0 30000], [1 0 0 0 ]); + figure() + z=-sqrt(10^2-r(:,1).^2-r(:,3).^2); + figure(1) + we=2*pi/23.934/3600; % rotation of Earth (each day is 23.934 hours long) + + plot(t,tan(we*sin(L)*t),t,-r(:,3)./r(:,1),'.') + xlabel('time (s)','Fontsize',18) + ylabel('-y/x','Fontsize',18) + % Plot Coriolis effect path + figure(2) + title('Path at 0 hr, 4.1 hrs, 8.3 hrs','Fontsize',24) + N=length(t); + i1=[1:100]; i2=[floor(N/2):floor(N/2)+100]; i3=[N-100:N]; + plot3(r(i1,1),r(i1,3),z(i1)) + hold on + plot3(r(i2,1),r(i2,3),z(i2),'k-') + plot3(r(i3,1),r(i3,3),z(i3),'g-') + xlabel('X (m)','Fontsize',18) + ylabel('Y (m)','Fontsize',18) + zlabel('Z (m)','Fontsize',18) + title('Coriolis acceleration Foucalt Pendulum') + +% figure() +% % Plot Eotvos effect for deviation upwards +% plot(1e-3*(r(:,1)-r(1,1)),r(:,5)) +% xlabel('North (+km)','Fontsize',18) +% ylabel('Altitude (+m)','Fontsize',18) +% title('Eotvos effect with north force') +% +end + diff --git a/lecture_23/eulode.m b/lecture_23/eulode.m new file mode 100644 index 0000000..ceed97b --- /dev/null +++ b/lecture_23/eulode.m @@ -0,0 +1,29 @@ +function [t,y] = eulode(dydt,tspan,y0,h,varargin) +% eulode: Euler ODE solver +% [t,y] = eulode(dydt,tspan,y0,h,p1,p2,...): +% uses Euler's method to integrate an ODE +% input: +% dydt = name of the M-file that evaluates the ODE +% tspan = [ti, tf] where ti and tf = initial and +% final values of independent variable +% y0 = initial value of dependent variable +% h = step size +% p1,p2,... = additional parameters used by dydt +% output: +% t = vector of independent variable +% y = vector of solution for dependent variable +if nargin<4,error('at least 4 input arguments required'),end +ti = tspan(1);tf = tspan(2); +if ~(tf>ti),error('upper limit must be greater than lower'),end +t = (ti:h:tf)'; n = length(t); +% if necessary, add an additional value of t +% so that range goes from t = ti to tf +if t(n) 1.5\n", + " f=fmn(:,4);\n", + " else\n", + " f=fmn(:,3);\n", + " end\n", + " [~,i_fit]=sort(abs(m-fmn(:,1)));\n", + " x=fmn(i_fit(1:4),1);\n", + " y=f(i_fit(1:4));\n", + " f_out = Newtint(x,y,m);\n", + " sigma_z=q*f_out;\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[0;31mUndefined function 'Newtint' for input arguments of type 'double'.\n", + "\u001b[0m" + ] + } + ], + "source": [ + "boussinesq_lookup(10,1,1,10)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i =\n", + "\n", + " 2\n", + " 3\n", + " 1\n", + " 4\n", + " 5\n", + " 6\n", + " 7\n", + " 8\n", + "\n", + "\n", + "ans =\n", + "\n", + " 0.2000\n", + " 0.3000\n", + " 0.1000\n", + " 0.4000\n", + " 0.5000\n", + " 0.6000\n", + " 0.7000\n", + " 0.8000\n" + ] + } + ], + "source": [ + "m_d=[1,2,3,4,5,6,7,8]'/10;\n", + "[~,i]=sort(abs(0.25-m_d))\n", + "m_d(i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initial Value Problems (continued)\n", + "\n", + "## Predator-Prey Models (Chaos Theory)\n", + "\n", + "Predator-prey models were developed independently in the early part of the twentieth\n", + "century by the Italian mathematician Vito Volterra and the American biologist Alfred\n", + "Lotka. These equations are commonly called Lotka-Volterra equations. The simplest version is the following pairs of ODEs:\n", + "\n", + "$\\frac{dx}{dt}=ax-bxy$\n", + "\n", + "$\\frac{dy}{dt}=-cy+dxy$\n", + "\n", + "where x and y = the number of prey and predators, respectively, a = the prey growth rate, c = the predator death rate, and b and d = the rates characterizing the effect of the predator-prey interactions on the prey death and the predator growth, respectively." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```matlab\n", + "function yp=predprey(t,y,a,b,c,d)\n", + " % predator-prey model (Lotka-Volterra equations)\n", + " yp=zeros(1,2);\n", + " x=y(1);\n", + " y=y(2);\n", + " yp(1)=a.*x-b.*x.*y;\n", + " yp(2)=-c*y+d*x.*y;\n", + "end\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "h=0.0625;tspan=[0 40];y0=[2 1];\n", + "a=1.2;b=0.6;c=0.8;d=0.3;" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 12.0000\n", + " 5.2000\n" + ] + } + ], + "source": [ + "predprey(1,[20 1],a,b,c,d)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n9C0bAAAAwBDeFRJCqH379i5TdgAAAID54HoNCQAAAPAfQCEBAAAAXAAKCQAAAOACUEgAAAAAF4BC\nAgAAALgAFBIAAADABaCQAAAAAC4AhQQAAABwASgkAAAAgAtAIQEAAABcAAoJAAAA4AJQSAAAAAAX\ngEICAAAAuMAA2b4BAGBO79699S4CoBATb1QICgkA/BQT92smxtyWBEzZAQAAAFwACgkAAADgAlBI\nAAAAABeAQgIAAAC4ABQSAAAAwAWgkACzUVTdoHcRVKGouiFx47dmlQ4AECgk/8ReUJOyp9CUXVvK\nnsLuKzJT9hTqXRD2dF+RaQsPmb09T++CAIBagELySmp2efcVmWbttYtqGlK+NFuvbS+oWf5lYcb8\nQanflOtdFsakZpcn9GyXPKG7veBHe0GN3sUBAFUAheSV2dtPzRraOXHTt3oXhDGp2eUIoeQJ3fEH\nM7H/3I/LJ3RP6Gm1WYNN1mvvL/hxZlxnW3hwQs92epeFJeXl5Tt27CguLq6pqVm/fv3s2bMfe+yx\nI0eOeDzn8uXLGzdunD179tq1a4VvL1++vHXr1gcffBAfv3TpkvDV999/v2PHjnPnzrn8aFVV1Y4d\nO7Kzs1UVDVAAKCTPpOwpTOjZLvnW7ggh83VtCT2tuGszmWip35SPvfFaf73/3I/6FoYt9oKahJ5W\nhNDMuM7bsi/qXRxm5OTkTJs27cMPPxwwYMDf/va30tLSzZs3jxgxYtWqVS7nbN++vX///osWLfrs\ns8/S09PxVwcPHuzVq9ecOXPsdvvx48effPLJXr167d+/H3/bsmXLBx54YOHChS4/unXr1mnTplVV\nVWkjI0AOKCTP2AtqZsZ1RgjZrMHm69pwr53Q02qmrg0hVFTdYLOGIIRmxnUuqjHPXKu9oKaousEW\nHiz8q295mLNixYrp06eXl5fv3bv30qVL8fHxzz77bFZWlvicl1566d57762rq6uurt61axdCqLy8\n/M4772zZsmVubm5BQcG333579uzZDh06TJkypba2FiHUoUOH++67b8+ePcXFxeJbvfnmm1FRURMn\nTtRSRoAEUEiesRf8KBikZuraiqobiqobsGjdwoOLquv1LhEz7AU1CT3b4V7bFm62KTthpi6hp9V8\n65o33HDDypUr8Wer1bp161aE0Pr168Xn9OnT59VXXw0MDEQItWjRAiG0bt26mpqa7du39+vXD5/T\n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\nsbFt27aTJk0S8o6fP39+//79CKGjR4+2bt0aH5w6dapwbXFx8fbt20+fPh0YGJiQkHDvvfe2bNmS\npORaIu4JuVZOVw3Is88+GxMTs27dOunTYmJiZN0241x1whvHvH0766O85V+cl3VDfjCxaFuPlkmI\ntvyL88YVbfkX52d9lKfsW5/IbR0qsXv3boTQK6+8EhUV1alTp/Hjx1ssFoTQypUrXc5ZuXKlzWaz\nWCxWq/W2227DXx04cKBTp04IoR49egwaNCggIKBNmzZ2u138E1u2bEEIWSyWcePGRUVFRUZGvvji\niwihTz/9FJ/wyy+/IIQCAgJ69OgxYsSIoKAghNDtt9/e3Nx89erV1NTUkJAQhFBISEibXxFu/uGH\nH1osloCAgEGDBuGS9OrVq6yszGfJFUNfcZxUvUcMsIbkzu9+9zuEEH6NGCI9r2XoFDsSuQyQwUXz\nFjomYFzRkOTgzzTbzyOEVqxYMX369PLy8r179166dCk+Pv7ZZ5/NysoSn/PSSy/de++9dXV11dXV\nu3btQgiVl5ffeeedLVu2zM3NLSgo+Pbbb8+ePduhQ4cpU6bU1tbiq06ePDl//vzY2NiSkpKvvvqq\npKRk0aJFKSkp4ju3aNHinXfeaWhoKCgoyMrKunz58uLFi//zn/+sX78eITRz5kz8c6+//nrtr+AL\n8/LyHnjgga5du54+ffrbb78tLy9/++238/Pz77nnHumSA94wpELKz89HCMXGxrK9rXTXZvT2b9au\nTVrfGF006fIbPXuIwA033LBy5Ur82Wq1bt26FSGE9YFAnz59Xn311cDAQIQQ3q5i3bp1NTU127dv\n79evHz6nR48emzZt+uGHH4QdzV9//fXm5uatW7cK83hLly512c0vMDBw9uzZ+M7433/84x+dOnX6\n4osvpIu9bt265ubmd955R9gx/cEHH5w2bdrhw4fF2tS95IA3uF5DunTpUps2bUJDQ8UHt2zZcuLE\niZCQkFGjRrH9OW+5DK6fYNj27y2XwfUTDCsa8qV1jCuax71iBdi6clSlra5KW+3t25hPylyOnJ3S\nBX+ISFoi68KqtNURSUtcDrpsFBsTE9OrV6///e9/4oN//OMfXa5KT09v1apV//79L1++LBwcMWIE\nQujQoUMPP/wwQigjI6NNmzZxcXHiC++55x53N91Dhw5lZ2efPXvW4XAghAIDAw8fPuxNLszBgweD\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "a=1.2;b=0.6;c=0.8;d=0.3;\n", + "h=0.001;\n", + "[t y] = eulode(@predprey,tspan,y0,h,a,b,c,d);\n", + "\n", + "plot(t,y(:,1),t,y(:,2),'--')\n", + "legend('prey','predator');\n", + "title('(a) Euler time plot')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(y(:,1),y(:,2))\n", + "title('(b) Euler phase plane plot')\n", + "xlabel('prey population')\n", + "ylabel('pred population')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAABcSAAAXEgFnn9JSAAAA\nB3RJTUUH4QQSDhkOaHryRgAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJ\nbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAxOC1BcHItMjAxNyAxMDoyNToxNJduS+UAACAA\nSURBVHic7d19eBNV2j/w+6GNbVMaGgqlhca2wJaXqIi8NiuaVBdcEF0FW18eH4X1UVqqC3QRYZVa\nLvB60EXqgryo7KIiSqW+sAvqrwoVoYigQCUgBKU1WGhqW6y1BdKG3x8Hx2GSTNI2yUxmvp8/vJLJ\nJDnEztwz59znPv918eJFAgAAkFo3qRsAAABAhIAEAAAygYAEAACygIAEAACygIAEAACygIAEAACy\nECl1AyCcbNmypa6ujoiuueaaUaNGdfTt69atYw9uvvnm1NTUADcufLhcrn/961/scbdu3aZNmyZt\newJFqf8uCJn/wjwk8NO+fftGjx7NHh89enTw4MEd/YT77rtv48aNRPTHP/5x27Zt/r/xnnvu+fnn\nnwUbu3XrFhsbO3jw4Ntvv/3aa68VeUtBQYHFYuG/WlhY+OWXX3JPFy9e7P4JRPTGG2+8+eab3NPx\n48c/9thj/jS4ubn5/Pnz7HFcXNwVV1zBf/XChQtRUVHscVRU1Llz5/z5TPkL4L9L/AcExboI4B+T\nycT+ZiZMmNC5Tzh69Cj3h1dWVub/G3v16iX+Z3zXXXe1trZ6e8trr73Gfyk3N5f/3vXr13v80qqq\nqri4OP6eDz30kJ8NvuOOO7h3vfvuu4JXuVMtEUVFRfn9M8hdAP9d4j8gKBW67MAvn332WUVFBXs8\nb968zn3I4MGDb7jhhp07dxJRYWHhzTffHKjmvf3222lpac8++6zPPR955JGXXnqJe7phw4b77rvP\n457Tp093vy0LiG7duk2aNIk9jozEMQhwCQ4G8MuyZcvYg759+wq6vzpk+vTpLCBVVFR8+eWXI0aM\n6OgnzJw5c9y4cUT0zTffvPDCC42NjWz7mjVrfAakBx544LXXXuOebty48Z577vG458qVK7dv305E\nGo3G6XR2tJHiIiMj//Of/wT2MwEUAAEJfKurq+NOoFOmTPG22/Hjx19//XWr1Xro0KGmpqahQ4de\neeWVt9xyyz333NOt26V8zjvuuOPPf/5ze3s7Eb366qudCEhjxozJyclhj6+88srp06ezxz///POF\nCxdEBhvuv//+DRs2cE9LS0vvvPNOj3t+9913TzzxBBElJSWZzea33nrL/+atWrXqwIEDBw4c4La8\n+OKLW7duZY//53/+Z9y4cW1tbVy3oUajWbVqFXvsvv3LL7/8+9//vmvXrr59+95yyy1z587t3r07\nEX388cdr1qzZs2dPcnKy2WyeO3dunz593BtTWVm5fv36EydO7Nu3Lzo6evjw4ddff/1DDz2k0+n8\n+be4t+fIkSPLly/fs2fPL7/8Mnbs2MceeywzM9P/H2ffvn1vvPEGa49Wqx02bNjVV189bdq0/v37\nd+gH9P8bIcxI3WcIYYB/V/H++++779De3v7oo496+xs7f/48f+exY8ey7UlJSX42wNuAUFlZGf+L\nnE6nt7fcfffd3NOIiAjxYYnrr7+e7fnvf/975syZ3Bv9GUPiD364e+WVVy56H2sRbF+/fr3g7UOG\nDGloaHDvMu3bt++ZM2f4zTh//jwXqgV69er10Ucf+fOzC9qzcePGiIgIwac988wz3vbnf1Rra+u9\n997rsT0RERGLFi3q0A8ISoWABL7xTyUNDQ3iO7gTBCT+ifLYsWP+NMBbQPrnP//JbR80aJC3t/Tt\n25d7rNFo/v3vf4t81wsvvMD2fPDBBy9evChVQIqIiHA/+xPR8OHDPX5ybm6ut2ZEREQMHz580KBB\n/C/94osvfP5bBO3RaDQev3rr1q3u+wsC0uTJk0V+FiJ6+umn/f8BQakQkMA37iToMXXqgw8+4J8y\n7r33XhZmzp8//9FHH918882CgMS/3/IzgYofXf7yl7+8++6777777jPPPMPf/tZbb3l7C0ej0XBn\nT49sNltMTAwRpaSk/PTTTxc7HpD279+/detWLiORiJ588smtv/r+++8v+heQiCgxMXHDhg2HDh0S\n3OvExsauXbv20KFDc+fO5W/kPuf999/ntqekpNhsNra9tLSU2z58+HCf/xb39pSVlbW3tx87doy7\niSSiq6++2n1//r+L/70RERGvvPJKe3t7a2sr/1YvIiKCtdOfHxCUCgEJfGPnaCLq37+/+6v8S9o/\n/vGPPj+Nf3pasWKFPw0QT/tOSUkRRCNvbxkyZIjD4RD5Iu48+MEHH7AtHQ1ITOfSvgUBgMtHr6mp\n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\nPHjZsmVbt2597733li9fftNNN0ndrtApKCg4ePDgiBEjNm/efPjw4Z07d86YMaOpqSk/P9/9uk0Z\nvvrqq8rKyj59+txyyy0iu8n0bHlRQaZOnZqRkbF161Zuy88//5yZmZmRkXHy5Enp2hU6P/zwQ11d\nnWDjzp07MzIyhg0b1t7eLkmrJLR+/fqMjIzt27dnZGRkZGRI3ZyQ2rgejwqOAAAGhElEQVRxY0ZG\nxj333HPhwgWp2yKN+vr6jIyMoUOHNjY28rc//PDDGRkZ69evl6phQfXNN99w/8dF/uzlebZUzh1S\ndXV1ZWWlXq+fOHEit7F79+6swtC2bduka1ro9O3bt1evXoKN48aNi46Obm1tdS9Tq2x2u3358uW3\n3Xbb9ddfL3VbJPDSSy8R0VNPPcWWcVGhb775hoji4+Pj4+P529lIycmTylypb9CgQT7/j8v2bKmc\ngMRKOYwZM0awfdSoUUR05MgRCdokDy6Xi60gJTgsFW/hwoVarfZvf/ub1A2RwNGjR2tqalJTU4cM\nGUJETqeztbVV6kaF2qhRoyIjI5ubm51OJ3/78ePH6dewpE6yPVsqJyDZbDYi0uv1gu3JyclEdODA\nAQnaJA/bt2+/cOFCRkaGSjI7mE2bNlVUVMyfP19tYZg5ceIEEV111VUVFRWTJ0++6qqrrr322uuu\nu27x4sXNzc1Sty5ENBrNzJkzz507N2/evLNnzxKRy+UqLS3dsmXL0KFDJ0yYIHUDJSPbs6Vy0r5r\na2uJKDU1VbA9PT2diNRzEAo0NDQUFhYS0V//+lep2xI6dXV1S5cuveGGG1RbEr66upqIjh8/Pm3a\ntN/97nc5OTkul2v37t2vv/76l19++dZbb6nk6iQvLy85OXndunUmkyk6OtrpdEZFRU2fPj03N1e1\nPZkk47OlcgJSe3s7EcXFxXl8lfVZqU1LS0teXt6PP/44ffr0G2+8UermhM6TTz7pcrkWL14sdUMk\n09DQQEQ2my0rK2v16tVsY0tLy3333XfkyJG1a9c+9thjkjYwRGpra7ds2WKz2fr27ZuRkXH27NmD\nBw9u27Zt9OjRFotF6tZJRrZnS+V02bHrHfdUTvbjRkRESNAmSZ0/fz43N/fAgQO33XbbvHnzpG5O\n6Lz//vvl5eWzZ8/u06eP1G2RDOt7IaKnnnqK26jVaufMmUOqyfFpbW29++67Kyoqnn766R07dqxd\nu3bTpk0ffPABEc2YMeOLL76QuoGSke3ZUjl3SGxFc4fDIdjOhu9SUlIkaJN0nE7njBkzPv/88wkT\nJjz33HNSNyeknn32Wb1e369fv48//pht4ab+sS0jR45U/MBSYmIiEcXExAiKMowePZqIvv/+e2ma\nFVoffvhhTU1NVlbWPffcw23s37//3LlzCwoK1q5dy34NFZLt2VI5AYlVx3HPbGZb2P8AlXA6nXl5\neRUVFX/4wx9UOB+2qanpwoULM2fOdH+JbXzjjTcUn2F15ZVXSt0E6bHBee5mkcNyyQ4dOiRBm+RB\ntmdL5QQkk8kUERGxa9eulpYWfqGqsrIyIho7dqx0TQup9vb2vLy8nTt33nDDDS+88ILUzZHAc889\nJ+gEb29vZzkdy5cvJ6L+/ftL07IQGjZsmE6na2pqamho4Beq+Prrr4koKSlJuqaFjk6nI6Jz584J\ntrOMD/aqOsn2bKmcMSStVjtp0qS2tra1a9dyG202W1lZWWxsrEqyrVwu16OPPsqi0apVq1Q4ckZE\nt9xyy8TLcTVU2FM1VBLq1q0bW1V51apV/O3s6OBPh1Qwk8lERGVlZYJbgQ0bNnCvqpNsz5aKKq56\n+vTpKVOm1NfX33nnnRaLxW63r1u3rr6+ftGiRSpZ8vzdd9994okniGjs2LHR0dGCV/Pz86+++mop\n2iUxp9N51VVXkZqKihJRS0vLnXfeefLkyZtuuunWW29tb29/4403Dhw40K9fv/fee08l9wfTpk2r\nqKhISEi49957MzIympqa3n777YMHD8bFxb377ruKrIK/f//+l19+mT0uLy8nIrPZzJ5Onz6dmwwr\nz7OlogISEZ04ceLxxx9nQ3NEpNfrZ8+erZJoRESbN28WKUzw0ksvqSr5m6POgEREP/7448KFCz/5\n5BNuy0033bRo0SL3+lJK1dra+vzzz2/cuJFf03rEiBGLFi0aOHCghA0Lnm3bts2ePdvjS88+++zt\nt9/OPZXh2VJpAYmpqqqqrq6OjY297rrrunVTTrckQCecPXuWDR2xgSWpmyMBl8v11Vdf/fLLL926\ndRs+fHj37t2lbpGMyOpsqcyABAAAYQd3DwAAIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsISAAA\nIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsISAAAIAsI\nSAAAIAv/H0HbHRZqb02MAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "a=10;b=0.6;c=0.8;d=0.3;\n", + "tspan=[0 10];\n", + "[t y] = rk4sys(@predprey,tspan,y0,h,a,b,c,d);\n", + "plot(t,y(:,1),t,y(:,2),'--')\n", + "title('(c) RK4 time plot')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nZj+aUWrny/9cd3f3d99912AwtLW18ecTubu7s3oePnx4165d3CRYInrxxRd3/erMmTM9Vht6hECS\nEO53eOTIkaZ7+VeV+KljMBj443imgcT/rROMn5hledp3UFCQaRp1966IiAj+X8emuF/vzz77jJUM\nPJD4vbozZ87w/8CvrKw0+5bXX3+de8vjjz/OlT/99NOWP5p/uevxxx9nhX/+859ZiVKptNwl5f/R\nvWXLFv6u+Ph4btexY8es2wJ9nQZt9jRNP7fHZpTa+fLr8/zzz/M/gpueSkQZGRlm34Jp31aHSQ0S\n0tbWxjYiIiJM93799dfcdkJCArft5uY2ZcoUvV7f3Y+VyWTcNregQ/94enomJSXxP92y6urquLi4\nvXv3/td//Zfp3n/84x9sjntaWto999wzkIrxPfLII9z2iBEjoqKivv32W/aysrJy9OjRpm9JSUnh\ntseNG8dtc/8iRHTp0qXc3Nw9e/Z89913/HION2d91KhRbEOv14eFhfn5+UVGRt56660ajWbatGkK\nhYJ7yxdffMFtf/jhh9yUFiI6deoUt/3999/fdtttFk/6Bv1ogX6cpqkem1Fq58uvD78XSEQPPPDA\nvn37uPr0vjIwEAgkCXF3d2fT4cz+zl+6dInb9vHx4e+ycCGaiIxGI7ft6+vbpyrFxMQolcrGxkY2\nJ7uzs3P9+vXl5eX79+/38Oj2f54pU6Zwv8yVlZWTJ0/ev3+/aSatWLGCVf7ee+/dv38/K/zPf/7D\nHdDQ0LB//343NzduMaQeeXl5CSo2fPhwbtvsLfpeXl78yV2///3vTY85ffr05MmT6+vre1OH5cuX\nb9++nTuRq1evstbYsmWLu7t7VlbW8uXLuV3cu7j5Wqb6tLJAP1qA06fTNP3cHptRaufLr4/gl4j/\nd4PTr2QhHQgkCfHx8WG/IWb/IvPw8OBGHvgZQ0SCEQyBn3/+mdv+4x//2KcqpaenP/bYY0T01Vdf\n3XXXXSwvDx06lJOTY+FO27lz586YMePpp59mL0+cOGE2k7q6uojo6tWr3EUXATY636e1XgQtw30K\n4+bWzxvvFi9ezH1Nh4WFpaenBwUFubm5HTp06JVXXhEcfMstt1RWVq5bt27Pnj3ffPMN/1/HYDC8\n+OKL8fHxbFKyl5cXtzc+Pr676vG/YXs0kBbo02n2g9TO19PTs7Ozk20Lfok6Ojq4bQt/e4F1oaEl\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(y(:,1),y(:,2))\n", + "title('(d) RK4 phase plane plot')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Systems of ODE's:\n", + "## The Coriolis Effect\n", + "\n", + "System of ODE's defined as:\n", + "```matlab\n", + " function ddr = coriolis_ode(t,r,R,L)\n", + " g=9.81; % acceleration due to gravity m/s^2\n", + " l=10; % 10 m long cable\n", + " we=2*pi/23.934/3600; % rotation of Earth (each day is 23.934 hours long)\n", + " ddr=zeros(4,1); % initialize ddr\n", + "\n", + " ddr(1) = r(2); % x North(+) South (-)\n", + " ddr(2) = 2*we*r(4).*sin(L)-g/l*r(1); % dx/dt \n", + " ddr(3) = r(4); % y West (+) East (-)\n", + " ddr(4) = -2*we*(r(2).*sin(L))-g/l*r(3); % dy/dt\n", + " end\n", + "```\n", + "\n", + "First, we will solve for the path of a neutrally-buoyant object with a 100-N force pointing North. It's path starts at 41.8084$^o$ lattitude (Storrs, CT)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAABcSAAAXEgFnn9JSAAAA\nB3RJTUUH4QQSAxwY6QEgAQAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJ\nbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAxNy1BcHItMjAxNyAyMzoyODoyNLLRS0sAACAA\nSURBVHic7N15QBNn/j/wj0TuY4mlKioV1IJHrYuCWuoBVNFqUXu4WrW2UK2K9wUtWhW32NV2vQse\nteJZ/VW02sJqscgqsipUFBWPYIWyBgEFBeRO+P3x7M43GyBkQo5J8n79NXnm+jyTIR/mmWeeadPQ\n0EAAAACGZmHoAAAAAIiQkAAAQCCQkAAAQBCQkAAAQBCQkAAAQBCQkAAAQBDaGjoAgP+orq4+ffr0\ns2fP6uvrWcno0aM7d+6szlyTIZfL9+7dy6YtLCxCQkJ0t5aR0kVlzeTsEr42eA5JY++//355ebmK\nBXx9fVevXq3ZxisqKmpqati0o6OjlZWVZtsxFocOHZo1a9bz588VC5OSkkaMGNHiXF0w1PGvra21\ntrZm09bW1tXV1erE09xaRkrPldX/2QXNagBNubi4qD62Y8eO1Xjjb7/9NredEydOaDFsAbp7965I\nJGp8AJOSklqcqyOGOv7cDzERWVtbqxlPc2sZKX1W1iBnFzQHTXZgeKdPn5bJZGx64MCB0dHR7F/g\nfv36tTjXxFhYWIwdO5ZNt22LP0+dM6uzS/hwxmvH9OnTBw0apFTo7u5uiFiMz61bt7jpjz/+WKmp\nRPVcE9O2bduff/7Z0FGYEbM6u4QP95A09+KLLz5+/JhN79+//4MPPmhxlfT09EOHDuXk5KSnp9vZ\n2fXr169v374hISHdunXjlomJicnMzDx79mxubi4rGTFiBJfbpk+f/ujRo19++YV9nDhxYlBQkOIu\nfvnllx9++IFNBwUFTZw4kdfeGblcvm/fPhbDvXv32rZtO2DAALFY7O3t/frrrzdOvU3KysqKi4tj\nu7OxsfH29h4yZMiMGTOcnJy4ZQ4cOHD+/PkLFy7cvXuXlQwbNszT05OIHB0dvb29VczduHEjr30p\nunfv3oEDB27dunX9+vWysrLevXu/9NJLo0ePfv/993fs2KH6+A8dOrTJbVZWVi5cuJBN9+rVa8mS\nJY3LP/nkE19fXzb9448/JiQkKJXX19fPmTOHFVpaWsbExLR4PgwdOrTxbZWcnJzNmzefP3++tLR0\n0KBBoaGhY8aMaTJsJY0DUHNTap5djbefnZ29adOmy5cvFxcXT58+vaSkRD+VVX3uKZ5d6v/hqK7d\nqVOnuG9fxRloYfE/nZ/5ntvGzdBthkZM8R7S/v37VS9cVVU1ZcqUJr8CkUi0du1abknFBvTGvv32\n20uXLnEf/f39lXYUGBjIzb1y5QrfvTc0NDx79mzAgAHNBaDOjbGamprQ0NAmV3dxcTlz5gy35IwZ\nM5rbkYuLi+q5fPfFyGSy+fPnN7fZmpqaFo+/iop37NiRLWZrayuTyVjhiRMnuNXnzp3b5Bd9+/Zt\nrjpcIbtBok48SmudPHnS1tZWaclt27a1+MVptileZ5fS9s+cOaO4/ddee01vlVXn7Gqxarxql5CQ\n0KDGGai4NV7ntglAQtKcYkKaO3fukUb+/e9/cwsHBwc3dwoya9asYUuq8wPUt29frkRxL3/88QdX\n3rdvXw323tDQsHLlSq7c0tJyyJAhw4YNc3R0ZCXqJCTFKohEIm9vby8vL67E2tqay5StT0jq74tp\n7veFaWVCmjZtGrfkpUuXWOHSpUu5Qm9vb1Yok8m4n6ouXbpwW2h9QhKJRJaWlo2XtLa2LioqavG7\n02BTvM4upe2LxWLFJfkmpNZUVp2zq8Wq8aodS0gtnoHc1vie2yYACUlzLfay4zoIxcfHK55Y3377\nrUwmq6qqioiIUCyXSCQNDQ0ZGRkJCQl+fn7crJUrVyb81x9//NHQ0LBp0yZu7t/+9jcupL/97W9c\n+ZYtWzTYe0NDA3dTvVevXuXl5dzGHz169N13333xxReqD8vJkye5zXbp0oXbrGIY3O/yjRs3EhIS\nRo0axc1auHAhq2lSUpLquXz31dDQ8I9//EPxC5oyZcrdu3cbGhpqamrOnDkzYsSImpoadY5/c44c\nOcKttWnTJlY4ePBgxeP8/PnzhoaGK1eucIXTp0/nttA4IakTj+JaRGRra7tt27bbt2/HxcUp/od+\n+PBh1d+dBpvie3YpbZ+IBg8eHBcXd/jw4aVLl+7fv19vlW3x7FKnarxqd+XKFXXOQLYpvue2aUBC\n0pz6CUnxP53ly5crbmTYsGHcrFWrVnHlqnu+Pnv2jPvHUPFKiLtysrS0fPbsmWZ7f/PNN1mJu7s7\n+2vhRXF3Bw8eVJyl2Jx4/fp1rlzxf9XGlyAq5vLdl+Lyb775ppq1UL/b96NHj7i13n333YaGhrq6\nOtaruH379qz85MmTDQ0NW7Zs4ZY8cuQIt4XWd/smhf9FGhoapk+fzpXPnz+/xSrw3RTfs0tp+2+/\n/XbjGPRW2Qa1zy4VVeNVO83OQDX/jkwAetlph6OjI3ejlcM90Hf27Fmu0N/fX3GZt99++/z582z6\nxo0bau7Oyclp6tSpcXFxbK1r1679+c9/zsrK4rYwadIk7p4n37336NGDTeTm5np5ebHOBS+99JK/\nv/+YMWNcXV1Vx6a4u++//16xz1hOTg43fePGjVdffVXN+mprX4rLz549u5V7b6xDhw59+vRhHbcS\nExNJoVfx3/72N3Y/ICUlZdy4cdxhp0ZfSut99NFH3LRi9+Wqqiqtb6qV5/batWv5hsQ3Qo2pWTXi\nUzv1z0B9/h0JBxKSdnzzzTcqetkpDujA3YxhFH/feT1zHhoayhISER0+fPjPf/7z4cOHubmffPKJ\nxntfsWLFiRMn/v3vf3Ors7+9gwcPikSiqKioFStWqAhMcXdcL7LGtDKaAN99KS7/pz/9qfUBNObv\n788SUlVVVVZW1r/+9S9WPm7cuL59+964cePy5cv033RFRH369OnQoYMWA7C2tlbsf9Waaqqzqdac\n25aWlq+88orG4akZocbUrBrxqZ36Z6A+/46EAwlJHywtLevq6ti00kV9bW0tN83rQcihQ4d6eXmx\nHquHDh3asGHDoUOH2CwvLy/Frsl8996hQ4dbt25t27btl19+uXz5suIqMpls5cqVgYGBKm4+W1tb\nc6sEBgYq9WHlaGWgML77UlyeOybaNWLEiG+++YZNp6ampqamEpGXl9cLL7wwaNAglpAuX77M/f+u\n9csjPWvNud3c9yUQalaN+NRO/TNQn39HwoGEpA89e/bkLurz8vIUZyle+PP9/27GjBnLly8nIqlU\n+vnnn3PXNErdhzTYu5OT04oVK9iVUEVFxfnz53ft2sXdZT1x4oSKhNSzZ8/r16+z6XXr1qn50JJm\n+O5LcfnLly/r4inIoKAgkUjEmumSk5MvXrxIRK+//jqbxW6MK/ZjNPYnMXV0bguBmlUjPrVT/wzU\n59+RcAj6PxQjcv369cSmsLmKj+n9/e9/r6ioYNN5eXlHjx7lZik+xKrYX6i5FuoPP/yQG4brq6++\nYhOWlpYffvih4mJ89/6vf/2LW4aIHBwcxowZo9gGWFpa2mQ8zPjx47np9evXN17g5s2b8+bNU7EF\n9fHdl9Ly6enpigv/85//5AZ7Vuf4N8nOzo7L1qdOnWKZafTo0aRwMcTdHhCJRGxWizSOR9c0OLdb\nJJDKqlk14lM79c9Aff4dCYihe1UYsRZ72XGHt6ioSPGJhJdeemnGjBkfffSRYmG/fv0UN/7FF18o\nbsfR0dHFxcXFxUWxH3ZDQ8O7776rtMeJEycqxcl379OnT7e0tAwODl61atXhw4fj4+O/+eYbxQcg\nYmNjVRyWx48fcz3KiGjgwIHffPNNfHz84cOHFy9ezG47c895MBr3suO7r5KSEsXlRSJRcHDwnDlz\nQkNDvb29SeEpEDWPf5MiIyOVvhSpVMpmvfzyy4rlfn5+Sus218tOdTwqxhv99ttvuVkzZsxoMXi+\nm+J7dqkzNKreKtug8uxSp2p8a6f+GajB35EJQELSnPoJqaGhITk5Wem+qKIuXbooPeDy73//u8nl\nlX4Qk5KSlBZocpRiXntX7DvbmLu7e4s/yqmpqUp/tEq0lZA02NelS5cU/86VcD8Hah7/Jil9Ke7u\n7twsxS5hRLRy5UqldZv7RVMdjwETUgPPs0udhKS3yja0dHa1WDUNaqfmGdjA/9w2AWiy05OAgIBr\n165NmTJF6cFyR0fHhQsXZmVlubm5KZZ37tw5LS1t8uTJKv4eiGjEiBEvvfQS99Hd3b3JVmlee3/9\n9df79evXeEx+S0vLGTNmXLlyxcHBQXVlX3/99Rs3bnzyySeNn6K3tbV99913t2/frnoL6uO7r0GD\nBmVlZc2dO9fe3l5peW9vb+7WsZrHv0mBgYGKwSg+s6LUQDd8+HA1t9maeHSN77ndIuFUtsWqaVA7\nNc9A0u/fkUBgcFV9k8vlFy9efPbsGRF16dLl1Vdf1WdfI/X3LpfL79y5k5ubW19fb2FhwTqJ8Q1V\nLpffvHnzjz/+kMvlVlZW/fr1a/ExJo3x3ZdcLs/Ozs7NzZXL5XZ2dkOGDLGxsdFRbGbCsOe2Tumi\nauqfgfr8OzIs40hIly9fTk9Pf/TokY2NTf/+/f39/e3s7BovJpVKk5KSJBKJs7Ozv7+/j4+P/kMF\nAADNCD0hlZSUzJkz59q1a4qFTk5OGzduVHoLQHx8/KpVq7g+KkQUGBi4efPmxgMoAACAAAn9gnrp\n0qXXrl0bMGDAsWPHbt68ef78+dmzZ5eVlc2bN08qlXKLZWRkREZG2tnZbdu27ebNmwkJCQMHDkxO\nTo6OjjZg8AAAoD5BXyGVlJS89tprbdu2vXjxorOzM1c+a9aslJSUyMhI7oGbiRMnZmVlbdq0iXt0\noKKiIigo6MmTJ2fOnMGbWwEAhE/QV0h37twhImdnZ8VsRETs5tCDBw/Yx7y8vKysLLFYrPggm4OD\nA3uXCfd0KgAACJmgE5Kvr2/btm0rKiqUBn26d+8e/TctEREby7Lx0BrsbcHZ2dn6iBUAAFpH0AnJ\n0tJy7ty51dXVERERT58+JSK5XB4fH3/q1KnevXtzb9aSSCRE1PgJMtYzMjMzU79RAwCAJoQ+uGpY\nWJirq+uePXv8/PxsbGzq6uqsra1DQ0PnzJnDPSxWWFhIRF27dlVa18PDg4gUh2UDAADBEnpCKiws\nPHXqlEQi6dSpk6en59OnT69du5aYmDhw4MCAgAC2DBu/srmHuuVyuepdKI7SBgBg8thrawRI0Amp\nqqpq8uTJUql0zZo177//Piv8/fffQ0JCZs+efeDAgYEDBxIRu1RS7AXOsFTUeAicxgT79ega90Yl\nM2TOdSfzrr45152E/S+4oO8hnT59WiqVBgYGctmIiLp168ZeArRz505W0r17dyIqKipSWp11dujS\npYuewgUAgFYQdEJi/REaj9rEus9xb69igxsWFxcrLcZKWLoCAACBE3RCcnJyoqZeGs/e3sjmEpGf\nn59IJEpNTa2srFRcjL0FYPDgwfqIFQAAWkfQCcnPz4+IkpKSlK5+Dh48yM0lIjs7u7Fjx9bX13ON\neEQkkUiSkpLs7e3Z47HQJHNuSTfnupN5V9+c6y5wgu7U4Ofn5+fnl5aWNn78+ClTpnh6epaVlf3w\nww/Xrl1zdHScNWsWt+SSJUsuXry4Y8eOoqKigICA/Pz8PXv2yGSyiIiIFl/eAwAAQiDoseyIqKqq\nauPGjYcPH1YcxnvAgAFr167t0aOH4pI5OTnh4eGsIwMRicXixYsXT5o0qcVdmHmXGwAwK0L+xRN6\nQtIDIX89AADaJeRfPEHfQwIAAPOBhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKA\nhAQAAIKAhAQAZifqzIPcEuVRm8HgkJAAwLzEpRfEZRS4t7MxdCCgDAkJAMzLvvSCvZN7GToKaAIS\nEgCYkYCYq+7tbP27iw0dCDRB0K+fAADQopT7pSn3nzaE9Td0INA0XCEBgLmIOvPgXJi3oaOAZiEh\nAYBZiEsvQGOdwCEhAYDpyy2pDjly+0PfjoYOBFRBQgIA0xdyJPsjX1dcHgkcOjUAgImLSy/ILa0+\nh74Mgqd5QiorKystLS0rKztx4sSdO3eIqHPnztOmTfvTn/7k5OTUrl077QUJAKC5kCO30ZfBKPBL\nSJWVlZcuXdqwYcOjR4+qqqqU5v7222+nTp36z3bbtnV1df34449HjRqF5AQAhhIQcxWNdcaiTUND\ngzrLXb58ecWKFfn5+Rrso2PHjgsWLHj33Xc1WFcPvLy87t69a+goAED74tILQo7cbvh7oKEDERAh\n/+K13Knh4MGD/fv3nz59umbZiIgePXoUGRnZu3fvr7/+WrMtAABoYF96ARrrjIiqK6Sffvpp5cqV\n1dXKY+J27Nixffv2q1atcnJysre3t7GxsbS0JKK6urra2trnz59XVFRs3Ljx/v37Dx8+bLzZRYsW\nzZkzR7vVaA0h/78AABoLOXKbiDBsnRIh/+I1nZAKCwvfe++9oqIirqRt27b9+vVbt26dm5ubSCRS\nfwdSqfTrr79OTk5WvOdka2u7a9eugQMHtiZ0bRHy1wMAmsktqfaITjsX5o27R0qE/IvXdEJ6/fXX\nHz9+zKY7d+68YcMGHx+fVu4pLy9vzpw59+/f50oEclCE/PUAgGYCYq6uHuWBbNSYkH/xVN1D6t27\nd0pKSnJycuuzERF17do1MTHx8uXLI0eObP3WAACaE5deQETIRkan6W7fnTp1OnbsmKurq9b35+zs\nvH379rKysrlz52p94wAAhAePjJa63b4N4vHjx9euXWtubufOnXv1+p/blVKpNCkpSSKRODs7+/v7\nq3lhJ+QLWADgi73xCH0ZmiPkXzxBDx1069YtFRdSoaGhigkpPj5+1apV9fX17OPu3bsDAwM3b95s\nbW2t80ABQBgwSpBRE3RC6tmz54YNG5QK5XL5ihUrZDLZuHHjuMKMjIzIyEgnJ6fo6OiAgIC8vLyo\nqKjk5OTo6Oi1a9fqN2oAMBi8ntyoCTohdejQYfz48UqFZ8+elclkPXv2VLw8Wr9+PRFFRUUFBQUR\nUY8ePWJjY4OCgo4ePRoaGuru7q7HqAHAMPB6cmNnfK+fOHr0KBEpDkSUl5eXlZUlFovHjBnDFTo4\nOAQHBxNRYmKi/oMEAD1jrydfHeRh6EBAc0aWkIqLiy9evNi2bdt33nmHK7x16xYRDRo0SGlhX19f\nIsrOztZnhABgEOz15O7tbAwdCGhO8yY7qVR68uTJhISE6urqurq6Fpe3sLA4d+6cxrtjjh07JpPJ\ngoODHRwcuEKJREJEYrHydTrrtp6ZmdnKnQKAwOHBI9OgSUL65z//uXTp0vLycl5r8RpwqDnx8fFE\npHh5RESFhYVE1LVrV6WFPTw8iKiioqL1+wUAwWKvJ8eDRyaAd0KKiIj48ccfdRFKi65evZqfn9+5\nc2c/Pz/FcplMRkSOjo5NriWXy1vcspeXFzct2B76ANCkkCPZGLNONcWfOCHjl5Di4+OVslH79u0d\nHR1FIpGFRQu3o1pcoEU//PADEb333ntK5WyscalUqlTOUpE6V2ZIQgBGCo116lD8iRNycuKXkL78\n8ktuesmSJTNmzNBKQ5w6qqqq2OtoJ0yYoDSre/fuRKQ4NjnDOjt06dJFLwECgL6hsc7E8EhIZWVl\n3H2jbdu2sSd+9ObUqVP19fV+fn6dOnVSmuXm5kZExcXFSuWshKUrADA9IUey8XpyU8KjGY3rHWBv\nb6/nbEREx44do/99/Ijj5+cnEolSU1MrKysVy5OSkoho8ODB+okQAPSJjRKEcRlMiSb3dVxcXLQe\nh2oSiSQrK8vJyUnx0VeOnZ3d2LFj6+vrd+7cqbhKUlKSvb09ezwWAEwJa6xDNjIxPJrs7Ozs2IQ6\n/da0i10ejR8/vrmeEUuWLLl48eKOHTuKiooCAgLy8/P37Nkjk8kiIiIUn1gCANOAxjqTxCMhOTs7\n29raVlVVPX36VHcBNSaXy0+ePEnNtNcxrq6u+/fvDw8PP378+PHjx4lILBavXbt20qRJ+gsUAPQC\nQ3qbKn697KZOnfrtt9+Wl5cXFBTo4vV9TbKwsLh06VKLi/Xo0YOlIgAwbehZZ6r43UNavny5lZUV\nEeHGDAAYREDMVTTWmSrenRqSk5OJqLy83M/Pr6SkRAchAQA0DT3rTBvvoYNefPHFrKys4ODgvLy8\n1157zc3NbdSoUWPGjGFXTqq9/PLLGgUJAECExjpT16ahoUGD1Xbu3Llx40Zeq4hEImG+CULIb5gH\nAA57/x4uj1pJyL94vK+QpFLpm2++WV1drYtoAACahJ515oBfQqqrqwsICNBRKAAAzUFjnTngl5A+\n+eQTbtrW1nbGjBnvvPOOk5OTOqN9AwBoBj3rzASPhCSTydLS0ti0n5/f3r17dRMSAMD/iUsvSLn/\ntAGNdWaAx2WN4vsdvv32Wx0EAwCgbF96ARrrzASPhFRfX88mOnfurLfXIAGAOWM969BYZyZ4NNm1\nbfufhW1sbHQTDADA/0FjnbnhcYXUrl07NvH8+XPdBAMA8H/QWGdueCQka2vrzp07E9GjR49kMpnO\nQgIAQGOdOeLXV5vry7Bp0yYdBAMAQPTfxjoMymBu+CWkbt26zZ8/n4h27979/fff6yYkADB3aKwz\nT7yfZp03b96KFSuIaM2aNUFBQRKJBM13AKBFaKwzW/xGanjrrbcePXrEfczLy3vrrbeIyMbGxtLS\nUvW6bdq0SU9P1yBEADAfGLPOnPFLSOXl5eXl5Y3Lq6urWxxuFY8uAUCLMGadOcMAdAAgFBizzszx\nu0IaMGCAYpMdLxh9FQBUQGMd8EtIfF/KBwCgjtySajTWAa5aAMDwQo5ko7EOeL8xFgBAu9BYBwwS\nEgAYEhrrgIMmOwAwpJAj2efCvNFYB4SEBAAGFJdeQETIRsAYTZNdbm7u+fPn792717Zt2wEDBgwY\nMKBTp05Ky0il0qSkJIlE4uzs7O/v7+PjY5BQAUAdaKwDJW0aGhpauYmMjIyFCxcSUY8ePfbt26eN\nqP5HTU1NVFRUfHy8Uvndu3cVP8bHx69atYp7rS0RBQYGbt682draWvX2vby8lDYFAHoQEHN19SgP\nXB7pmZB/8bRzhfT48WMiEot1cmLNmzfv/PnzPXv2nDlzZs+ePevq6h48ePDzzz8rLpORkREZGenk\n5BQdHR0QEJCXlxcVFZWcnBwdHb127VpdRAUArYERVKExoTfZff/99+fPnx8wYMC+ffu48Vt79eo1\nZswYxcXWr19PRFFRUUFBQUTUo0eP2NjYoKCgo0ePhoaGuru76z1wAGgWe93RuVEehg4EhEXonRp2\n7dpFRJ9//rmK0cTz8vKysrLEYrFilnJwcAgODiaixMREPcQJAOpjrzvC5REoEXRCun37tlQq7dq1\na69evYiorq6uqqqq8WK3bt0iokGDBimV+/r6ElF2drbuIwUAdaGxDpoj6Ca7nJwcInrllVfS0tK+\n/PLLe/fuEZG9vf0777yzaNEiBwcHtphEIqGm7mC5uroSUWZmpl6DBoDmsca6BgzKAE0R9BVSXl4e\nEd27dy8kJKShoWHSpEkTJ07805/+dODAgQ8++KCmpoYtVlhYSERdu3ZVWt3Dw4OIKioq9Bs1ADQL\n7yYHFQR9hVRSUkJEEokkMDAwNjaWFVZWVk6dOjU7O3vnzp0LFiwgIvYOdUdHxyY3IpfLW9yRl5cX\nNy3YDpEAxg6NdYai+BMnZIK+QmJtbkT0+eefc4V2dnZLliwhhd4KrL+DVCpVWp2lInXeVHtXgTYC\nBwBlbATVvZN7GToQc2QsP3GCvkJq3749Edna2ioNyjBw4EAi+uOPP9jH7t27E1FRUZHS6qyzQ5cu\nXfQQKgCogEEZQB1qJaSMjAwVc9PT09Vcku9YPi+99JI6i7m5uRFRcXGxUjkrYekKAAwo5Ej2miAM\nygAtUCshLVy4kI3FoJpEIpk6dWpzc0UiEd8e2P369XNyciorKyspKWnXrh1XfuPGDSLq2LEj++jn\n5ycSiVJTUysrK+3s7LjFkpKSiGjw4MG8dgoA2hV15oF7O9vVeAwWWiLoe0gWFhaTJk0iopiYGMXy\nnTt3EhH3GKydnd3YsWPr6+tZOSORSJKSkuzt7dnjsQBgEHHpBWt+efChb0dDBwJGQK0rpJ49e6q+\nQrpz5w63ZHPLWFhokvzCwsLOnj174MABqVT61ltvyWSyQ4cOZWZmdu7c+ZNPPuEWW7JkycWLF3fs\n2FFUVBQQEJCfn79nzx6ZTBYREcE9rgQA+odBGUB92hntm7XUvfzyy0pjnmrF48ePV61a9euvv3Il\nb7zxxtq1a11cXBQXy8nJCQ8PZx0ZiEgsFi9evJhdYKkm5LFvAYwa6+eNnnWCIuRfPEH3smNcXFyU\nmuya1KNHj+PHj+shHgBQB+vnfQ6DMoDajCAhAYDRQT9v0ICgOzUAgJEKOZK9d3Iv3DoCXpCQAEDL\nWD/vj3xdDR0IGBkkJADQJvTzBo0hIQGANqGfN2gMCQkAtAbjeUNroJcdAGgH+nlDK2knIVlZWdF/\nXwMBAGYI/byh9bSQkHx8fNhopwBgttDPG1oP95AAoLXQzxu0AgkJAFoF/bxBW5CQAKBV0M8btAUJ\nCQA0h37eoEXo9g0AGkI/b9Cupq+QoqOj6+rqdLrjrVu36nT7AKBTrJ833nUEWtR0QkpMTHzllVfW\nr1+vi7S0f//+Pn36fPPNN1rfMgDoTciRbNw6Au1SdQ/pu+++e+WVVxYuXKj6/eVqqqioWL9+fe/e\nvaOjo+vr61u/QQAwFNw6Al1oOiFFRUWJRCI2ffr06ddff3348OH79u0rKyvju4OqqqrTp08HBgYO\nGDDgu+++k8lkrHzJkiUaBw0ABsRuHaGxDrSuTUNDQ3PzVq1adfToUaVCJyenLl26LF26tFu3bk5O\nTg4ODkoLVFZWlpeXP378+K9//esff/zx5MkTpQWGDRu2detWW1tbrVSg9YT8aPMUsQAAIABJREFU\nhnkAocktqfaITkNjnfES8i+eqoRERJWVlZ999tnp06dVLGNlZcVGsaurq6utrVWxpLe39/bt211c\nXDSLVUeE/PUACE1AzNXVozyQjYyXkH/xWuj2bWdnt2XLlpqampiYmAMHDjx//rzxMrW1tarzkI2N\nTXBwcHh4uJOTU6uCBQCDwq0j0KkWrpCU5Ofnb9q06cKFC+rcTLK3t/f29v7888/d3d01D1D3hPz/\nAoBwxKUXRP3y4MEKP0MHAq0i5F88fg/Gurm5bdy4kYiqqqoKCwtzcnJ27txZVVXFrpCsrKysrKwm\nTZo0YMCA9u3b43oIwGTg7RKgBxqO1GBra+vu7u7u7j5ixAjtBgQAAoSnjkAPMJYdALQAt45APzCW\nHQCoggHrQG+QkACgWbh1BPok9IR0/fr14uLixuV9+/bt0KGDUqFUKk1KSpJIJM7Ozv7+/j4+PnqJ\nEcBk4dYR6JPQE9Lu3buTkpIal2/atGnMmDGKJfHx8atWreJGydu9e3dgYODmzZutra31ESiAycGt\nI9AzoSckZvXq1fb29oolf/7znxU/ZmRkREZGOjk5RUdHBwQE5OXlRUVFJScnR0dHr127Vr/BApgC\n3DoC/TOOhDRmzBhnZ2cVC6xfv56IoqKigoKCiKhHjx6xsbFBQUFHjx4NDQ0V+JO5AEKDW0dgEKbQ\n7TsvLy8rK0ssFis24jk4OAQHBxNRYmKi4UIDMEq4dQQGYTQJqa6urqqqqslZt27dIqJBgwYplfv6\n+hJRdna2rmMDMCW4dQSGYhxNdqNHjy4tLSUiGxuboKCguXPnKrbCSSQSIhKLlf9+XF1diSgzM1N/\ngQIYOdw6AgMygiskFxcXHx+fCRMmjBw50srK6tSpUxMmTLhy5Qq3QGFhIRF17dpVaUUPDw8iqqio\n0Ge0AMYrLr0g5MhtvHkPDEXoV0jLli1TvBiqqalZs2bN8ePHly5dmpKSwl5ry95C6+jo2OQW5HJ5\ni3vx8vLipgU7Di6ArrGODGisMz2KP3FCJvSEpNRBztraOjo6OjMz88GDB+fOnWNDu7LXA0qlUqV1\nWSri3sWuApIQQEDM1TVBePOeaVL8iRNycjKCJjslFhYW3t7epNBboXv37kRUVFSktCTr7NClSxf9\nBghgfFhHhtWjPAwdCJg1oV8hNalNmzZEVFNTwz66ubkRUeMRhlgJS1cA0Bx0ZACBML4rJPpvt7o+\nffqwj35+fiKRKDU1tbKyUnExNubQ4MGD9R8hgLFgz8CiIwMIgRYS0uPHj3Nzc3Nyclie0KLCwkKl\nHENEO3fuzMrKsrW1HTJkCCuxs7MbO3ZsfX39zp07ucUkEklSUpK9vT17PBYAmoRnYEE4NG+yu337\n9vz58/Pz8xULjx071rdvX+6jVCpdvHgxEVlaWh48eJDvLn777bfly5cHBASwt9Pm5uampaWxO0NR\nUVGKr0hfsmTJxYsXd+zYUVRUFBAQkJ+fv2fPHplMFhER4eDgoHEdAUwbnoEFQdEwIQUHB9+7d6/F\nxTp16lRUVMT6v/3+++/dunXjtZeOHTu6uroqjfbdu3fvpUuXcpdHjKur6/79+8PDw48fP378+HEi\nEovFa9eunTRpEq89ApiPkCO33dvZorEOhKNNQ0MDrxXkcnmvXs2ewUpXSER0+fLl6dOnE9HLL7/8\n888/axalTnl5eaHbN5gb9gzsgxV+7u1sDB0L6JWQf/F430N64403uOn27dvv37//X//61z/+8Y/m\nlmcDyhGRUuMeABgKN5g3shEICr+E9Msvv3DPn65YseLChQuDBg1q166djU2zp7WFhUXnzp2JqLq6\n+unTp62JFQC0Ah0ZQJj4JaTo6Gg2MXv2bNYQpw7uSSAkJACDQ0cGECweCamuru7Ro0dEJBKJWN85\nNS1YsIBNPHv2jFdwAKBdUWce5JZWoyMDCBOPhMRd37z00ku89sE16OE2EoABxaUXrPnlAbIRCBaP\nhFRdXc0mbG1tee2jvr6eTVy6dInXigCgLVxHBjTWgWDxSEjcsNl1dXVKs9jgcs1JT09nE++++y6f\n2ABAa0KOZO+d3AvZCISMR0Kys7NjE+zlrerjxmho/FJXANAD1pHhI19XQwcCoAqPhOTs7GxlZUVE\njx8/LisrU3OtqqqqvLw8Nt2+fXu+8QFAK6EjAxgLft2+udeER0REqLnK8uXL2YSLiwt3jQUA+oGO\nDGBE+CWkXbt2sYnk5OTt27e3uPxXX33FjUS3evVqvsEBQGugIwMYF34JqVOnTn5+fmx627ZtI0aM\naK4nt0QiGTp06Lfffss+tm/fPigoqDWBAgBfGJEBjAvvwVWJyNfXV/EekkgkeuGFF9gbxF9++eVn\nz541fpt4VlaWtbV1K2PVESEPNQigsYCYq/7dxXgrOSgR8i+eJi/oS09P597WSkQymYzLQBKJRCkb\n2djYXL58WbDZCMAksW51yEZgXDR8Y+zx48c3bNhgb2+verFJkyZdv37d2dlZs70AgAbQrQ6MlOZv\njB0/fvz48ePz8vK2bNly7dq1ysrK+vr6Nm3a2NnZOTs7R0RE+Pr6WlpaajFWAGgR61Z3Lszb0IEA\n8KZ5QmK6du26ceNGrYQCAK2EbnVg1DRssgMAAUK3OjBqSEgAJgIvOgJjh4QEYApYNkJHBjBqrb2H\nBAAGF5dekFtafS6sv6EDAWiVphPS5MmTKyoqtLunNm3a/PTTT9rdJgDEpRewjgyGDgSgtZpOSDk5\nOeXl5drdE/c6JQDQFnSrA1OCe0gARgyv3QNT0vQVkpubm+orJKUxVe3t7R0dHUUiUUNDQ1VVldIb\n/Nzc3IjIwgLJD0Cb8No9MDFNJ6QTJ06oWGfmzJksIb3wwgtffPHFa6+9Zmtrq7iATCbLy8tbuHDh\nvXv3iKimpubChQvaixkA0K0OTBDvq5Zp06adP3+eiMLDw9PS0gIDA5WyERGJRKJu3br99NNP+/fv\nJ6KioqLevXtrJVwAIKKQI7cxWh2YHn4J6eeff05PTyeiRYsWffzxxy0uP2jQoCNHjhCRTCZbsGCB\nZiEqun79+tmzZ8+ePdvkXKlUum/fvpUrV3799dcZGRmt3x2AAMWlF8SlF5ybg07eYGr4vQ/Jz8/v\nyZMnVlZWN27cUH+t0aNHP3jwgIhu3rzZmuFWf//99/Hjx9fW1hJR4/d5xMfHr1q1qr6+nisJDAzc\nvHlzi2++EPLbQQCUcJ280ZEBNCPkXzweV0iVlZVPnjwhoq5du/LaR1RUFJto7vWyavrss8/atWvX\n5KyMjIzIyEg7O7tt27bdvHkzISFh4MCBycnJ0dHRrdkjgKCgkzeYNh4J6dmzZ2yi8U0j1V588UWl\nLWhg3759165dW7NmTZNz169fT0RRUVFBQUGWlpY9evSIjY194YUXjh49mpubq/FOAYQjt6Q6IPYq\nshGYMB4JiWsNq66u5rWPmpoaNhEfH89rRU5+fv6mTZvGjRs3ZMiQxnPz8vKysrLEYvGYMWO4QgcH\nh+DgYCJKTEzUbKcAghJyJHt1kAeyEZgwHgnJxsaGTTx8+JDXPsLDw9nExIkTea3IWbVqlZ2d3YoV\nK5qce+vWLSIaNGiQUrmvry8RZWdna7ZTAOHAI0dgDngkJK7l7fnz5+pf60ilUvY0EhG1b9+eV3DM\n0aNH09LSPvvss+ZehS6RSIhILFb+z9HV1ZWIMjMzNdgpgHDgkSMwE/y6fQ8YMIBNREZGJicnt7h8\nYWFhQEAAm7a3t2cZgpfi4uL169cPGzaMtb81txdqqquFh4cHEWl9lFgAfcIjR2A++L1+YteuXVxO\nmjNnjqenZ0xMDBsZSElxcfHGjRuPHz/Olaxbt06D+FauXCmXy7/44gsVy8hkMiJydHRscq5cLm9x\nL15eXty0YDtEghlijxw9WOFn6EDAuCn+xAkZv4Tk4OCwadOmxYsXs4/37t0bMWJE27Zt27dvb2tr\na2lpWVdXV11dXVJSUlVVpbji+++/P3r0aL7BnTx5MiUlJTIyskOHDioWY882SaVSpXKWitQZZRxJ\nCASIe+TIvZ2NoWMB46b4Eyfk5MT7BX1jxoyxsrKaO3cuV1JfX984GSiaPXs2l8N42bBhg1gs7ty5\nMzc0A9fTj5X4+Pg4Ozt3796diIqKipRWZ50dunTposGuAQwLjxyBGdLkjbEjRoy4du3a8uXLk5KS\nVC/ZtWvXAwcOqL6+UaGsrKy2tlYx+XFY4aFDh3x8fFibYXFxsdIyrISlKwAjgkeOwDxp+ApzW1vb\n7du319XV/f777ytXrnzy5El5eXlDQ0ObNm3s7OycnZ3nzp07ePBgJyen1gT31VdfKd0Bkslky5Yt\nI6JNmzYRUbdu3YjIz89PJBKlpqZWVlba2dlxC7N8OXjw4NbEAKB/eOQIzBO/sewMrq6u7pVXXqFG\nd32WL19+6tQpxbZBiUQyfvx4Gxub8+fPOzg4qNimkEd2AjOETt6gU0L+xdPwCklolixZcvHixR07\ndhQVFQUEBOTn5+/Zs0cmk0VERKjORgCCgmwE5sxEEpKrq+v+/fvDw8OPHz/O+pqLxeK1a9dOmjTJ\n0KEBqAvZCMyckSUkS0vL5i42e/ToofjYE4BxCTlym4iQjcCcGVlCAjBJIUdup9wvxQOwYOb4JaRZ\ns2Y9evRIsz1ZWFicOHFCs3UBTFjUmQcp90vxBlgAfgnpzp07GickdUZMADA3cekFa355gOEYAIjv\n4KoAoEV4HzmAIn5XSJ07d27xQqeurq6qqqq8vFxxLSKysEDyA/g/KfdLkY0AFPFLSIcPH1ZzyYqK\nit27d+/YsYOIPDw89uzZwzs0ANOVW1IdEJOJbASgSFdXLQ4ODosXLz5//jwRpaamavyuWADTg6Hq\nAJqk22a0Dh06fP/990SUlZUVExOj030BGAsMVQfQJJ3f1+nfvz97c/n27dt1vS8A4QuIuerfXfyR\nL++3JwOYPH10NGAvF5fJZHl5eXrYHYBgsWy0epSHoQMBECJ9JKSwsDA2UVJSoofdAQgTG6oO2Qig\nOfpISImJiWzi5MmTetgdgABh4FSAFukjIV26dIlNjB8/Xg+7AxAaZCMAdeg8IWVmZubn57Ppdu3a\n6Xp3AEKDbASgJh0mJLlc/v3330+ePJkrYb0bAMwHshGA+nQy2nddXV15eXlRUZFi4fz58/mFBmDk\nAmKuEl5xBKA2PY32PXLkyHnz5mmwIoCRYtnoXBheKgGgLp2/oM/KyioiImLatGm63hGAcCAbAWhA\n+6N9M3Z2dq+99trUqVPd3d01iQvAaCEbAWhGV6N9A5inkCO3CdkIQCN4RxGA1oQcuZ1bUoVsBKAZ\nnd9DAjATIUdup9wvfbDCz9CBABgrXCEBaAHLRufm4NoIQHP8rpACAgIKCwudnZ3T0tLUX8vPz+/p\n06dt2rS5desWz/AAjACXjdzb2Rg6FgAjxu8KSS6Xy2QyuVyuwVoNDQ281gIwCshGANqCJjsAzf2n\nFwOyEYA2CL1TQ11dXVpaWl5eXk5Ojlwu79y5c//+/QcNGtTkwlKpNCkpSSKRODs7+/v7+/j46Dla\nMCt43ghAu/SRkKqrq4lIzSdqlbz22mvl5eVKha+++mpMTMyLL76oWBgfH79q1ar6+nr2cffu3YGB\ngZs3b7a2ttYoagBVkI0AtE7nTXYVFRVVVVVEZGOjSZuGt7f3okWLYmNjExISEhIStmzZ0rNnz6ys\nrE8++URxsYyMjMjISDs7u23btt28eTMhIWHgwIHJycnR0dHaqQaAAmQjAF3Q4RWSXC4vLi6eMWMG\n+6h0QaOm3bt3K37s0aPHsGHDhg8fnp2dff369X79+rHy9evXE1FUVFRQUBBbLDY2Nigo6OjRo6Gh\noRi+CLQIb5QA0BFVCSk4ODg3N1expLa2lohKS0v79u2rertyuZxrPWMiIyM1jPF/2dnZ9e/fPyUl\n5cmTJ6wkLy8vKytLLBaPGTOGW8zBwSE4ODguLi4xMTEsLEwruwZANgLQHVVNdnV1dbX/i5tV2xKl\nbCQWi4cMGaKViOVy+b1794ioW7durIQ93tS4p4Ovry8RZWdna2W/AAExV/27i5GNAHREH92+hwwZ\ncunSpdZvRy6X3717d968eVKp9IMPPuAa4iQSCRGJxWKl5V1dXYkoMzOz9bsGYNlo9SgPQwcCYLJU\nNdl9+eWXSiWLFi169OiRWCyOjY1tcdM2NjYODg4dO3a0tLRsVYxEs2bNSklJYdNOTk6bNm1SbJ0r\nLCykpt6P7uHhQUQVFRWt3DsAshGAHqhKSN7e3hrM0gUfHx97e3uZTHb37t0HDx6sX7/eycmJawOU\nyWRE5Ojo2OS66owr4eXlxU3fvXtXGyGDicgtqQ6Ivbo6yOMjX1dDxwKgIcWfOCHj18vOwsJCJBJZ\nWOh7fIeZM2dy02fPnl28ePHcuXNPnTrFrorYFZhUKlVai6UidZ5/QhKCJiEbgWlQ/IkTcnLil1rO\nnTuXnZ3Na2RVrRsxYsS0adOqq6t/+OEHVtK9e3ciKioqUlqSdXbo0qWLniME05ByvxTZCECfhD50\nUJP69OlDCpdEbm5uRFRcXKy0GCth6QqAl5T7pQExmefCvP27K3eWAQAdMcrBVdnTUQ4ODuyjn5+f\nSCRKTU2trKxUXCwpKYmIBg8erPcAwbhFnXmAbASgf4JOSAUFBUo5hohycnIOHjxIRG+99RYrsbOz\nGzt2bH19/c6dO7nFJBJJUlKSvb19cHCw3gIGExBy5PaaXx4gGwHon6Cb7K5cuRIZGTlixAg3Nzd3\nd/eioqLs7Ozk5GSZTBYcHDxw4EBuySVLlly8eHHHjh1FRUUBAQH5+fl79uyRyWQRERHchRRAi7jX\nkON1EgD613RC8vHx4cbYPnLkCNfJe/jw4Y8ePdJsTyKRiO+gCW5ubp6enqdPn1Ys7NSpU0hIyPTp\n0xULXV1d9+/fHx4efvz48ePHjxORWCxeu3btpEmTNIsWzNB/hkzFy40ADETQV0j9+/c/ceKEmgv3\n6NGDpSIADWCQOgCDE/Q9JAD9wCB1AELQ9BXS3r17uWnFgb23b9+u84gA9AiPvgIIR9MJqbm3S7T4\n1gkAI5JyvzTkyG1kIwCBEPQ9JADdiUsvCDlyG927AYQD95DAHEWdeYBsBCA0/K6QAgICCgsLnZ2d\neQ1n5+fn9/Tp0zZt2rDB5QAMCw8bAQgTv4Qkl8tlMpk6L3RovJY6o24D6Bp72OjBCj9DBwIAytBk\nB+Yit6TaIzrNv7v4XFh/Q8cCAE1ApwYwC2z07r2Te6FDHYBg6SMhVVdXk3ovygPQhagzDzBeKoDw\n6TwhVVRUVFVVEZGNDW4ggwGwLgzIRgDCp8OEJJfLi4uLZ8yYwT6++OKLutsXQJMwXiqAEVGVkIKD\ng9mr8Di1tbVEVFpa2uKQDXK5vL6+XrEkMjJSwxgB+MstqQ45ku3fXbx6lIehYwEAtahKSHV1dSwD\nNdZceXPEYvGQIUN4rQKgMYwJBGCM9NHte8iQIZcuXdLDjgDovy8gR4c6AKOj6grpyy+/VCpZtGjR\no0ePxGJxbGxsi5u2sbFxcHDo2LGjpaVlq2IEUBtGYQAwXqoSEveiWF6zAAyC3TRyb2eLURgAjBS/\nJjsLCwuRSGRhgfEdQFhS7pd6RKd96OuKl+wBGC9+3b7PnTunozgANBZy5HZcegGeNAIwdhg6CIwb\nN1gqbhoBGDs0voGxYs10bLBUZCMAE4ArJDBKbHg69O0GMCVISGB8cNMIwCQ1nZB8fHzKy8u1uyeR\nSJSdna3dbYK5UezbjWY6ABODKyQwGmimAzBtSEhgHAJiruaWVqOZDsCENZ2Q9u7dq+c4AJrDRkr9\nyMcV43YDmLamE1KLb5fQp1u3bmVlZd2+fZuIevbsOXToUDc3tyaXlEqlSUlJEonE2dnZ39/fx8dH\nv5GC9rH+C2imAzAHgm6yu379+qJFi6RSqVL5Rx999NlnnykVxsfHr1q1insJ0+7duwMDAzdv3mxt\nba2PWEEH8NArgFkR9IOxDx8+LCoqmjBhwrZt206dOnXq1KlPP/3U3t4+Li5u69atiktmZGRERkba\n2dlt27bt5s2bCQkJAwcOTE5Ojo6ONlTw0Bpx6QV46BXA3LRpaGjQw24qKiq+++67BQsW8FpLKpVa\nWVm5uLgoFl64cGHGjBm2trZXr17lhnmdOHFiVlbWpk2bxowZw+0xKCjoyZMnZ86ccXd3V7EXLy+v\nu3fv8goMdAqPGQHojpB/8XR+hXTlypXAwMABAwbs2LGD77qdOnVSykZENHToUBsbm6qqquLiYlaS\nl5eXlZUlFou5bEREDg4OwcHBRJSYmNiK8EGv2GhARPRghR+yEYC50dU9pMLCwr/+9a/JyckymUy7\nW5bL5XK5nIicnZ1Zya1bt4ho0KBBSkv6+vrGxcXhaVxjgf4LAGZOywmppqbmhx9+iImJefLkiXa3\nzElOTq6trfX09OR6K0gkEiISi5X/oXZ1dSWizMxMHUUC2sI6dvt3F6P/AoA501pC+v3338PCwh48\neNDkXDc3t7Vr17Z+LyUlJatXryaiZcuWcYWFhYVE1LVrV6WFPTw8iKiioqL1+wXdwYURADCtTUgl\nJSXbt2+Pj4+vrq5uPLd9+/bz5s0bN26cra1tK3dERJWVlWFhYY8fPw4NDR0+fDhXzloFHR0dm1yL\nte+p5uXlxU0L9naf6Um5Xxp15gGhYzeAjin+xAmZhglJLpefPXv2yy+/bPyQEDNz5szQ0NB27dq1\nIrb/UVNTM2fOnMzMzHHjxkVERCjOsrS0JKLGkbBUJBKJWtw4kpD+4cIIQG8Uf+KEnJx4JySpVBoe\nHp6enq5iGUdHR8Umtdarq6ubPXv2pUuXRo0a9dVXXynN7d69OxEVFRUplbPODl26dNFiJNB6uDAC\ngCapm5AqKiri4uL27dtXVlbWeK6bm9u6devc3Nz8/f21GR0REdXV1YWFhaWlpY0cOVLpeVhu70TE\n9QLnsBKWrkAgcGEEAM1pOSFdvXo1PDw8Pz+/8SyxWPzxxx9PnTrVzs6OiAoKCrQen0wmCwsLO3/+\n/LBhw7Zs2dLkMn5+fiKRKDU1tbKykkXCJCUlEdHgwYO1HhVoIC69IOqXB+hKBwDNaTYhFRcXf/HF\nF2fPnuVGh/u/ddq2HTFixKeffsr6VeuOXC6fP38+y0YxMTHN3Q2ys7MbO3bsqVOndu7cuXjxYlYo\nkUiSkpLs7e3Z47FgWLgwAoAWNZuQPvjgg8Z9uLt27bply5ZevXrpOKr/OHny5K+//kpEtbW18+bN\nU5o7b948blTyJUuWXLx4cceOHUVFRQEBAfn5+Xv27JHJZBEREQ4ODvqJFpoUdeZBXEbBRz6uDX8P\nNHQsACBoat1DcnFxmTdv3oQJE7TSe1t93CgPly5dajx3ypQp3LSrq+v+/fvDw8OPHz9+/PhxIhKL\nxWvXrp00aZJ+QoXGuM4Leyf3wjhAANAitRKSlZWVg4ODlZWVrqNR8t5777333ntqLtyjRw+WikAI\n0EYHAHypNbiqVCpdtmxZ7969x4wZ8/vvv+s6JjBq7M0RRPRghR+yEQCor9mEdPDgwXfffVfpquj+\n/ftvvvlm3759lyxZwgbsAeCk3C8NiLm6L71g7+Reeyf3Qlc6AOCl2YTk4uKybt26Gzdu/Pjjj0rD\nxNXW1iYkJAwbNszPzy82NrayslL3cYLQhRy5HRCT+aGv67mw/rhjBAAaaLnJrlevXr/88ktmZuay\nZcucnJwUZz158mTz5s3e3t6BgYEXLlzQWZAgaCFHbrdZmuwutkEbHQC0Bu83xkql0s8//zw1NVXF\nMo6OjhkZGa0LTH+E/P5EgeOedV0d5IEGOgCjIORfPN5vjO3UqdOePXvu3r0bGxvbqVOnJpcpLy9f\ns2bN48ePWx0eCFRcekFAzNWoXx7gdhEAaAvvKyQlJSUlsbGx/+///b8mXz/xwgsvfPDBB1OnTlVq\n6xMUIf+/IEAp90v3pT9Cl24AIyXkX7zWJiRObm7u7Nmzm3tBX6dOnRYtWjR+/Hit7Eu7hPz1CA2e\nLgIwdkL+xdNaQmJqamri4+O3b9/e+BXmIpEoOztbi/vSFiF/PcLBpSL/7mI00AEYLyH/4vG+h6Sa\ntbX1lClT0tLSUlJSRo0apd2Ng0GwTnT03wddkY0AQEda+wrz5ri6urJ3F12+fPmzzz57+PChjnYE\nuhNy5HbK/VK8MAIA9ENXCYkzaNCg5OTksrKyuLg4Xe8LtIU10H3k63puTn+kIgDQD50nJMbJyWnB\nggX62Re0BpeKcFUEAHqmp4QEwodUBACGhYRk7uLSC/55/ynrQYcBFwDAgJCQzBcb+Ce3pBqpCACE\nAAnJHLHXirMx6PCIKwAIBBKSGeFG/UH3OQAQICQks8C1zq0J8kCfBQAQJiQkU8Y6LLCHW9E6BwAC\nh4RkmhQvidA6BwBGAQnJpOCSCACMFxKSKeDykLvY5kNfV/ThBgBjhIRkxFLul/4z52lcRgGa5gDA\nBCAhGZ+49IK8kmqWh9CBGwBMBhKS0eDa5ZCHAMAkISEJXVx6wb70gtzSanexjX93MfIQAJgq40hI\ncrn8xo0bxcXFRDRixIjmFpNKpUlJSRKJxNnZ2d/f38fHR48xapPSxdCHvq54cTgAmDyhJ6SDBw+e\nPHkyOzu7vr6elTT3Nvj4+PhVq1Zxi+3evTswMHDz5s3W1tZ6irV1FO8M+Xd3xsUQAJgboSekq1ev\nZmVlde7cuW/fvqdPn25usYyMjMjISCcnp+jo6ICAgLy8vKioqOTk5Ojo6LVr1+ozYPXlllSn3C9V\nSkJ7J/dyF9siDwGAGWrT0NBg6BhUuXv3brdu3SwtLYnIy8uLmrlCmjhxYlZW1qZNm8aMGcNKKioq\ngoKCnjx5cubMGXd3dxW78PLyau6qS+vYZVDK/dLc0mrWHOcuthnewxkzKax2AAAX7ElEQVRJCAD0\nQ5+/eHwJ/QqJJSHV8vLysrKyxGIxl42IyMHBITg4OC4uLjExMSwsTJcxNovdBFLMQP7dnd3b2Qrn\nnpCQT01dM+e6k3lX35zrLnBCT0jquHXrFhENGjRIqdzX1zcuLi47O1sPMXC55z/TpdW5JdXu7Wz8\nu4vdxTarR3ngGggAQDVTSEgSiYSIxGKxUrmrqysRZWZmtn4XuSXVuaVVbIJlndzS6tySqtzSalbI\ncg8RIf0AAGjGFBJSYWEhEXXt2lWp3MPDg4gqKipUr/6o3/SAmKuKJSzNEFFuyX8mWHZxF9u4t7P9\nz4TY5kPfju5iW24uAAC0hikkJJlMRkSOjo5NzpXL5apXt3siuRMvaVv1RLHQsvIJEXkQWSqUS4mk\nRESURkREhzUPWUDUuUtnqsy57mTe1TfnuguZKSQk1gdPKpUqlbNUJBKJVK9e8GucbuICAAAeLAwd\ngBZ0796diIqKipTKWWeHLl26GCAmAADgyRQSkpubGxGxgYUUsRKWrgAAQOBMISH5+fmJRKLU1NTK\nykrF8qSkJCIaPHiwgeICAAAeTCEh2dnZjR07tr6+fufOnVyhRCJJSkqyt7cPDg42YGwAAKAmoXdq\nyMjI2L17t2LJrFmz2ERoaCj3MOySJUsuXry4Y8eOoqKigICA/Pz8PXv2yGSyiIgIBwcHfQcNAAD8\nCX0su8TExMWLFzc5a8OGDePHj+c+5uTkhIeHs44MRCQWixcvXjxp0iR9RAkAAK0m9IQEAABmwhTu\nIQEAgAlAQgIAAEFAQgIAAEEQei873ZFKpUlJSRKJxNnZ2d/f38fHx9ARtcr169cbPxpMRH379u3Q\noYNSoZp1F+whksvlN27cYPUdMWJEc4upH79xHZAWq8/rZCDjqf6tW7eysrJu375NRD179hw6dCh7\nKL4xk/zq1am+sX/1ZtqpIT4+ftWqVfX19VxJYGDg5s2bra2tDRhVa8ybN489CKxE8S26jJp1F+Yh\nOnjw4MmTJ7Ozs7nAmnvTmvrxG9EBUbP66p8MZCTVv379+qJFixqPV/nRRx999tlnSoWm99WrX32j\n/+obzE96erqnp6ePj8+ZM2dqa2slEsm0adM8PT0///xzQ4emublz53p6eh46dOjH//Xw4UPFxdSs\nu2AP0eLFiz09PQMCAhYsWODp6enp6dnkYurHb1wHRM3qq3kyNBhP9RMSEnr37h0eHn7mzJk7d+7c\nuXPnu+++8/b29vT03LJli2ahGkvdG/hU39i/enNMSO+9956np2dCQgJXUl5e/tprr3l6ej548MBw\ncbUKOxFLS0tVL6Zm3QV7iO7cuVNbW8umVfwiqx+/cR0QNauv5snQYDzVf/jwYXFxsVLh+fPnPT09\n+/XrJ5PJNAhVK3UXWvWN/as3u04NeXl5WVlZYrFY8QLWwcGBjTCUmJhouNB0Ts26C/kQeXl5sbeN\nqKB+/EZ3QNSpvvqMqPqdOnVycXFRKhw6dKiNjU1VVRV310T/X72gqq8+wX71ZpeQ2FAO3JhDHF9f\nXyLKzs42QExaVVdXV1VV1eQsNetu7IdI/fhN/oCoOBnI+Ksvl8vZO8+cnZ1Zif6/ekFVX5GRfvVm\n18tOIpEQkVgsVip3dXUloszMTAPEpD2jR48uLS0lIhsbm6CgoLlz57q7u3Nz1ay7sR8i9eM37QOi\n+mQg469+cnJybW2tp6cnd3fdrL76xtXnGO9Xb3ZXSIWFhUTUtWtXpXIPDw8iqqioMEBMWuLi4uLj\n4zNhwoSRI0daWVmdOnVqwoQJV65c4RZQs+7GfojUj9+ED0iLJwMZefVLSkpWr15NRMuWLeMK9f/V\nC6r6jFF/9WZ3hSSTyYjI0dGxybnsEtgYLVu2TPGfoJqamjVr1hw/fnzp0qUpKSnsPe5q1t3YD5H6\n8ZvqAVHnZCBjrn5lZWVYWNjjx49DQ0OHDx/OlZvJV99c9cn4v3qzu0Ji94Qb9+hnB5f7woyO0iW5\ntbV1dHS0h4dHUVHRuXPnWKGadTf2Q6R+/KZ6QNQ5Gchoq19TUzNnzpzMzMxx48ZFREQoztL/Vy+o\n6pPxf/Vml5DYG82LioqUytntuy5duhggJt2wsLDw9vYmhXuPatbd2A+R+vGbyQGhpk4GMs7q19XV\nzZ49+9KlS6NGjfrqq6+U5ur/qxdU9ZtkXF+92TXZscE2GneUZCXsCzAZbdq0IaKamhr2Uc26G/sh\nUj9+MzkgjNLJQEZY/bq6urCwsLS0tJEjR27durXxAqb91bdY/eYY0VdvdldIfn5+IpEoNTW1srJS\nsZyNtzF48GADxaUTrJNMnz592Ec1627sh0j9+M3kgDBKJwMZW/VlMllYWNj58+eHDRu2ZcuWJpfR\n/1cvqOo3x4i+erNLSHZ2dmPHjq2vr9+5cydXKJFIkpKS7O3t2QNfRqewsFDpjCGinTt3ZmVl2dra\nDhkyhJWoWXdjP0Tqx2+SB0TNk4GMqvpyuXz+/Pns5zgmJqa5uxf6/+oFVX0T+OrNrsmOiJYsWXLx\n4sUdO3YUFRUFBATk5+fv2bNHJpNFREQ4ODgYOjpN/Pbbb8uXLw8ICHB3d3d3d8/NzU1LS2PtvFFR\nUU5OTtySatZdsIcoIyNj9+7diiWzZs1iE6GhodwTfOrHb1wHRJ3qq38ykPFU/+TJk7/++isR1dbW\nzps3T2nuvHnz+vbtyzdUY6k7qV19E/jqzXS075ycnPDwcPZVEZFYLF68ePGkSZMMG5XGrl69Gh4e\nnp+fr1jYu3fvpUuXKv5bxKhZd2EeosTExMWLFzc5a8OGDePHj+c+qh+/ER0QdarP62QgI6n+sWPH\nVqxY0dzcXbt2KfZ+Nr2vXs3qm8BXb6YJicnNzc3Ly7O3t+/fv7+FhdG3XtbU1Pz22291dXUWFhb9\n+vVT+odIiZp1N/ZDpH78JnZAeJ0MZHLVJ3z1xvnVm3VCAgAA4RBungcAALOChAQAAIKAhAQAAIKA\nhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQAAIKAhAQA\nAIJgji/oA1Dt66+/PnbsGBE5OzufPn1an7tOTEz84YcfiGjcuHFvv/22PndNBq24ZrZu3ZqZmUlE\n4eHhvXr1MnQ40FpISKDKrVu3YmNjuY+2trbr169v8W0oy5Ytq66uJqJ+/frNnDlTtyHqQGVlZWlp\nqf73W1ZWtnbt2tLSUltb202bNuk/AENVXGOjRo365ptviCgyMvLEiROGDgdaCwkJVHn8+HFSUpJi\niY+PT4svi0xOTn7+/Lku4+Lt8uXLR48eJSKRSPTVV18ZOpym7dy5k+WDGTNmODs7GzocI+Dl5fXG\nG2/8+uuv2dnZ8fHx7777rqEjglbBPSTgZ/v27XV1dYaOgrf8/PyEhISEhATBtkQVFBTs3buXiGxs\nbD766CNDh2M05s+fzya2bt1qjGcmKEJCAn6Kiori4uIMHYUJio2NlclkRDR58mQHBwdDh2M0evXq\n5evrS0SPHj06fPiwocOBVkFCAnWJRCI2sWvXroqKCsMGY2IKCwtZbwIiev/99zXezu7du0NCQkJC\nQi5cuKCl0IzAtGnT2ERcXJxcLjdsMNAaSEigrvfee49NlJWV7dmzx7DBmJgffviBXR55e3u7u7tr\nvJ2cnJy0tLS0tLTCwkKtBSd4QUFBTk5ORCSVSs+ePWvocEBz6NQA6ho8ePCDBw+uXLlCRN99992U\nKVNefPFFrWy5pqbmt99+q6urs7Cw6NmzZ2s2K5fLb9++/fjxYwsLi759+2q3a4BcLr927Vp5ebmF\nhYW3t7e2Gtbkcjnr6k1E48aN08o2haauri49Pb2urs7W1nbAgAHc1XZjeXl5f/zxBxF5enp26NBB\nnY1bWFiMGjWKHcPvv/8+KChIW2GDniEhAQ+ffvrpO++8Q0TV1dW7du1asWJFa7ZWWVl56NChEydO\n3L9/X7FcLBa/9dZboaGhnTp1am7dw4cP//Of/yQie3v7jRs3ElFmZuaOHTtSU1Pr6+vZMhMmTFi/\nfn1YWJhMJpNKpaxQJpPNmjVLaWsikSgmJkZFqDk5OZs3bz537hy3cSLq06dPWFjYiBEjeNS5Kenp\n6Y8ePWLTb7zxRiu3pgepqakHDhxg0y+88EJkZCSXmxt/L1evXt2yZUt6ejq7BCSitm3bjhkzZtmy\nZYr5pqKiYs+ePUePHn3y5AlX2L179zlz5gQHB7cYUmBgIEtIly9fLikpadeunXaqCvqFhAQ89OnT\nZ+TIkawj+KFDh0JCQlTkDNUyMjIWL15cVFTUeFZpaemBAweOHj26fPny6dOnN7l6Tk5OSkoKEYnF\nYiLatGnTjh07mlzywoULtbW13EeZTMZWVGRlZaUi1KNHj0ZFRXG/p5xbt27NnTv3gw8+WLlypYrV\nW/SPf/yDTbz88stqXhMY0E8//RQREcGOxssvv7x27VrFK0Wl7yU2Nnbz5s1KW6ivrz916lRKSsrB\ngwe9vLyISCKRzJgxg8vKnPv37y9btuzOnTvLly9XHdXw4cNFIpFMJpPJZGfOnGnNfTgwINxDAn6W\nLFnC2ltkMtmWLVs020haWlpISAiXjaysrEaOHDlhwoSxY8e6uLiwwtra2ujoaNUXLszevXu5bNS+\nfXt/f38/Pz8bGxtW4uzsLBaL7e3tueXFjaho2Ttx4sSqVatkMplIJHr11VdHjRr1xhtvvPDCC9wC\nLHfyPAD/Iy0tjU307du3NdvRg5iYmGXLlrFs5Ovre/jwYRUZ9PDhwywbtW3b1s/Pb9SoUUOGDGnb\n9j//BJeVlc2ZM6empqagoODDDz9k2cjNze2NN94YOXJk586due18++23LXbWF4lE/fv3Z9OXLl1q\nXS3BYHCFBPx069ZtwoQJ8fHxRPTjjz/OnDmzR48evLbw+PHjJUuWcFctoaGhCxYssLW15RY4evTo\nunXr2FgPW7Zs6dOnz/Dhw5vb2vPnz7/++msiGj169Pz587lg5HI5uxXB+psdO3aMNTBaWVmp/4P1\n/PnzNWvWENEHH3wQFham2BB0+PDhL774gv00b9q06b333lNxX0SFp0+f5uXlsenBgwdrsAW9iYyM\nZN87EY0ePfrrr7+2tLRsbuHnz59/+eWXRBQWFjZz5kw7OztWXlJSEhERcf78eSJ6+PDh/v37z549\n++TJk549e65bt65Pnz7cFn766adPP/2UtZFu2LBh9OjRqsPr0aNHeno6/fcbB2OEKyTgbf78+dz/\nuX//+9/5rr5161ZufJr58+dHREQoZiMimjRp0q5du7iP0dHRKrZWW1tbX18/ffr0LVu2KKZGCwuL\n1nRX4zZeXV0dGRm5cuVKpdsSU6ZMWbhwIZsuLS09d+6cZrvIyMjgprXVSUTrKisrP/74Yy4bhYaG\nbtmyRUU2IqLa2tra2tp169YtXLiQy0ZE1K5du+3bt3MtvVu3br127VqfPn2+//57xWxERMHBwYsW\nLWLTDx8+vHz5suogvb292cTz588LCgr41A+EAgkJeHN1deWGEkhOTmajW6qprKyMe+CmZ8+e8+bN\na3KxQYMGcXeP8vLykpOTVWyze/fun332mfox8DJ48OAPP/ywyVmhoaFcYmb/8muA621BCj+pgvL4\n8eOpU6empqayjytWrIiIiFBnxSFDhjQ5lo+1tfVf/vIXNs0ulDds2KCYtDjTpk3jjjC7+lFBsd31\nzp076kQIQoOEBJqYOXMmd1dm/fr16q94/vx5rnfAjBkzVCwZGhrKTScmJqpY8sMPP2xxvFeNNZeN\niMjS0nLIkCFsuri4WLPtcz+dIpFI6UpRCHJycv7yl79kZ2cTkY2NzY4dO5rrZtKYiiV79+7NTfv5\n+TXX6mtra8vdV/v9999V787NzY2bLisrUzNIEBTcQwJNODs7z5gxg3VqyMzMvHDhwtChQ9VZkWvf\nF4lEqp8XcXV1ffXVV7Oysqil/46HDRumbtw8iUQiFbeviIhrx8vPz9dsF9wotKp7+nHi/397dxMS\n1RcFAPz8NcwPZqGE3yIYOkJoKqR/pEAGSxlRMMgyUBmC8DHkMCEo4kJcuHChEYIfDYWhglI4oASl\nCxe5qFwkQeHHQpBUdMwvBm1w7L+4dHg0M/c934y+N/3Pb3VjXrzbk+Z47r3vnNevf/365etT3I7i\nP7G4uDg5P6+5uTlBENiXe3R0dG9vr/wcLjQ0lHOLq1ev4pgV/uFMlQ0ODw/5d0xISMCxZPQi2kQB\niShkMpmGh4cdDgcAdHZ2ygxIP378YIPk5OSLFy/yL05LS2MBaWNj4+TkxGsadOHCBfE3UWCFhYXx\njyrgp/jvOi3MF/lbMqitrU18it0Xu91ut9t9fVpYWCj585qenrZarexeSUlJg4OD4hREUlhYGCdt\nFeeC/K0+fCySNYFwcQ8A9vb25EySaA0t2RGFIiIicM1tcXFxcnJSzt9aXFxkg8uXL0tenJaWhmN2\n6M7rNOTcVxk8Oy7J/xJqyg7pnZGDgwOz2cyiUXZ29qtXr04VjUDq0YljFT811NRjIWeNMiSiXF1d\n3cuXL9m2/JMnT4xGo+ReDq5QyfmiEb/us7W1lZqa6nmN+PfiYITPQU7eAwClpaWer+iiz58/f//+\nHQCys7M5ISQ9PZ1/F3FBip2dHc4dtUM8Z8nkm2hTcP9nJuoKCQlpaGhobm4GgNXV1aGhIckdb4wf\nclIKcVYkDk5/Ezxd5isF/AO/u2BTUxMLSHfv3sViuApER0dbLBb2Dtbq6mpVVdXIyMjZLY0GhLjX\nbWZmpoozIYrRkh3xS2VlJf663d/f//PnT/71rFQMAHjWifEkPryrwRNoAYE7KG63W1P95aqrq9kb\nxwCwtrZWVVW1srKi6owkiCsi6nQ6FWdCFKOARPz1+PFjNnA4HJK9+zDRWVpakkySsIdCVFTU37qX\nIN5Lm5+fV3EmnsrLy7u7u9l4c3Pz/v37S0tL6k6JQ3yQQbz7SIIIBSTiL4PBkJOTw8bPnj3jvwKC\nV7pcLv7R5MPDQyzyVlhYGIiZapH4jRw5WeM5MxqNvb29bKF1e3u7rq7u27dvak/KOwzn4eHhFJCC\nFAUkEgBsGwkADg4OXrx4wblS/FoPtjDwamxsDLepZZ4p58BdbrfbrammoomJiVhPlvWa0hqDwdDX\n18dOzW1vb9fW1motk2NwRVHjJQEJBwUkEgC5ubn4dqrNZuPsJKWmpuL3xdTUFOud42l9fb2np4eN\ndTqdnI44fKyjKAC43W6t/Y6Pj+7Lly/qzsSXGzduDAwMsNoc+/v7JpNJXIJPC05OTrBmbn5+vrqT\nIYpRQCKB0djYyAas2innypaWFhxbrVbPOnUrKys1NTW49Gc2m70WOjuVa9eu4S5UV1eX4ko/Z+Hm\nzZts8PXr193dXXUn40tBQYHNZmNx3el0PnjwAKvbacGnT5/w3Lz/LROJWiggkcDQ6/Uy8xi9Xo+t\nZp1OpyAINTU1g4ODb968GR8fb2xsLCsrw0o8BoPBZDL5P73IyEij0cjG79+/v379el5e3r+/+b8k\n6I+ioiI8Faa4avg5yMvLe/78OYtJR0dHgiBop9EDNl28cuWK1/fVSFCggEQCxmKxyDwLV1tbi9tO\nAPDx48eOjg6r1drc3DwxMYEJVklJiWe/UcVaWloyMjLwj06nc+c3dfOSkJCQyspKNuaXkVVdVlbW\n0NAQOyrpcrnq6+unp6fVnhQAAHbwu3PnjrozIf6ggEQCJiUl5d69ezIvNplMdrsdq2X/IT09vbu7\n++nTpwF85T4mJsZut7e3t5eUlMTHx8ssZno+sOX27OysppYTPen1+pGRkdjYWAA4Pj42m82qB9EP\nHz6wciE6ne727dvqTob44x9O5WBCzsHu7u7c3Nzm5uby8nJcXFxKSkpmZub/8NiuIAhsO+3Ro0e+\n2kQRrywWC8uQzGZzQ0OD2tMhylFAIkQTFhYWKioqAODSpUszMzMyi3+TtbW14uJit9sdERExMzMj\nbtNHgg4t2RGiCXq9vqysDAAcDsfo6Kja0wkaNpuN1X59+PAhRaNgRxkSIVqxvr5+69Ytl8sVHx//\n7t07KlktCdOjpKSkt2/fUloZ7ChDIkQrEhISBEEAgI2NDcmqgAQAurq6WHrU2tpK0egvQBkSIYQQ\nTaAMiRBCiCZQQCKEEKIJ/wFT/tZfvHkeeAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAABcSAAAXEgFnn9JSAAAA\nB3RJTUUH4QQSAxwZngYQlwAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJ\nbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAxNy1BcHItMjAxNyAyMzoyODoyNcXWe90AACAA\nSURBVHic7N15XFTV/z/wIyP7EmOkoiAgOShGiooibkCKpmGZ9pHKh4IfW0TNXT+ZifgJK1tcU8kN\nzYX6pqYFiRTiRiAIiYELGhAJggrKvs3w++N8Pvd3PzPDcO8szJ2Z1/Ovy5lzzz333pn75t6z3C5t\nbW0EAABA38z0XQEAAABCEJAAAEAgEJAAAEAQEJAAAEAQEJAAAEAQEJAAAEAQuuq7Ap1HJpPJZLKu\nXTtjl2Uy2YEDB+iymZlZRESEFgvRSuFGwECPg4FWWwW198j4DoUKutjZxsbGM2fOPHnypLW1laZM\nmjSpd+/empesL12MexxSeXn5/v37f/nll8uXLzc1NRFCRCKRRCIJDg6eM2eOn5+fjrbb3NxsaWlJ\nly0tLRsbG7VYiFYKNwKCPQ61tbX0y0YIsbe3t7CwYH8q2GqrTcUemdSh6OSdPXLkyDvvvFNXV8dO\nTE5OHj9+vIYl61Ob8dq8ebO1tbWKfY+Pj9fRppnvJSHE0tJSu4VopXAjINjjMG3aNKZiJ0+elPtU\nsNVWm4o9MqlD0Zk7e+vWLZFIpHhNS05O1rBk/TLaR3aRkZG7du1Snae5uVlHWzczM5syZQpd1vpD\nQp0WDrpmfKfP+PZI+M6cOSOVSuny8OHDY2Ji6O3XoEGD9FovTRnnt2fHjh3saNS9e/fVq1dPnTq1\nT58+jY2NFy5cOHXq1MGDB3VXga5du/7000+GWDjomvGdPuPbI+HLy8tjlv/5z38a9mM6FiNsQ6qv\nr+/Vq9eTJ0/on3369ElPT3d2dpbLdu/evUePHj3//PNMSmZm5pEjR+7cuZOZmWljYzNo0CAfH5+I\niIi+ffuyV2xtbZ0/fz5dNjc337lzZ35+/ubNmzMyMh48eHD69Gk/Pz/FPOwSOG6ovYfOKgqXyWQH\nDx785ZdfioqKbt++3bVr16FDh4rFYl9f31GjRo0YMaLDo3f69OlLly6VlJRUVVVdu3attbW1b9++\nbm5uo0ePDg8Pd3BwUFzl9u3b33zzTV5e3rVr16qrq729vfv06TNp0qTXX3/dzMxMjZy5ublxcXH0\n+FhZWfn6+o4ePXrevHlyW+/woTzHcricUI6HZefOnTk5OfT405Tx48e7u7vT5dmzZ48ZM0b1d4No\n8D28c+fOli1bLly4UFVVNWLEiLlz506ePFnxfLHV19cvXryYLg8YMGDZsmWK6W+//TbT2vrDDz8k\nJCTIpSvdIy6HQvEMqrELmhwKzX/yhJAHDx7Mnj27srKyc3b2m2++uXDhwsWLF2/dukVTxo4dK5FI\nCCH29vZffvmlFveO+f7TT7n/0jn+9JTQ9zND7du/fz97B5OSkjpcpaGh4Y033lB6fEQi0YYNG9iZ\n5Z4FJyUlsVuqEhISFPNoZUMdpj958mTo0KHtnegpU6ZwOXr29vbtlSAWi+WeUEul0kWLFrWXv6mp\niW/OpqamuXPnKs3j5OQkdypVPJTXpBylJ5TjYWG3Iijau3ev6mpr8vU4deqUYovp9u3bOzzjPXv2\npJmtra2lUilNPHnyJFPIggULmMzsHbxx44aKE6HGoVB7F9QoR4s/eULIyJEjO21n582b196GnJyc\ntL539PvP/ZfO66enyAgDEvtMuLu7c1klNDS0vWNNrV+/nsnMPn8ikUgsFrNzqg5Iam+IS0Bau3Yt\nk25ubj569OixY8cyV1JeAcnS0tLLy2vixIk+Pj7stlOxWPzkyROlh1oR+2vKMSf7KiYSiXx9fb28\nvNg7e+XKlQ6PgybltHdCOR4WDQOSJt9Dc3NzxfyWlpYVFRWqz/isWbOY/Onp6TRx+fLlTKKvry9N\nlEqlzKXKxcVF9Yngeyg02QU1ytHiT57wD0ia7CyXgKT1Cxr3Xzqvn54iIwxIEydOZPY/LCysw/zH\njx9nH8G9e/dKpdKGhobVq1ez0wsKCmh+9vmj/P394+Lijh49unz5cnq4lf5ENdkQl4DENCwPGDCg\npqaGSb9///7+/fs/+ugjLkdv6dKlzFWJqqysDAwMZLYYGxtL03/++Wf2QXjjjTdu3bpFq5eUlDR+\n/Hjma8ox56lTp5g8Li4uzHFgHzfm4qjiOGhSTnsnlONhycrKSkhICAgIYNLXrl2b8F9//fWXimpr\n+D20trbevn37jRs34uLi2P/hHj16VPUZj4+PZzJv3ryZJvr7+7M3WldX19bWduXKFSZx9uzZqk8E\n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\n2zbuK3bp0oX87zsT6ZxDiv3FaQqNQ9yzAQCAFgk9IEml0sjIyAsXLowdO3br1q281qWd5QYOHMik\nBAQEiESiS5cu1dfXs3PSaYeYVyhxzAYAAFok6IAkk8kWLVpEo9HOnTvba7wpLy+XixyEkNjY2Nzc\nXGtr69GjRzOJNjY2U6ZMaW1tjY2NZRILCgqSk5NtbW3puFfu2UDg0GghHDgXwIWgOzWcOnXq119/\nJYQ0Nzcrvvh24cKFPj4+hJCrV6+uXLkyKCjI3d3d3d29qKgoLS2NtvdER0fLvWli2bJlly9f3r17\nd0VFRVBQUElJyb59+6RS6erVq9mvC+KYDQAAtEXQAYl2vyaEpKenK37KvB6tZ8+ezs7OcrN9e3t7\nL1++nH17RDk7Ox86dGjVqlUnTpw4ceIEIUQsFm/YsGHmzJlqZAMAAG0R9OSqBgo9XAFAsIR8gRJ0\nGxIAAJgOBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQA\nABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAE\nBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABAEBCQAABCErmqvWV1dXVVV\nVV1dffLkyZs3bxJCevfuPWvWrKeeesrBwaFbt27aqyQAABg/fgGpvr4+PT1906ZN9+/fb2hokPv0\n6tWrp0+f/k+5Xbs6Ozv/85//nDhxIoITAAB0qEtbWxuXfBkZGR988EFJSYka2+jZs+d77703ffp0\nNdY1RF5eXrdu3dJ3LQAAlBDyBarjNqTDhw8PGTJk9uzZ6kUjQsj9+/fXrFnj7e39+eefq1cCAAAY\nPVV3SD/++OPatWsbGxvl0nv27Nm9e/d169Y5ODjY2tpaWVmZm5sTQlpaWpqbm+vq6mpra7/88su7\nd+/eu3dPsdglS5bMnz9fu7shKEL+BwQATJyQL1DKA1J5efmMGTMqKiqYlK5duw4aNGjjxo2urq4i\nkYj7BkpLSz///POUlBR2m5O1tfXXX389fPhwTaouWEI+3wBg4oR8gVIekEaNGvXw4UO63Lt3702b\nNg0bNkzDLRUXF8+fP//u3btMimAPioaEfL4BwMQJ+QKlqg3J29s7NTU1JSVF82hECHFzc0tMTMzI\n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\nN8Ztf6GQ81nmAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0000\n", + " 0.0001\n", + " 0.0001\n", + " 0.0002\n", + " 0.0003\n", + " 0.0003\n", + " 0.0006\n", + " 0.0009\n", + " 0.0013\n", + " 0.0016\n", + " 0.0031\n", + " 0.0047\n", + " 0.0063\n", + " 0.0078\n", + " 0.0157\n", + " 0.0235\n", + " 0.0314\n", + " 0.0392\n", + " 0.0785\n", + " 0.1177\n", + " 0.1570\n", + " 0.1962\n", + " 0.3925\n", + " 0.5887\n", + " 0.7850\n", + " 0.9812\n", + " 1.9624\n", + " 2.9436\n", + " 3.9248\n", + " 4.9060\n", + " 9.0087\n", + " 13.1115\n", + " 17.2142\n", + " 21.3169\n", + " 26.3169\n", + " 31.3169\n", + " 36.3169\n", + " 41.3169\n", + " 46.3169\n", + " 51.3169\n", + " 56.3169\n", + " 61.3169\n", + " 66.3169\n", + " 71.3169\n", + " 76.3169\n", + " 81.3169\n", + " 86.3169\n", + " 91.3169\n", + " 96.3169\n", + " 101.3169\n", + " 106.3169\n", + " 111.3169\n", + " 116.3169\n", + " 121.3169\n", + " 126.3169\n", + " 131.3169\n", + " 136.3169\n", + " 141.3169\n", + " 146.3169\n", + " 151.3169\n", + " 156.3169\n", + " 161.3169\n", + " 166.3169\n", + " 171.3169\n", + " 176.3169\n", + " 181.3169\n", + " 185.9877\n", + " 190.6584\n", + " 195.3292\n", + " 200.0000\n" + ] + } + ], + "source": [ + "north_coriolis(41.8084,1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "coriolis(41.8084)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adaptive Runge-Kutta Methods\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ODE23 Solve non-stiff differential equations, low order method.\n", + " [TOUT,YOUT] = ODE23(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates \n", + " the system of differential equations y' = f(t,y) from time T0 to TFINAL \n", + " with initial conditions Y0. ODEFUN is a function handle. For a scalar T\n", + " and a vector Y, ODEFUN(T,Y) must return a column vector corresponding \n", + " to f(t,y). Each row in the solution array YOUT corresponds to a time \n", + " returned in the column vector TOUT. To obtain solutions at specific \n", + " times T0,T1,...,TFINAL (all increasing or all decreasing), use TSPAN = \n", + " [T0 T1 ... TFINAL]. \n", + " \n", + " [TOUT,YOUT] = ODE23(ODEFUN,TSPAN,Y0,OPTIONS) solves as above with default\n", + " integration properties replaced by values in OPTIONS, an argument created \n", + " with the ODESET function. See ODESET for details. Commonly used options\n", + " are scalar relative error tolerance 'RelTol' (1e-3 by default) and vector\n", + " of absolute error tolerances 'AbsTol' (all components 1e-6 by default).\n", + " If certain components of the solution must be non-negative, use\n", + " ODESET to set the 'NonNegative' property to the indices of these\n", + " components.\n", + " \n", + " ODE23 can solve problems M(t,y)*y' = f(t,y) with mass matrix M that is\n", + " nonsingular. Use ODESET to set the 'Mass' property to a function handle \n", + " MASS if MASS(T,Y) returns the value of the mass matrix. If the mass matrix \n", + " is constant, the matrix can be used as the value of the 'Mass' option. If\n", + " the mass matrix does not depend on the state variable Y and the function\n", + " MASS is to be called with one input argument T, set 'MStateDependence' to\n", + " 'none'. ODE15S and ODE23T can solve problems with singular mass matrices. \n", + " \n", + " [TOUT,YOUT,TE,YE,IE] = ODE23(ODEFUN,TSPAN,Y0,OPTIONS) with the 'Events'\n", + " property in OPTIONS set to a function handle EVENTS, solves as above \n", + " while also finding where functions of (T,Y), called event functions, \n", + " are zero. For each function you specify whether the integration is \n", + " to terminate at a zero and whether the direction of the zero crossing \n", + " matters. These are the three column vectors returned by EVENTS: \n", + " [VALUE,ISTERMINAL,DIRECTION] = EVENTS(T,Y). For the I-th event function: \n", + " VALUE(I) is the value of the function, ISTERMINAL(I)=1 if the integration \n", + " is to terminate at a zero of this event function and 0 otherwise. \n", + " DIRECTION(I)=0 if all zeros are to be computed (the default), +1 if only \n", + " zeros where the event function is increasing, and -1 if only zeros where \n", + " the event function is decreasing. Output TE is a column vector of times \n", + " at which events occur. Rows of YE are the corresponding solutions, and \n", + " indices in vector IE specify which event occurred. \n", + " \n", + " SOL = ODE23(ODEFUN,[T0 TFINAL],Y0...) returns a structure that can be\n", + " used with DEVAL to evaluate the solution or its first derivative at \n", + " any point between T0 and TFINAL. The steps chosen by ODE23 are returned \n", + " in a row vector SOL.x. For each I, the column SOL.y(:,I) contains \n", + " the solution at SOL.x(I). If events were detected, SOL.xe is a row vector \n", + " of points at which events occurred. Columns of SOL.ye are the corresponding \n", + " solutions, and indices in vector SOL.ie specify which event occurred. \n", + " \n", + " Example \n", + " [t,y]=ode23(@vdp1,[0 20],[2 0]); \n", + " plot(t,y(:,1));\n", + " solves the system y' = vdp1(t,y), using the default relative error\n", + " tolerance 1e-3 and the default absolute tolerance of 1e-6 for each\n", + " component, and plots the first component of the solution. \n", + " \n", + " Class support for inputs TSPAN, Y0, and the result of ODEFUN(T,Y):\n", + " float: double, single\n", + " \n", + " See also ODE45, ODE113, ODE15S, ODE23S, ODE23T, ODE23TB, ODE15I,\n", + " ODESET, ODEPLOT, ODEPHAS2, ODEPHAS3, ODEPRINT, DEVAL,\n", + " ODEEXAMPLES, RIGIDODE, BALLODE, ORBITODE, FUNCTION_HANDLE.\n", + "\n", + " Reference page in Doc Center\n", + " doc ode23\n" + ] + } + ], + "source": [ + "help ode23" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "a=4;b=0.05;c=5;d=0.1;\n", + "tspan=[0,5];\n", + "[t23 y23] = ode23(@predprey,tspan,y0,h,a,b,c,d);\n", + "[t45,y45] = ode45(@predprey,tspan,y0,h,a,b,c,d);\n", + "plot(t23,y23(:,1),t23,y23(:,2),t45,y45(:,1),'--'...\n", + ",t45,y45(:,2),'--')\n", + "title('ode23- vs ode45--')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Matlab", + "language": "matlab", + "name": "matlab" + }, + "language_info": { + "codemirror_mode": "octave", + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "matlab", + "version": "0.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_23/north_coriolis.m b/lecture_23/north_coriolis.m new file mode 100644 index 0000000..28a2337 --- /dev/null +++ b/lecture_23/north_coriolis.m @@ -0,0 +1,53 @@ +function [t,r] = coriolis(L,m) + % In class we ran this function using L=41.8084 (the latitude of Storrs, CT). This + % function takes the latitude (L) in degrees and mass (m) and calculates the trajectory + % of a particle with a 100 N load directed North. The initial conditions are set as L + % (in radians) * radius of Earth, 0 m/s initial x-velocity, 0 m E-W position (add to + % -72.261319 degrees for longitude of Storrs), 0 m/s initial E-W velocity, 10 m initial + % altitude, 0 m/s initial z-velocity [L*pi/180*R 0 0 0 10 0], the force is given as 100 + % N North, 0 West and 9.81*m z (neutrally buoyant) [100 0 9.81*m] + % + % the output of myode is ddr=[dx/dt d2x/dt2 dy/dt d2y/dt2 dz/dt d2z/dt2]' and the input + % to myode is r=[x dx/dt y dy/dt z dz/dt]' + % using ode23 solver solves for r as a function of time, here we solve from 0 to 200 s + % r(:,1) = x (the north-south position from 0 to 200 s) + % r(:,3) = x (the West-East position from 0 to 200 s) + % r(:,5) = x (the altitude from 0 to 200 s) + + % define ordinary differential equation in terms of 6 first order ODE's + function ddr = myode(t,r,F,m,R) + Fx=F(1); Fy=F(2); Fz=F(3); % set each Force component + g=9.81; % acceleration due to gravity m/s^2 + we=2*pi/23.934/3600; % rotation of Earth (each day is 23.934 hours long) + ddr=zeros(6,1); % initialize ddr + + ddr(1) = r(2); % x North(+) South (-) + ddr(2) = 2*we*r(2).*sin(r(1)/R)-r(6).*cos(r(1)/R)+Fx/m; % dx/dt + ddr(3) = r(4); % y West (+) East (-) + ddr(4) = -2*we*(r(2).*sin(r(1)/R)-r(6).*cos(r(1)/R))+Fy/m; % dy/dt + ddr(5) = r(6); % z altitude + ddr(6) = -2*we*r(4).*cos(r(1)/R)+Fz/m-g; % dz/dt + end + + R=6378.1e3; % radius of Earth in m + % Applied force is 100 N in Northern direction and z-direction equals force of gravity + % (neutrally buoyant travel) + F= [ 100 0 9.81*m]; %Applied force in N + [t,r]=ode45(@(t,r) myode(t,r,[100 0 9.81*m],m, R),[0 200], [L*pi/180*R 0 0 0 10 0]); + figure() + % Plot Coriolis effect for deviation Westward + plot(r(:,3),1e-3*(r(:,1)-r(1,1))) + xlabel('West (+m)','Fontsize',18) + ylabel('North (+km)','Fontsize',18) + text(0,0, 'Storrs, CT') + title('Coriolis acceleration with north force') + + figure() + % Plot Eotvos effect for deviation upwards + plot(1e-3*(r(:,1)-r(1,1)),r(:,5)) + xlabel('North (+km)','Fontsize',18) + ylabel('Altitude (+m)','Fontsize',18) + title('Eotvos effect with north force') + +end + diff --git a/lecture_23/octave-workspace b/lecture_23/octave-workspace new file mode 100644 index 0000000..31e53e3 Binary files /dev/null and b/lecture_23/octave-workspace differ diff --git a/lecture_23/predprey.m b/lecture_23/predprey.m new file mode 100644 index 0000000..349c3f6 --- /dev/null +++ b/lecture_23/predprey.m @@ -0,0 +1,6 @@ +function yp=predprey(t,y,a,b,c,d) + % predator-prey model (Lotka-Volterra equations) + yp=zeros(2,1); + yp(1)=a*y(1)-b*y(1)*y(2); + yp(2)=-c*y(2)+d*y(1)*y(2); +end diff --git a/lecture_23/rk4sys.m b/lecture_23/rk4sys.m new file mode 100644 index 0000000..fe747cb --- /dev/null +++ b/lecture_23/rk4sys.m @@ -0,0 +1,53 @@ +function [tp,yp] = rk4sys(dydt,tspan,y0,h,varargin) +% rk4sys: fourth-order Runge-Kutta for a system of ODEs +% [t,y] = rk4sys(dydt,tspan,y0,h,p1,p2,...): integrates +% a system of ODEs with fourth-order RK method +% input: +% dydt = name of the M-file that evaluates the ODEs +% tspan = [ti, tf]; initial and final times with output +% generated at interval of h, or +% = [t0 t1 ... tf]; specific times where solution output +% y0 = initial values of dependent variables +% h = step size +% p1,p2,... = additional parameters used by dydt +% output: +% tp = vector of independent variable +% yp = vector of solution for dependent variables +if nargin<4,error('at least 4 input arguments required'), end +if any(diff(tspan)<=0),error('tspan not ascending order'), end +n = length(tspan); +ti = tspan(1);tf = tspan(n); +if n == 2 + t = (ti:h:tf)'; n = length(t); + if t(n)h,hh = h;end + while(1) + if tt+hh>tend,hh = tend-tt;end + k1 = dydt(tt,y(i,:),varargin{:})'; + ymid = y(i,:) + k1.*hh./2; + k2 = dydt(tt+hh/2,ymid,varargin{:})'; + ymid = y(i,:) + k2*hh/2; + k3 = dydt(tt+hh/2,ymid,varargin{:})'; + yend = y(i,:) + k3*hh; + k4 = dydt(tt+hh,yend,varargin{:})'; + phi = (k1+2*(k2+k3)+k4)/6; + y(i+1,:) = y(i,:) + phi*hh; + tt = tt+hh; + i=i+1; + if tt>=tend,break,end + end + np = np+1; tp(np) = tt; yp(np,:) = y(i,:); + if tt>=tf,break,end +end \ No newline at end of file diff --git a/lecture_24/.ipynb_checkpoints/lecture_24-checkpoint.ipynb b/lecture_24/.ipynb_checkpoints/lecture_24-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_24/.ipynb_checkpoints/lecture_24-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_24/feng et al 2009-paper_airplane.pdf b/lecture_24/feng et al 2009-paper_airplane.pdf new file mode 100644 index 0000000..d48bd26 Binary files /dev/null and b/lecture_24/feng et al 2009-paper_airplane.pdf differ diff --git a/lecture_24/lecture_24.ipynb b/lecture_24/lecture_24.ipynb new file mode 100644 index 0000000..66b8be6 --- /dev/null +++ b/lecture_24/lecture_24.ipynb @@ -0,0 +1,88 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![q1](q1.png)\n", + "\n", + "![q2](q2.png)\n", + "\n", + "### How do Runge-Kutta methods increase the order of convergence?\n", + "![q3](q3.png)\n", + "\n", + "## Questions from you\n", + "\n", + "- How do Runge-Kutta methods increase the order of convergence?\n", + "\n", + "- Can you provide more assistance for the final project?\n", + "\n", + "- Will there be another homework? Or is it just the final project for the rest of the semester.\n", + "\n", + "- will the competition be limited to numerical methods or general engineering problems (like the hack-a-thon)?\n", + "\n", + "- On the final project, to get the GitHub bonus, do you have to solve the issue? Or do the points go to the one who opens the issue?\n", + "\n", + "- can we go over the final project\n", + "\n", + "Tues - more background and help" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Paper Airplane Design challenge\n", + "\n", + "We looked at a Phugoid model comparing Euler and Runge-Kutta second order solutions. Now, use this model to maximize the distance your paper airplane will fly. \n", + "\n", + "Using the phugoid model, write a new code to analyze the flight of a paper airplane, with the following conditions:\n", + "\n", + "* Assume $L/D$ of 5.2 (a value close to measurements in [Feng et al. 2009](./feng et al 2009-paper_airplane.pdf))\n", + "* For the trim velocity, $v_{t}$=5.5 m/s.\n", + "\n", + "Submit your github repository to the following Google form:\n", + "\n", + "[https://goo.gl/forms/mI2CKcyRvfOWz5FF3](https://goo.gl/forms/mI2CKcyRvfOWz5FF3)\n", + "\n", + "Initial judging by Prof. Cooper will be based upon clarity of solution (e.g. documents, files, results in README)\n", + "\n", + "The top groups will be distributed to the class to be voted on\n", + "\n", + "We have focused on Matlab/Octave in our work this semester, but if you prefer Python or some other language, feel free to code your solution in your language of choice. \n", + "\n", + "**Good Luck!**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_24/octave-workspace b/lecture_24/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_24/octave-workspace differ diff --git a/lecture_24/q1.png b/lecture_24/q1.png new file mode 100644 index 0000000..b6f47ff Binary files /dev/null and b/lecture_24/q1.png differ diff --git a/lecture_24/q2.png b/lecture_24/q2.png new file mode 100644 index 0000000..77dfdb5 Binary files /dev/null and b/lecture_24/q2.png differ diff --git a/lecture_24/q3.png b/lecture_24/q3.png new file mode 100644 index 0000000..3d37be2 Binary files /dev/null and b/lecture_24/q3.png differ diff --git a/lecture_25/final_notes.pdf b/lecture_25/final_notes.pdf new file mode 100755 index 0000000..ab5c0df Binary files /dev/null and b/lecture_25/final_notes.pdf differ diff --git a/lecture_25/lecture_25.pdf b/lecture_25/lecture_25.pdf new file mode 100755 index 0000000..8141f37 Binary files /dev/null and b/lecture_25/lecture_25.pdf differ diff --git a/lecture_26/.ipynb_checkpoints/lecture_26-checkpoint.ipynb b/lecture_26/.ipynb_checkpoints/lecture_26-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_26/.ipynb_checkpoints/lecture_26-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_26/compiled_data.csv b/lecture_26/compiled_data.csv new file mode 100644 index 0000000..ea6a99a --- /dev/null +++ b/lecture_26/compiled_data.csv @@ -0,0 +1,233 @@ +7.8,62,1 +12.3,61,1 +5.2,35,1 +12.4,44,1 +5.2,294,1 +3.3,73,2 +1.4,30,2 +11,10,2 +6.3,39,3 +6.9,60,3 +6.3,100,3 +7.8,249,3 +3.3,282,3 +7,96,4 +3.9,186,4 +2.95,166,4 +8.6,262,4 +2.5,355,4 +20,155,5 +18.5,225,5 +14,45,5 +8.5,340,5 +5.25,95,5 +10,20,5 +6.5,62,5 +8.75,36,5 +3,190,5 +4.5,280,5 +2.25,62,6 +3.9,312,6 +9.3,36,6 +1.9,154,6 +7.3,115,6 +4.75,298,6 +4.6,306,7 +2.3,282,7 +10.1,138,7 +3.3,180,7 +8.5,242,7 +5,10,8 +2.5,350,8 +11,30,8 +4,272,8 +17,38,8 +3.75,85,9 +4.5,102,9 +1.36,118,9 +0.78,157,9 +3.41,198,9 +3,27,10 +1,88,10 +2,20,10 +2.5,155,10 +4.5,281,10 +1.5,75,10 +6.32,70,10 +2.85,135,10 +3.71,250,10 +5.45,60,10 +6.1,95,10 +5.5,92,11 +15,266,11 +12.5,14,11 +7,120,11 +4,132,11 +9,30,12 +5,90,12 +6,350,12 +8,330,12 +5,60,12 +3.81,140,12 +6.35,116,12 +0.635,88,12 +7.62,12,12 +1.27,180,12 +4.2,292,13 +0.8,165,13 +2.5,0,13 +6,43,13 +6.65,317,13 +1,0,13 +2.9,50,13 +7.4,302,13 +16.6,246,13 +2.4,234,13 +0.8,100,14 +3.6,62,14 +3.5,260,14 +4.4,168,14 +5.7,178,14 +3.6,143,14 +1.75,37,14 +1.95,62,14 +2.27,48,14 +4.26,69,14 +4,182,15 +5.8,100,15 +8.3,45,15 +10.2,30,15 +4,278,15 +3.81,120,16 +7.62,77,16 +1.59,212,16 +3.73,265,16 +4.84,259,16 +3.45,243,16 +2.1,186,16 +4.6,24,16 +0.7,343,16 +1.7,211,16 +12.4,33,17 +13.9,103,17 +4.5,307,17 +6.7,313,17 +11.4,328,17 +3,240,18 +4,330,18 +2,90,18 +3.5,315,18 +1,15,18 +4.6,98,19 +3.8,326,19 +3.4,184,19 +4,48,19 +2.6,83,19 +2.75,88,20 +1.33,93,20 +1.5,12,20 +3,280,20 +0.5,24,20 +1.2,130,21 +2.6,122,21 +0.8,296,21 +1.4,100,21 +1.2,290,21 +3,90,22 +2,30,22 +10,90,22 +3,15,22 +7,90,22 +3.3,170,23 +8.8,95,23 +8.1,71,23 +7.7,48,23 +9.6,301,23 +3,70,24 +1.2,10,24 +2.1,15,24 +6,260,24 +0.7,30,24 +12.5,10,25 +11,35,25 +7,320,25 +7.5,292,25 +3.5,134,25 +1,4,26 +2,3.9,26 +3,5.25,26 +4,3.2,26 +5,3,26 +4.5,27,27 +1.1,80,27 +2.6,155,27 +1.9,200,27 +2.8,325,27 +4.3,15,28 +7,145,28 +3.5,80,28 +9,210,28 +5.2,175,28 +1,54,29 +3.5,128,29 +4.5,140,29 +2,54,29 +11,274,29 +3.175,98,30 +1.5875,30,30 +3.175,282,30 +5.08,318,30 +10.795,316,30 +11.2,19,31 +14.5,232,31 +12.3,271,31 +16.9,120,31 +9,177,31 +7.4,276,32 +11.5,321,32 +1.5,36,32 +7.5,22,32 +10.1,66,32 +1.75,10,33 +2.5,123,33 +2,64,33 +1.8,271,33 +4,308,33 +4.5,39,34 +3.25,68,34 +2.5,282,34 +1.25,108,34 +2,122,34 +3.97,18,35 +8.29,196,35 +15.52,232,35 +4.79,93,35 +6.43,153,35 +7.5,74,36 +10.75,86,36 +3.5,96,36 +6.25,172,36 +5.5,38,36 +3.25,192,37 +4.5,88,37 +5,336,37 +4,176,37 +2.5,194,37 +1.5,73,38 +1.33,265,38 +2.15,92,38 +3.5,130,38 +0.9,65,38 +3.75,-2,39 +1.66,89,39 +5.43,76,39 +4.12,54,39 +6.87,63,39 +10,85,40 +9,30,40 +7,180,40 +4.3,22,40 +5.8,281,40 +2.9,1,40 +3.31,29,40 +1.5,10,40 diff --git a/lecture_26/lecture_26.ipynb b/lecture_26/lecture_26.ipynb new file mode 100644 index 0000000..dc43ec3 --- /dev/null +++ b/lecture_26/lecture_26.ipynb @@ -0,0 +1,1060 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Monte Carlo Dart Challenge\n", + "\n", + "![Dart Challenge Figure](../HW2/projectile.png)\n", + "\n", + "In homework 2, you created `projectile.m`, that calculated the height of a dart based upon initial velocity and angle. \n", + "\n", + "For extra credit, we compiled data from 40 students. \n", + "\n", + "Now, we want to calculate the control that these students had over their dart-throwing. \n", + "\n", + "This is called an *inverse problem*. Given, a mean and standard deviation of velocity and angle, we can calculate the mean and standard deviation of the final dart height with a Monte-Carlo model, but we want to determine a reasonable estimate for the mean and standard deviation of these two parameters. \n", + "\n", + "This is an open-ended design problem, so you can choose to fix or vary the parameters at your own discretion. In HW3, we used 15 m/s as an initial velocity. This is a good starting point, but is it fixed? Its up to you to decide. \n", + "\n", + "You can use the Matlab/Octave command `hist` to plot the data and the Monte Carlo model results. And you can compare statistics with `mean` and `std`\n", + "\n", + "State your assumptions and provide documentation for your functions and scripts. \n", + "\n", + "### The goal of this challenge comes down to 3 parts:\n", + "\n", + "1. Determine a range of values for initial velocity and angle (intuition or analysis)\n", + "\n", + "2. Describe initial velocity and angle with random variables (normal distribution? completely random?)\n", + "\n", + "3. Show that your random variables produce the same ditribution of dart locations as our throwers\n", + "\n", + "### Submit your repository via the Google Form:\n", + "[https://goo.gl/forms/MwdfNWgj9UlHnRV83](https://goo.gl/forms/MwdfNWgj9UlHnRV83)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 40\r\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ty position (cm)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx position (cm)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_22a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_23a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_24a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_25a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_26a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_27a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_28a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_29a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_30a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_31a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_32a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_33a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_34a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_35a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_36a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_37a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_38a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_39a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_40a\n", + "\n", + "\t \n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "darts=dlmread('compiled_data.csv',',');\n", + "x_darts=darts(:,1).*cosd(darts(:,2));\n", + "y_darts=darts(:,1).*sind(darts(:,2));\n", + "\n", + "colormap(colorcube(length(darts(:,3))))\n", + "max(darts(:,3))\n", + "scatter(x_darts, y_darts, [], darts(:,3))\n", + "xlabel('x position (cm)')\n", + "ylabel('y position (cm)')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-15\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_5a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_6a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_7a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_8a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_9a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_10a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_11a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_12a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_13a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_14a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_15a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_16a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_17a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_18a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_19a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_20a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_21a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hist(y_darts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_26/octave-workspace b/lecture_26/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_26/octave-workspace differ diff --git a/linear_algebra/LU_suggested.html b/linear_algebra/LU_suggested.html new file mode 100644 index 0000000..f1998e1 --- /dev/null +++ b/linear_algebra/LU_suggested.html @@ -0,0 +1,39 @@ + + + + + + + + + + + +

Linear Algebra Review

+

(Gauss Elimination) Suggested problems

+

No due date

+
    +
  1. Determine the lower (L) and upper (U) triangular matrices with LU-decomposition for the following matrices:

    +
      +
    1. \(A=\left[ \begin{array}{cc} 1 & 3 \\ 2 & 1 \end{array} \right]\)

    2. +
    3. \(A=\left[ \begin{array}{cc} 1 & 1 \\ 2 & 3 \end{array} \right]\)

    4. +
    5. \(A=\left[ \begin{array}{cc} 1 & 1 \\ 2 & -2 \end{array} \right]\)

    6. +
    7. \(A=\left[ \begin{array}{ccc} 1 & 3 & 1 \\ -4 & -9 & 2 \\ 0 & 3 & 6\end{array} \right]\)

    8. +
    9. \(A=\left[ \begin{array}{ccc} 1 & 3 & 1 \\ -4 & -9 & 2 \\ 0 & 3 & 6\end{array} \right]\)

    10. +
    11. \(A=\left[ \begin{array}{ccc} 1 & 3 & -5 \\ 1 & 4 & -8 \\ -3 & -7 & 9\end{array} \right]\)

    12. +
    13. \(A=\left[ \begin{array}{ccc} 1 & 2 & -1 \\ 2 & 2 & 2 \\ 1 & -1 & 2\end{array} \right]\)

    14. +
  2. +
  3. Calculate the determinant of A from 1a-g.

  4. +
  5. Determine the Cholesky factorization, C, of the following matrices, where

    +

    \(C_{ii}=\sqrt{a_{ii}-\sum_{k=1}^{i-1}C_{ki}^{2}}\)

    +

    \(C_{ij}=\frac{a_{ij}-\sum_{k=1}^{i-1}C_{ki}C_{kj}}{C_{ii}}\).

    +
      +
    1. A=\(\left[ \begin{array}{cc} 3 & 2 \\ 2 & 1 \end{array} \right]\)

    2. +
    3. A=\(\left[ \begin{array}{cc} 10 & 5 \\ 5 & 20 \end{array} \right]\)

    4. +
    5. A=\(\left[ \begin{array}{ccc} 10 & -10 & 20 \\ -10 & 20 & 10 \\ 20 & 10 & 30 \end{array} \right]\)

    6. +
    7. A=\(\left[ \begin{array}{cccc} 21 & -1 & 0 & 0 \\ -1 & 21 & -1 & 0 \\ 0 & -1 & 21 & -1 \\ 0 & 0 & -1 & 1 \end{array} \right]\)

    8. +
  6. +
  7. Verify that \(C^{T}C=A\) for 3a-d

  8. +
+ + diff --git a/linear_algebra/LU_suggested.md b/linear_algebra/LU_suggested.md new file mode 100644 index 0000000..f809813 --- /dev/null +++ b/linear_algebra/LU_suggested.md @@ -0,0 +1,68 @@ +# Linear Algebra Review +## (Gauss Elimination) Suggested problems +### No due date + +1. Determine the lower (L) and upper (U) triangular matrices with LU-decomposition for the +following matrices: + + a. $A=\left[ \begin{array}{cc} + 1 & 3 \\ + 2 & 1 \end{array} \right]$ + + a. $A=\left[ \begin{array}{cc} + 1 & 1 \\ + 2 & 3 \end{array} \right]$ + + a. $A=\left[ \begin{array}{cc} + 1 & 1 \\ + 2 & -2 \end{array} \right]$ + + b. $A=\left[ \begin{array}{ccc} + 1 & 3 & 1 \\ + -4 & -9 & 2 \\ + 0 & 3 & 6\end{array} \right]$ + + c. $A=\left[ \begin{array}{ccc} + 1 & 3 & 1 \\ + -4 & -9 & 2 \\ + 0 & 3 & 6\end{array} \right]$ + + d. $A=\left[ \begin{array}{ccc} + 1 & 3 & -5 \\ + 1 & 4 & -8 \\ + -3 & -7 & 9\end{array} \right]$ + + d. $A=\left[ \begin{array}{ccc} + 1 & 2 & -1 \\ + 2 & 2 & 2 \\ + 1 & -1 & 2\end{array} \right]$ + +2. Calculate the determinant of A from 1a-g. + +3. Determine the Cholesky factorization, C, of the following matrices, where + + $C_{ii}=\sqrt{a_{ii}-\sum_{k=1}^{i-1}C_{ki}^{2}}$ + + $C_{ij}=\frac{a_{ij}-\sum_{k=1}^{i-1}C_{ki}C_{kj}}{C_{ii}}$. + + a. A=$\left[ \begin{array}{cc} + 3 & 2 \\ + 2 & 1 \end{array} \right]$ + + a. A=$\left[ \begin{array}{cc} + 10 & 5 \\ + 5 & 20 \end{array} \right]$ + + a. A=$\left[ \begin{array}{ccc} + 10 & -10 & 20 \\ + -10 & 20 & 10 \\ + 20 & 10 & 30 \end{array} \right]$ + + a. A=$\left[ \begin{array}{cccc} + 21 & -1 & 0 & 0 \\ + -1 & 21 & -1 & 0 \\ + 0 & -1 & 21 & -1 \\ + 0 & 0 & -1 & 1 \end{array} \right]$ + +4. Verify that $C^{T}C=A$ for 3a-d + diff --git a/linear_algebra/LU_suggested.pdf b/linear_algebra/LU_suggested.pdf new file mode 100644 index 0000000..9b04276 Binary files /dev/null and b/linear_algebra/LU_suggested.pdf differ diff --git a/linear_algebra/gauss_suggested.md b/linear_algebra/gauss_suggested.md new file mode 100644 index 0000000..6b1f6b6 --- /dev/null +++ b/linear_algebra/gauss_suggested.md @@ -0,0 +1,71 @@ +# Linear Algebra Review +## (Gauss Elimination) Suggested problems +### No due date + +1. Solve for x when Ax=b for the following problems: + + a. $A=\left[ \begin{array}{cc} + 1 & 3 \\ + 2 & 1 \end{array} \right] + b= + \left[\begin{array}{c} + 1 \\ + 1\end{array}\right]$ + + a. $A=\left[ \begin{array}{cc} + 1 & 1 \\ + 2 & 3 \end{array} \right] + b= + \left[\begin{array}{c} + 3 \\ + 4\end{array}\right]$ + + a. $A=\left[ \begin{array}{cc} + 1 & 1 \\ + 2 & -2 \end{array} \right] + b= + \left[\begin{array}{c} + 4 \\ + 2\end{array}\right]$ + + b. $A=\left[ \begin{array}{ccc} + 1 & 3 & 1 \\ + -4 & -9 & 2 \\ + 0 & 3 & 6\end{array} \right] + b= + \left[\begin{array}{c} + 0 \\ + 0 \\ + 0\end{array}\right]$ + + c. $A=\left[ \begin{array}{ccc} + 1 & 3 & 1 \\ + -4 & -9 & 2 \\ + 0 & 3 & 6\end{array} \right] + b= + \left[\begin{array}{c} + 1 \\ + -1 \\ + -3\end{array}\right]$ + + d. $A=\left[ \begin{array}{ccc} + 1 & 3 & -5 \\ + 1 & 4 & -8 \\ + -3 & -7 & 9\end{array} \right] + b= + \left[\begin{array}{c} + 1 \\ + -1 \\ + -3\end{array}\right]$ + + d. $A=\left[ \begin{array}{ccc} + 1 & 2 & -1 \\ + 2 & 2 & 2 \\ + 1 & -1 & 2\end{array} \right] + b= + \left[\begin{array}{c} + 2 \\ + 12 \\ + 5\end{array}\right]$ + +2. Calculate the determinant of A from 1a-g. diff --git a/linear_algebra/gauss_suggested.pdf b/linear_algebra/gauss_suggested.pdf new file mode 100644 index 0000000..a78b277 Binary files /dev/null and b/linear_algebra/gauss_suggested.pdf differ diff --git a/myode.m b/myode.m new file mode 100644 index 0000000..cedefb6 --- /dev/null +++ b/myode.m @@ -0,0 +1,7 @@ +function dudt = myode(t,u) + x=u(1); + y=u(2); + dudt=zeros(2,1); + dudt(1)=0.1*x+0.3*x*y; + dudt(2)=0.1*x*y-2*y; +end \ No newline at end of file diff --git a/octave-workspace b/octave-workspace new file mode 100644 index 0000000..5ddb511 Binary files /dev/null and b/octave-workspace differ