{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Introduction to Python for biological circuits\n", "\n", "(c) 2019 Justin Bois and Michael Elowitz. With the exception of pasted graphics, where the source is noted, this work is licensed under a [Creative Commons Attribution License CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). All code contained herein is licensed under an [MIT license](https://opensource.org/licenses/MIT).\n", "\n", "This document was prepared at [Caltech](http://www.caltech.edu) with financial support from the [Donna and Benjamin M. Rosen Bioengineering Center](http://rosen.caltech.edu).\n", "\n", "\n", "\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Design principle\n", "- A cascade can filter out high frequency fluctuations.\n", "\n", "#### Techniques\n", "- Nondimensionalization.\n", "- Numerical solution of ODEs using `scipy.integrate.odeint()`.\n", "- Interactive plotting.\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Prior to executing this lesson, you should be sure to update the `biocircuits` module by doing the following on the command line.**\n", "\n", " pip install --upgrade biocircuits " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", " var JS_MIME_TYPE = 'application/javascript';\n", " var HTML_MIME_TYPE = 'text/html';\n", " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " var CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " var script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " var cell = handle.cell;\n", "\n", " var id = cell.output_area._bokeh_element_id;\n", " var server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd, {\n", " iopub: {\n", " output: function(msg) {\n", " var id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", "\n", " \n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " var el = document.getElementById(\"1001\");\n", " if (el != null) {\n", " el.textContent = \"BokehJS is loading...\";\n", " }\n", " if (root.Bokeh !== undefined) {\n", " if (el != null) {\n", " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", " }\n", " finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"1001\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.4.min.js\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.4.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.log(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.4.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.4.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.4.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import scipy.integrate\n", "\n", "import biocircuits\n", "\n", "import bokeh.application\n", "import bokeh.application.handlers\n", "import bokeh.io\n", "import bokeh.models\n", "import bokeh.plotting\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You have already installed [Anaconda](https://store.continuum.io/cshop/anaconda/) and have launched a Jupyter notebook. You have the tools you need to use your computer to analyze biological circuits. In this lesson, we will put these tools to use analyzing a genetic circuit." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Our model system\n", "\n", "As we learn how to use some Python-based tools for analysis of genetic circuits, we will learn an important design principle about *cascades*. A three-component cascade is illustrated below.\n", "\n", "\\begin{align}\n", "\\mathrm{X} \\to \\mathrm{Y} \\to \\mathrm{Z}\n", "\\end{align}\n", "\n", "Here, X is our input, which we will specify. X could be something like an externally imposed stimulus. We are interested in the response of Y and Z as a function of input X. We will expose the design principle that a cascade can filter out high frequency fluctuations. This makes sense intuitively. Imagine we have a brief pulse in X. Y will start to grow in concentration during the pulse, but will then fall back toward its basal level when the pulse stops. If there is not enough time for Y to accumulate enough to enhance production of Z, then the level of Z does not change appreciably. Thus, Z shows no response to a brief pulse." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The dynamical equations\n", "\n", "We will model the circuit more quantitatively by writing down a system of ordinary differential equations and solving them. We will assume Hill-like behavior for the activation of Y by X and of Z by Y. We also neglect leakage. We define the concentrations of X, Y, and Z, respectively as $x$, $y$, and $z$. The system of ODEs describing this system is then\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}y}{\\mathrm{d}t} &= \\beta_y\\,\\frac{(x/k_x)^{n_x}}{1+(x/k_x)^{n_x}} - \\gamma_y y, \\\\[1em]\n", "\\frac{\\mathrm{d}z}{\\mathrm{d}t} &= \\beta_z\\,\\frac{(y/k_y)^{n_y}}{1+(y/k_y)^{n_y}} - \\gamma_z z.\n", "\\end{align}\n", "\n", "Note that the imposed $x(t)$ is in general a function of time. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Nondimensionalization\n", "\n", "As is generally a good idea for analysis of these systems, we will **nondimensionalize** the dynamical equations. The variables and parameters in the problem have **dimension**. For example, $y$ has dimension of concentration, or number of particles per cubic length, written as\n", "\n", "\\begin{align}\n", "y = \\left[\\frac{N}{L^3}\\right].\n", "\\end{align}\n", "\n", "The parameter $\\gamma_y$ has dimension of inverse time, or $\\gamma_y = [T^{-1}]$. It is clear that each term in the dynamical equations has dimension of $N/L^3 T$. In general, every term in an equation must have the same dimension; trying to add, for example, a meter to a kilogram is nonsensical. \\\n", "\n", "The nondimensionalization procedure involves rewriting the equations such that every term is **dimensionless**, which means that every term has dimension of unity. We can do this by defining dimensionless parameters as follows.\n", "\n", "\\begin{align}\n", "\\tilde{t} &= \\gamma_y t, \\\\[2mm]\n", "\\tilde{x} &= x/k_x, \\\\[2mm]\n", "\\tilde{y} &= y/k_y, \\\\[2mm]\n", "\\tilde{z} &= z/k_y, \\\\[2mm]\n", "\\gamma &= \\gamma_z/\\gamma_y, \\\\[2mm]\n", "\\tilde{\\beta}_y &= \\frac{\\beta_y}{\\gamma_y k_y}, \\\\[2mm]\n", "\\tilde{\\beta}_z &= \\frac{\\beta_z}{\\gamma_z k_y}.\n", "\\end{align}\n", "\n", "Inserting these into the dynamical equations, our dimensionless ODEs are\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}\\tilde{y}}{\\mathrm{d}\\tilde{t}} &= \\tilde{\\beta}_y\\,\\frac{\\tilde{x}^{n_x}}{1+\\tilde{x}^{n_x}} - \\tilde{y}, \\\\[1em]\n", "\\gamma^{-1}\\,\\frac{\\mathrm{d}\\tilde{z}}{\\mathrm{d}\\tilde{t}} &= \\tilde{\\beta}_z\\,\\frac{\\tilde{y}^{n_y}}{1+\\tilde{y}^{n_y}} - \\tilde{z}.\n", "\\end{align}\n", "\n", "For notational convenience, and since we will always be working in dimensionless units, we will drop the tildes.\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}y}{\\mathrm{d}t} &= \\beta_y\\,\\frac{x^{n_x}}{1+x^{n_x}} - y, \\\\[1em]\n", "\\gamma^{-1}\\,\\frac{\\mathrm{d}z}{\\mathrm{d}t} &= \\beta_z\\,\\frac{y^{n_y}}{1+y^{n_y}} - z.\n", "\\end{align}\n", "\n", "Thus, in addition to the specifics of our input $x(t)$, we have five parameters, $\\beta_y$, $\\beta_z$, $\\gamma$, $n_x$, and $n_y$. Note that this is one fewer parameter than the original equations. Nondimensionalization typically results in a reduction of the number of parameters that vary independently." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The scipy.intergrate module\n", "\n", "**The [SciPy Library](https://docs.scipy.org/doc/scipy/reference/)** is a Python library for scientific computing. It contains many modules, including `scipy.stats`, `scipy.special`, and `scipy.optimize`, which respectively have functions to perform statistical calculations, special functions, and optimization. There are many more. We will use the `scipy.integrate` module to integrate systems of ODEs.\n", "\n", "There are three main APIs for solving real-valued initial value problems in the module. They are [`solve_ivp()`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html#scipy.integrate.solve_ivp), [`ode()`](https://scipy.github.io/devdocs/generated/scipy.integrate.ode.html#scipy.integrate.ode), and [`odeint()`](https://scipy.github.io/devdocs/generated/scipy.integrate.odeint.html#scipy.integrate.odeint). According to the SciPy developers, `solve_ivp()` is the preferred method, with the others labeled as having an \"old\" API. The `solve_ivp()` function has the flexibility of allowing choice of multiple numerical algorithms for solving ODEs. However, for the kinds of problems we encounter in this class, I find that the generic LSODA algorithm developed by Linda Petzold and Alan Hindmarsh that handles both stiff and non-stiff problems with variable time stepping is the best option. This is the only solver offered in the `odeint()` function. If we compare the two solvers, `solve_ivp()` and `odeint()`, the former has a large overhead, which can lead to performance issues for small problems (for large problems, this is not a big deal). Since most of our problems are small, we will use `odeint()`. It has much better performance, and though its API is different, it is still intuitive.\n", "The basic call signature for `odeint()` is\n", "\n", " scipy.integrate.odeint(func, y0, t, args=())\n", "\n", "There are many other keyword arguments to set algorithmic parameters, but we will generally not need them (and you can read about them in the [documentation](https://scipy.github.io/devdocs/generated/scipy.integrate.odeint.html#scipy.integrate.odeint)).\n", "Importantly, `func` is a vector-valued function with call signature `func(y, t, *args)` that specifies the right hand side of the system of ODEs to be solved. `t` is a scalar time point and `y` is a one-dimensional array (though multidimensional arrays are possible). `y0` is an array with the initial conditions.\n", "\n", "As is often the case, use of this function is best seen by example, and we will now apply it to the cascade circuit." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving for a constant input X\n", "\n", "We will first consider the case where we initially have no X, Y, or Z present. At time $t = 0$, we suddenly have a concentration of X of $x_0$. So, we need six parameters for the right hand side of our ODEs, $\\beta_y$, $\\beta_z$, $\\gamma$, $n_x$, $n_y$, and $x_0$.\n", "\n", "We now define the function for the right hand side of the ODEs." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def cascade_rhs(yz, t, beta_y, beta_z, gamma, n_x, n_y, x):\n", " \"\"\"\n", " Right hand side for cascade X -> Y -> Z. Return dy/dt and dz/dt.\n", " \"\"\"\n", " # Unpack y and z\n", " y, z = yz\n", " \n", " # Compute dy/dt\n", " dy_dt = beta_y * x**n_x / (1 + x**n_x) - y\n", " \n", " # Compute dz/dt\n", " dz_dt = gamma * (beta_z * y**n_y / (1 + y**n_y) - z)\n", " \n", " # Return the result as a NumPy array\n", " return np.array([dy_dt, dz_dt])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now define the initial conditions, our parameters, and the time points we want and use `scipy.integrate.odeint()` to solve." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Number of time points we want for the solutions\n", "n = 400\n", "\n", "# Time points we want for the solution\n", "t = np.linspace(0, 10, n)\n", "\n", "# Initial condition\n", "yz_0 = np.array([0.0, 0.0])\n", "\n", "# Parameters\n", "beta_y = 1.0\n", "beta_z = 1.0\n", "gamma = 1.0\n", "n_x = 2\n", "n_y = 2\n", "x_0 = 2.0\n", "\n", "# Package parameters into a tuple\n", "args = (beta_y, beta_z, gamma, n_x, n_y, x_0)\n", "\n", "# Integrate ODES\n", "yz = scipy.integrate.odeint(cascade_rhs, yz_0, t, args=args)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's it! The integration is done. We can now look at what `scipy.integrate.odeint()`'s output looks like." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(400, 2)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yz.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first column of the output `yz` gives $y(t)$ at the specified time points and the second column gives $z(t)$. We would now like to plot the results." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting results\n", "\n", "We will use [Bokeh](http://bokeh.pydata.org/) to plot the results. The syntax is pretty self-explanatory from the example below. Note that you can save a plot as a PNG by clicking the disk icon next to the plot, which might be helpful for incorporating your plots into your homeworks. (Note that for publications, you should usually save your figures in a vector graphics format, which [Bokeh supports](https://bokeh.pydata.org/en/latest/docs/user_guide/export.html), but is not necessary, and in fact discouraged, for display of plots in the browser.)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"02820925-6f38-4a2c-b695-2cc9e7ae90e5\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1011\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1016\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"id\":\"1015\",\"type\":\"Grid\"},{\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"id\":\"1020\",\"type\":\"Grid\"},{\"id\":\"1029\",\"type\":\"BoxAnnotation\"},{\"id\":\"1048\",\"type\":\"Legend\"},{\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"id\":\"1053\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1042\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1027\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1003\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1007\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1005\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1009\",\"type\":\"LinearScale\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1074\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1007\",\"type\":\"LinearScale\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1029\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"},{\"attributes\":{\"data_source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1037\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1038\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1040\",\"type\":\"CDSView\"}},\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"1044\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1012\",\"type\":\"BasicTicker\"}},\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1042\",\"type\":\"Title\"},{\"attributes\":{\"source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"}},\"id\":\"1040\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"BasicTicker\"},{\"attributes\":{\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1012\",\"type\":\"BasicTicker\"}},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1044\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"1046\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1017\",\"type\":\"BasicTicker\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{\"items\":[{\"id\":\"1049\",\"type\":\"LegendItem\"},{\"id\":\"1064\",\"type\":\"LegendItem\"}],\"location\":\"bottom_right\",\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"1048\",\"type\":\"Legend\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1017\",\"type\":\"BasicTicker\"}},\"id\":\"1020\",\"type\":\"Grid\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"1039\",\"type\":\"GlyphRenderer\"}]},\"id\":\"1049\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1038\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1051\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"AAAAAAAAAACfTUn+EFvLPi48/CnDwfo+lmWSjX4BFj+YKjmfDGgpP2StvY2+KDg/Qza4VbFRRD9IQaXBpGZPP28ndu93zVY/GFxXihuVXz8/ngfhShFlPxTVhweDRGs/hpRB4bY1cT/3OZrTjkV1P2PeAs9Z03k/iSZRPcjffj8CYjnmYDWCP6dmNnW9OYU/Bhr3Q0Z8iD8PaO7ZAPyLP4Q/5ee3t48/jMDwPADXkT8W4yRNou6TPwyc05rjIZY/af4BsdZvmD9HptyjgNeaPxE6jf7cV50/zmyJ297vnz8dSR0ROk+hPyxsFS9DsaI/Zh9WoH4dpD93SDHrX5OlP3CrmqtaEqc/Dfx5LuOZqD+iYRGSbymqP15DoG13wKs/Fh1lpXRerT/kJ2KQ4wKvP+jTT5+hVrA/ZE4H4oousT/8rdQn8AiyPzy2DreV5bI/EvUOiEHEsz/nHIdYu6S0PzoaO7HMhrU/2KrF6kBqtj+fvKY25U63P3PCsJGINLg/fNwUy/sauT9OV+OREQK6P0hkC1ee6bo/OOHXUHjRuz9uf3OAd7m8P3z++Zh1ob0/NvRF/E2Jvj8a7My83XC/P9O5ScMBLMA/TAAuzE+fwD+UN8jgSRLBPwIESqfhhME/SPnDfwn3wT8Oj76BtGjCP3YPvXPW2cI/visRxmNKwz+AsXuPUbrDP1rAC4aVKcQ/GVij+SWYxD8x8yzR+QXFP+dYIIIIc8U/ydoeC0rfxT+NXt7utkrGP66l9DVItcY/qSpWZPcexz/+XylyvofHP273TsiX78c/INUQQX5WyD/WYpAibbzIP0BjThRgIck/t2YnHVOFyT8OCFqiQujJPzDKeGcrSso/CMqlgAqryj8RH8lR3QrLP0mVe4yhacs/51W+M1XHyz+DMnWN9iPMP3Q7VCGEf8w/n2bytvzZzD/N4oZYXzPNP3ZvI0uri80/Xi7LB+DizT/0bUE7/TjOP/snkMsCjs4/WooZzvDhzj/QUxOCxzTPP74hrlCHhs8/+fukyjDXzz/bgiZTYhPQP6eMeuKhOtA/VgZIlVdh0D+o/5r9g4fQP8jt6r0nrdA/hsSbiEPS0D9NkxYf2PbQP+tfp0nmGtE/IV4j3W4+0T8phZK6cmHRPw8w3szyg9E/oUelCPCl0T+v185ua8fRP1Dn9Qdm6NE/niPl5OAI0j9xHH4e3SjSP0f3GdRbSNI/1dhCKV5n0j8aLaJI5YXSP0PDN2Lyo9I/58/QqobB0j+jNJxbo97SPzv4u7FJ+9I/Xl3V7XoX0z969bNTODPTP9VM7imDTtM/xYuKuVxp0z/F27NNxoPTP3l1cjPBndM/SA5nuU630z+gT3AvcNDTP3rdseUm6dM/jT8lLXQB1D8SWzdXWRnUP07veLXXMNQ/875gmfBH1D8dIAlUpV7UP4sjGDb3dNQ/ZBaLj+eK1D8ujI2vd6DUP3XF+eOotdQ/b5E+eXzK1D9vE7u6897UP4yfXfIP89Q/rOmJaNIG1T8v6AJkPBrVP6Jd2ClPLdU/uFRr/AtA1T8TzDMbdFLVP5ofSMSIZNU/R9h6M0t21T+BzEmivIfVP1Ez0UfemNU/WG/BWLGp1T+TnMYGN7rVP+ikOoBwytU/ShxT8V7a1T9zN4SDA+rVPydEd11f+dU/v4QFo3MI1j/UHjV1QRfWP4I3zPHJJdY/Qa71Mg401j/PQVhQD0LWP8DFlV7OT9Y/asZFb0xd1j/0efWQimrWP8o5Kc+Jd9Y/p40SMkuE1j8IcTO+z5DWPx9fUXUYndY/4SARViap1j9uu/Nb+rTWP/x2WX+VwNY/jv2FtfjL1j/pH3rwJNfWP9Ryrh4b4tY/vT66K9zs1j8KKhgAaffWP2ZdJoHCAdc/8EAskekL1z89CGEP3xXXPyJO0tejH9c/wZcgwzgp1z814BannjLXP6oMfFbWO9c/3q4ToeBE1z/DHaVTvk3XP0odAzhwVtc/r0P/FPde1z8fNTWuU2fXPx/Qf8SGb9c/q8nbFZF31z/Tqmldc3/XP5fjdVMuh9c/Q0KBrcKO1z8lKEMeMZbXPzVVcFV6ndc/YxsWAJ+k1z/ji5jIn6vXP1ytrVZ9stc/+81lTzi51z81FTRV0b/XP3am9gdJxtc/ZZ7VBKDM1z8L2mvm1tLXP1+C4UTu2Nc/5qLjtebe1z+1gqzMwOTXP4EjDBp96tc/uOZwLBzw1z9RG9yPnvXXP54R5s0E+9c/4DvrbU8A2D8jpAH1fgXYP+rqAOaTCtg/eH2KwY4P2D863xEGcBTYPytR3S84Gdg/LvH7uOcd2D9P7HAZfyLYP2iGLsf+Jtg/uGQcNmcr2D91VR/YuC/YP5EcIR30M9g/JkoWcxk42D/aIPZFKTzYP+ov1/8jQNg/SifzCApE2D+gbqvH20fYP7R1kKCZS9g/JAFp9kNP2D+59T8q21LYP/o1QZtfVtg/WZYBp9FZ2D9vDVypMV3YPwp5g/x/YNg/rzUJ+bxj2D8StuP16GbYP5UadUgEatg/KvmKRA9t2D9GQGY8CnDYPzkJzID1ctg/DCQGYdF12D+wk+kqnnjYP00N3Spce9g/mXffqwt+2D8pao73rIDYP9TXH1ZAg9g/4G9aDsaF2D+DvcdlPojYP/kBp6Cpitg/KmjyAQiN2D90O2XLWY/YP3Aegj2fkdg/v0GZl9iT2D+wY8IXBpbYP26Bt/onmNg/MXcsfD6a2D8XV7rWSZzYP42W30NKntg/csgF/D+g2D80V4c2K6LYP/U+tSkMpNg/x4rWCuOl2D+oHfINsKfYP8EHKWZzqdg/2y+vRS2r2D+rc8Pd3azYPzLStF6Frtg/HZbn9yOw2D8mgNrXubHYPzY+KixHs9g/E8BZIcy02D+VFhbjSLbYPwc7Spy9t9g/1+8Mdyq52D+tVKWcj7rYP4Z6jzXtu9g/zPeAaUO92D+uem1fkr7YP+wgYT3av9g/2LOYKBvB2D8dnrNFVcLYP2tQmriIw9g/OVGCpLXE2D+ITPIr3MXYP6sjxnD8xtg/Av0ylBbI2D8WrKq2KsnYPzd+z/c4ytg/YAjSdkHL2D9qvUdSRMzYP0lXLahBzdg/sIvqlTnO2D+xwFU4LM/YP2PBt6sZ0Ng/gXLPCwLR2D8Qh9Vz5dHYPwkIPf7D0tg/uoW6xJ3T2D8c6cbgctTYP5dPWmtD1dg/YJPufA/W2D+OZ4It19bYPzF0nJSa19g/bXJOyVnY2D+NSDjiFNnYPx0mi/XL2dg/HnrMGH/a2D98PfhgLtvYP0Oc0OLZ29g/p4mtsoHc2D8jY3/kJd3YP+2T0YvG3dg/cDjNu2Pe2D+/wTuH/d7YPw6ZiQCU39g/BGzIOSfg2D+6FG5Et+DYP03sjTFE4dg/L1UJEs7h2D8Ml2r2VOLYP4IU5+7Y4tg/4oBhC1rj2D/oFWxb2OPYP3jJSu5T5Ng/VoP10szk2D+AGRkYQ+XYP5QN28u25dg/Eqwc/Cfm2D9AzpG2lubYP3wopwgD59g/vyOE/2zn2D8Ztwyo1OfYPzRB4w466Ng/02FqQJ3o2D9S08ZI/ujYPxLkujNd6dg/MO8PDbrp2D/wzcvfFOrYPxEBDLdt6tg/ERGzncTq2D9bUWqeGevYP1Obo8Ns69g/QgGbF77r2D8meVikDezYP2V/sXNb7Ng//KxGj6fs2D9AV1IA8uzYP5uM88867dg/Z98mB4Lt2D9eYLmux+3YP62rSc8L7tg/S+pIcU7u2D+Xx/ucj+7YPy1be1rP7tg/Awe2sQ3v2D/ASXCqSu/YP1uFRUyG79g/9LmonsDv2D8FXN6o+e/YP9sg+3Ex8Ng/onf1AGjw2D+w8JxcnfDYP3Z0movR8Ng/M55wlATx2D/wCXx9NvHYP9uV80xn8dg/9pboCJfx2D8kAUe3xfHYP4eC1V3z8dg/PpI1AiDy2D988+upS/LYP9Qaulp28tg/d2AXGqDy2D+kkUbtyPLYP+o0bdnw8tg/mP+T4xfz2D/pRKcQPvPYP/Jed2Vj89g/WRG55ofz2D/L5QWZq/PYPzOC3IDO89g/u/igovDz2D+IEZ0CEvTYP25EE6Uy9Ng/7EdAjlL02D8tCDPCcfTYP0Wn40SQ9Ng/CDQ0Gq702D+lD/FFy/TYP0tP0cvn9Ng/4xl3rwP12D/WAXD0HvXYP+paNZ459dg/KIwssFP12D/YXactbfXYP+a05RmG9dg/sooieJ712D+6N4BLtvXYP6epDJfN9dg/7q/EXeT12D8=\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1074\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1073\",\"type\":\"UnionRenderers\"}},\"id\":\"1050\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1052\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"PanTool\"},{\"attributes\":{\"data_source\":{\"id\":\"1050\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1051\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1052\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1054\",\"type\":\"CDSView\"}},\"id\":\"1053\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1050\",\"type\":\"ColumnDataSource\"}},\"id\":\"1054\",\"type\":\"CDSView\"},{\"attributes\":{\"overlay\":{\"id\":\"1029\",\"type\":\"BoxAnnotation\"}},\"id\":\"1023\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1062\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"ResetTool\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"1053\",\"type\":\"GlyphRenderer\"}]},\"id\":\"1064\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"HelpTool\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1062\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1061\",\"type\":\"UnionRenderers\"}},\"id\":\"1036\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null},\"id\":\"1005\",\"type\":\"DataRange1d\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1021\",\"type\":\"PanTool\"},{\"id\":\"1022\",\"type\":\"WheelZoomTool\"},{\"id\":\"1023\",\"type\":\"BoxZoomTool\"},{\"id\":\"1024\",\"type\":\"SaveTool\"},{\"id\":\"1025\",\"type\":\"ResetTool\"},{\"id\":\"1026\",\"type\":\"HelpTool\"}]},\"id\":\"1027\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1073\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1061\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null},\"id\":\"1003\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"02820925-6f38-4a2c-b695-2cc9e7ae90e5\",\"roots\":{\"1002\":\"c8880125-f049-4cba-9643-9cd7a4dac47f\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1002" } }, "output_type": "display_data" } ], "source": [ "# Set up color palette for this notebook\n", "colors = bokeh.palettes.d3['Category10'][10]\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# Set up plot\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y')\n", "p.line(t, z,line_width=2, color=colors[1], legend='z')\n", "\n", "# Place the legend\n", "p.legend.location = 'bottom_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the casacade acts as a delay for changes in $z$ as a result of input $x$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interactive plotting and varying parameters\n", "\n", "Plotting with Bokeh in Jupyter notebooks allows for interactivity with plots that can help to rapidly gain insights about how parameter values might affect the dynamics. We have found that this is a useful tool to rapidly explore parameter dependence on circuit behavior. We will construct an interactive plot for the cascade circuit to demonstrate how it is done.\n", "\n", "To make an interactive plot in Bokeh, there are three major components.\n", "\n", "1. The **widgets**. Widgets for parameter values are primarily **sliders**, which enable you to vary parameter values by clicking and dragging. We will also make use of a **toggle**, which is a pushbutton whose `True`/`False` state dictates a feature of the plot.\n", "2. The **callback function**. This is a function that is executed whenever a widget changes value. Most of the time, we use it to update the **`ColumnDataSource`** of the plot. A `ColumnDataSource` is a Bokeh object that dictates where the glyphs are placed on the plot. You may have more than one callback functions for different sliders, toggles, and also changes in the range of the axis of the plot due to zooming.\n", "3. The **function handler**. The Bokeh object takes a Python function and uses it to make a plot. The function you provide sets up the entire plot, including the callbacks.\n", "\n", "We will start by setting up the widgets, starting with sliders. For response of the cascade circuit to the sudden presence of X, there are six parameters. For each slider, we need to specify the following.\n", "\n", "|property |description|\n", "|:----|:-----|\n", "|`title` | Title of slider, essentially the name of the variable|\n", "|`start`| Lower bound on the slider values |\n", "|`end`| Upper bound on the slider values |\n", "|`step`| Step size for the slider, going from `start` to `end`|\n", "|`value`| Initial value of the slider |\n", "\n", "It is convenient to store the properties of the parameters as a tuple of objects with attributes. To do this, we set up a generic class, which we will call an `AttributeContainer`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Generic class to hold attributes\n", "class AttributeContainer(object):\n", " def __init__(self, **kw):\n", " self.__dict__ = kw\n", "\n", "# Parameters for each slider\n", "slider_params = (AttributeContainer(title='log₁₀ βy', start=-1, end=2, value=0, step=0.1),\n", " AttributeContainer(title='log₁₀ βz', start=-1, end=2, value=0, step=0.1),\n", " AttributeContainer(title='log₁₀ γ', start=-1, end=2, value=0, step=0.1),\n", " AttributeContainer(title='nx', start=1, end=10, value=2, step=0.1),\n", " AttributeContainer(title='ny', start=1, end=10, value=2, step=0.1),\n", " AttributeContainer(title='log₁₀ x₀', start=-1, end=2, value=np.log10(2), step=0.1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have chosen to vary the parameters $\\beta_y$, $\\beta_z$, $\\gamma$, and $x_0$ on a logarithmic scale. The ordering of the parameters in the tuple is important, since this is the ordering that is expected by the callback function. We can also define Boolean inputs for the plot that will be included as toggles. For our interactive plot of the cascade dynamics, we will have a single toggle that determines whether or not the concentrations of the respective species are normalized such that their maximum value is unity. We specify this again as a tuple of dictionaries (in this case a 1-tuple). The dictionary contains the name of the toggle and its initial value." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "toggle_params = (AttributeContainer(title='normalize', active=False),)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now turn our attention to the callback function. The callback function for a slider must have call signature `callback_function(attr, old, new)`. For reasons that will become clear in a moment, we should limit the scope of the callback function to be within the function we will pass to the function handler. This is as simple as defining a function that calls a user-supplied callback function with the necessary arguments. It looks like this:\n", "\n", "```python\n", "def _callback(attr, old, new):\n", " supplied_callback(source=source, \n", " x_range=p.x_range, \n", " y_range=p.y_range, \n", " sliders=sliders, \n", " toggles=toggles, \n", " *extra_args)\n", "```\n", "\n", "In our interactive plot, it is important to note that the function `supplied_callback` function has the call signature shown above. It takes as input a `ColumnDataSource`, the `x_range` and `y_range` of the plot, a tuple of arguments from the sliders, a tuple of arguments from the toggles, and finally any extra arguments it needs. Its main purpose is to update the `ColumnDataSource` according to the inputs from the sliders, toggles, range of the x-axis, and any extra arguments it needs. For the callback for the cascade system, or for any plot that is the solution to a system of ODEs, the `extra_args` contain the right-hand side of the ODEs (`cascade_rhs`), the initial conditions (`yz_0`), and the number of time points to consider (`n`). Here is the supplied callback for the cascade system." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "extra_args = (cascade_rhs, yz_0, n)\n", "\n", "def cascade_callback(source, x_range, y_range, sliders, toggles, cascade_rhs, yz_0, n):\n", " # Set up time values, keeping minimum at zero\n", " t = np.linspace(0, x_range.end, n)\n", " \n", " # Convert logarithmic sliders\n", " slider_args = tuple(10**slider.value if 'log' in slider.title else slider.value \n", " for slider in sliders)\n", "\n", " # Integrate ODES\n", " yz = scipy.integrate.odeint(cascade_rhs, yz_0, t, args=slider_args)\n", "\n", " # Normalize if desired\n", " if toggles[0].active:\n", " yz[:,0] /= yz[:,0].max()\n", " yz[:,1] /= yz[:,1].max()\n", "\n", " # Update data source\n", " y, z = yz.transpose()\n", " source.data['t'] = t\n", " source.data['y_vals'] = y\n", " source.data['z_vals'] = z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have our callback function, we can use it to generate our plot. We need to write a function to do this because when we build the interactive plot, the plot objects we create have to be self-containing in a function we pass to the `FunctionHandler`. The function must return both a Bokeh figure, and a `ColumnDataSource` for the figure. Given the function we will write for making the interactive plot, the function must have the call signature shown below." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def cascade_plot(callback, sliders, toggles, extra_args):\n", " # Set up plot\n", " p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", " # Set up empty data source\n", " source = bokeh.models.ColumnDataSource()\n", "\n", " # Populate glyphs\n", " p.line('t', 'y_vals', source=source, line_width=2, color=colors[0], legend='y')\n", " p.line('t', 'z_vals', source=source, line_width=2, color=colors[1], legend='z')\n", "\n", " # Place the legend\n", " p.legend.location = 'bottom_right'\n", "\n", " # Update data according to callback\n", " callback(source, bokeh.models.Range1d(0, 10), None, \n", " sliders, toggles, *extra_args)\n", "\n", " return p, source" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The base plot looks good, and now we are ready to make it interactive. One important note in making it interactive: If you want the range of the x-axis (in this case, time) to change upon zooming, you need to set the padding of the `x_range` and `y_range` to zero, using `p.x_range.range_padding = 0`. Otherwise, if the callback function resets the x-values of the plot every time the x-range is changed, Bokeh will then pad the x-range. But this means the x-range was changed, so the callback function will reset the x-values, Bokeh will pad it, and so on ad infinitum." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def interactive_xy_plot(base_plot, callback, slider_params, toggle_params, extra_args):\n", " \"\"\"Build an interactive x-y plot app.\"\"\"\n", " \n", " def _plot_app(doc):\n", " # Build the initial plot and data source\n", " p, source = base_plot(callback, slider_params, toggle_params, extra_args)\n", " \n", " # Make sure axis ranges have no padding\n", " if type(p.x_range) == bokeh.models.ranges.Range1d:\n", " start, end = p.x_range.start, p.x_range.end\n", " p.x_range = bokeh.models.ranges.DataRange1d(p.x_range)\n", " p.x_range.start = start\n", " p.x_range.end = end\n", " if type(p.y_range) == bokeh.models.ranges.Range1d:\n", " start, end = p.y_range.start, p.y_range.end\n", " p.y_range = bokeh.models.ranges.DataRange1d(p.y_range)\n", " p.y_range.start = start\n", " p.y_range.end = end\n", " p.x_range.range_padding = 0\n", " p.y_range.range_padding = 0\n", " \n", " # Callbacks\n", " def _callback(attr, old, new):\n", " callback(source, p.x_range, p.y_range, sliders, toggles, \n", " *extra_args)\n", "\n", " # Callback for the toggle with required call signature\n", " def _callback_toggle(new):\n", " _callback(None, None, new)\n", " \n", " # Set up sliders\n", " sliders = tuple(bokeh.models.Slider(start=param.start,\n", " end=param.end,\n", " value=param.value,\n", " step=param.step,\n", " title=param.title)\n", " for param in slider_params)\n", " for slider in sliders:\n", " slider.on_change('value', _callback)\n", "\n", " # Set up toggles\n", " toggles = tuple(bokeh.models.Toggle(label=param.title) for param in toggle_params)\n", " for toggle in toggles:\n", " toggle.on_click(_callback_toggle)\n", " \n", " # Execute callback upon changing axis values\n", " p.x_range.on_change('start', _callback)\n", " p.x_range.on_change('end', _callback)\n", " p.y_range.on_change('start', _callback)\n", " p.y_range.on_change('end', _callback)\n", " \n", " # Add the plot to the app\n", " widgets = bokeh.layouts.widgetbox(*sliders, *toggles)\n", " doc.add_root(bokeh.layouts.column(widgets, p))\n", "\n", " handler = bokeh.application.handlers.FunctionHandler(_plot_app)\n", " return bokeh.application.Application(handler)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are now finally ready to build our app and interact with it. When showing the interactive app in JupyterLab, you should specify the URL of the notebook. It is almost always `'localhost:8888'`, but it may have a different port (for example `'localhost:8889'`) if you have more than one instance of JupyterLab running. \n", "\n", "*Note: The plot will not display nor be interactive in the HTML version of this notebook; it will only be interactive in a live JupyterLab session. This is because Python functions are being called to update the plot. If you want interactivity in a notebook rendered into HTML, the interactions must be pure JavaScript.*" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.bokehjs_exec.v0+json": "", "text/html": [ "\n", "" ] }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "server_id": "1636e74f0b3d469d8bf4743512ac6771" } }, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "ERROR:bokeh.server.protocol_handler:error handling message Message 'PATCH-DOC' (revision 1) content: {'events': [{'kind': 'ModelChanged', 'model': {'type': 'DataRange1d', 'id': '1144'}, 'attr': 'start', 'new': 0}], 'references': []}: TypeError(\"unsupported operand type(s) for *: 'NoneType' and 'float'\")\n" ] } ], "source": [ "# Build the interactive plotting app\n", "app = interactive_xy_plot(cascade_plot, cascade_callback, \n", " slider_params, toggle_params, extra_args)\n", "\n", "# Show the app\n", "notebook_url = 'localhost:8888'\n", "bokeh.io.show(app, notebook_url=notebook_url)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Importantly, when exploring the plot interactively, we see that when Y cooperatively activates Z (that is, $n_y$ is large), the delay is longer. The delay is also naturally longer as $\\gamma$ gets small. This makes sense, since $\\gamma$ is the ratio of the decay rate of Z to that of Y. As we saw in the previous lesson, the decay rate sets the speed of the response, and if Z decays more slowly than Y, its dynamics will be slower." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A short aside on interactive plots and Hill functions\n", "\n", "The process of building the interactive plot may have seemed like a lot of steps. However, if we look back at what we did to build it, we did the following.\n", "\n", "1. Specify the sliders and toggles as tuples of `AttributeContainer` instances.\n", "2. Specify the callback function.\n", "3. Specify the function to build the plot.\n", "4. Use the `interactive_xy_plot()` to build the app.\n", "5. Show the app.\n", "\n", "You pretty much do steps 2, 3, and 4 whenever you make any plot. You just need to be sure to specify a `ColumnDataSource` in the case of interactive plots. Step 1 is necessary to specify what you want to have control of with your widgets. The only other step is step 4. But the function we wrote is general, and can work for any x-y plot with any callbacks. So, we can reuse the `interactive_xy_plot()` function whenever we need to make an interactive plot. Now that we have gone through building this function, we can use it whenever we like. It is included in the `biocircuits` package, as is the `AttributeContainer` class.\n", "\n", "To investigate, we can look at how tuning the Hill coefficient and Hill $k$ values affect the shape of a Hill function." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.bokehjs_exec.v0+json": "", "text/html": [ "\n", "" ] }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "server_id": "fa44aa72e36c485896c24ae335f57859" } }, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "ERROR:bokeh.server.protocol_handler:error handling message Message 'PATCH-DOC' (revision 1) content: {'events': [{'kind': 'ModelChanged', 'model': {'type': 'DataRange1d', 'id': '1468'}, 'attr': 'start', 'new': 0}], 'references': []}: TypeError(\"unsupported operand type(s) for *: 'NoneType' and 'float'\")\n" ] } ], "source": [ "slider_params = (biocircuits.AttributeContainer(title='k', start=0.1, \n", " end=10, value=1, step=0.05),\n", " biocircuits.AttributeContainer(title='n', start=1, \n", " end=10, value=1, step=0.1))\n", "\n", "extra_args = (400,)\n", "\n", "\n", "def hill_callback(source, x_range, y_range, sliders, toggles, n_points):\n", " # Set up x values, keeping minimum at zero\n", " x = np.linspace(0, x_range.end, n_points)\n", " \n", " # Pull out slider values\n", " k = sliders[0].value\n", " n = sliders[1].value\n", " \n", " # Compute Hill function\n", " source.data['x'] = x\n", " source.data['y'] = (x/k)**n / (1 + (x/k)**n)\n", "\n", "\n", "def hill_plot(callback, sliders, toggles, extra_args):\n", " # Set up plot\n", " p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='x',\n", " y_axis_label='f(x;k,n)')\n", "\n", " # Set up empty data source\n", " source = bokeh.models.ColumnDataSource()\n", "\n", " # Populate glyphs\n", " p.line('x', 'y', source=source, line_width=2)\n", "\n", " # Update data according to callback\n", " callback(source, bokeh.models.Range1d(0, 10), None, \n", " sliders, toggles, *extra_args)\n", "\n", " return p, source\n", "\n", "hill_app = biocircuits.interactive_xy_plot(hill_plot, hill_callback, \n", " slider_params, (), extra_args)\n", "bokeh.io.show(hill_app, notebook_url=notebook_url)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Duration of input\n", "\n", "Coming back to our cascade circuit, now imagine that the input is a pulse of duration $\\tau$. We can write a function for this and plot it." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"37aa2acf-0a3b-415f-80d6-6b334884dac6\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1756\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1761\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"1756\",\"type\":\"LinearAxis\"},{\"id\":\"1760\",\"type\":\"Grid\"},{\"id\":\"1761\",\"type\":\"LinearAxis\"},{\"id\":\"1765\",\"type\":\"Grid\"},{\"id\":\"1774\",\"type\":\"BoxAnnotation\"},{\"id\":\"1784\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1798\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1772\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1748\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1752\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1750\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1754\",\"type\":\"LinearScale\"}},\"id\":\"1747\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1757\",\"type\":\"BasicTicker\"},{\"attributes\":{\"overlay\":{\"id\":\"1774\",\"type\":\"BoxAnnotation\"}},\"id\":\"1768\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1802\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1769\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1770\",\"type\":\"ResetTool\"},{\"attributes\":{\"plot\":{\"id\":\"1747\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1757\",\"type\":\"BasicTicker\"}},\"id\":\"1760\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1767\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"axis_label\":\"dimensionless x\",\"formatter\":{\"id\":\"1802\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1747\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1762\",\"type\":\"BasicTicker\"}},\"id\":\"1761\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1766\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1762\",\"type\":\"BasicTicker\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1766\",\"type\":\"PanTool\"},{\"id\":\"1767\",\"type\":\"WheelZoomTool\"},{\"id\":\"1768\",\"type\":\"BoxZoomTool\"},{\"id\":\"1769\",\"type\":\"SaveTool\"},{\"id\":\"1770\",\"type\":\"ResetTool\"},{\"id\":\"1771\",\"type\":\"HelpTool\"}]},\"id\":\"1772\",\"type\":\"Toolbar\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"1800\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1747\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1757\",\"type\":\"BasicTicker\"}},\"id\":\"1756\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"1781\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1782\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1783\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1785\",\"type\":\"CDSView\"}},\"id\":\"1784\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1803\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1804\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null},\"id\":\"1750\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1754\",\"type\":\"LinearScale\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1774\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1752\",\"type\":\"LinearScale\"},{\"attributes\":{\"callback\":null},\"id\":\"1748\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1782\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1781\",\"type\":\"ColumnDataSource\"}},\"id\":\"1785\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1800\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},\"selected\":{\"id\":\"1804\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1803\",\"type\":\"UnionRenderers\"}},\"id\":\"1781\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1798\",\"type\":\"Title\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1747\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1762\",\"type\":\"BasicTicker\"}},\"id\":\"1765\",\"type\":\"Grid\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1783\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1771\",\"type\":\"HelpTool\"}],\"root_ids\":[\"1747\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"37aa2acf-0a3b-415f-80d6-6b334884dac6\",\"roots\":{\"1747\":\"89159e19-c40a-4801-9958-98d5d4608823\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1747" } }, "output_type": "display_data" } ], "source": [ "def x_pulse(t, t_0, tau, x_0):\n", " \"\"\"\n", " Returns x value for a pulse beginning at t = 0 \n", " and ending at t = t_0 + tau.\n", " \"\"\"\n", " return np.logical_and(t >= t_0, t <= (t_0 + tau)) * x_0\n", "\n", "# Plot the pulse\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless x')\n", "\n", "# Populate glyphs\n", "p.line(t, x_pulse(t, 1.0, 2.0, 2), line_width=2)\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we want to solve the ODEs for a pulsed input, we need to have a way to pass this function as a parameter. Fortunately, we can pass functions as arguments in Python! So, we write a new function that takes `x_fun`, the function describing $x(t)$ as an argument, as well as `x_args`, the set of parameters passed into `x_fun`." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def cascade_rhs_x_fun(yz, t, beta_y, beta_z, gamma, n_x, n_y, x_fun, x_args):\n", " \"\"\"\n", " Right hand side for cascade X -> Y -> Z. Return dy/dt and dz/dt.\n", " \n", " x_fun is a function of the form x_fun(t, *x_args), so x_args is a tuple\n", " containing the arguments to pass to x_fun.\n", " \"\"\"\n", " # Compute x\n", " x = x_fun(t, *x_args)\n", " \n", " # Return cascade RHS with this value of x\n", " return cascade_rhs(yz, t, beta_y, beta_z, gamma, n_x, n_y, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With this in hand, we can now solve for a pulse. We will have a pulse during $1 \\le t \\le 5$." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"ab21f28b-7574-4b2a-8f9e-68ba6eae9118\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1869\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1874\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"1869\",\"type\":\"LinearAxis\"},{\"id\":\"1873\",\"type\":\"Grid\"},{\"id\":\"1874\",\"type\":\"LinearAxis\"},{\"id\":\"1878\",\"type\":\"Grid\"},{\"id\":\"1887\",\"type\":\"BoxAnnotation\"},{\"id\":\"1906\",\"type\":\"Legend\"},{\"id\":\"1897\",\"type\":\"GlyphRenderer\"},{\"id\":\"1911\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1900\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1885\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1861\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1865\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1863\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1867\",\"type\":\"LinearScale\"}},\"id\":\"1860\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1870\",\"type\":\"BasicTicker\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1896\",\"type\":\"Line\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1900\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1865\",\"type\":\"LinearScale\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1920\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1919\",\"type\":\"UnionRenderers\"}},\"id\":\"1894\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"1902\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1860\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1870\",\"type\":\"BasicTicker\"}},\"id\":\"1869\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1884\",\"type\":\"HelpTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1910\",\"type\":\"Line\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1879\",\"type\":\"PanTool\"},{\"id\":\"1880\",\"type\":\"WheelZoomTool\"},{\"id\":\"1881\",\"type\":\"BoxZoomTool\"},{\"id\":\"1882\",\"type\":\"SaveTool\"},{\"id\":\"1883\",\"type\":\"ResetTool\"},{\"id\":\"1884\",\"type\":\"HelpTool\"}]},\"id\":\"1885\",\"type\":\"Toolbar\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQZ/Vnc8YsPixJ3lBIPNI+jsa6Z0/q/j6ZIG8L/DgYP5hV/WcgSis/sFcqMP+ROT8szrOUhktFPyqZG2yqVlA/wZoFRn2aVz8TKTzhQ0dgP4NxqUxDpWU/MJXafpDwaz8WdtLkFJhxP6ckzu52tHU/AaZpR+dOej/3EC5fAGh/Pz4ZTFPMf4I/YOJBymmKhT+XkGYzHdOIP984hlHmWIw/nF9AskQNkD8SgKzsSwuSP5DSkCK7JZQ/wKuu37Jblj+eppd0Q6yYP3jTZKZxFps/qdxwVjeZnT9aNhXYwxmgP6uIgcsncqE/bn5oTjzVoj8xAb82dUKkP0UmFN9FuaU/yQdftyE5pz/LltynfcGoP6OcharPUao/BbTYpY/pqz9cN6a6N4itPz8yr3ZELa8/XoQ4oRpssD9qZPg4RkSxP5Akk8nnHrI/19qKwcP7sj+sDMtFoNqzP0hH2ENFu7Q/qw+nb3ydtT+8rOlVEYG2P/DePlHRZbc/Lp4GiYtLuD++Kc4HETK5Pxu9taM0Gbo/Uw1R+MoAuz8pGXpxqui7P9d47jer0Lw/MIhvJ6e4vT9AeYTTeaC+PyXjIHUAiL8/pBBi74w3wD88gfM906rAP4m7XyDEHcE/JLbITlGQwT99zEY9bQLCP/ikmxQLdMI/MUXPqx7lwj941g+FnFXDP4S6Fcd5xcM//4L5Nqw0xD/lyfs0KqPEP1CPnLXqEMU/eqlzO+V9xT/RphPSEerFP9lXBQ1pVcY/bXhLAOS/xj9eSM05fCnHP7Pbb70rksc/PH5fAu35xz+COYftumDIP3WtEcyQxsg/IMWVT2oryT9c2fWKQ4/JPwZg7u0Y8sk/IJ5vQOdTyj8JbSGfq7TKP493C3hjFMs/YkTwhgxzyz+Zzo3RpNDLP2cga6QqLcw/L62Vj5yIzD9OC4Rj+eLMPwNFHi5APM0/DyPYN3CUzT94NbgAievNP6/7nD2KQc4/2YXi1XOWzj/hM9DgRerOP6cBuaIAPc8/wnSqiqSOzz/F7PwwMt/PP0ypcCpVF9A//Ng07YY+0D8xuVbkLmXQP5wGM6NNi9A/676cy+Ow0D/SJsEO8tXQPyhZkyt5+tA/By4I7nke0T/cb2Eu9UHRP3Gvxc/rZNE/Er+nvl6H0T+dolPyTqnRP/N1bmu9ytE//whZM6vr0T9sBqdbGQzSP9ShEP0ILNI/Oo7DNXtL0j+UAh4rcWrSP+ZlbAjsiNI/TO5m/uym0j8L9MpCdcTSP4DJmA+G4dI/gBJsoSD+0j/C+io5RhrTP4/iCxv4NdM/xygljjdR0z+IgiDcBWzTP3ARuVBkhtM/B/FKOFSg0z9GQjHh1rnTPyAXHpvt0tM/g4O6tpnr0z/F1G6F3APUP2yvDFm3G9Q/EB2Rgisz1D/kHkBTOkrUP53hPhzlYNQ/yTk/Li131D8H6FfZE43UP/hAzmyaotQ/ue8TNsK31D9i8ZiBjMzUP2MWnpr64NQ/+O/qyg311D9zhLJaxwjVPxGHcpAoHNU/jVIrsDIv1T8MW+/75kHVPzBb4bNGVNU//PrzFVNm1T9OLdhdDXjVPw266sR2idU/HHydgZCa1T+P7dHHW6vVP2u898jZu9U/k4zUswvM1T9wqnm08tvVPy6FO/SP69U/eMhwmeT61T+bbxrH8QnWP+ptgJ24GNY/j8JyOjon1j8NXmO4dzXWPzOcHtnUQtY/8PdDZ7RL1j8QmbhRp0/WP1ulzs3dTtY/cK5d+YdJ1j+g40TH1T/WPzZO4ev2MdY/hEeuyRog1j864bVecArWP+MxTjAm8dU/ziy9N2rU1T/I/M/SabTVP7PQ8rhRkdU/+QCM3E1r1T9cv01ciULVP5ioKIQuF9U/Sy6VwWbp1D+T6emEWrnUPzXwPkUxh9Q/Y0oxcRFT1D88vG9dIB3UP84TiVSC5dM/SkiJglqs0z8iyufnynHTP5GVxWz0NdM/VjZAzPb40j909IiQ8LrSP2qoZyf/e9I/eR2tzT480j+bC+2SyvvRP/p5umy8utE/hq/4JC150T/nR2RjNDfRP45crr3o9NA/9Qurql+y0D8ZMlyPrW/QP4ZaSsvlLNA/W+AZYzXUzz99tjMuu07PP5KnS7d9yc4/Vigd0ZtEzj8i6dB8MsDNPwTCi/dcPM0/ZupuwTS5zD+09sm00TbMP2+lsBJKtcs/AnNQj7I0yz+o5ahkHrXKP2u0I2CfNso/HVv88EW5yT+JATA2IT3JP8K77Q4/wsg/OABgKaxIyD/rVsIQdNDHP2sCKzKhWcc/ffd18zzkxj9c2WzCT3DGP8+7wSDh/cU/xMvfn/eMxT9eKNT5mB3FPydbYCTKr8Q/h2xOWY9DxD/CayQP7NjDP2ys8Avjb8M/wgeNfnYIwz8abNcCqKLCPynfkZt4PsI/FA+SuujbwT+yKcVg+HrBPzyZZh6nG8E/Zi9BD/S9wD+HoH3b3WHAP4SgE9ZiB8A/vxrC/wFdvz+UALEMbK6+PzdwrXf+Ar4/dVScZrNavT9rQOt7hLW8P0ipq+FqE7w/4L/9XV90uz+jj+lKWti6P7740aBTP7o/RptkAUOpuT8GT0LYHxa5P9OegUThhbg/w2ghJH74tz/YCSQd7W23P0WqdbAk5rY/u072Mhthtj848KXTxt61P2I+WaIdX7U/o2xRmRXitD+thcidpGe0P+iGmIPA77M/HzfiEV96sz+jfQ4KdgezP+W3Iin7lrI/V9fZKeQosj/xGTLIJr2xP5I39Ma4U7E/7HLi8I/ssD/uM9gZooewP2PofyHlJLA/1Eeb752Irz/VEag8q8uuPwZa3E7eEq4/ebL0cSNerT95OzgbZ62sP4rUlu2VAKw/03YlxJxXqz8uSiuqaLKqPxszeuDmEKo/upDV4ARzqT93jJVgsNioP7aOi0fXQag/Emjltmeupz+1TpcRUB6nP30em/l+kaY/fQSIUeMHpj9Rvik7bIGlP9tSxQ8J/qQ/Pp7lbal9pD9Woeg1PQCkP4Ib94m0haM/sB1uzv8Noz89RFqmD5miP+zUF/bUJqI/oXWy5EC3oT9s8MLaREqhPxyRZYLS36A/vbQuxtt3oD+XBgvPUhKgP/IpTQ5UXp8/pTHAMKicnj9ZWovXh9+dP9sfMFLZJp0/WIcAa4NynD/aoVFnbcKbP/Y/mgZ/Fps/gNDwgKBumj8FiuWFusqZPx7DDjq2Kpk/nPowNH2OmD9LFxl/+fWXP/L76JYVYZc/UGCiZ7zPlj8oLYJL2UGWP2g7xQZYt5U/MkJqySQwlT/IB4MtLKyUP/fALzVbK5Q/DV81SZ+tkz8y75435jKTPzE0XzIeu5I/jE1kxzVGkj8+0+XiG9SRPyL5E9K/ZJE/ZKuSPhH4kD9dVv0sAI6QPxYFdft8JpA/FEV0wPCCjz/FaqPLxr2OP+H0J89e/Y0/u/jYLJxBjT/aYjbpYoqMP9JoYKiX14s/YudIqx8piz+KLPrM4H6KP44aRH7B2Ik/EQ0jvKg2iT8oe6oXfpiIP4oHNbAp/oc/8pLsL5Rnhz+QzCPJptSGPw72wTNLRYY/K81vqmu5hT8Pd8Li8jCFP1dAPRDMq4Q/rLj+4eIphD9+7vV+I6uDP4YYb4N6L4M/+zSv/tS2gj+qWp5wIEGCP0q+icVKzoE/TBCTVEJegT+xgTTf9fCAP2y5741UhoA/0a0h7k0egD9Wssjfo3F/Pxcr/cehq34/CK2z8XbqfT/UIFRuBS59P1XXQgYwdnw/yDpHMtrCez/WAosX6BN7PwYG0oM+aXo/jdzI6cLCeT9+UQVdWyB5PxB2hYzugXg/jbfnwWPndz8=\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1952\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1951\",\"type\":\"UnionRenderers\"}},\"id\":\"1908\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1860\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1875\",\"type\":\"BasicTicker\"}},\"id\":\"1878\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1880\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1867\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1875\",\"type\":\"BasicTicker\"},{\"attributes\":{\"callback\":null},\"id\":\"1861\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1919\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1909\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1883\",\"type\":\"ResetTool\"},{\"attributes\":{\"source\":{\"id\":\"1894\",\"type\":\"ColumnDataSource\"}},\"id\":\"1898\",\"type\":\"CDSView\"},{\"attributes\":{\"plot\":{\"id\":\"1860\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1870\",\"type\":\"BasicTicker\"}},\"id\":\"1873\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1882\",\"type\":\"SaveTool\"},{\"attributes\":{\"data_source\":{\"id\":\"1894\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1895\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1896\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1898\",\"type\":\"CDSView\"}},\"id\":\"1897\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1887\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1879\",\"type\":\"PanTool\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"1897\",\"type\":\"GlyphRenderer\"}]},\"id\":\"1907\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1895\",\"type\":\"Line\"},{\"attributes\":{\"overlay\":{\"id\":\"1887\",\"type\":\"BoxAnnotation\"}},\"id\":\"1881\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"1911\",\"type\":\"GlyphRenderer\"}]},\"id\":\"1922\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1951\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1920\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1902\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1952\",\"type\":\"Selection\"},{\"attributes\":{\"items\":[{\"id\":\"1907\",\"type\":\"LegendItem\"},{\"id\":\"1922\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"1860\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"1906\",\"type\":\"Legend\"},{\"attributes\":{\"data_source\":{\"id\":\"1908\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1909\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1910\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1912\",\"type\":\"CDSView\"}},\"id\":\"1911\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"1904\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1860\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1875\",\"type\":\"BasicTicker\"}},\"id\":\"1874\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1904\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"source\":{\"id\":\"1908\",\"type\":\"ColumnDataSource\"}},\"id\":\"1912\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null},\"id\":\"1863\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"1860\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"ab21f28b-7574-4b2a-8f9e-68ba6eae9118\",\"roots\":{\"1860\":\"7a2ec4ce-e8dd-4bc8-9dd1-c626d0c4eb7f\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1860" } }, "output_type": "display_data" } ], "source": [ "# Set up parameters for the pulse (on at t = 1, off at t = 5, x_0 = 2)\n", "x_args = (1.0, 4.0, 2.0)\n", "\n", "# Package parameters into a tuple\n", "args = (beta_y, beta_z, gamma, n_x, n_y, x_pulse, x_args)\n", "\n", "# Integrate ODEs\n", "yz = scipy.integrate.odeint(cascade_rhs_x_fun, yz_0, t, args=args)\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y')\n", "p.line(t, z,line_width=2, color=colors[1], legend='z')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see what happens when we do a shorter pulse, this time with $1 \\le t \\le 3$." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"268baca3-a07b-45e6-a796-29e54dd2c9e9\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2029\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"2034\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"2029\",\"type\":\"LinearAxis\"},{\"id\":\"2033\",\"type\":\"Grid\"},{\"id\":\"2034\",\"type\":\"LinearAxis\"},{\"id\":\"2038\",\"type\":\"Grid\"},{\"id\":\"2047\",\"type\":\"BoxAnnotation\"},{\"id\":\"2066\",\"type\":\"Legend\"},{\"id\":\"2057\",\"type\":\"GlyphRenderer\"},{\"id\":\"2071\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"2060\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"2045\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"2021\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"2025\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"2023\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"2027\",\"type\":\"LinearScale\"}},\"id\":\"2020\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2069\",\"type\":\"Line\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"2020\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2035\",\"type\":\"BasicTicker\"}},\"id\":\"2038\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":null},\"id\":\"2023\",\"type\":\"DataRange1d\"},{\"attributes\":{\"callback\":null},\"id\":\"2021\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2070\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"2080\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2079\",\"type\":\"UnionRenderers\"}},\"id\":\"2054\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2030\",\"type\":\"BasicTicker\"},{\"attributes\":{\"items\":[{\"id\":\"2067\",\"type\":\"LegendItem\"},{\"id\":\"2082\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"2020\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"2066\",\"type\":\"Legend\"},{\"attributes\":{},\"id\":\"2080\",\"type\":\"Selection\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"2062\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2020\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2030\",\"type\":\"BasicTicker\"}},\"id\":\"2029\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"2054\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2055\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2056\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2058\",\"type\":\"CDSView\"}},\"id\":\"2057\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2123\",\"type\":\"Selection\"},{\"attributes\":{\"source\":{\"id\":\"2068\",\"type\":\"ColumnDataSource\"}},\"id\":\"2072\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2042\",\"type\":\"SaveTool\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"2071\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2082\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2055\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2064\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2044\",\"type\":\"HelpTool\"},{\"attributes\":{\"data_source\":{\"id\":\"2068\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2069\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2070\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2072\",\"type\":\"CDSView\"}},\"id\":\"2071\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2039\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"2043\",\"type\":\"ResetTool\"},{\"attributes\":{\"plot\":{\"id\":\"2020\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2030\",\"type\":\"BasicTicker\"}},\"id\":\"2033\",\"type\":\"Grid\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"2057\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2067\",\"type\":\"LegendItem\"},{\"attributes\":{\"overlay\":{\"id\":\"2047\",\"type\":\"BoxAnnotation\"}},\"id\":\"2041\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"2027\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2035\",\"type\":\"BasicTicker\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2056\",\"type\":\"Line\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"2064\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2020\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2035\",\"type\":\"BasicTicker\"}},\"id\":\"2034\",\"type\":\"LinearAxis\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"2060\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"2079\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"2123\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2122\",\"type\":\"UnionRenderers\"}},\"id\":\"2068\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"2054\",\"type\":\"ColumnDataSource\"}},\"id\":\"2058\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2122\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2062\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2040\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"2047\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"2025\",\"type\":\"LinearScale\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"2039\",\"type\":\"PanTool\"},{\"id\":\"2040\",\"type\":\"WheelZoomTool\"},{\"id\":\"2041\",\"type\":\"BoxZoomTool\"},{\"id\":\"2042\",\"type\":\"SaveTool\"},{\"id\":\"2043\",\"type\":\"ResetTool\"},{\"id\":\"2044\",\"type\":\"HelpTool\"}]},\"id\":\"2045\",\"type\":\"Toolbar\"}],\"root_ids\":[\"2020\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"268baca3-a07b-45e6-a796-29e54dd2c9e9\",\"roots\":{\"2020\":\"c4bc67f1-9a7f-4351-991d-22b649676f96\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "2020" } }, "output_type": "display_data" } ], "source": [ "# Set up parameters for the pulse (on at t = 1, off at t = 3, x_0 = 2)\n", "x_args = (1.0, 0.7, 2.0)\n", "\n", "# Package parameters into a tuple\n", "args = (beta_y, beta_z, gamma, n_x, n_y, x_pulse, x_args)\n", "\n", "# Integrate ODEs\n", "yz = scipy.integrate.odeint(cascade_rhs_x_fun, yz_0, t, args=args)\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y')\n", "p.line(t, z,line_width=2, color=colors[1], legend='z')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that Z basically does not respond to a short pulse. The delay of the circuit allows short pulses to be ignored, but large pulses to be detected and responded to." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Really short pulses and a lesson about scipy.integrate.odeint()\n", "\n", "Now, we will take a brief interlude to learn an important lesson about the algorithm of `scipy.integrate.odeint()` and its use in these applications. We will consider a very brief pulse, $1 \\le t \\le 1.05$." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"ed390eb0-84ac-4c75-8e37-f4eae6dd7d49\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2200\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"2205\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"2200\",\"type\":\"LinearAxis\"},{\"id\":\"2204\",\"type\":\"Grid\"},{\"id\":\"2205\",\"type\":\"LinearAxis\"},{\"id\":\"2209\",\"type\":\"Grid\"},{\"id\":\"2218\",\"type\":\"BoxAnnotation\"},{\"id\":\"2237\",\"type\":\"Legend\"},{\"id\":\"2228\",\"type\":\"GlyphRenderer\"},{\"id\":\"2242\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"2231\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"2216\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"2192\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"2196\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"2194\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"2198\",\"type\":\"LinearScale\"}},\"id\":\"2191\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"2210\",\"type\":\"PanTool\"},{\"id\":\"2211\",\"type\":\"WheelZoomTool\"},{\"id\":\"2212\",\"type\":\"BoxZoomTool\"},{\"id\":\"2213\",\"type\":\"SaveTool\"},{\"id\":\"2214\",\"type\":\"ResetTool\"},{\"id\":\"2215\",\"type\":\"HelpTool\"}]},\"id\":\"2216\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"2201\",\"type\":\"BasicTicker\"},{\"attributes\":{\"items\":[{\"id\":\"2238\",\"type\":\"LegendItem\"},{\"id\":\"2253\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"2191\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"2237\",\"type\":\"Legend\"},{\"attributes\":{\"callback\":null},\"id\":\"2194\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2240\",\"type\":\"Line\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"2233\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2191\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2201\",\"type\":\"BasicTicker\"}},\"id\":\"2200\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2196\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2206\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data_source\":{\"id\":\"2225\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2226\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2227\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2229\",\"type\":\"CDSView\"}},\"id\":\"2228\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"2305\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2304\",\"type\":\"UnionRenderers\"}},\"id\":\"2239\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2305\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2304\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2250\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2227\",\"type\":\"Line\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"2191\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2206\",\"type\":\"BasicTicker\"}},\"id\":\"2209\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2215\",\"type\":\"HelpTool\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"2235\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2191\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2206\",\"type\":\"BasicTicker\"}},\"id\":\"2205\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2213\",\"type\":\"SaveTool\"},{\"attributes\":{\"plot\":{\"id\":\"2191\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2201\",\"type\":\"BasicTicker\"}},\"id\":\"2204\",\"type\":\"Grid\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"2228\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2238\",\"type\":\"LegendItem\"},{\"attributes\":{\"overlay\":{\"id\":\"2218\",\"type\":\"BoxAnnotation\"}},\"id\":\"2212\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"data_source\":{\"id\":\"2239\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2240\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2241\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2243\",\"type\":\"CDSView\"}},\"id\":\"2242\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2233\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2214\",\"type\":\"ResetTool\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"2231\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"2210\",\"type\":\"PanTool\"},{\"attributes\":{\"callback\":null},\"id\":\"2192\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2235\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"2218\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"2198\",\"type\":\"LinearScale\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAAACgmoFqBqqZP6CagWoGqqk/+DPhz4Q/sz+gmoFqBqq5P6QAkQJECsA/+DPhz4Q/wz9MZzGdxXTGP6CagWoGqsk/9M3RN0ffzD+kAJECRArQP04aOWnkpNE/+DPhz4Q/0z+iTYk2JdrUP0xnMZ3FdNY/9oDZA2YP2D+gmoFqBqrZP0q0KdGmRNs/9M3RN0ff3D+e53me53neP6QAkQJECuA/eQ3lNZTX4D9OGjlp5KThPyMnjZw0cuI/+DPhz4Q/4z/NQDUD1QzkP6JNiTYl2uQ/d1rdaXWn5T9MZzGdxXTmPyF0hdAVQuc/9oDZA2YP6D/LjS03ttzoP6CagWoGquk/dafVnVZ36j9KtCnRpkTrPx/BfQT3Eew/9M3RN0ff7D/J2iVrl6ztP57neZ7nee4/c/TN0TdH7z+kAJECRArwPw4HOxzscPA/eQ3lNZTX8D/kE49PPD7xP04aOWnkpPE/uCDjgowL8j8jJ42cNHLyP44tN7bc2PI/+DPhz4Q/8z9iOovpLKbzP81ANQPVDPQ/OEffHH1z9D+iTYk2Jdr0PwxUM1DNQPU/d1rdaXWn9T/iYIeDHQ72P0xnMZ3FdPY/tm3btm3b9j8hdIXQFUL3P4x6L+q9qPc/9oDZA2YP+D9gh4MdDnb4P8uNLTe23Pg/NpTXUF5D+T+gmoFqBqr5PwqhK4SuEPo/dafVnVZ3+j/grX+3/t36P0q0KdGmRPs/tLrT6k6r+z8fwX0E9xH8P4rHJx6fePw/9M3RN0ff/D9e1HtR70X9P8naJWuXrP0/NOHPhD8T/j+e53me53n+PwjuI7iP4P4/c/TN0TdH/z/e+nfr363/P6QAkQJECgBA2QNmD5g9AEAOBzsc7HAAQEQKEClApABAeQ3lNZTXAECuELpC6AoBQOQTj088PgFAGRdkXJBxAUBOGjlp5KQBQIMdDnY42AFAuCDjgowLAkDuI7iP4D4CQCMnjZw0cgJAWCpiqYilAkCOLTe23NgCQMMwDMMwDANA+DPhz4Q/A0AtN7bc2HIDQGI6i+kspgNAmD1g9oDZA0DNQDUD1QwEQAJEChApQARAOEffHH1zBEBtSrQp0aYEQKJNiTYl2gRA11BeQ3kNBUAMVDNQzUAFQEJXCF0hdAVAd1rdaXWnBUCsXbJ2ydoFQOJgh4MdDgZAF2RckHFBBkBMZzGdxXQGQIFqBqoZqAZAtm3btm3bBkDscLDDwQ4HQCF0hdAVQgdAVnda3Wl1B0CMei/qvagHQMF9BPcR3AdA9oDZA2YPCEArhK4QukIIQGCHgx0OdghAlopYKmKpCEDLjS03ttwIQACRAkQKEAlANpTXUF5DCUBrl6xdsnYJQKCagWoGqglA1Z1Wd1rdCUAKoSuErhAKQECkAJECRApAdafVnVZ3CkCqqqqqqqoKQOCtf7f+3QpAFbFUxFIRC0BKtCnRpkQLQH+3/t36dwtAtLrT6k6rC0Dqvaj3ot4LQB/BfQT3EQxAVMRSEUtFDECKxycen3gMQL/K/CrzqwxA9M3RN0ffDEAp0aZEmxINQF7Ue1HvRQ1AlNdQXkN5DUDJ2iVrl6wNQP7d+nfr3w1ANOHPhD8TDkBp5KSRk0YOQJ7neZ7neQ5A0+pOqzutDkAI7iO4j+AOQD7x+MTjEw9Ac/TN0TdHD0Co96Lei3oPQN76d+vfrQ9AE/5M+DPhD0CkAJECRAoQQD+C+wjuIxBA2QNmD5g9EEB0hdAVQlcQQA4HOxzscBBAqYilIpaKEEBEChApQKQQQN6Lei/qvRBAeQ3lNZTXEEAUj088PvEQQK4QukLoChFASZIkSZIkEUDkE49PPD4RQH6V+VXmVxFAGRdkXJBxEUCzmM5iOosRQE4aOWnkpBFA6Zujb46+EUCDHQ52ONgRQB6feHzi8RFAuCDjgowLEkBTok2JNiUSQO4juI/gPhJAiKUilopYEkAjJ42cNHISQL6o96LeixJAWCpiqYilEkDzq8yvMr8SQI4tN7bc2BJAKK+hvIbyEkDDMAzDMAwTQF2ydsnaJRNA+DPhz4Q/E0CTtUvWLlkTQC03ttzYchNAyLgg44KME0BiOovpLKYTQP279e/WvxNAmD1g9oDZE0Ayv8r8KvMTQM1ANQPVDBRAaMKfCX8mFEACRAoQKUAUQJ3FdBbTWRRAOEffHH1zFEDSyEkjJ40UQG1KtCnRphRAB8weMHvAFECiTYk2JdoUQD3P8zzP8xRA11BeQ3kNFUBy0shJIycVQAxUM1DNQBVAp9WdVndaFUBCVwhdIXQVQNzYcmPLjRVAd1rdaXWnFUAS3EdwH8EVQKxdsnbJ2hVAR98cfXP0FUDiYIeDHQ4WQHzi8YnHJxZAF2RckHFBFkCx5caWG1sWQExnMZ3FdBZA5+ibo2+OFkCBagaqGagWQBzscLDDwRZAtm3btm3bFkBR70W9F/UWQOxwsMPBDhdAhvIaymsoF0AhdIXQFUIXQLz179a/WxdAVnda3Wl1F0Dx+MTjE48XQIx6L+q9qBdAJvyZ8GfCF0DBfQT3EdwXQFv/bv279RdA9oDZA2YPGECRAkQKECkYQCuErhC6QhhAxgUZF2RcGEBgh4MdDnYYQPsI7iO4jxhAlopYKmKpGEAwDMMwDMMYQMuNLTe23BhAZg+YPWD2GEAAkQJEChAZQJsSbUq0KRlANpTXUF5DGUDQFUJXCF0ZQGuXrF2ydhlABRkXZFyQGUCgmoFqBqoZQDsc7HCwwxlA1Z1Wd1rdGUBwH8F9BPcZQAqhK4SuEBpApSKWilgqGkBApACRAkQaQNola5esXRpAdafVnVZ3GkAQKUCkAJEaQKqqqqqqqhpARSwVsVTEGkDgrX+3/t0aQHov6r2o9xpAFbFUxFIRG0CvMr/K/CobQEq0KdGmRBtA5TWU11BeG0B/t/7d+ncbQBo5aeSkkRtAtLrT6k6rG0BPPD7x+MQbQOq9qPei3htAhD8T/kz4G0AfwX0E9xEcQLpC6AqhKxxAVMRSEUtFHEDvRb0X9V4cQIrHJx6feBxAJEmSJEmSHEC/yvwq86scQFlMZzGdxRxA9M3RN0ffHECPTzw+8fgcQCnRpkSbEh1AxFIRS0UsHUBe1HtR70UdQPlV5leZXx1AlNdQXkN5HUAuWbtk7ZIdQMnaJWuXrB1AZFyQcUHGHUD+3fp3698dQJlfZX6V+R1ANOHPhD8THkDOYjqL6SweQGnkpJGTRh5AA2YPmD1gHkCe53me53keQDlp5KSRkx5A0+pOqzutHkBubLmx5cYeQAjuI7iP4B5Ao2+Ovjn6HkA+8fjE4xMfQNhyY8uNLR9Ac/TN0TdHH0AOdjjY4WAfQKj3ot6Leh9AQ3kN5TWUH0De+nfr360fQHh84vGJxx9AE/5M+DPhH0Ctf7f+3fofQKQAkQJECiBAcUHGBRkXIEA/gvsI7iMgQAzDMAzDMCBA2QNmD5g9IECnRJsSbUogQHSF0BVCVyBAQcYFGRdkIEAOBzsc7HAgQNxHcB/BfSBAqYilIpaKIEB2ydola5cgQEQKEClApCBAEUtFLBWxIEDei3ov6r0gQKzMrzK/yiBAeQ3lNZTXIEBGTho5aeQgQBSPTzw+8SBA4c+EPxP+IECuELpC6AohQHxR70W9FyFASZIkSZIkIUAW01lMZzEhQOQTj088PiFAsVTEUhFLIUB+lflV5lchQEvWLlm7ZCFAGRdkXJBxIUDmV5lfZX4hQLOYzmI6iyFAgdkDZg+YIUBOGjlp5KQhQBtbbmy5sSFA6Zujb46+IUC23NhyY8shQIMdDnY42CFAUV5DeQ3lIUAen3h84vEhQOvfrX+3/iFAuCDjgowLIkCGYRiGYRgiQFOiTYk2JSJAIOOCjAsyIkDuI7iP4D4iQLtk7ZK1SyJAiKUilopYIkBW5leZX2UiQCMnjZw0ciJA8GfCnwl/IkC+qPei3osiQIvpLKazmCJAWCpiqYilIkAma5esXbIiQPOrzK8yvyJAwOwBswfMIkCOLTe23NgiQFtubLmx5SJAKK+hvIbyIkD179a/W/8iQMMwDMMwDCNAkHFBxgUZI0BdsnbJ2iUjQCvzq8yvMiNA+DPhz4Q/I0DFdBbTWUwjQJO1S9YuWSNAYPaA2QNmI0AtN7bc2HIjQPt369+tfyNAyLgg44KMI0CV+VXmV5kjQGI6i+kspiNAMHvA7AGzI0D9u/Xv1r8jQMr8KvOrzCNAmD1g9oDZI0BlfpX5VeYjQDK/yvwq8yNAAAAAAAAAJEA=\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"2251\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2250\",\"type\":\"UnionRenderers\"}},\"id\":\"2225\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2241\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2226\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"2225\",\"type\":\"ColumnDataSource\"}},\"id\":\"2229\",\"type\":\"CDSView\"},{\"attributes\":{\"source\":{\"id\":\"2239\",\"type\":\"ColumnDataSource\"}},\"id\":\"2243\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2211\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"2251\",\"type\":\"Selection\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"2242\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2253\",\"type\":\"LegendItem\"}],\"root_ids\":[\"2191\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"ed390eb0-84ac-4c75-8e37-f4eae6dd7d49\",\"roots\":{\"2191\":\"9352a1af-ab0e-4c08-94b0-94909505d611\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "2191" } }, "output_type": "display_data" } ], "source": [ "# Set up parameters for the pulse (on at t = 1, off at t = 1.05, x_0 = 2)\n", "x_args = (1.0, 0.05, 2.0)\n", "\n", "# Package parameters into a tuple\n", "args = (beta_y, beta_z, gamma, n_x, n_y, x_pulse, x_args)\n", "\n", "# Integrate ODEs\n", "yz = scipy.integrate.odeint(cascade_rhs_x_fun, yz_0, t, args=args)\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y')\n", "p.line(t, z,line_width=2, color=colors[1], legend='z')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uh oh! Something went wrong, since the Y signal never went up. This exposes an important issue with the algorithm used by `scipy.integrate.odeint()`. The Hindmarsh-Petzold algorithm uses variable step sizes so that it takes long steps when the system is not changing much and short steps when it is. Therefore, if we have a long period of no changes (leading up to $t = 1$), the step sizes taken by the solver will increase, and we'll step right over the pulse.\n", "\n", "So, it is in general good practice to explicitly take into account discontinuities in the parameters over time. In this case, we would use `scipy.integrate.odeint()` to integrate to the pulse and use the end point of that as the initial condition of a new solution during the pulse. Then, at the end of the pulse, we start again. Let's try again using this method." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"49d52fba-3a97-4835-a36b-3fb7244b4c01\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2382\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"2387\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"2382\",\"type\":\"LinearAxis\"},{\"id\":\"2386\",\"type\":\"Grid\"},{\"id\":\"2387\",\"type\":\"LinearAxis\"},{\"id\":\"2391\",\"type\":\"Grid\"},{\"id\":\"2400\",\"type\":\"BoxAnnotation\"},{\"id\":\"2419\",\"type\":\"Legend\"},{\"id\":\"2410\",\"type\":\"GlyphRenderer\"},{\"id\":\"2424\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"2413\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"2398\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"2374\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"2378\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"2376\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"2380\",\"type\":\"LinearScale\"}},\"id\":\"2373\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"2373\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2388\",\"type\":\"BasicTicker\"}},\"id\":\"2391\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAAAAor6G8hvKqPyivobyG8ro/XkN5DeU1xD8or6G8hvLKP3kN5TWU19A/XkN5DeU11D9DeQ3lNZTXPyivobyG8to/DeU1lNdQ3j95DeU1lNfgP2wor6G8huI/XkN5DeU15D9QXkN5DeXlP0N5DeU1lOc/NpTXUF5D6T8or6G8hvLqPxrKayivoew/DeU1lNdQ7j8AAAAAAADwP2cJu/ktBPA/zxJ281sI8D82HDHtiQzwP54l7Oa3EPA/BS+n4OUU8D9tOGLaExnwP9RBHdRBHfA/PEvYzW8h8D+jVJPHnSXwPwpeTsHLKfA/cmcJu/kt8D/ZcMS0JzLwP0F6f65VNvA/qIM6qIM68D8QjfWhsT7wP3eWsJvfQvA/359rlQ1H8D9GqSaPO0vwP66y4YhpT/A/FbycgpdT8D98xVd8xVfwP+TOEnbzW/A/S9jNbyFg8D+z4YhpT2TwPxrrQ2N9aPA/gvT+XKts8D/p/blW2XDwP1EHdVAHdfA/uBAwSjV58D8fGutDY33wP4cjpj2RgfA/7ixhN7+F8D9WNhwx7YnwP70/1yobjvA/JUmSJEmS8D+MUk0ed5bwP/RbCBilmvA/W2XDEdOe8D/Dbn4LAaPwPyp4OQUvp/A/kYH0/lyr8D/5iq/4iq/wP2CUavK4s/A/yJ0l7Oa38D8vp+DlFLzwP5ewm99CwPA//rlW2XDE8D9mwxHTnsjwP83MzMzMzPA/ubOE3fwW8j+lmjzuLGHzP5KB9P5cq/Q/fmisD4319T9qT2QgvT/3P1Y2HDHtifg/Qh3UQR3U+T8uBIxSTR77PxrrQ2N9aPw/B9L7c62y/T/zuLOE3fz+P/DPtcqGIwBAZsMR057IAEDctm3btm0BQFKqyePOEgJAyJ0l7Oa3AkA+kYH0/lwDQLSE3fwWAgRAKng5BS+nBECga5UNR0wFQBZf8RVf8QVAjFJNHneWBkACRqkmjzsHQHg5BS+n4AdA7ixhN7+FCEBkIL0/1yoJQNwTGUjvzwlAUgd1UAd1CkDI+tBYHxoLQD7uLGE3vwtAtOGIaU9kDEAq1eRxZwkNQKDIQHp/rg1AFrycgpdTDkCMr/iKr/gOQAKjVJPHnQ9APEvYzW8hEED3RAbS+3MQQLI+NNaHxhBAbThi2hMZEUAoMpDen2sRQOMrvuIrvhFAniXs5rcQEkBZHxrrQ2MSQBQZSO/PtRJAzxJ281sIE0CKDKT351oTQEUG0vtzrRNAAAAAAAAAFEA=\",\"dtype\":\"float64\",\"shape\":[118]},\"y\":{\"__ndarray__\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzy8RVLvEo/PthZSNa4Wj+pSbA3BQhkP0II6QbhsWo/aADc0f+scD/rJQjOMAB0PxLz+HeDUnc/FAm30/ajej//JOZ5jvR9PyVZyhMkooA/x01dC5JJgj9EyfxLkfCDP8QvBQUil4U/LpMLWEQ9hz/ElY1m+OKIPzTYCFI+iIo/vvz6OxYtjD8RpOFFgNGNP29wOpF8dY8/Q4HBn4WMkD8Zfhw5Fl6RP6f/bCVwL5I/T7inc5MAkz/q1JcpgNGTPyE80lM2opQ/5qBUALZylT9htRw9/0KWP4YsKBgSE5c/fbh0n+7ilz8GDADhlLKYP+HZx+oEgpk/jyXRyj5Rmj8b3KCPQiCbP3EPhEcQ75s/yQieAKi9nD+TEBLJCYydPwdwA681Wp4/l2+VwCsonz95WOsL7PWfP485lE+7YaA/4uY3xGXIoD/t2sNq9S6hP/YYGEpqlaE/K001acT7oT9bIxzPA2KiP7VHzYIoyKI/BWZJizIuoz98KpHvIZSjP+ZApbb2+aM/8foWguVtoj8sRLGDgAChP25Gn0bQXp8/roU9KdbwnD+ZV78tCLOaP7bu8O6qoZg/pVugPU25lj9WmyYxwvaUP3bGmKwcV5M/B/kV5KfXkT+sX5615XWQP5xIEcoSX44/Fb6plucEjD+oKr6PX9mJP0Se6ujd2Ic/kuyLqQ0Ahj84qW8F3EuEP2lJ8pRyuYI/RtNDNzNGgT+UY7wBad9/P8h98lZ5Z30/4IMv6Xogez9imPHSowZ5Pw9r1lR0Fnc/JVP6m7JMdT+mV++eZKZzP2q2j7fLIHI/5WrqU1+5cD95QVRdkttuPwCBQqHCd2w/jsHhLVVDaj9QmrM9njpoPwRFm+U6WmY/4uzRiQyfZD8krU+IMQZjP/3TZowAjWE/lWj+SwYxYD+q7LpD/99dP2mz/x6rj1s/K4x9EDdtWT/vA67mFXVXPxrwXGj/o1U/ACT0OO72Uz9aQODAGGtSP4UF0RXr/VA/kynUcQtaTz/EQaCHcOxMP2BLC1r5rko/+wtDBuydSD8=\",\"dtype\":\"float64\",\"shape\":[118]}},\"selected\":{\"id\":\"2433\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2432\",\"type\":\"UnionRenderers\"}},\"id\":\"2407\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2423\",\"type\":\"Line\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"2417\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2373\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2388\",\"type\":\"BasicTicker\"}},\"id\":\"2387\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2380\",\"type\":\"LinearScale\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"2424\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2435\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2408\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2497\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null},\"id\":\"2376\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2415\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"2413\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"2378\",\"type\":\"LinearScale\"},{\"attributes\":{\"plot\":{\"id\":\"2373\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2383\",\"type\":\"BasicTicker\"}},\"id\":\"2386\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2432\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"items\":[{\"id\":\"2420\",\"type\":\"LegendItem\"},{\"id\":\"2435\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"2373\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"2419\",\"type\":\"Legend\"},{\"attributes\":{\"data_source\":{\"id\":\"2421\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2422\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2423\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2425\",\"type\":\"CDSView\"}},\"id\":\"2424\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2396\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"2397\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"2498\",\"type\":\"Selection\"},{\"attributes\":{\"overlay\":{\"id\":\"2400\",\"type\":\"BoxAnnotation\"}},\"id\":\"2394\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"2433\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2393\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"2392\",\"type\":\"PanTool\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2422\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"2421\",\"type\":\"ColumnDataSource\"}},\"id\":\"2425\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAAAAor6G8hvKqPyivobyG8ro/XkN5DeU1xD8or6G8hvLKP3kN5TWU19A/XkN5DeU11D9DeQ3lNZTXPyivobyG8to/DeU1lNdQ3j95DeU1lNfgP2wor6G8huI/XkN5DeU15D9QXkN5DeXlP0N5DeU1lOc/NpTXUF5D6T8or6G8hvLqPxrKayivoew/DeU1lNdQ7j8AAAAAAADwP2cJu/ktBPA/zxJ281sI8D82HDHtiQzwP54l7Oa3EPA/BS+n4OUU8D9tOGLaExnwP9RBHdRBHfA/PEvYzW8h8D+jVJPHnSXwPwpeTsHLKfA/cmcJu/kt8D/ZcMS0JzLwP0F6f65VNvA/qIM6qIM68D8QjfWhsT7wP3eWsJvfQvA/359rlQ1H8D9GqSaPO0vwP66y4YhpT/A/FbycgpdT8D98xVd8xVfwP+TOEnbzW/A/S9jNbyFg8D+z4YhpT2TwPxrrQ2N9aPA/gvT+XKts8D/p/blW2XDwP1EHdVAHdfA/uBAwSjV58D8fGutDY33wP4cjpj2RgfA/7ixhN7+F8D9WNhwx7YnwP70/1yobjvA/JUmSJEmS8D+MUk0ed5bwP/RbCBilmvA/W2XDEdOe8D/Dbn4LAaPwPyp4OQUvp/A/kYH0/lyr8D/5iq/4iq/wP2CUavK4s/A/yJ0l7Oa38D8vp+DlFLzwP5ewm99CwPA//rlW2XDE8D9mwxHTnsjwP83MzMzMzPA/ubOE3fwW8j+lmjzuLGHzP5KB9P5cq/Q/fmisD4319T9qT2QgvT/3P1Y2HDHtifg/Qh3UQR3U+T8uBIxSTR77PxrrQ2N9aPw/B9L7c62y/T/zuLOE3fz+P/DPtcqGIwBAZsMR057IAEDctm3btm0BQFKqyePOEgJAyJ0l7Oa3AkA+kYH0/lwDQLSE3fwWAgRAKng5BS+nBECga5UNR0wFQBZf8RVf8QVAjFJNHneWBkACRqkmjzsHQHg5BS+n4AdA7ixhN7+FCEBkIL0/1yoJQNwTGUjvzwlAUgd1UAd1CkDI+tBYHxoLQD7uLGE3vwtAtOGIaU9kDEAq1eRxZwkNQKDIQHp/rg1AFrycgpdTDkCMr/iKr/gOQAKjVJPHnQ9APEvYzW8hEED3RAbS+3MQQLI+NNaHxhBAbThi2hMZEUAoMpDen2sRQOMrvuIrvhFAniXs5rcQEkBZHxrrQ2MSQBQZSO/PtRJAzxJ281sIE0CKDKT351oTQEUG0vtzrRNAAAAAAAAAFEA=\",\"dtype\":\"float64\",\"shape\":[118]},\"y\":{\"__ndarray__\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBaU3RThQ8+/vp9gE9RMz6/NE6VEipHPlx6jJsQVFU+IKqyu8e5Yj5wkQePONpuPqp24mOthXc+hnDW5lYOgD7LYY/tsmiHPlEG5H+vBpA+hHMAjtUUlT7ojhn3kv2aPmAnAOpd8qA+1tHG8SHypD7Gum8LB4upPgrSia/+ya4+GwZSK/1dsj46rKa89ba1PgVWCshhdrk+tHrECbqivT4SSg6fOyHBPk8OrRAJrsM+WEMVYZd6xj7cqQwlmIfJPuR2vE5Q18w+INT0Ryw20D48nCzNpCTSPtIS6A9eONQ+AbUJaaRy1j5kAXQxxNTYPrl2CcIJYNs++glqQsAV3j5WyiEBj3vgPuSdozWxAuI+gj8s2+mg4z6GbS0O3FblPtznGOsqJec+x2xgjnkM6T5LvHUUaw3rPpCUypmiKO0+WGIXL8Ne7z51aki1LtjwPpK/LlEAD/I+kmjzlyRU8z5UHEu26af0PvSS6tidCvY+Q4OGLI989z5spdPdC/74PjGwhhlij/o+GUjsqmlMIT89C9Pg4xMsP9MtfkIYHDI/6X6jRCMZNT/mtczMpDM3P+B1arcQljg/A7qrrNhjOT8rT4w2iLo5P6v48v+Lsjk/e9HzU3lgOT9LJNWCJtU4PwJQ2Px3Hjg/VHXNOdVHNz+chXIgk1o2P0nJKTRNXjU/sfyjgyNZND9LoUxR/U8zP+GZ7znMRjI/mhf3HqxAMT/iAhqb7j8wP2Z92QKwjC4/2JNleZGqLD/Y76bZV9sqP9UG1l1ZICk/AKSoUFd6Jz/gPu8LseklPxyuBypobiQ/mhLsEkcIIz/CdsKM5LYhP8fwH9GweSA/Aj69j/ufHj+VCOwBGXIcPxK1VdoeaBo/EtlcYUuAGD/jFnow5bgWP9Aq0xxBEBU/qunM4qOEEz9OLEX+XxQSP69qxLbbvRA/KLTbUf7+Dj8jLiWUh68MP4ufHrB1igo/VDfD6PuMCD80/j10crQGP0EWpOZj/gQ/Fp9aRnVoAz9zwCEwbvABP6icUo46lAA/5nwEbsWj/j4=\",\"dtype\":\"float64\",\"shape\":[118]}},\"selected\":{\"id\":\"2498\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2497\",\"type\":\"UnionRenderers\"}},\"id\":\"2421\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data_source\":{\"id\":\"2407\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2408\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2409\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2411\",\"type\":\"CDSView\"}},\"id\":\"2410\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"2400\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"2383\",\"type\":\"BasicTicker\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"2392\",\"type\":\"PanTool\"},{\"id\":\"2393\",\"type\":\"WheelZoomTool\"},{\"id\":\"2394\",\"type\":\"BoxZoomTool\"},{\"id\":\"2395\",\"type\":\"SaveTool\"},{\"id\":\"2396\",\"type\":\"ResetTool\"},{\"id\":\"2397\",\"type\":\"HelpTool\"}]},\"id\":\"2398\",\"type\":\"Toolbar\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2409\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"2410\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2420\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"2388\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2395\",\"type\":\"SaveTool\"},{\"attributes\":{\"source\":{\"id\":\"2407\",\"type\":\"ColumnDataSource\"}},\"id\":\"2411\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null},\"id\":\"2374\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2417\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"2415\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2373\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2383\",\"type\":\"BasicTicker\"}},\"id\":\"2382\",\"type\":\"LinearAxis\"}],\"root_ids\":[\"2373\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"49d52fba-3a97-4835-a36b-3fb7244b4c01\",\"roots\":{\"2373\":\"27840842-7098-4de2-aafd-95bb86e1610c\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "2373" } }, "output_type": "display_data" } ], "source": [ "# Integrate prior to pulse\n", "t_before_pulse = np.linspace(0, 1.0, 20)\n", "args = (beta_y, beta_z, gamma, n_x, n_y, 0.0)\n", "yz_0 = np.array([0.0, 0.0])\n", "yz_before_pulse = scipy.integrate.odeint(\n", " cascade_rhs, yz_0, t_before_pulse, args=args)\n", "\n", "# Integrate during pulse\n", "t_during_pulse = np.linspace(1.0, 1.05, 50)\n", "args = (beta_y, beta_z, gamma, n_x, n_y, 2.0)\n", "yz_0 = yz_before_pulse[-1]\n", "yz_during_pulse = scipy.integrate.odeint(\n", " cascade_rhs, yz_0, t_during_pulse, args=args)\n", "\n", "# Integrate after pulse\n", "t_after_pulse = np.linspace(1.05, 5, 50)\n", "args = (beta_y, beta_z, gamma, n_x, n_y, 0.0)\n", "yz_0 = yz_during_pulse[-1]\n", "yz_after_pulse = scipy.integrate.odeint(cascade_rhs, yz_0, t_after_pulse, args=args)\n", "\n", "# Piece together solution\n", "t = np.concatenate((t_before_pulse, t_during_pulse[1:], t_after_pulse[1:]))\n", "yz = np.vstack((yz_before_pulse, yz_during_pulse[1:,:], \n", " yz_after_pulse[1:,:]))\n", "y, z = yz.transpose()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y')\n", "p.line(t, z,line_width=2, color=colors[1], legend='z')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Much better. Dealing with discontinuities like this while solving systems of ODEs are facilitated by **event handling**. Unfortunately, `scipy.integrate.odeint()` does not allow for event handling, and we need to take the less elegant approach we just showed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Periodic input\n", "\n", "Finally, we will consider the case where we have periodic forcing of the circuit. We will do this for highly cooperative activation by Y, taking $n_y = 10$. Recall that this gives a longer time delay.\n", "\n", "We first write a function for the forcing, `x_fun`, which is periodic with frequency $f$." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"cc6989ae-8c00-4740-a047-4cea152814c3\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2575\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"2580\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"2575\",\"type\":\"LinearAxis\"},{\"id\":\"2579\",\"type\":\"Grid\"},{\"id\":\"2580\",\"type\":\"LinearAxis\"},{\"id\":\"2584\",\"type\":\"Grid\"},{\"id\":\"2593\",\"type\":\"BoxAnnotation\"},{\"id\":\"2603\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"2670\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"2591\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"2567\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"2571\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"2569\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"2573\",\"type\":\"LinearScale\"}},\"id\":\"2566\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null},\"id\":\"2567\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2602\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2585\",\"type\":\"PanTool\"},{\"attributes\":{\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2601\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"2600\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2601\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2602\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2604\",\"type\":\"CDSView\"}},\"id\":\"2603\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"plot\":{\"id\":\"2566\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2576\",\"type\":\"BasicTicker\"}},\"id\":\"2579\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"2600\",\"type\":\"ColumnDataSource\"}},\"id\":\"2604\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[500]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[500]}},\"selected\":{\"id\":\"2676\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2675\",\"type\":\"UnionRenderers\"}},\"id\":\"2600\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"2566\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2581\",\"type\":\"BasicTicker\"}},\"id\":\"2584\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2588\",\"type\":\"SaveTool\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"2674\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2566\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2581\",\"type\":\"BasicTicker\"}},\"id\":\"2580\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2586\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"2581\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2576\",\"type\":\"BasicTicker\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"2585\",\"type\":\"PanTool\"},{\"id\":\"2586\",\"type\":\"WheelZoomTool\"},{\"id\":\"2587\",\"type\":\"BoxZoomTool\"},{\"id\":\"2588\",\"type\":\"SaveTool\"},{\"id\":\"2589\",\"type\":\"ResetTool\"},{\"id\":\"2590\",\"type\":\"HelpTool\"}]},\"id\":\"2591\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"2675\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2674\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2676\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2573\",\"type\":\"LinearScale\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"2670\",\"type\":\"Title\"},{\"attributes\":{\"callback\":null},\"id\":\"2569\",\"type\":\"DataRange1d\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"2593\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"2672\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2566\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2576\",\"type\":\"BasicTicker\"}},\"id\":\"2575\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2571\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2589\",\"type\":\"ResetTool\"},{\"attributes\":{\"overlay\":{\"id\":\"2593\",\"type\":\"BoxAnnotation\"}},\"id\":\"2587\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"2672\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2590\",\"type\":\"HelpTool\"}],\"root_ids\":[\"2566\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"cc6989ae-8c00-4740-a047-4cea152814c3\",\"roots\":{\"2566\":\"1b6aefd4-99bf-4bf6-8d72-e4c83e9621fe\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "2566" } }, "output_type": "display_data" } ], "source": [ "def x_periodic(t, f, x_0):\n", " \"\"\"\n", " Returns x value for periodic forcing of amplitude x_0 and frequency f.\n", " \"\"\"\n", " if type(f) in [float, int]:\n", " return x_0 * (1 + np.sin(f * t))\n", " else:\n", " sin_sum = np.zeros_like(t)\n", " for freq, amp in zip(f, x_0):\n", " sin_sum += amp * (1 + np.sin(freq*t))\n", " return sin_sum\n", "\n", "# Plot the forcing\n", "t = np.linspace(0, 10, 500)\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, x_periodic(t, 5, 2.0), line_width=2, color=colors[2])\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how the circuit responds to a low-frequency input." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"96a888d8-afa4-433d-8402-678e052e2f57\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2741\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"2746\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"2741\",\"type\":\"LinearAxis\"},{\"id\":\"2745\",\"type\":\"Grid\"},{\"id\":\"2746\",\"type\":\"LinearAxis\"},{\"id\":\"2750\",\"type\":\"Grid\"},{\"id\":\"2759\",\"type\":\"BoxAnnotation\"},{\"id\":\"2778\",\"type\":\"Legend\"},{\"id\":\"2769\",\"type\":\"GlyphRenderer\"},{\"id\":\"2783\",\"type\":\"GlyphRenderer\"},{\"id\":\"2798\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"2772\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"2757\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"2733\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"2737\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"2735\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"2739\",\"type\":\"LinearScale\"}},\"id\":\"2732\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2781\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"x (normalized)\"},\"renderers\":[{\"id\":\"2798\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2811\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"2774\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2792\",\"type\":\"Selection\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2796\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2752\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"2895\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2756\",\"type\":\"HelpTool\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2767\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2896\",\"type\":\"Selection\"},{\"attributes\":{\"plot\":{\"id\":\"2732\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2742\",\"type\":\"BasicTicker\"}},\"id\":\"2745\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2747\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2776\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2768\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2808\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2751\",\"type\":\"PanTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2797\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null},\"id\":\"2733\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2739\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"2766\",\"type\":\"ColumnDataSource\"}},\"id\":\"2770\",\"type\":\"CDSView\"},{\"attributes\":{\"overlay\":{\"id\":\"2759\",\"type\":\"BoxAnnotation\"}},\"id\":\"2753\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"2791\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null},\"id\":\"2735\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2737\",\"type\":\"LinearScale\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"2751\",\"type\":\"PanTool\"},{\"id\":\"2752\",\"type\":\"WheelZoomTool\"},{\"id\":\"2753\",\"type\":\"BoxZoomTool\"},{\"id\":\"2754\",\"type\":\"SaveTool\"},{\"id\":\"2755\",\"type\":\"ResetTool\"},{\"id\":\"2756\",\"type\":\"HelpTool\"}]},\"id\":\"2757\",\"type\":\"Toolbar\"},{\"attributes\":{\"data_source\":{\"id\":\"2795\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2796\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2797\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2799\",\"type\":\"CDSView\"}},\"id\":\"2798\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2742\",\"type\":\"BasicTicker\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[300]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[300]}},\"selected\":{\"id\":\"2792\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2791\",\"type\":\"UnionRenderers\"}},\"id\":\"2766\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"2759\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"2732\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2747\",\"type\":\"BasicTicker\"}},\"id\":\"2750\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2754\",\"type\":\"SaveTool\"},{\"attributes\":{\"items\":[{\"id\":\"2779\",\"type\":\"LegendItem\"},{\"id\":\"2794\",\"type\":\"LegendItem\"},{\"id\":\"2811\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"2732\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"2778\",\"type\":\"Legend\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[300]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[300]}},\"selected\":{\"id\":\"2809\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2808\",\"type\":\"UnionRenderers\"}},\"id\":\"2780\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[300]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[300]}},\"selected\":{\"id\":\"2896\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"2895\",\"type\":\"UnionRenderers\"}},\"id\":\"2795\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2755\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"2809\",\"type\":\"Selection\"},{\"attributes\":{\"data_source\":{\"id\":\"2780\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2781\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2782\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2784\",\"type\":\"CDSView\"}},\"id\":\"2783\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"2772\",\"type\":\"Title\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"2776\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2732\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2747\",\"type\":\"BasicTicker\"}},\"id\":\"2746\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"2780\",\"type\":\"ColumnDataSource\"}},\"id\":\"2784\",\"type\":\"CDSView\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"2769\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2779\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"2795\",\"type\":\"ColumnDataSource\"}},\"id\":\"2799\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"2774\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2732\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2742\",\"type\":\"BasicTicker\"}},\"id\":\"2741\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"2766\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"2767\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"2768\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"2770\",\"type\":\"CDSView\"}},\"id\":\"2769\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2782\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"2783\",\"type\":\"GlyphRenderer\"}]},\"id\":\"2794\",\"type\":\"LegendItem\"}],\"root_ids\":[\"2732\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"96a888d8-afa4-433d-8402-678e052e2f57\",\"roots\":{\"2732\":\"5befe289-4d5c-4234-92dd-9d6b35feb2f8\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "2732" } }, "output_type": "display_data" } ], "source": [ "# Set up parameters for periodic forcing with f = 0.5 and x_0 = 2.\n", "x_args = (0.5, 2.0)\n", "\n", "# Package parameters into a tuple, now with high cooperativity\n", "n_y = 10\n", "args = (beta_y, beta_z, gamma, n_x, n_y, x_periodic, x_args)\n", "\n", "# Time points\n", "t = np.linspace(0, 40, 300)\n", "\n", "# Initial condition\n", "yz_0 = np.array([0.0, 0.0])\n", "\n", "# Integrate ODES\n", "yz = scipy.integrate.odeint(cascade_rhs_x_fun, yz_0, t, args=args)\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# x\n", "x = x_periodic(t, *x_args)\n", "x /= x.max()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y')\n", "p.line(t, z, line_width=2, color=colors[1], legend='z')\n", "p.line(t, x, line_width=2, color=colors[2], alpha=0.2, legend='x (normalized)', line_join='bevel')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We roughly follow the forcing with some lag. Now, for high-frequency forcing, we have a different response." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"f3329d6e-e931-4b83-a213-5dc3cde03a27\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2985\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"2990\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"2985\",\"type\":\"LinearAxis\"},{\"id\":\"2989\",\"type\":\"Grid\"},{\"id\":\"2990\",\"type\":\"LinearAxis\"},{\"id\":\"2994\",\"type\":\"Grid\"},{\"id\":\"3003\",\"type\":\"BoxAnnotation\"},{\"id\":\"3022\",\"type\":\"Legend\"},{\"id\":\"3013\",\"type\":\"GlyphRenderer\"},{\"id\":\"3027\",\"type\":\"GlyphRenderer\"},{\"id\":\"3042\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"3016\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"3001\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"2977\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"2981\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"2979\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"2983\",\"type\":\"LinearScale\"}},\"id\":\"2976\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"3020\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2981\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3025\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3026\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null},\"id\":\"2979\",\"type\":\"DataRange1d\"},{\"attributes\":{\"data_source\":{\"id\":\"3024\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"3025\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"3026\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"3028\",\"type\":\"CDSView\"}},\"id\":\"3027\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"3024\",\"type\":\"ColumnDataSource\"}},\"id\":\"3028\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]}},\"selected\":{\"id\":\"3053\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"3052\",\"type\":\"UnionRenderers\"}},\"id\":\"3024\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"3035\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]},\"y\":{\"__ndarray__\":\"VjwcVQ8A4D/WeKHRo1DjP5oXZ2lmfOY/kpEFNR5g6T/4eceIstvrP2Q0JnqP0+0/Cj86NNgx7z/QKHXQWefvPynCJCo07O8/UvtzWTFA7z+RQjEKyOrtP2tJX5TI+us/D8Ryb7iF6T8YVggk46bmP4+ndxsrfuM/M7AKdacu4D9eOMN9PLrZPyTINPjXXNM/bwAWxqgXyz/O1g/0mg/BP1UUMQnoIbI/8Mu92w6kmz9zGW1gEiZuPzYP+fJcLl8/a6jkG7BClj8IYSVfQemvP4I/6w4tNb8/qs+HBHNUyT9rXA9p7l3SP3Jy9cYTqdg/EZvJQMFF3z/Z4aFrQvXiP+XGUFzJJuY/QUkBfPwT6T8JGZzMWZzrP9BnxV+/o+0/YxPI1KMT7z9sDu2tENzvP9kglaBT9O8/BK6ELl9b7z+FXmBX1hfuPw9/d+DCN+w/qp25ZfnP6T/s0u33MfvmP9lHU1Lf2OM/O8teiNGL4D8RmZSnZnHaP5G2npTlCNQ/ZRqonJxKzD+qL+LTFRDCPzehbPqpp7M/3TQ58KGKnz+M1i63Mj51P5pBQ4tjDFE/ihZqS3b9kj8Ftto8QSetP1sxCHPMU70/OUNx+QMuyD9hzgLIOrbRP6t7Mdgq9Nc/ZDgViXyL3j+KGHywfJniP75ti6Zb0OU/DUOF1KbG6D/qtqQ4d1vrP406A5sgcu0/HoCWC3Dz7j/Dt/mSrc7vPzczn+dV+u8/O1OaGIR07z9q1kWYBkPuP1p6DL0ec+w/FO6/hO0Y6j96O/r9k07nP1o+HwsRM+Q/Au7pFuno4D96NslVTSnbP+xBXBWJttQ/sHWXwkuCzT+6P736phbDP26q3C7HO7U/ek+Pgm/YoT9zjJ9f63V8P6VKr9aaljw/acUpfCDzjz9PTq4mUIOqP2XhyQB/f7s/twIXt9sMxz9mQCPXaxDRP61Hkt1SQNc/5iKQMWnR3T8EozjJXj3iP9SZ2rsoeeU/gYHafSd46D8HwdxlExnrP+laDb+5Pu0/Ffn8HEHR7j9Ez7ZFMr/vP/SwbjM6/u8/VcrIwpyL7z/v0d8TU2zuPza9l0zUrOw/z33YIYtg6j9v8Lkp/qDnPyODW1K0jOQ/LBrgyuFF4T9mxjkq2OHbPxNAY3irZdU/X0Qt64y+zj9MygeeKyPEP1kLdBoK3rY/OSf9rBwLpD9CNEQqn1yCPzu2VPpktxc/ClJPd8huij+Zpmitx/2nP7V7l8WCuLk/c9MLjiDxxT8mod2Ol2zQP2kVnaujjdY/UEkk4p8X3T+x8Y7q9ODhP+xXIyo8IeU/gdm73ogo6D/+pEsgN9XqPyqggJuRCe0/3viFkBut7j/5ckzToK3vPwAAAAAAAPA/WSWbHaag7z/6kkZRtpPuP0HCh+nb5Ow/Ol24v8im6j+ay5CPZfLnP2zrZ0e95eQ/E+uLUq+i4T9J2P6w7prcP6Sh7Yg1FtY/c4OqLjb/zz+nCEopgDXFPxeKQFE7jrg/Eki36A1dpj8hNr+liQOHP+fpecwCJc0+VIm5rJ9uhT/4flJa/ZalP9xdGwsU/7c/CIbSFvjaxD9NxfhIp5XPP1Lcg+803NU/+VzsODle3D/VVEdTS4ThP3dE5JehyOQ/7x71g9XX5z9Oadpl64/qP1UBgjuv0uw/dltVMASH7j+1nqmP+5nvP6WyMRGn/+8/23h7X52z7z/uFWYYK7nuPz5gQycuG+0/Tsm4D53r6j8Tjixmv0LoPx8PFx4gPuU/m3fwYUX/4T+MTa5jeFTdP5CejOIPyNY/3Lvqhw6i0D/LlORCgE3GPxbPwo4hTLo/dO96gvTNqD/a3OdUFy+MP22amCNd+SY/SoUAvU/zgD/TXN+jQk+jPxYPRk9tU7Y/HariLIfKwz99NY4Oa1bOP/YqAiweLNU/K8Dwxk2l2z/gnJtKbifhP9hZqsJkb+Q/qEb9HhiG5z9WqSJlOUnqPwCoz+QZmuw/ZOaFCABf7j8kNTUVRYTvPzN/zHIv/e8/oGkRBYDE7z9aG69yrNzuP22gJdPDT+0/ueES8/4u6z/ow/IHAZLoP415PiDRleU/g3FqtJdb4j9uQ5usXA7ePx03QvQie9c/6HnNQItG0T/1cuHQBmvHPxv9hL2BF7w/Ow7frH1dqz8vUJVrTO+QP//za3rE2UM/F5fLXOH6eT8IOeLi5CahP9UejjzHtbQ/QE/G6fG/wj/X21a7pBvNP12iP7Z2fdQ/fjPmDPbs2j+rnJYeasrgPwmwgn2RFeQ/8quLhFsz5z9iHjd8KgHqP9Q/yhbZX+w/nRJ+ZhQ17j+ysnVEgGzvP0ywgXiZ+O8/w2uX0UvT7z+xgr+rNf7uP0nncfWVgu0/+wcVfOVw6z/362n0H+DoP4LuQ6/E7OU/IExQDpq34j9SBhjqgsjeP2uZoANXL9g/hFlhdvvs0T9lmd797Y3IP4Ti7v4e8L0/FAxNi1ILrj/3LPunpgiUP1/GpQfHNlU/zd9esREbcz/7nZuQWjyeP9f5baJYJrM/yXpRoFu7wT8BOd8EfuXLPx59uLJV0NM/lqzud0o12j8fw3IiS23gP4Vjaa8zu+M/16ooq6rf5j+B3WU3yLfpP8yidon0I+w/NjA82EYJ7j+nla9DsFLvP+sN4L3l8e8/sKcmz/7f7z+j4AFSwh3vP2xPQNKds+0/fLxR70ex6z+ltJ3RES3pP0mQp0XvQuY/BTKRPkAT4z8Nmblx0oLfP+MF7y+U5Ng/fv/aGkmV0j/GSxE+D7bJPy6/VrO61b8/w5vBHoxrsD/MOSVAMWOXP3EVfYutXWI/oBxsTTOQaj94sAOnwWqaP6WtIG5WpbE/W+3z1+a8wD+yNd4DILTKP1uLLBLSJNM/gcNcXmN+2T9yB/isHRDgP9DXtVFXYOM/fL65qRCL5j+JdvRPHG3pP48EeCx05us/CPqZK53b7T+KiHp+2DbvP7dAPyYV6e8/g3v5Tpfq7z8mO0Q3TjvvP0sWYurU4u0/kdPHxB3w6z+nHH5tzHjpP/6yinhFmOY/dpNSIH5u4z8KM85JmR7gP07GU3XCmtk/LvAr4V0/0z+co2FUQ+PKP4bDJkEK5MA/4bfP9TfgsT9GUklxev6aP99xNARIPGw/u6qqmH0FYT9aNU2SgNmWP32PnqPzMrA/OrxLkGqJvz8OFsMus4fJP5UGlY4Ce9I/EiV6/FjI2D/fs7It3GXfP6+KhG4IBeM/L1cJtpg15j9SHNaqMCHpP/u9AiZgp+s/R7SHbR2s7T8SXU2l/BjvPyuyodwo3u8/Fo+k6RPz7z8X2EVx1VbvP8f9Pfw0EO4/ydgDqV4t7D+cTDm/RcPpP3snM/m77OY/mBaMnEfJ4z/z1NROxXvgP4zMArDJUdo/zwn3PyPr0z82lJ1XYhXMPxPLkjF148E/hydYaXtjsz/9YGbkB9qeP3JnORLyGnQ/BTNy4IsuUz8yui9VEImTPylyta3Cnq0/po7gp8+lvT8T71hUX2DIP3+nIaj90tE/vHtRcUMT2D8JrSNykavePzawHh9TqeI/9ZZKI07f5T/OA1xXD9ToPz3fx9HAZus/k+4+6c167T+S5gCtIPnuPwHujFMi0e8/JXRGf3P57z+zCjxaVHDvP8eDpAS4O+4/OX06fgJp7D8R+I/ocwzqPy3MipZHQOc/0rKhq5Aj5D8glG7v4NjgP/eMcJ+RCds/c/yMdIKY1D+5wsK3Q0zNP9tO2VL86MI/IKblKCP1tD8rKz1fq3qhP1umdtt1JHs/NcqrhiEaQT8h+sBb4XmQP0+MhEqd9ao/a6kiCz3Puz+HTYCWSz7HPzhoPaLZLNE/rDZ8uzpf1z901IPWc/HdP0jKX4pDTeI/4CiZYDyI5T9dJuCNwoXoP7uq2b+eJOs/5gRtJ7VH7T8LxUnOSNfuP3OJ2EQDwu8/fsutN7X97z8G702Rx4fvP/DVmz9YZe4/behbXQGj7D8QGyQ3TVTqP2Ywmz7dkuc/8sD7Vk195D9dXkXV3zXhP/mniOkBwts/aFrwhWRH1T+JcF5DvofOP1LcoP189MM/5wHT+/mUtj+Oc+zY7aejP/vRGVTgnIE/O6cZsJM/IT+n1h7ZtliLPx40/F7Raqg/+BR7FPEFuj/z1P9kniHGP+5Om4CsiNA/n5n0tVas1j99VxkEnDfdP0t0GePl8OE/kGZ1924w5T/Uk2quVDboP94eibMC4eo/i3xV7dkS7T9MMimFebPuP4CXc7HNsO8/h+p1gtj/7z+ZAgf7K53vP0FkIykQje4/Rskfl1Pb7D9N58ElyJrqPxkYBQBy5Oc/H8qcunHW5D8grNGttZLhP7v15x0Ce9w/sdrgR7L31T/j0AItqMfPP0k15L/TBcU/wnBYyMhCuD+zbVCIgfSlP0lbvSPgLIY/G/ymLSHLQz5m9sM1u0GGP/448Ca1/qU/Ynv8WyhKuD/yYmx4fQrFP89VlwgYzc8/Wo7sFK/61T91J+uaIn7cP+WZdWZGlOE/cPw8ivHX5D+XglE/0OXnP1q2PKL1m+o/lVnsO0Pc7D8y5FSQt43uP5yxIOGDne8/TP0ZF93/7z9Ei8DBfrDvPwL67n3asu4/xQIKtfER7T9NtKJd29/qP8Sscwv7NOg/xt+0BvIu5T8OfvwrVu/hP5qGGbl5NN0/0GbtXVSp1j9ggWiI64XQP1OmpGHcHMY/0qXYmlb+uT8W0yZwGGCoPwe8qZifQYs/mz9MmwGtID/oCj50fK+BP+hCSc2asaM/5LVbrx2ctj+0iynNDfnDPypWtFEbjc4/9I6pYltK1T8zrH0uIMXbP85MV1pxN+E/OUag0s9+5D9cTNTrP5TnPxqFQLKAVeo/sYvoTvij7D9FGJbwB2buP4edKGIoiO8/V6L+9ML97z8vvgFWvcHvP95DGTyy1u4/edFnetRG7T92yqm3fSPrP/MuC7VthOg/EUcygcKG5T8LosAJtUviP+cq1idQ7t0/6oiMPjNc1z8FgQv9DyrRP8OjtulxOcc/YrFsrWjHuz/LGjF3YOqqP/qs8Ss5bZA/fPE7V93QQD/8MXBJK0V7PyGiIWHQg6E/qBwlCgr8tD+W/YKec+3CP5VE6kKNUc0/ICVm/HKb1D8CGZFCrQzbP592ugtz2uA/io8UoBUl5D/bhrGCrkHnP53ajzmtDeo/2ZHOmwBq7D9e3R/obzzuP7mbAwm+cO8/Xf9xY4r57z9HmtZu5dDvPwWrzaOS+O4/GEpF5fR57T9M3Jo9pmXrPxzw0nW/0ug/0UJPh9fd5T+rCMsJxqfiP+YQRspsqN4/zdc6NjcQ2D+lYoC0K9DRP1Hxp6JuW8g/k6Otb8KdvT8ybhVzA5OtPz/TIkNNe5M/CJVAzp73Uj+k8F5YIDd0P0HX2pY/654/dJ8vjiRqsz/ud99h0ufBP57QPKyXGsw/X2E5Dw3u0z9d4OFH4lTaP9qUEs1XfeA/rnVD1s7K4z9kaLj0Ju7mPwaTmLyExOk/T3Tz0GMu7D/zs9z59BDuP+tn+e9HV+8/a06i8TPz7z9qah0K9d3vPx1w6Td3GO8/iA5bL0yr7T/aBEorTKbrP3RsGu3lH+k/ZMccjyU05j+D8hn5fAPjP3gRRPe2Yt8/lPCeakjF2D+a4y2sKHjSP6DDvh+sgsk/Tvy6jiWBvz/Hu+SZ0yywP2Si1XCkypY/IH7pNeXgYD/VKv3IjmtsP9jDXoqdDps/BZhOfKLmsT+dAA7CTOjAP4RhzMFj6Mo/f6wElUBC0z+uouuY153ZP0e/qPQrIOA/hJp3awdw4z8vqVVTtJnmP2o/+OwQeuk/zTl41Cnx6z/8mLPonOPtP1T6t3bJO+8/FOWKdsDq7z+Y5cps6ujvP1bvk75bNu8/GBr0ztPa7T+DJcXvZuXrPytR2eHWa+k/3eIJKaGJ5j+fwZqwzV7jP+ka0f+KDuA/ppOy3U572T/iH7ah8CHTPxEuEUIDr8o/1F++/qi4wD9A1MLH9p6xP/ZIMm7OWpo/9N5d6n1iaj85ihZF2INiP0Gwd5w9cpc/L2NDLbdxsD9W5Fs1Cd6/P2RgYBYau8k/oWtoUSSY0j9pF692pefYP3lV8rX3hd8/jN8GZ8sU4z/wEBzPYUTmP09UM6hbLuk/yPQ9w1qy6z/al8S2bbTtP9EW4UFGHu8//bfXEDHg7z+K4yQjxPHvP5X5zUE8Uu8/SojLd4UI7j9ueXYu7iLsP45ACkSItuk/4ahnAT/e5j/6NMYWrLnjP/eDt5i4a+A/zn3wcDIy2j8LpOkVbc3TP/8ltD1M4Ms/txOQ/gK3wT8Ysp83uh+zP1NYfF1SK54/kgLwhqv/cj9P9iNH2nBVP/fJFUmaFpQ/akzfFSgXrj/z6GTnNfi9Pw30Bpbiksg/\",\"dtype\":\"float64\",\"shape\":[600]}},\"selected\":{\"id\":\"3153\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"3152\",\"type\":\"UnionRenderers\"}},\"id\":\"3039\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"3036\",\"type\":\"Selection\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"3027\",\"type\":\"GlyphRenderer\"}]},\"id\":\"3038\",\"type\":\"LegendItem\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]}},\"selected\":{\"id\":\"3036\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"3035\",\"type\":\"UnionRenderers\"}},\"id\":\"3010\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3012\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"3013\",\"type\":\"GlyphRenderer\"}]},\"id\":\"3023\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3040\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null},\"id\":\"2977\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2995\",\"type\":\"PanTool\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"2976\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2991\",\"type\":\"BasicTicker\"}},\"id\":\"2994\",\"type\":\"Grid\"},{\"attributes\":{\"data_source\":{\"id\":\"3010\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"3011\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"3012\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"3014\",\"type\":\"CDSView\"}},\"id\":\"3013\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3041\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"3039\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"3040\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"3041\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"3043\",\"type\":\"CDSView\"}},\"id\":\"3042\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2983\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3011\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"3010\",\"type\":\"ColumnDataSource\"}},\"id\":\"3014\",\"type\":\"CDSView\"},{\"attributes\":{\"overlay\":{\"id\":\"3003\",\"type\":\"BoxAnnotation\"}},\"id\":\"2997\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"3039\",\"type\":\"ColumnDataSource\"}},\"id\":\"3043\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"3018\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2996\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"3018\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2976\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2986\",\"type\":\"BasicTicker\"}},\"id\":\"2985\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"3052\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2986\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"3053\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2998\",\"type\":\"SaveTool\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"3016\",\"type\":\"Title\"},{\"attributes\":{\"label\":{\"value\":\"x (normalized)\"},\"renderers\":[{\"id\":\"3042\",\"type\":\"GlyphRenderer\"}]},\"id\":\"3055\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"2999\",\"type\":\"ResetTool\"},{\"attributes\":{\"plot\":{\"id\":\"2976\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2986\",\"type\":\"BasicTicker\"}},\"id\":\"2989\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"3000\",\"type\":\"HelpTool\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"3020\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"2976\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"2991\",\"type\":\"BasicTicker\"}},\"id\":\"2990\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"3152\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"2995\",\"type\":\"PanTool\"},{\"id\":\"2996\",\"type\":\"WheelZoomTool\"},{\"id\":\"2997\",\"type\":\"BoxZoomTool\"},{\"id\":\"2998\",\"type\":\"SaveTool\"},{\"id\":\"2999\",\"type\":\"ResetTool\"},{\"id\":\"3000\",\"type\":\"HelpTool\"}]},\"id\":\"3001\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"2991\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"3153\",\"type\":\"Selection\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"3003\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"items\":[{\"id\":\"3023\",\"type\":\"LegendItem\"},{\"id\":\"3038\",\"type\":\"LegendItem\"},{\"id\":\"3055\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"2976\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"3022\",\"type\":\"Legend\"}],\"root_ids\":[\"2976\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"f3329d6e-e931-4b83-a213-5dc3cde03a27\",\"roots\":{\"2976\":\"4da2acac-9f2d-44bb-80fd-c38742dd76fd\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "2976" } }, "output_type": "display_data" } ], "source": [ "# Set up parameters for periodic forcing with f = 5 and x_0 = 2.\n", "x_args = (5.0, 2.0)\n", "\n", "# Package parameters into a tuple\n", "args = (beta_y, beta_z, gamma, n_x, 10, x_periodic, x_args)\n", "\n", "# Time points\n", "t = np.linspace(0, 25, 600)\n", "\n", "# Initial condition\n", "yz_0 = np.array([0.0, 0.0])\n", "\n", "# Integrate ODES\n", "yz = scipy.integrate.odeint(cascade_rhs_x_fun, yz_0, t, args=args)\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# x\n", "x = x_periodic(t, *x_args)\n", "x /= x.max()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y', line_join='bevel')\n", "p.line(t, z, line_width=2, color=colors[1], legend='z', line_join='bevel')\n", "p.line(t, x, line_width=2, color=colors[2], alpha=0.2, legend='x (normalized)', line_join='bevel')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that Z does not really respond to high frequency forcing, even though the forcing is with the same amplitude. This gives us a design principle, that **a cascade can filter out high frequency fluctuations**. We can see this by adding another frequency to the signal." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"efc7f45d-2232-48a7-ae89-1130c69e4680\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"3242\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"3247\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":500,\"renderers\":[{\"id\":\"3242\",\"type\":\"LinearAxis\"},{\"id\":\"3246\",\"type\":\"Grid\"},{\"id\":\"3247\",\"type\":\"LinearAxis\"},{\"id\":\"3251\",\"type\":\"Grid\"},{\"id\":\"3260\",\"type\":\"BoxAnnotation\"},{\"id\":\"3279\",\"type\":\"Legend\"},{\"id\":\"3270\",\"type\":\"GlyphRenderer\"},{\"id\":\"3284\",\"type\":\"GlyphRenderer\"},{\"id\":\"3299\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"3273\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"3258\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"3234\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"3238\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"3236\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"3240\",\"type\":\"LinearScale\"}},\"id\":\"3233\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"3248\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"3293\",\"type\":\"Selection\"},{\"attributes\":{\"data_source\":{\"id\":\"3267\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"3268\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"3269\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"3271\",\"type\":\"CDSView\"}},\"id\":\"3270\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"3260\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"3257\",\"type\":\"HelpTool\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"3284\",\"type\":\"GlyphRenderer\"}]},\"id\":\"3295\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3269\",\"type\":\"Line\"},{\"attributes\":{\"axis_label\":\"dimensionless y, z\",\"formatter\":{\"id\":\"3277\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"3233\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"3248\",\"type\":\"BasicTicker\"}},\"id\":\"3247\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"3267\",\"type\":\"ColumnDataSource\"}},\"id\":\"3271\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"3252\",\"type\":\"PanTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"3252\",\"type\":\"PanTool\"},{\"id\":\"3253\",\"type\":\"WheelZoomTool\"},{\"id\":\"3254\",\"type\":\"BoxZoomTool\"},{\"id\":\"3255\",\"type\":\"SaveTool\"},{\"id\":\"3256\",\"type\":\"ResetTool\"},{\"id\":\"3257\",\"type\":\"HelpTool\"}]},\"id\":\"3258\",\"type\":\"Toolbar\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3297\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"3253\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3298\",\"type\":\"Line\"},{\"attributes\":{\"overlay\":{\"id\":\"3260\",\"type\":\"BoxAnnotation\"}},\"id\":\"3254\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"data_source\":{\"id\":\"3296\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"3297\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"3298\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"3300\",\"type\":\"CDSView\"}},\"id\":\"3299\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]}},\"selected\":{\"id\":\"3310\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"3309\",\"type\":\"UnionRenderers\"}},\"id\":\"3281\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"3255\",\"type\":\"SaveTool\"},{\"attributes\":{\"source\":{\"id\":\"3296\",\"type\":\"ColumnDataSource\"}},\"id\":\"3300\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"3256\",\"type\":\"ResetTool\"},{\"attributes\":{\"callback\":null},\"id\":\"3236\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"3309\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"3273\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"3238\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"3240\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"3310\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"3275\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"3233\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"3248\",\"type\":\"BasicTicker\"}},\"id\":\"3251\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"3243\",\"type\":\"BasicTicker\"},{\"attributes\":{\"label\":{\"value\":\"x (normalized)\"},\"renderers\":[{\"id\":\"3299\",\"type\":\"GlyphRenderer\"}]},\"id\":\"3312\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"3277\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"3275\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"3233\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"3243\",\"type\":\"BasicTicker\"}},\"id\":\"3242\",\"type\":\"LinearAxis\"},{\"attributes\":{\"items\":[{\"id\":\"3280\",\"type\":\"LegendItem\"},{\"id\":\"3295\",\"type\":\"LegendItem\"},{\"id\":\"3312\",\"type\":\"LegendItem\"}],\"plot\":{\"id\":\"3233\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"3279\",\"type\":\"Legend\"},{\"attributes\":{},\"id\":\"3422\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"3270\",\"type\":\"GlyphRenderer\"}]},\"id\":\"3280\",\"type\":\"LegendItem\"},{\"attributes\":{\"plot\":{\"id\":\"3233\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"3243\",\"type\":\"BasicTicker\"}},\"id\":\"3246\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"3423\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]}},\"selected\":{\"id\":\"3293\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"3292\",\"type\":\"UnionRenderers\"}},\"id\":\"3267\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[600]}},\"selected\":{\"id\":\"3423\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"3422\",\"type\":\"UnionRenderers\"}},\"id\":\"3296\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null},\"id\":\"3234\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3282\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3283\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3268\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"3281\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"3282\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"3283\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"3285\",\"type\":\"CDSView\"}},\"id\":\"3284\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"3281\",\"type\":\"ColumnDataSource\"}},\"id\":\"3285\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"3292\",\"type\":\"UnionRenderers\"}],\"root_ids\":[\"3233\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.4\"}};\n", " var render_items = [{\"docid\":\"efc7f45d-2232-48a7-ae89-1130c69e4680\",\"roots\":{\"3233\":\"2490ccf4-82b2-4802-a52e-a2fd5054d158\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "3233" } }, "output_type": "display_data" } ], "source": [ "# Set up parameters for periodic forcing with f = 5 and x_0 = 2.\n", "x_args = ((0.5, 10.0), (0.5, 2.0))\n", "\n", "# Package parameters into a tuple\n", "args = (beta_y, beta_z, gamma, n_x, 10, x_periodic, x_args)\n", "\n", "# Time points\n", "t = np.linspace(0, 25, 600)\n", "\n", "# Initial condition\n", "yz_0 = np.array([0.0, 0.0])\n", "\n", "# Integrate ODES\n", "yz = scipy.integrate.odeint(cascade_rhs_x_fun, yz_0, t, args=args)\n", "\n", "# Pluck out y and z\n", "y, z = yz.transpose()\n", "\n", "# x\n", "x = x_periodic(t, *x_args)\n", "x /= x.max()\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=300,\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless y, z')\n", "\n", "# Populate glyphs\n", "p.line(t, y, line_width=2, color=colors[0], legend='y', line_join='bevel')\n", "p.line(t, z, line_width=2, color=colors[1], legend='z', line_join='bevel')\n", "p.line(t, x, line_width=2, color=colors[2], alpha=0.2, legend='x (normalized)', line_join='bevel')\n", "\n", "# Place the legend\n", "p.legend.location = 'top_right'\n", "\n", "#Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even though the high frequency part of the forcing has a bigger amplitude, the signal in *z* responds predominantly to the low frequency part of the signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A challenge\n", "\n", "In the above analysis, I made a fresh plot each time of the response to an oscillating input so that the plots would display nicely in the HTML rendered version of this notebook. Can you make the sample plot(s) by making a single interactive plot?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing environment" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPython 3.7.3\n", "IPython 7.1.1\n", "\n", "numpy 1.16.2\n", "scipy 1.2.1\n", "bokeh 1.0.4\n", "jupyterlab 0.35.4\n", "biocircuits 0.0.5\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p numpy,scipy,bokeh,jupyterlab,biocircuits" ] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }