From ae32666a229cf585a45c5501597e4e708a2d19f9 Mon Sep 17 00:00:00 2001 From: Michael Soukup Date: Sun, 16 Aug 2020 12:35:48 +0200 Subject: [PATCH] Produce plots and animations --- Duffing.ipynb | 1046 +++++ duffing-response.ipynb | 4069 +------------------ duffing-stuffing.ipynb | 85 +- duffing-stuffing2.ipynb | 344 ++ frequency-response/frequency-response-0.png | Bin 0 -> 25389 bytes frequency-response/frequency-response-1.png | Bin 0 -> 23559 bytes frequency-response/frequency-response-2.png | Bin 0 -> 22871 bytes frequency-response/frequency-response-3.png | Bin 0 -> 36676 bytes tsanim.py | 42 + 9 files changed, 1540 insertions(+), 4046 deletions(-) create mode 100644 Duffing.ipynb create mode 100644 duffing-stuffing2.ipynb create mode 100644 frequency-response/frequency-response-0.png create mode 100644 frequency-response/frequency-response-1.png create mode 100644 frequency-response/frequency-response-2.png create mode 100644 frequency-response/frequency-response-3.png create mode 100644 tsanim.py diff --git a/Duffing.ipynb b/Duffing.ipynb new file mode 100644 index 0000000..facce78 --- /dev/null +++ b/Duffing.ipynb @@ -0,0 +1,1046 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "import numpy as np\n", + "from scipy.integrate import odeint, quad\n", + "from scipy.optimize import brentq\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import animation, rc\n", + "import seaborn as sbs\n", + "#rc('font', **{'family': 'serif', 'serif': ['Computer Modern'], 'size': 20})\n", + "#rc('text', usetex=True)\n", + "#rc('animation', html='jshtml')\n", + "#plt.rcParams[\"animation.html\"] = \"jshtml\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def deriv(X, t, omega, gamma, alpha, delta, beta):\n", + " \"\"\"Return the derivatives dx/dt and d2x/dt2.\"\"\"\n", + " \n", + " #dVdx = lambda x: x**3 - x\n", + " x, xdot = X\n", + " xdotdot = gamma*np.cos(omega*t) - delta*xdot + alpha*x - beta*x*x*x\n", + " return xdot, xdotdot\n", + "\n", + "def solve_duffing(tmax, dt_per_period, t_trans, x0, v0, params):\n", + " \"\"\"Solve the Duffing equation for parameters gamma, delta, omega.\n", + " \n", + " Find the numerical solution to the Duffing equation using a suitable\n", + " time grid: tmax is the maximum time (s) to integrate to; t_trans is\n", + " the initial time period of transient behaviour until the solution\n", + " settles down (if it does) to some kind of periodic motion (these data\n", + " points are dropped) and dt_per_period is the number of time samples\n", + " (of duration dt) to include per period of the driving motion (frequency\n", + " omega).\n", + " \n", + " Returns the time grid, t (after t_trans), position, x, and velocity,\n", + " xdot, dt, and step, the number of array points per period of the driving\n", + " motion.\n", + " \n", + " \"\"\"\n", + " # Time point spacings and the time grid\n", + "\n", + " omega, gamma, alpha, delta, beta = params\n", + " period = 2*np.pi/omega\n", + " dt = 2*np.pi/omega / dt_per_period\n", + " step = int(period / dt)\n", + " t = np.arange(0, tmax, dt)\n", + " # Initial conditions: x, xdot\n", + " X0 = [x0, v0]\n", + " X = odeint(deriv, X0, t, args=params)\n", + " idx = int(t_trans / dt)\n", + " return t[idx:], X[idx:], dt, step" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the motion for a oscillator with initial position\n", + "# x0 and initially at rest.\n", + "x0, v0 = 1, 0.1\n", + "tmax, t_trans = 10000, 100\n", + "dt_per_period = 500\n", + "\n", + "omega = 1.0\n", + "gamma = 0.4\n", + "alpha = 1.0\n", + "delta = 0.1\n", + "beta = 1.0\n", + "\n", + "omega = 1.4\n", + "gamma, delta = 0.4, 0.1\n", + "\n", + "\n", + "params = (omega, gamma, alpha, delta, beta)\n", + "xs = []" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1102945,)\n", + "(1102945,)\n" + ] + } + ], + "source": [ + "# Solve the equation of motion.\n", + "params = (omega, gamma, alpha, delta, 0.01)\n", + "t, X, dt, pstep = solve_duffing(tmax, dt_per_period, t_trans, x0, v0, params)\n", + "x, xdot = X.T\n", + "xs.append(x)\n", + "print(t.shape)\n", + "print(x.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Solve the equation of motion.\n", + "#params = (omega, gamma, 1.2, delta, 0.1)\n", + "#t, X, dt, pstep = solve_duffing(tmax, dt_per_period, t_trans, x0, v0, params)\n", + "#x, xdot = X.T\n", + "#xs.append(x)\n", + "#print(t.shape)\n", + "#print(x.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1102945,)\n", + "(1102945,)\n" + ] + } + ], + "source": [ + "# Solve the equation of motion.\n", + "params = (omega, gamma, alpha, delta, 1.0)\n", + "t, X, dt, pstep = solve_duffing(tmax, dt_per_period, t_trans, x0, v0, params)\n", + "x, xdot = X.T\n", + "xs.append(x)\n", + "print(t.shape)\n", + "print(x.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def tsanim(tss):\n", + " \"Plot an array of time series data t, x = [ti], [xi].\"\n", + " nrows = len(tss)\n", + " fig, axes = plt.subplots(nrows=nrows, ncols=1)\n", + " tsmax = lambda ts: max(len(ts[0]), len(ts[1]))\n", + " ts_maxlen = max(map(tsmax, tss))\n", + " tinit = int(0.1*ts_maxlen)\n", + " print(\"Animate time series from t=%d with %d frames\" % (tinit, ts_maxlen))\n", + "\n", + " def tsplot(ax, ts):\n", + " t, x = ts\n", + " ax.set_ylabel(r'$x [\\mathrm{m}]$')\n", + " ax.set_ylim(np.min(x), np.max(x))\n", + " line, = ax.plot(t[:tinit], x[:tinit])\n", + " return line\n", + " \n", + " lines = list(map(lambda axts: tsplot(*axts), zip(axes, tss)))\n", + " axes[-1].set_xlabel(r'$t [\\mathrm{s}]$')\n", + "\n", + " def animate(i):\n", + " \"\"\"Update the image for iteration i of the Matplotlib animation.\"\"\"\n", + " for ax, line, ts in zip(axes, lines, tss):\n", + " t, x = ts\n", + " line.set_data(t[:i+1], x[:i+1])\n", + " ax.set_xlim(t_trans, t[i])\n", + " return\n", + "\n", + " #plt.tight_layout()\n", + " \n", + " #tmp\n", + " fig.suptitle(\"Duffing oscillator, beta = 0.01 (top) and 1.0 (bottom)\")\n", + " \n", + " anim = animation.FuncAnimation(fig, animate, frames=20000, interval=1)\n", + " return anim" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " event.shiftKey = false;\n", - " // Send a \"J\" for go to next cell\n", - " event.which = 74;\n", - " event.keyCode = 74;\n", - " manager.command_mode();\n", - " manager.handle_keydown(event);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], "source": [ "gamma = 1\n", "alpha = 1\n", @@ -847,812 +57,53 @@ " np.linspace(0, 2, 500)\n", ")\n", "\n", - "plt.figure()\n", - "for beta in (-0.3, 0.0, 1, 4):\n", + "betas = (-0.3, 0.0, 10)\n", + "for i, beta in enumerate(betas):\n", + " fig = plt.figure(i)\n", " G = right(gamma, alpha, beta*beta_mul, delta, z, omega)\n", " plt.contour(omega, z, (z-G), [0])\n", " plt.xlabel(\"$\\omega$\")\n", - " plt.ylabel(\"$z/\\gamma$\")" + " plt.ylabel(\"$z/\\gamma$\")\n", + " fig.suptitle(\"Frequency response, beta=\" + str(beta))\n", + " fig.savefig('frequency-response-%d.png' % i)\n", + "\n", + "fig = plt.figure(len(betas))\n", + "for beta in betas:\n", + " G = right(gamma, alpha, beta*beta_mul, delta, z, omega)\n", + " plt.contour(omega, z, (z-G), [0])\n", + " plt.xlabel(\"$\\omega$\")\n", + " plt.ylabel(\"$z/\\gamma$\")\n", + "fig.suptitle(\"Frequency response, beta=\" + ', '.join(map(str, betas)))\n", + "fig.savefig('frequency-response-%d.png' % len(betas))" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support.' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
')\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " event.shiftKey = false;\n", - " // Send a \"J\" for go to next cell\n", - " event.which = 74;\n", - " event.keyCode = 74;\n", - " manager.command_mode();\n", - " manager.handle_keydown(event);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Clipped\n", - "917\n", - "917\n" - ] - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support.' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
')\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " event.shiftKey = false;\n", - " // Send a \"J\" for go to next cell\n", - " event.which = 74;\n", - " event.keyCode = 74;\n", - " manager.command_mode();\n", - " manager.handle_keydown(event);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 100, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "f_resonance = 8e3\n", "omega_resonance = 2*np.pi*f_resonance\n", diff --git a/duffing-stuffing.ipynb b/duffing-stuffing.ipynb index 2658d15..010ea70 100644 --- a/duffing-stuffing.ipynb +++ b/duffing-stuffing.ipynb @@ -26,9 +26,9 @@ "c1 = 0.1\n", "c2 = 0.1\n", "c3 = 0.1\n", - "a1 = 0.1\n", - "a2 = 0.1\n", - "a3 = 0.1\n", + "a1 = 0.12\n", + "a2 = 0.05\n", + "a3 = 0.08\n", "k1 = 0.05\n", "k2 = 0.21\n", "k3 = 0.11\n", @@ -85,8 +85,8 @@ "outputs": [], "source": [ "# Set up the motion for a oscillator with initial positions and velocities\n", - "x0, v0 = (0.5, -0.5), (0.5, -0.1)\n", - "tmax, t_trans = 150, 0\n", + "x0, v0 = (-1, -2.5), (1.5, -0.1)\n", + "tmax, t_trans = 200, 0\n", "dt_per_period = 100" ] }, @@ -132,49 +132,67 @@ "outputs": [], "source": [ "%%capture\n", - "fig2, ((ax11, ax12), (ax21, ax22)) = plt.subplots(nrows=2, ncols=2)\n", + "fig2, ((ax11, ax12, ax13), (ax21, ax22, ax23)) = plt.subplots(nrows=2, ncols=3)\n", + "\n", + "#fig2.suptitle(\"Duffing\")\n", "\n", "# Positions\n", "ax11.set_xlabel(r'$x_1$')\n", "ax11.set_ylabel(r'$x_2$')\n", "ln11, = ax11.plot([], [])\n", - "ax11.set_xlim([np.min(x1), np.max(x1)])\n", - "ax11.set_ylim([np.min(x2), np.max(x2)])\n", + "ax11.set_xlim([1.2*np.min(x1), 1.2*np.max(x1)])\n", + "ax11.set_ylim([1.2*np.min(x2), 1.2*np.max(x2)])\n", "\n", "# Velocities\n", - "ax12.set_xlabel(r'$v_1$')\n", - "ax12.set_ylabel(r'$v_2$')\n", + "ax21.set_xlabel(r'$v_1$')\n", + "ax21.set_ylabel(r'$v_2$')\n", + "ln21, = ax21.plot([], [])\n", + "ax21.set_xlim([1.2*np.min(xd1), 1.2*np.max(xd1)])\n", + "ax21.set_ylim([1.2*np.min(xd2), 1.2*np.max(xd2)])\n", + "\n", + "# x1(t)\n", + "ax12.set_xlabel(r'$t$')\n", + "ax12.set_ylabel(r'$x_1$')\n", "ln12, = ax12.plot([], [])\n", - "ax12.set_xlim([np.min(xd1), np.max(xd1)])\n", - "ax12.set_ylim([np.min(xd2), np.max(xd2)])\n", + "ax12.set_xlim([t[0], t[-1]])\n", + "ax12.set_ylim([1.2*np.min(x1), 1.2*np.max(x1)])\n", + "\n", + "# x2(t)\n", + "ax22.set_xlabel(r'$t$')\n", + "ax22.set_ylabel(r'$x_2$')\n", + "ln22, = ax22.plot([], [])\n", + "ax22.set_xlim([t[0], t[-1]])\n", + "ax22.set_ylim([1.2*np.min(x2), 1.2*np.max(x2)])\n", "\n", "# Phase spaces\n", - "ax21.set_xlabel(r'$\\mathbf{x}$')\n", - "ax21.set_ylabel(r'$\\mathbf{v}$')\n", - "ln21a, = ax21.plot([], [])\n", - "ln21b, = ax21.plot([], [])\n", - "ax21.set_xlim([min(np.min(x1), np.min(x2)), max(np.max(x1), np.max(x2))])\n", - "ax21.set_ylim([min(np.min(xd1), np.min(xd2)), max(np.max(xd1), np.max(xd2))])\n", + "ax13.set_xlabel(r'$\\mathbf{x}$')\n", + "ax13.set_ylabel(r'$\\mathbf{v}$')\n", + "ln13a, = ax13.plot([], [])\n", + "ln13b, = ax13.plot([], [])\n", + "ax13.set_xlim([1.2*min(np.min(x1), np.min(x2)), 1.2*max(np.max(x1), np.max(x2))])\n", + "ax13.set_ylim([1.2*min(np.min(xd1), np.min(xd2)), 1.2*max(np.max(xd1), np.max(xd2))])\n", "\n", "# F(t)\n", "F1 = f1(t)\n", "F2 = f2(t)\n", - "ax22.set_xlabel(r'$t$')\n", - "ax22.set_ylabel(r'$\\mathbf{F}(t)$')\n", - "ln22a, = ax22.plot([], [])\n", - "ln22b, = ax22.plot([], [])\n", - "ax22.set_xlim([t[0], t[-1]])\n", - "ax21.set_ylim([min(np.min(F1), np.min(F2)), max(np.max(F1), np.max(F2))])\n", + "ax23.set_xlabel(r'$t$')\n", + "ax23.set_ylabel(r'$\\mathbf{F}(t)$')\n", + "ln23a, = ax23.plot([], [])\n", + "ln23b, = ax23.plot([], [])\n", + "ax23.set_xlim([t[0], t[-1]])\n", + "ax23.set_ylim([1.2*min(np.min(F1), np.min(F2)), 1.2*max(np.max(F1), np.max(F2))])\n", "\n", "plt.tight_layout()\n", "\n", "def animate(i):\n", " ln11.set_data(x1[:i], x2[:i])\n", - " ln12.set_data(xd1[:i], xd2[:i])\n", - " ln21a.set_data(x1[:i], xd1[:i])\n", - " ln21b.set_data(x2[:i], xd2[:i])\n", - " ln22a.set_data(t[:i], F1[:i])\n", - " ln22b.set_data(t[:i], F2[:i])\n", + " ln21.set_data(xd1[:i], xd2[:i])\n", + " ln12.set_data(t[:i], x1[:i])\n", + " ln22.set_data(t[:i], x2[:i])\n", + " ln13a.set_data(x1[:i], xd1[:i])\n", + " ln13b.set_data(x2[:i], xd2[:i])\n", + " ln23a.set_data(t[:i], F1[:i])\n", + " ln23b.set_data(t[:i], F2[:i])\n", " \n", "\n", "anim = animation.FuncAnimation(fig2, animate, frames=len(t), interval=100, repeat_delay=1000)" @@ -189,6 +207,15 @@ "anim" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anim.save('animations/coupled-duffing.mp4', writer='ffmpeg')" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/duffing-stuffing2.ipynb b/duffing-stuffing2.ipynb new file mode 100644 index 0000000..d1337ae --- /dev/null +++ b/duffing-stuffing2.ipynb @@ -0,0 +1,344 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "\n", + "import numpy as np\n", + "from scipy.integrate import odeint\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import animation\n", + "plt.rcParams[\"animation.html\"] = \"jshtml\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def deriv(X, t, gamma, delta, omega):\n", + " \"\"\"Return the derivatives dx/dt and d2x/dt2.\"\"\"\n", + " \n", + " x, xdot = X\n", + " xdotdot = -dVdx(x) -delta * xdot + gamma * np.cos(omega*t)\n", + " return xdot, xdotdot\n", + "\n", + "def solve_duffing(tmax, dt_per_period, t_trans, x0, v0, gamma, delta, omega):\n", + " \"\"\"Solve the Duffing equation for parameters gamma, delta, omega.\n", + " \n", + " Find the numerical solution to the Duffing equation using a suitable\n", + " time grid: tmax is the maximum time (s) to integrate to; t_trans is\n", + " the initial time period of transient behaviour until the solution\n", + " settles down (if it does) to some kind of periodic motion (these data\n", + " points are dropped) and dt_per_period is the number of time samples\n", + " (of duration dt) to include per period of the driving motion (frequency\n", + " omega).\n", + " \n", + " Returns the time grid, t (after t_trans), position, x, and velocity,\n", + " xdot, dt, and step, the number of array points per period of the driving\n", + " motion.\n", + " \n", + " \"\"\"\n", + " # Time point spacings and the time grid\n", + "\n", + " period = 2*np.pi/omega\n", + " dt = 2*np.pi/omega / dt_per_period\n", + " step = int(period / dt)\n", + " t = np.arange(0, tmax, dt)\n", + " # Initial conditions: x, xdot\n", + " X0 = [x0, v0]\n", + " X = odeint(deriv, X0, t, args=(gamma, delta, omega))\n", + " idx = int(t_trans / dt)\n", + " return t[idx:], X[idx:], dt, step" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the motion for a oscillator with initial position\n", + "# x0 and initially at rest.\n", + "x0, v0 = 0, 0\n", + "tmax, t_trans = 18000, 300\n", + "omega = 1.4\n", + "gamma, delta = 0.4, 0.1\n", + "dt_per_period = 100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Solve the equation of motion.\n", + "delta = 0.0\n", + "t, X, dt, pstep = solve_duffing(tmax, dt_per_period, t_trans, x0, v0, gamma, delta, omega)\n", + "x1, x1dot = X.T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Solve the equation of motion.\n", + "delta = 0.1\n", + "t, X, dt, pstep = solve_duffing(tmax, dt_per_period, t_trans, x0, v0, gamma, delta, omega)\n", + "x2, x2dot = X.T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m1 = 1\n", + "m2 = 1\n", + "c1 = 0.1\n", + "c2 = 0.1\n", + "c3 = 0.1\n", + "a1 = 0.12\n", + "a2 = 0.05\n", + "a3 = 0.08\n", + "k1 = 0.05\n", + "k2 = 0.21\n", + "k3 = 0.11\n", + "C1 = 0.15\n", + "C2 = 0.30\n", + "omega = 0.1\n", + "\n", + "f1 = lambda t: C1*np.cos(omega*t)\n", + "f2 = lambda t: C2*np.cos(omega*t)\n", + "\n", + "def deriv(X, t):\n", + " \"\"\"Return the derivatives dx/dt and d2x/dt2.\"\"\"\n", + " x1, x2, xd1, xd2 = X\n", + " F1 = f1(t)\n", + " F2 = f2(t)\n", + " xdd1 = F1 - xd1*(c1 + c2) + xd2*c2 - x1*(k1 + k2) + x2*k2 - a1*x1**3 + a2*(x2 - x1)**3\n", + " xdd2 = F2 - xd2*(c2 + c3) + xd1*c1 - x2*(k2 + k3) + x1*k2 - a3*x2**3 + a2*(x2 - x1)**3\n", + " return xd1, xd2, xdd1/m1, xdd2/m2\n", + "\n", + "\n", + "def solve_duffing(tmax, dt_per_period, t_trans, x0, v0):\n", + " \"\"\"Solve the Duffing equation with the standard odeint solver.\n", + " \n", + " Find the numerical solution to the Duffing equation using a suitable\n", + " time grid: tmax is the maximum time (s) to integrate to; t_trans is\n", + " the initial time period of transient behaviour until the solution\n", + " settles down (if it does) to some kind of periodic motion (these data\n", + " points are dropped) and dt_per_period is the number of time samples\n", + " (of duration dt) to include per period of the driving motion (frequency\n", + " omega).\n", + " \n", + " Returns the time grid, t (after t_trans), position, x, and velocity,\n", + " xdot, dt, and step, the number of array points per period of the driving\n", + " motion.\n", + " \n", + " \"\"\"\n", + " # Time point spacings and the time grid\n", + "\n", + " period = 2*np.pi/omega\n", + " dt = 2*np.pi/omega / dt_per_period\n", + " step = int(period / dt)\n", + " t = np.arange(0, tmax, dt)\n", + " # Initial conditions: x, xdot\n", + " X0 = x0 + v0\n", + " X = odeint(deriv, X0, t)\n", + " idx = int(t_trans / dt)\n", + " return t[idx:], X[idx:], dt, step" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the motion for a oscillator with initial positions and velocities\n", + "x0, v0 = (-1, -2.5), (1.5, -0.1)\n", + "tmax, t_trans = 200, 0\n", + "dt_per_period = 100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Solve the equation of motion.\n", + "t, X, dt, pstep = solve_duffing(tmax, dt_per_period, t_trans, x0, v0)\n", + "print(\"# samples: %d\" % len(t))\n", + "print(\"dt: %.4f\" % dt)\n", + "print(\"Steps per period: %d\" % pstep)\n", + "x1, x2, xd1, xd2 = X.T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig1, ((ax11, ax12), (ax21, ax22)) = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "ax11.plot(t, x1)\n", + "ax11.set_xlabel(r'$x_1$')\n", + "ax12.plot(t, x2)\n", + "ax12.set_xlabel(r'$x_2$')\n", + "ax21.plot(t, xd1)\n", + "ax21.set_xlabel(r'$v_1$')\n", + "ax22.plot(t, xd2)\n", + "ax22.set_xlabel(r'$v_2$')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "%%capture\n", + "fig2, ((ax11, ax12, ax13), (ax21, ax22, ax23)) = plt.subplots(nrows=2, ncols=3)\n", + "\n", + "#fig2.suptitle(\"Duffing\")\n", + "\n", + "# Positions\n", + "ax11.set_xlabel(r'$x_1$')\n", + "ax11.set_ylabel(r'$x_2$')\n", + "ln11, = ax11.plot([], [])\n", + "ax11.set_xlim([1.2*np.min(x1), 1.2*np.max(x1)])\n", + "ax11.set_ylim([1.2*np.min(x2), 1.2*np.max(x2)])\n", + "\n", + "# Velocities\n", + "ax21.set_xlabel(r'$v_1$')\n", + "ax21.set_ylabel(r'$v_2$')\n", + "ln21, = ax21.plot([], [])\n", + "ax21.set_xlim([1.2*np.min(xd1), 1.2*np.max(xd1)])\n", + "ax21.set_ylim([1.2*np.min(xd2), 1.2*np.max(xd2)])\n", + "\n", + "# x1(t)\n", + "ax12.set_xlabel(r'$t$')\n", + "ax12.set_ylabel(r'$x_1$')\n", + "ln12, = ax12.plot([], [])\n", + "ax12.set_xlim([t[0], t[-1]])\n", + "ax12.set_ylim([1.2*np.min(x1), 1.2*np.max(x1)])\n", + "\n", + "# x2(t)\n", + "ax22.set_xlabel(r'$t$')\n", + "ax22.set_ylabel(r'$x_2$')\n", + "ln22, = ax22.plot([], [])\n", + "ax22.set_xlim([t[0], t[-1]])\n", + "ax22.set_ylim([1.2*np.min(x2), 1.2*np.max(x2)])\n", + "\n", + "# Phase spaces\n", + "ax13.set_xlabel(r'$\\mathbf{x}$')\n", + "ax13.set_ylabel(r'$\\mathbf{v}$')\n", + "ln13a, = ax13.plot([], [])\n", + "ln13b, = ax13.plot([], [])\n", + "ax13.set_xlim([1.2*min(np.min(x1), np.min(x2)), 1.2*max(np.max(x1), np.max(x2))])\n", + "ax13.set_ylim([1.2*min(np.min(xd1), np.min(xd2)), 1.2*max(np.max(xd1), np.max(xd2))])\n", + "\n", + "# F(t)\n", + "F1 = f1(t)\n", + "F2 = f2(t)\n", + "ax23.set_xlabel(r'$t$')\n", + "ax23.set_ylabel(r'$\\mathbf{F}(t)$')\n", + "ln23a, = ax23.plot([], [])\n", + "ln23b, = ax23.plot([], [])\n", + "ax23.set_xlim([t[0], t[-1]])\n", + "ax23.set_ylim([1.2*min(np.min(F1), np.min(F2)), 1.2*max(np.max(F1), np.max(F2))])\n", + "\n", + "plt.tight_layout()\n", + "\n", + "def animate(i):\n", + " ln11.set_data(x1[:i], x2[:i])\n", + " ln21.set_data(xd1[:i], xd2[:i])\n", + " ln12.set_data(t[:i], x1[:i])\n", + " ln22.set_data(t[:i], x2[:i])\n", + " ln13a.set_data(x1[:i], xd1[:i])\n", + " ln13b.set_data(x2[:i], xd2[:i])\n", + " ln23a.set_data(t[:i], F1[:i])\n", + " ln23b.set_data(t[:i], F2[:i])\n", + " \n", + "\n", + "anim = animation.FuncAnimation(fig2, animate, frames=len(t), interval=100, repeat_delay=1000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anim" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anim.save('animations/coupled-duffing.mp4', writer='ffmpeg')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/frequency-response/frequency-response-0.png b/frequency-response/frequency-response-0.png new file mode 100644 index 0000000000000000000000000000000000000000..d5771bd2a5d4b6bfd5f619d8ca5a7e3bbd399c8b GIT binary patch literal 25389 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 O1>%(MIh`^LF8p6f@p5wj literal 0 HcmV?d00001 diff --git a/frequency-response/frequency-response-1.png b/frequency-response/frequency-response-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d45c1512a4cf7bb2aa81ca94668e90a2332bb19 GIT binary patch literal 23559 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 NKb*EXmf8E9{1cQ&ss;c6 literal 0 HcmV?d00001 diff --git a/frequency-response/frequency-response-3.png b/frequency-response/frequency-response-3.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc4d18ec7bf5e203c14f7d0f308fb7f87d73ae7 GIT binary patch literal 36676 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 b!V{X2&8IifJp