{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "###### Content under Creative Commons Attribution license CC-BY 4.0, code under BSD 3-Clause License © 2017 L.A. Barba, N.C. Clementi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Get with the oscillations\n", "\n", "So far, in this module of our course in _Engineering Computations_ you have learned to:\n", "\n", "* capture time histories of a body's position from images and video;\n", "* compute velocity and acceleration of a body, from known positions over time—i.e., take numerical derivatives;\n", "* find the motion description (position versus time) from acceleration data, stepping in time with Euler's method;\n", "* form the state vector and the vectorized form of a second-order dynamical system;\n", "* improve the simple free-fall model by adding air resistance.\n", "\n", "You also learned that Euler's method is a _first-order_ method: a Taylor series expansion shows that stepping in time with Euler makes an error—called the _truncation error_—proportional to the time increment, $\\Delta t$.\n", "\n", "In this lesson, you'll work with oscillating systems. Euler's method doesn't do very well with oscillating systems, but we'll show you a clever way to fix this. (The modified method is _still_ first order, however. We will also confirm the **order of convergence** by computing the error using different values of $\\Delta t$.\n", "\n", "As always, we will need our best-loved numerical Python libraries, and we'll also re-use the `eulerstep()` function from the [previous lesson](http://go.gwu.edu/engcomp3lesson2). So let's get that out of the way.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy\n", "from matplotlib import pyplot\n", "%matplotlib inline\n", "pyplot.rc('font', family='serif', size='14')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def eulerstep(state, rhs, dt):\n", " '''Update a state to the next time increment using Euler's method.\n", " \n", " Arguments\n", " ---------\n", " state : array of dependent variables\n", " rhs : function that computes the RHS of the DiffEq\n", " dt : float, time increment\n", " \n", " Returns\n", " -------\n", " next_state : array, updated after one time increment'''\n", " \n", " next_state = state + rhs(state) * dt\n", " return next_state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Spring-mass system\n", "\n", "A prototypical mechanical system is a mass $m$ attached to a spring, in the simplest case without friction. The elastic constant of the spring, $k$, determines the restoring force it will apply to the mass when displaced by a distance $x$. The system then oscillates back and forth around its position of equilibrium.\n", "\n", " \n", "#### Simple spring-mass system, without friction." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Newton's law applied to the friction-less spring-mass system is:\n", "\n", "\\begin{equation}\n", "-k x = m \\ddot{x}\n", "\\end{equation}\n", "\n", "Introducing the parameter $\\omega = \\sqrt{k/m}$, the equation of motion is rewriten as:\n", "\n", "\\begin{equation}\n", "\\ddot{x} + \\omega^2 x = 0\n", "\\end{equation}\n", "\n", "where a dot above a dependent variable denotes the time derivative. This is a second-order differential equation for the position $x$, having a known analytical solution that represents _simple harmonic motion_:\n", "\n", "$x(t) = x_0 \\cos(\\omega t)$\n", "\n", "The solution represents oscillations with period $P = 2 \\pi/ \\omega $ (the time between two peaks), and amplitude $x_0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### System in vector form\n", "\n", "It's useful to write a second-order differential equation as a set of two first-order equations: in this case, for position and velocity, respectively:\n", "\n", "\\begin{eqnarray}\n", "\\dot{x} &=& v \\nonumber\\\\\n", "\\dot{v} &=& -\\omega^2 x\n", "\\end{eqnarray}\n", "\n", "Like we did in [Lesson 2](http://go.gwu.edu/engcomp3lesson2) of this module, we write the state of the system as a two-dimensional vector,\n", "\n", "\\begin{equation}\n", "\\mathbf{x} = \\begin{bmatrix}\n", "x \\\\ v\n", "\\end{bmatrix},\n", "\\end{equation}\n", "\n", "and the differential equation in vector form:\n", "\n", "\\begin{equation}\n", "\\dot{\\mathbf{x}} = \\begin{bmatrix}\n", "v \\\\ -\\omega^2 x\n", "\\end{bmatrix}.\n", "\\end{equation}\n", "\n", "Several advantages come from writing the differential equation in vector form, both theoretical and practical. In the study of dynamical systems, for example, the state vector lives in a state space called the _phase plane_, and many things can be learned from studying solutions to differential equations graphically on a phase plane.\n", "\n", "Practically, writing the equation in vector form results in more general, compact code. Let's write a function to obtain the right-hand side of the spring-mass differential equation, in vector form." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def springmass(state):\n", " '''Computes the right-hand side of the spring-mass differential \n", " equation, without friction.\n", " \n", " Arguments\n", " --------- \n", " state : array of two dependent variables [x v]^T\n", " \n", " Returns \n", " -------\n", " derivs: array of two derivatives [v - ω*ω*x]^T\n", " '''\n", " \n", " derivs = numpy.array([state[1], -ω**2*state[0]])\n", " return derivs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This worked example follows Reference [1], section 4.3 (note that the source is open access). We set the parameters of the system, choose a time interval equal to 1-20th of the oscillation period, and decide to solve the motion for a duration equal to 3 periods." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ω = 2\n", "period = 2*numpy.pi/ω\n", "dt = period/20 # we choose 20 time intervals per period \n", "T = 3*period # solve for 3 periods\n", "N = round(T/dt)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "60\n", "0.15707963267948966\n" ] } ], "source": [ "print(N)\n", "print(dt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, set up the time array and initial conditions, initialize the solution array with zero values, and assign the initial values to the first elements of the solution array." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "t = numpy.linspace(0, T, N)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x0 = 2 # initial position\n", "v0 = 0 # initial velocity" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#initialize solution array\n", "num_sol = numpy.zeros([N,2])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Set intial conditions\n", "num_sol[0,0] = x0\n", "num_sol[0,1] = v0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We're ready to solve! Step through the time increments, calling the `eulerstep()` function with the `springmass` right-hand-side derivatives and time increment as inputs." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "for i in range(N-1):\n", " num_sol[i+1] = eulerstep(num_sol[i], springmass, dt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's compute the position with respect to time using the known analytical solution, so that we can compare the numerical result with it. Below, we make a plot including both numerical and analytical values in our chosen time range." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x_an = x0*numpy.cos(ω * t)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot solution with Euler's method\n", "fig = pyplot.figure(figsize=(6,4))\n", "\n", "pyplot.plot(t, num_sol[:, 0], linewidth=2, linestyle='--', label='Numerical solution')\n", "pyplot.plot(t, x_an, linewidth=1, linestyle='-', label='Analytical solution')\n", "pyplot.xlabel('Time [s]')\n", "pyplot.ylabel('$x$ [m]')\n", "pyplot.title('Spring-mass system with Euler\\'s method (dashed line).\\n');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yikes! The numerical solution exhibits a marked growth in amplitude over time, which certainly is not what the physical system displays. _What is wrong with Euler's method?_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Exercise: \n", "\n", "* Try repeating the calculation above using smaller values of the time increment, `dt`, and see if the results improve. Try `dt=P/40`, `P/160` and `P/2000`.\n", "\n", "* Although the last case, with 2000 steps per oscillation, does look good enough, see what happens if you then increase the time of simulation, for example to 20 periods. —Run the case again: _What do you see now?_\n", "\n", "We consistently observe a growth in amplitude in the numerical solution, worsening over time. The solution does improve when we reduce the time increment `dt` (as it should), but the amplitude still displays unphysical growth for longer simulations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Euler-Cromer method\n", "\n", "The thing is, Euler's method has a fundamental problem with oscillatory systems. Look again at the approximation made by Euler's method to get the position at the next time interval:\n", "\n", "\\begin{equation}\n", " x(t_i+\\Delta t) \\approx x(t_i) + v(t_i) \\Delta t\n", "\\end{equation}\n", "\n", "It uses the velocity value at the _beginning_ of the time interval to step the solution to the future. \n", "\n", "A graphical explanation can help here. Remember that the derivative of a function corresponds to the slope of the tangent at a point. Euler's method approximates the derivative using the slope at the initial point in an interval, and advances the numerical position with that initial velocity. The sketch below illustrates two consecutive Euler steps on a function with high curvature.\n", "\n", " \n", "#### Sketch of two Euler steps on a curved function.\n", "\n", "Since Euler's method makes a linear approximation to project the solution into the future, assuming the value of the derivative at the start of the interval, it's not very good on oscillatory functions.\n", "\n", "A clever idea that improves on Euler's method is to use the updated value of the derivatives for the _second_ equation.\n", "\n", "Pure Euler's method applies:\n", "\n", "\\begin{eqnarray}\n", "x(t_0) = x_0, \\qquad x_{i+1} &=& x_i + v_i \\Delta t \\nonumber\\\\\n", "v(t_0) = v_0, \\qquad v_{i+1} &=& v_i - {\\omega}^2 x_i \\Delta t\n", "\\end{eqnarray}\n", "\n", "What if in the equation for $v$ we used the value $x_{i+1}$ that was just computed? Like this:\n", "\n", "\\begin{eqnarray}\n", "x(t_0) = x_0, \\qquad x_{i+1} &=& x_i + v_i \\Delta t \\nonumber\\\\\n", "v(t_0) = v_0, \\qquad v_{i+1} &=& v_i - {\\omega}^2 x_{i+1} \\Delta t\n", "\\end{eqnarray}\n", "\n", "Notice the $x_{i+1}$ on the right-hand side of the second equation: that's the updated value, giving the acceleration at the _end_ of the time interval. This modified scheme is called Euler-Cromer method, to honor clever Mr Cromer, who came up with the idea [2]." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Let's see what it does. Study the function below carefully—it helps a lot if you write things out on a piece of paper!" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def euler_cromer(state, rhs, dt):\n", " '''Update a state to the next time increment using Euler-Cromer's method.\n", " \n", " Arguments\n", " ---------\n", " state : array of dependent variables\n", " rhs : function that computes the RHS of the DiffEq\n", " dt : float, time increment\n", " \n", " Returns\n", " -------\n", " next_state : array, updated after one time increment'''\n", " \n", " mid_state = state + rhs(state)*dt # Euler step\n", " mid_derivs = rhs(mid_state) # updated derivatives\n", " \n", " next_state = numpy.array([mid_state[0], state[1] + mid_derivs[1]*dt])\n", " \n", " return next_state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We've copied the whole problem set-up below, to get the solution in one code cell, for easy trial with different parameter choices. Try it out!" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The number of time steps is 160000.\n", "The time increment is 0.015707963267948967\n" ] } ], "source": [ "ω = 2\n", "period = 2*numpy.pi/ω\n", "dt = period/200 # time intervals per period \n", "T = 800*period # simulation time, in number of periods\n", "N = round(T/dt)\n", "\n", "print('The number of time steps is {}.'.format( N ))\n", "print('The time increment is {}'.format( dt ))\n", "\n", "# time array\n", "t = numpy.linspace(0, T, N)\n", "\n", "x0 = 2 # initial position\n", "v0 = 0 # initial velocity\n", "\n", "#initialize solution array\n", "num_sol = numpy.zeros([N,2])\n", "\n", "#Set intial conditions\n", "num_sol[0,0] = x0\n", "num_sol[0,1] = v0\n", "\n", "for i in range(N-1):\n", " num_sol[i+1] = euler_cromer(num_sol[i], springmass, dt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recompute the analytical solution, and plot it alongside the numerical one, when you're ready. We computed a crazy number of oscillations, so we'll need to pick carefully the range of time to plot.\n", "\n", "First, get the analytical solution. We chose to then plot the first few periods of the oscillatory motion: numerical and analytical." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x_an = x0*numpy.cos(ω * t) # analytical solution" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n0zRN0yzl/wMU/309FRR0EwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "iend = 800 # in number of time steps\n", "\n", "fig = pyplot.figure(figsize=(6,4))\n", "\n", "pyplot.plot(t[:iend], num_sol[:iend, 0], linewidth=2, linestyle='--', label='Numerical solution')\n", "pyplot.plot(t[:iend], x_an[:iend], linewidth=1, linestyle='-', label='Analytical solution')\n", "pyplot.xlabel('Time [s]')\n", "pyplot.ylabel('$x$ [m]')\n", "pyplot.title('Spring-mass system, with Euler-Cromer method.\\n');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot shows that Euler-Cromer does not have the problem of growing amplitudes. We're pretty happy with it in that sense." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But if we plot the end of a long period of simulation, you can see that it does start to deviate from the analytical solution." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "istart = 400\n", "\n", "fig = pyplot.figure(figsize=(6,4))\n", "\n", "pyplot.plot(t[-istart:], num_sol[-istart:, 0], linewidth=2, linestyle='--', label='Numerical solution')\n", "pyplot.plot(t[-istart:], x_an[-istart:], linewidth=1, linestyle='-', label='Analytical solution')\n", "pyplot.xlabel('Time [s]')\n", "pyplot.ylabel('$x$ [m]')\n", "pyplot.title('Spring-mass system, with Euler-Cromer method. \\n');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the last few oscillations in a very long run shows a slight phase difference, even with a very small time increment. So although the Euler-Cromer method fixes a big problem with Euler's method, it still has some error. It's still a first-order method!\n", "\n", "#### The Euler-Cromer method is first-order accurate, just like Euler's method. The global error is proportional to $\\Delta t$.\n", "\n", "##### Note:\n", "\n", "You'll often find the presentation of the Euler-Cromer method with the reverse order of the equations, i.e., the velocity equation solved first, then the position equation solved with the updated value of the velocity. This makes no difference in the results: it's just a convention among physicists.\n", "\n", "The Euler-Cromer method is equivalent to a [_semi-implicit Euler method_](https://en.wikipedia.org/wiki/Semi-implicit_Euler_method)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convergence\n", "\n", "We've said that both Euler's method and the Cromer variant are _first-order accurate_: the error goes as the first power of $\\Delta t$. In [Lesson 2](http://go.gwu.edu/engcomp3lesson2) of this module, we showed this using a Taylor series. Let's now confirm it numerically.\n", "\n", "Because simple harmonic motion has a known analytical function that solves the differential equation, we can directly compute a measure of the error made by the numerical solution. \n", "\n", "Suppose we ran a numerical solution in the interval from $t_0$ to $T=N/\\Delta t$. We could then compute the error, as follows:\n", "\n", "\\begin{equation}\n", "e = x_N - x_0 \\cos(\\omega T)\n", "\\end{equation}\n", "\n", "where $x_N$ represents the numerical solution at the $N$-th time step." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How could we confirm the order of convergence of a numerical method? In the lucky scenario of having an analytical solution to directly compute the error, all we need to do is solve numerically with different values of $\\Delta t$ and see if the error really varies linearly with this parameter.\n", "\n", "In the code cell below, we compute the numerical solution with different time increments. We use two nested `for`-statements: one iterates over the values of $\\Delta t$, and the other iterates over the time steps from the initial condition to the final time. We save the results in a new variable called `num_sol_time`, which is an array of arrays. Check it out!" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dt_values = numpy.array([period/50, period/100, period/200, period/400])\n", "T = 1*period\n", "\n", "num_sol_time = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", "\n", "\n", "for j, dt in enumerate(dt_values):\n", "\n", " N = int(T/dt)\n", " t = numpy.linspace(0, T, N)\n", " \n", " #initialize solution array\n", " num_sol = numpy.zeros([N,2])\n", " \n", " \n", " #Set intial conditions\n", " num_sol[0,0] = x0\n", " num_sol[0,1] = v0\n", " \n", " for i in range(N-1):\n", " num_sol[i+1] = eulerstep(num_sol[i], springmass, dt)\n", "\n", " num_sol_time[j] = num_sol.copy()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will need to compute the error with our chosen norm, so let's write a function for that. It includes a line to obtain the values of the analytical solution at the needed instant of time, and then it takes the difference with the numerical solution to compute the error." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_error(num_sol, T):\n", " \n", " x_an = x0 * numpy.cos(ω * T) # analytical solution at final time\n", " \n", " error = numpy.abs(num_sol[-1,0] - x_an)\n", " \n", " return error" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All that is left to do is to call the error function with our chosen values of $\\Delta t$, and plot the results. A logarithmic scale on the plot confirms close to linear scaling between error and time increment." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "error_values = numpy.empty_like(dt_values)\n", "\n", "for j in range(len(dt_values)):\n", " \n", " error_values[j] = get_error(num_sol_time[j], T)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\no2yAV00AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the solution errors with respect to the time incremetn\n", "fig = pyplot.figure(figsize=(6,6))\n", "\n", "pyplot.loglog(dt_values, error_values, 'ko-') #log-log plot\n", "pyplot.loglog(dt_values, 10*dt_values, 'k:')\n", "pyplot.grid(True) #turn on grid lines\n", "pyplot.axis('equal') #make axes scale equally\n", "pyplot.xlabel('$\\Delta t$')\n", "pyplot.ylabel('Error')\n", "pyplot.title('Convergence of the Euler method (dotted line: slope 1)\\n');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What do you see in the plot of the error as a function of $\\Delta t$? It looks like a straight line, with a slope close to 1. On a log-log convergence plot, a slope of 1 indicates that we have a first-order method: the error scales as ${\\mathcal O}(\\Delta t)$—using the \"big-O\" notation. It means that the error is proportional to the time increment: $ e \\propto \\Delta t.$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modified Euler's method\n", "\n", "Another improvement on Euler's method is achieved by stepping the numerical solution to the midpoint of a time interval, computing the derivatives there, and then going back and updating the system state using the midpoint derivatives. This is called _modified Euler's method_.\n", "\n", "If we write the vector form of the differential equation as: \n", "\n", "\\begin{equation}\n", "\\dot{\\mathbf{x}} = f(\\mathbf{x}),\n", "\\end{equation}\n", "\n", "then modified Euler's method is:\n", "\\begin{align}\n", "\\mathbf{x}_{n+1/2} & = \\mathbf{x}_n + \\frac{\\Delta t}{2} f(\\mathbf{x}_n) \\\\\n", "\\mathbf{x}_{n+1} & = \\mathbf{x}_n + \\Delta t \\,\\, f(\\mathbf{x}_{n+1/2}).\n", "\\end{align}\n", "\n", "We can now write a Python function to update the state using this method. It's equivalent to a so-called _Runge-Kutta second-order_ method, so we call it `rk2_step()`." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def rk2_step(state, rhs, dt):\n", " '''Update a state to the next time increment using modified Euler's method.\n", " \n", " Arguments\n", " ---------\n", " state : array of dependent variables\n", " rhs : function that computes the RHS of the DiffEq\n", " dt : float, time increment\n", " \n", " Returns\n", " -------\n", " next_state : array, updated after one time increment'''\n", " \n", " mid_state = state + rhs(state) * dt*0.5 \n", " next_state = state + rhs(mid_state)*dt\n", " \n", " return next_state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how it performs with our spring-mass model." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dt_values = numpy.array([period/50, period/100, period/200,period/400])\n", "T = 1*period\n", "\n", "num_sol_time = numpy.empty_like(dt_values, dtype=numpy.ndarray)\n", "\n", "\n", "for j, dt in enumerate(dt_values):\n", "\n", " N = int(T/dt)\n", " t = numpy.linspace(0, T, N)\n", " \n", " #initialize solution array\n", " num_sol = numpy.zeros([N,2])\n", " \n", " \n", " #Set intial conditions\n", " num_sol[0,0] = x0\n", " num_sol[0,1] = v0\n", " \n", " for i in range(N-1):\n", " num_sol[i+1] = rk2_step(num_sol[i], springmass, dt)\n", "\n", " num_sol_time[j] = num_sol.copy()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true }, "outputs": [], "source": [ "error_values = numpy.empty_like(dt_values)\n", "\n", "for j, dt in enumerate(dt_values):\n", " \n", " error_values[j] = get_error(num_sol_time[j], dt)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot of convergence for modified Euler's\n", "fig = pyplot.figure(figsize=(6,6))\n", "\n", "pyplot.loglog(dt_values, error_values, 'ko-')\n", "pyplot.loglog(dt_values, 5*dt_values**2, 'k:')\n", "pyplot.grid(True)\n", "pyplot.axis('equal')\n", "pyplot.xlabel('$\\Delta t$')\n", "pyplot.ylabel('Error')\n", "pyplot.title('Convergence of modified Euler\\'s method (dotted line: slope 2)\\n');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The convergence plot, in this case, does look close to a slope-2 line. Modified Euler's method is second-order accurate: \n", "the effect of computing the derivatives (slope) at the midpoint of the time interval, instead of the starting point, is to increase the accuracy by one order!\n", "\n", "Using the derivatives at the midpoint of the time interval is equivalent to using the average of the derivatives at $t$ and $t+\\Delta t$: \n", "this corresponds to a second-order _Runge-Kutta method_, or RK2, for short.\n", "Combining derivatives evaluated at different points in the time interval is the key to Runge-Kutta methods that achieve higher orders of accuracy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What we've learned\n", "\n", "* vector form of the spring-mass differential equation\n", "* Euler's method produces unphysical amplitude growth in oscillatory systems\n", "* the Euler-Cromer method fixes the amplitude growth (while still being first order)\n", "* Euler-Cromer does show a phase lag after a long simulation\n", "* a convergence plot confirms the first-order accuracy of Euler's method\n", "* a convergence plot shows that modified Euler's method, using the derivatives evaluated at the midpoint of the time interval, is a second-order method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References\n", "\n", "1. Linge S., Langtangen H.P. (2016) Solving Ordinary Differential Equations. In: Programming for Computations - Python. Texts in Computational Science and Engineering, vol 15. Springer, Cham, https://doi.org/10.1007/978-3-319-32428-9_4, open access and reusable under [CC-BY-NC](http://creativecommons.org/licenses/by-nc/4.0/) license.\n", "\n", "2. Cromer, A. (1981). Stable solutions using the Euler approximation. _American Journal of Physics_, 49(5), 455-459. https://doi.org/10.1119/1.12478\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 26, "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 = '../style/custom.css'\n", "HTML(open(css_file, \"r\").read())" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }