Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Content modified under Creative Commons Attribution license CC-BY 4.0, code under BSD 3-Clause License © 2020 R.C. Cooper"
]
},
{
"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": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"plt.rcParams.update({'font.size': 22})\n",
"plt.rcParams['lines.linewidth'] = 3"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"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",
"<img src=\"../images/spring-mass.png\" style=\"width: 400px;\"/> \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simple spring-mass system, without friction.\n",
"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](./02_Step_Future.ipynb) 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": 423,
"metadata": {},
"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 - w*w*x]^T\n",
" '''\n",
" \n",
" derivs = np.array([state[1], -w**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": 43,
"metadata": {},
"outputs": [],
"source": [
"w = 2\n",
"period = 2*np.pi/w\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": 44,
"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": 45,
"metadata": {},
"outputs": [],
"source": [
"t = np.linspace(0, T, N)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"x0 = 2 # initial position\n",
"v0 = 0 # initial velocity"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"#initialize solution array\n",
"num_sol = np.zeros([N,2])"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"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": 49,
"metadata": {},
"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": 67,
"metadata": {},
"outputs": [],
"source": [
"x_an = x0*np.cos(w * t)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# plot solution with Euler's method\n",
"fig = plt.figure(figsize=(6,4))\n",
"\n",
"plt.plot(t, num_sol[:, 0], linewidth=2, linestyle='--', label='Numerical solution')\n",
"plt.plot(t, x_an, linewidth=1, linestyle='-', label='Analytical solution')\n",
"plt.xlabel('Time [s]')\n",
"plt.ylabel('$x$ [m]')\n",
"plt.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",
"<img src=\"../images/two-euler-steps.png\" style=\"width: 500px;\"/> \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": {},
"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": 69,
"metadata": {},
"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 = np.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": 70,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The number of time steps is 160000.\n",
"The time increment is 0.015707963267948967\n"
]
}
],
"source": [
"w = 2\n",
"period = 2*np.pi/w\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 = np.linspace(0, T, N)\n",
"\n",
"x0 = 2 # initial position\n",
"v0 = 0 # initial velocity\n",
"\n",
"#initialize solution array\n",
"num_sol = np.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": 71,
"metadata": {},
"outputs": [],
"source": [
"x_an = x0*np.cos(w * t) # analytical solution"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"iend = 800 # in number of time steps\n",
"\n",
"fig = plt.figure(figsize=(6,4))\n",
"\n",
"plt.plot(t[:iend], num_sol[:iend, 0], linewidth=2, linestyle='--', label='Numerical solution')\n",
"plt.plot(t[:iend], x_an[:iend], linewidth=1, linestyle='-', label='Analytical solution')\n",
"plt.xlabel('Time [s]')\n",
"plt.ylabel('$x$ [m]')\n",
"plt.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": 73,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"istart = 400\n",
"\n",
"fig = plt.figure(figsize=(6,4))\n",
"\n",
"plt.plot(t[-istart:], num_sol[-istart:, 0], linewidth=2, linestyle='--', label='Numerical solution')\n",
"plt.plot(t[-istart:], x_an[-istart:], linewidth=1, linestyle='-', label='Analytical solution')\n",
"plt.xlabel('Time [s]')\n",
"plt.ylabel('$x$ [m]')\n",
"plt.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": 74,
"metadata": {},
"outputs": [],
"source": [
"dt_values = np.array([period/50, period/100, period/200, period/400])\n",
"T = 1*period\n",
"\n",
"num_sol_time = np.empty_like(dt_values, dtype=np.ndarray)\n",
"\n",
"\n",
"for j, dt in enumerate(dt_values):\n",
"\n",
" N = int(T/dt)\n",
" t = np.linspace(0, T, N)\n",
" \n",
" #initialize solution array\n",
" num_sol = np.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": 75,
"metadata": {},
"outputs": [],
"source": [
"def get_error(num_sol, T):\n",
" \n",
" x_an = x0 * np.cos(w * T) # analytical solution at final time\n",
" \n",
" error = np.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": 76,
"metadata": {},
"outputs": [],
"source": [
"error_values = np.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": 77,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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tfNOI5J3DY277ror6DVFopHWOMQxr732GkOGDPFPd+jQwbHQOHToEGPHjvWHxrhx49i/f3/Q64pEI61xiCPeeOMN7r77bv/0ZZddRmpqKpUqVXKkfunSpZk/fz6JiYns3buXjIwMRw73FYlGCg4JupEjRxbYLNS+fXvmz59P5cqVHe2jSpUqLFy4kAMHDujoKZGToE1VElRvv/22/3sSAO3atWPBggWOhMamTZuOGKtSpYpCQ+QkKTgkaEaPHs2//vUv//Qll1zCggULqFKlStBru91umjRpwieffBL0WiIljYJDgmLMmDHcdttt/umLLrqIhQsXUrVq1aDXnjhxIsnJyezcuZPExES++OKLoNcUKUkUHFLsxo4dy8CBA/3Tbdu2JS0tjWrVqjlSv02bNpx22mkAnHnmmTRr1syRuiIlhYJDitW4ceO45ZZb/Ie9tmnThvT0dKpXr+5YDy1atCAnJ4euXbuSmZmpfRoixUxHVUmx+eCDD7jpppv8odGqVSvS09OpUaOG4720aNGCefPmOV5XpCTQGocUi4kTJzJgwAB/aPzjH/8gIyPDkU/706ZNY/369UGvIyJeCg45aZMnT+aGG24gNzcXgJYtW5KZmcmpp54a9Nput5t+/foRGxur8BBxiIJDTsrUqVO57rrr/KFx3nnnkZmZSc2aNYNee82aNfzrX//CWssvv/yia2mIOETBISds+vTp9O/f3x8a5557LllZWdSqVcuR+vXr12fSpEmUKVOGVq1aMWrUKEfqipR02jkuJ2TmzJlcc801HDp0CICzzz6brKws/2GwTunduzepqalceOGFOnpKxCEKDgnY7Nmz6devnz80WrRoQXZ2NrVr1w56bWstxpgCY507dw56XRH5H22qkoB8+OGHXH311Rw8eBDwfsEuOzub008/Pei13W43ffr04cCBA0GvJSJHp+CQIktNTeWqq67yh0bz5s3xeDycccYZQa+ddxGmmTNn0rdvX4WHSAgpOKRI5s+fT+/evf1v2M2aNcPj8VCnTh1H6v/000/+74isWrWK3bt3O1JXRI6kfRxyXAsXLqRXr17+K+Y1bdoUj8dD3bp1HevhhRdewFqLx+MhIyPD0VOYiEhBCg45prS0NHr27OkPjcaNG+PxeKhXr56jfRhjePHFF9mzZ49jVw0UkcJpU5UcVUZGBj179uTvv/8GoFGjRng8HurXrx/02j/88MMRY8YYhYZIGFBwSKGysrLo3r07+/btA6BBgwZ4PB4aNmwY9Nput5uWLVvy4osvBr2WiAROwSFH8Hg8JCUl+UOjfv365OTk0KhRo6DXTklJITk5GWst999/P+PGjQt6TREJjIJDCli0aBHdunVj7969ANSrVw+Px0Pjxo0dqR8XF8fll18OQOvWrUlKSnKkrogUnYJD/D7++GO6du3Knj17AKhbty4ej4emTZs61kOlSpWYN28ed955p2OnZReRwOioKgHgk08+oUuXLv7QOOOMM/B4PCG57GqlSpV48803Ha8rIkWjNQ7hs88+o0uXLv4v1Z1++ul4PB6aN28e9Npjx47F4/EEvY6IFB8FRwm3ePFiEhMT2bVrFwC1a9fG4/Fw1llnBb222+3mlltu4YorrlB4iEQQBUcJ9sUXX9C5c2d27twJwGmnnYbH46FFixZBr717926eeOIJrLXs3buXxx57zH9KEREJbwqOEmrJkiUkJCSwY8cOAGrVqkV2djZnn322I/UrVapEVlYWdevWpXXr1sydO/eI06WLSHjSzvES6KuvviIhIYHt27cDULNmTbKysjj33HMd7aN58+YsWrSIGjVq6OgpkQii4ChhvvnmGzp16sS2bdsAOPXUU8nKyuL8888Peu19+/ZRoUKFAmNOHuorIsVDm6pKkP/7v/8jPj6erVu3AnDKKaeQmZlJy5Ytg1477zQia9asCXotEQkuBUcJ8d133xEfH8+WLVsAqFGjBpmZmVxwwQVBr513EaZff/0Vl8vF2rVrg15TRIJHwVECfP/993Ts2JHNmzcDUL16dTIyMmjVqpUj9WvVqkWZMt6totWqVSMmJsaRuiISHAqOKLd06VI6duzIpk2bAO8bd0ZGBm3atHGsh6SkJGbOnMkll1yi04iIRAEFRxT78ccfiYuLY+PGjQBUrVqV9PR02rZt63gvSUlJfPrppwoNkSig4IhSq1evJi4ujg0bNgBQpUoV0tPTueiii4Jee+HChf6LP+VXqpQWN5FooFdyFPr5558ZPHgwf/31FwCVK1cmLS2Niy++OOi13W43Xbt2pXfv3oWGh4hEPgVHlPnll19wuVz+o6cqVarEwoUL+ec//xn02l999ZX/Ikzz5s3jkUceCXpNEXGegiOK/Pbbb7hcLtavXw94Q2PBggW0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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# plot the solution errors with respect to the time incremetn\n",
"fig = plt.figure(figsize=(6,6))\n",
"\n",
"plt.loglog(dt_values, error_values, 'ko-') #log-log plot\n",
"plt.loglog(dt_values, 10*dt_values, 'k:')\n",
"plt.grid(True) #turn on grid lines\n",
"plt.axis('equal') #make axes scale equally\n",
"plt.xlabel('$\\Delta t$')\n",
"plt.ylabel('Error')\n",
"plt.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: $ error \\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": 221,
"metadata": {},
"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": 405,
"metadata": {},
"outputs": [],
"source": [
"dt_values = np.array([period/50, period/100, period/200,period/400,period/1000])\n",
"T = 1*period\n",
"\n",
"num_sol_time = np.empty_like(dt_values, dtype=np.ndarray)\n",
"\n",
"\n",
"for j, dt in enumerate(dt_values):\n",
"\n",
" N = int(T/dt)\n",
" t = np.linspace(0, T, N)\n",
" \n",
" #initialize solution array\n",
" num_sol = np.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": 406,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f4022498850>]"
]
},
"execution_count": 406,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(t,num_sol[:,0],'s')\n",
"plt.plot(t,x0*np.cos(w*t))"
]
},
{
"cell_type": "code",
"execution_count": 407,
"metadata": {},
"outputs": [],
"source": [
"error_values = np.empty_like(dt_values)\n",
"\n",
"for j, dt in enumerate(dt_values):\n",
" \n",
" error_values[j] = get_error(num_sol_time[j], T)"
]
},
{
"cell_type": "code",
"execution_count": 408,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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sVAVH004kPIsW7aMiRMnxtqjRo3yNb5zjq5du3LEEUfwxBNPqAiJ7Eaoio8mHEh5xowZw65duwDo3LkzHTt29DV+8ZGrly5dSt++fVm9erWv8UXCJlTFR6QsS5YsYdKkSbG236MegDVr1rDPPvsAOnK1SGWo+EjoxY96Tj/9dE499VTf+7jqqqv44osvyM3N1X49IpWgqdYSaosXL+bJJ5+MtYuPPJAIjRo1YujQoQmLLxImGvlIqOXm5lJUVATAGWecwa9//euAMxIRUPGREPv888/Jz8+PtRMxw23jxo2+xhSpLUJVfDTVWuLFj3rOOussTjnlFF/jRyIRcnJyyMvL44cffvA1tkjYhar4aKq1FPvss8946qmnYu1EjHpGjhzJunXrGDp0KLm5ub7GFwm7UBUfkWKjR4+OjXrOPvtsTjrpJF/jf//996xbtw6AzMxMBgwY4Gt8kbDTbDcJnU8//ZSnn3461k7Efj2NGzdm0aJF5Ofns2rVKu3XI1JFKj4SOqNHj46dvvrcc8+lQ4cOCemnbt26XH311QmJLRJ22uwmofLJJ58wZcqUWDuR+/WISPWp+EiojBo1KjbqOf/88znhhBN8jV98pAQRqRltdpPQWLhwIc8++2ys7feoxzlHx44dadeuHZ06dfI1tkhtE6qRj/bzqd3iJxZccMEFHHfccb7Gj0QivP322zzyyCP06tWLTZs2+RpfpDYJVfHRfj6110cffcTzzz8fayfit55XX301dvnss89mjz328L0PkdoiVMVHaq/4Uc9FF13EMccc43sf48aN4/XXX+eMM86gW7duvscXqU1UfCTtLViwgKlTp8baiZrhZmacdtppzJw5k/322y8hfYjUFio+kvbii03Xrl056qijgktGRCpFxUfS2gcffMBLL70Ua48YMSLAbESkslR8JK3Fj3ouvfRS2rdv72v86dOnc9555/H+++/7GlektlPxkbQ1f/58XnnlFcD7PcbvUU/xkaunT5/OiSeeyPjx432NL1KbqfhI2oof9fzud7+jXbt2vsb/6KOPmDdvHuAdufqCCy7wNb5IbRaqIxyYWRegS+vWrYNORRKsoKCAadOmAYkZ9QAcffTRfPLJJ+Tm5tKkSRMduVrER6EqPs65V4BXjj/++N5B5yKJFT/queyyy2jbtm1C+mnTpg2TJ0+OHS9ORPyhzW6S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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# plot of convergence for modified Euler's\n",
"fig = plt.figure(figsize=(6,6))\n",
"\n",
"plt.loglog(dt_values, error_values, 'ko-')\n",
"plt.loglog(dt_values, 5*dt_values**2, 'k:')\n",
"plt.grid(True)\n",
"plt.axis('equal')\n",
"plt.xlabel('$\\Delta t$')\n",
"plt.ylabel('Error')\n",
"plt.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": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# An implicit integration approach\n",
"\n",
"In the Modified Euler's method, which is a type of second order Runge-Kutta method, we increased the accuracy of the method by approximating the average slope over the time step. The Euler method assumes the slope is constant during each time step. We can increase accuracy the accuracy of our average slope with an _implicit_ *predictor-corrector approach*. \n",
"\n",
"Heun's method is an integration method that uses the same second order Runge Kutta method, but with one important distinction. It uses the actual derivative at the next state as part of its correction. \n",
"\n",
"$y_{i+1}=y_{i}+f(t_{i},y_{i}) \\Delta t$\n",
"\n",
"$y_{i+1}=y_{i}+\n",
"\\frac{f(t_{i},y_{i})+f(t_{i+1},y_{i+1})}{2} \\Delta t$\n",
"\n",
"The error is $ error \\propto \\Delta t^2.$ This is the same convergence as the Modified Euler's method. Let's compare the two methods. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Using Heun's method\n",
"\n",
"The problem with an _implicit_ method is that our unknown $\\mathbf{y}_{i+1}$ is on both sides of the equation. In an _explicit_ method (such as the Euler and Modified Euler) we estimate the next state, with an equation that is only based upon the current state as such\n",
"\n",
"$\\mathbf{y}_{i+1} = f(\\mathbf{y_{i}}),$\n",
"\n",
"but with an implicit method we have a nonlinear function where\n",
"\n",
"$\\mathbf{y}_{i+1} = g(\\mathbf{y}_{i},\\mathbf{y}_{i+1}). $\n",
"\n",
"This extra step introduces the topic of solving a nonlinear problem with a computer. How can we solve an equation if the value we want is also part of our function? We'll take a look at methods to solve this next module, but for now lets set a tolerance `etol` for the _implicit_ Heun method and see what the resulting solution is. \n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 416,
"metadata": {},
"outputs": [],
"source": [
"def heun_step(state,rhs,dt,etol=0.000001,maxiters = 100):\n",
" '''Update a state to the next time increment using the implicit Heun'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",
" etol : tolerance in error for each time step corrector\n",
" maxiters: maximum number of iterations each time step can take\n",
" \n",
" Returns\n",
" -------\n",
" next_state : array, updated after one time increment'''\n",
" e=1\n",
" eps=np.finfo('float64').eps\n",
" next_state = state + rhs(state)*dt\n",
" ################### New iterative correction #########################\n",
" for n in range(0,maxiters):\n",
" next_state_old = next_state\n",
" next_state = state + (rhs(state)+rhs(next_state))/2*dt\n",
" e=np.sum(np.abs(next_state-next_state_old)/np.abs(next_state+eps))\n",
" if e<etol:\n",
" break\n",
" ############### end of iterative correction #########################\n",
" return next_state"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Why use implicit methods?\n",
"\n",
"The __benefit__ of an implicit solution is that it is a __stable__ solution. When we solve a set of differential equations, many times it may not be apparent what time step to choose. If you use an _implicit_ integration method, then it may converge at the same rate as an _explicit_ method, but it will always provide bounded errors. \n",
"\n",
"Consider the spring-mass equation if timesteps are large, in this case we have 10 steps/time period, then the second order Runge-Kutta that we defined above has the same increasing error as the Euler method. "
]
},
{
"cell_type": "code",
"execution_count": 417,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The number of time steps is 80.\n",
"The time increment is 0.3141592653589793\n"
]
}
],
"source": [
"w = 2\n",
"period = 2*np.pi/w\n",
"dt = period/10 # time intervals per period \n",
"T = 8*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 = np.linspace(0, T, N)\n",
"\n",
"x0 = 2 # initial position\n",
"v0 = 0 # initial velocity\n",
"\n",
"#initialize solution array\n",
"num_heun = np.zeros([N,2])\n",
"num_rk2 = np.zeros([N,2])\n",
"\n",
"#Set intial conditions\n",
"num_heun[0,0] = x0\n",
"num_heun[0,1] = v0\n",
"num_rk2[0,0] = x0\n",
"num_rk2[0,1] = v0\n",
"\n",
"for i in range(N-1):\n",
" num_heun[i+1] = heun_step(num_heun[i], springmass, dt)\n",
" num_rk2[i+1] = rk2_step(num_rk2[i], springmass, dt)"
]
},
{
"cell_type": "code",
"execution_count": 418,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(t,num_heun[:,0],'o-',label='implicit Heun')\n",
"plt.plot(t,num_rk2[:,0],'s-',label='explicit RK2')\n",
"plt.plot(t,x0*np.cos(w*t))\n",
"plt.ylim(-8,8)\n",
"plt.legend();\n",
"#plt.xlim(np.max(t)-5,np.max(t))\n",
"#plt.xlim(np.max(t)-period,np.max(t))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discussion\n",
"\n",
"Change the number of steps per time period in the above solutions for the second order Runge Kutta and the implicit Heun's method. Why do you think the implicit method does not have an increasing magnitude of oscillation? "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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\n",
"* How to create an implicit integration method\n",
"* The difference between _implicit_ and _explicit_ integration\n",
"* The difference between stable and unstable methods"
]
},
{
"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",
"\n",
"3. Chapra, Steven, _Applied Numerical Methods with MATLAB for Engineers and Scientists_ 4th edition. ch. 22.3 Improvements to Euler's method\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Problems\n",
"\n",
"1. Show that the implicit Heun's method has the same second order convergence as the Modified Euler's method. _Hint: you can use the same code from above to create the log-log plot to get the error between $2\\cos(\\omega t)$ and the `heun_step` integration. Use the same initial conditions x(0) = 2 m and v(0)=0m/s and the same RHS function, `springmass`._"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"../images/damped-spring.png\" style=\"width: 400px;\"/> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. In the image above, we have a spring, mass, _and damper_. A damper is designed to slow down a moving object. These devices are typical in automobiles, mountain bikes, doors, any place where oscillations may not be desired, but motion is required. The new differential equation, if F(t)=0, that results from this addition is\n",
"\n",
"$\\ddot{x} = -\\frac{b}{m}\\dot{x} -\\frac{k}{m}x$\n",
"\n",
"or keeping our _natural frequency_ above, \n",
"\n",
"$\\ddot{x} = -\\zeta\\omega\\dot{x} -\\omega^2x$\n",
"\n",
"where $\\zeta$ is a new constant called the __damping ratio__ of a system. When $\\zeta\\gt 1$, there are no oscillations and when $0<\\zeta<1$ the system oscillates, but decays to v=0 m/s eventually. \n",
"\n",
"Create the system of equations that returns the right hand side (RHS) of the state equations, e.g. $\\mathbf{\\dot{y}} = f(\\mathbf{y}) = RHS$\n",
"\n",
"Use $\\omega = 2$ rad/s and $\\zeta = 0.2$."
]
},
{
"cell_type": "code",
"execution_count": 425,
"metadata": {},
"outputs": [],
"source": [
"def smd(state):\n",
" '''Computes the right-hand side of the spring-mass-damper\n",
" differential 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, zeta*w*v - w*w*x]^T\n",
" '''\n",
" ## your work here ##\n",
" \n",
" return derivs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"3. Use three methods to integrate your `smd` function for 3 time periods of oscillation ( $t=0...6\\pi$ ) and initial conditions x(0)=2 m and v(0)=0 m/s. Plot the three solutions on one graph with labels. \n",
"\n",
"a. Euler integration\n",
"\n",
"b. second order Runge Kutta method (modified Euler method)\n",
"\n",
"c. the implicit Heun's method\n",
"\n",
"How many time steps does each method need to converge to the same results? _Remember that each method has a certain convergence rate_"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"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.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}