{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Table of Contents](table_of_contents.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# T11 Matrix Norms\n",
    "\n",
    "Author:  Mark Petersen\n",
    "Email: Mark Petersen\n",
    "\n",
    "Table of Content\n",
    "* [Introduction](#Introduction)\n",
    "* [Operator Norms](#Operator-Norms)\n",
    "* [Geometrix Representation](#Geometric-Representation)\n",
    "* [Bounded Operators](#Bounded-Operators)\n",
    "* [Submultiplicative Property](#Submultiplicative-Property)\n",
    "* [Matrix Norms](#Matrix-Norms)\n",
    "* [Matrix Norm Relationships](#Matrix-Norm-Relationships)\n",
    "* [Example Problem](#Example-Problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "\n",
    "This notebook will follow section 4.2 *Operator norms* in *Mathematical Methods and Algorithms for Signal Processing* by Todd K. Moon.\n",
    "\n",
    "Before learning about matrix norms, it is beneficial to look at the definition of a linear operator norm. We will then use this definition to analyze the geometry and boundedness of an operator norm. Then we will look at matrix norms and finish with an example.  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Operator Norms\n",
    "\n",
    "There are many ways of defining this norm, and one way to think about it is how much the operator can change the length of the vector it operates on. \n",
    "\n",
    "**Definition** Let $X$ and $Y$ be normed vector spaces, and let $A$ be a linear operator $A:X \\rightarrow Y$. The $p$ operator norm, or $p$ norm, or $l_p$ norm, of $A$ is\n",
    "\n",
    "$$ ||A||_p = \\sup_{x \\in X, \\neq 0} \\frac{||Ax||_p}{||x||_p} = \\sup_{x \\in X, ||x||_p=1} ||Ax||_p$$\n",
    "\n",
    "where $|| \\cdot ||_p$ is the $p$ norm. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Geometric Representation\n",
    "\n",
    "A good way to visually look at how an operator norm changes the length of a vector is to look at how the subordinate matrix norm $||A||_p$ changes the unit circle. \n",
    "\n",
    "Let $x \\in X , ||x||_p = 1$ and $A \\in R^{2x2}$ then $||A||_p = \\max y $  where  $ y \\in Y$ and  $y = Ax$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,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BNRZlq5du0paWppERUVJw4YNZeTIkXL33Xfr+vHF2xPd5MlKkAB6slv8Wally5bpiWj8+PEyceJEfVpiypQpJID+7E5qjQACPhDIyMjQN9h9/fXX8tVXX8knn3yib7wrVqxYnrMvfPH2QWeGuYokgGEGN/XjNm3aJO3bt5eHHnpIBg8eLIsXL9b/v2TJElGnhHM2VgBNjQDahQACkRJQc2ynTp3k9ddfl88++0x/ET99Y96NVM94+3NJAL3dP76oXWpqqnTo0EFPOuPGjcutc+/eveXYsWOiTguTAPqiK6kkAgj4UEDdAazm3muvvVamT59+VgtIAH3YqWGoMglgGJD5iFMCTEREAwIIIBBcAXXZzYMPPqhvvqtfvz4JYHB5jT0aCaCxXeu9hqnnUv38889y8OBBqVChgr4+UJ0mZkMAAQQQKLpAt27d9KU26tFb+W188S66rcl7kgCa3Lu0DQEEEEDASIHjx49LSkqKvPnmm/Lvf/9b1qxZo2+8O3Pji7eR3R+URpEABoWRgyCAAAIIIBA+AbWqd9lll+lHbamHQKuHP7Mh4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgRIAF0okVZBBBAAAEEEEDAAAESQAM6kSYggAACCCCAAAJOBEgAnWhRFgEEEEAAAQQQMECABNCATqQJCCCAAAIIIICAEwESQCdalEUAAQQQQAABBAwQIAE0oBNpAgIIIIAAAggg4ESABNCJFmURQAABBBBAAAEDBEgADehEmoAAAggggAACCDgR+P+gyKK5AQfkZAAAAABJRU5ErkJggg==\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Matrix Norm 2.0615528128088303\n"
     ]
    }
   ],
   "source": [
    "%matplotlib notebook\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def visualize(A = np.matrix([[2,0],[0,0.5]]), norm_type = 2):\n",
    "\n",
    "    # Construct x s.t. ||x||_1 = 1\n",
    "    if norm_type == 1:\n",
    "        num_points = 5\n",
    "        x1 = np.concatenate((np.linspace(0,1,num_points),np.linspace(1,0,num_points),\n",
    "                        np.linspace(0,-1,num_points), np.linspace(-1,0,num_points)))\n",
    "        x2 = np.concatenate((np.linspace(-1,0,num_points),np.linspace(0,1,num_points),\n",
    "                             np.linspace(1,0,num_points),np.linspace(0,-1,num_points)))\n",
    "        x = np.vstack([x1,x2])\n",
    "    \n",
    "    # Construct x s.t. ||x||_2 = 1\n",
    "    elif norm_type == 2:\n",
    "        angle = np.linspace(-np.pi, np.pi,20)\n",
    "        x = np.vstack([np.sin(angle),np.cos(angle)])\n",
    "    else:\n",
    "        num_points = 5\n",
    "        x1 = np.concatenate((np.linspace(-1,1,num_points),np.linspace(1,1,num_points),\n",
    "                        np.linspace(1,-1,num_points), np.linspace(-1,-1,num_points)))\n",
    "        x2 = np.concatenate((np.linspace(-1,-1,num_points),np.linspace(-1,1,num_points),\n",
    "                             np.linspace(1,1,num_points),np.linspace(1,-1,num_points)))\n",
    "        x = np.vstack([x1,x2]) \n",
    "    \n",
    "    \n",
    "\n",
    "\n",
    "    # Compute y\n",
    "    y = A*x\n",
    "\n",
    "\n",
    "    # Get maximum x and y axis values for plotting\n",
    "    x_max = max(abs(np.concatenate((x[0,:],np.array(y[0,:]).reshape(-1,)) ) ))\n",
    "    y_max = max(abs(np.concatenate((x[1,:],np.array(y[1,:]).reshape(-1,)))))\n",
    "    dim_max = x_max if x_max > y_max else y_max\n",
    "    dim_max += 0.1\n",
    "    \n",
    "    # Plot results\n",
    "\n",
    "    plt.figure()\n",
    "    plt.subplot(131,aspect='equal')\n",
    "    plt.plot(x[0,:],x[1,:])\n",
    "    plt.ylim([-dim_max,dim_max])\n",
    "    plt.xlim([-dim_max,dim_max])\n",
    "    plt.xlabel('$x_1$')\n",
    "    plt.ylabel('$x_2$')\n",
    "    plt.title('x')\n",
    "\n",
    "    plt.subplot(133,aspect='equal')\n",
    "    plt.plot(np.array(y[0,:]).reshape(-1,),np.array(y[1,:]).reshape(-1,))\n",
    "    plt.ylim([-dim_max,dim_max])\n",
    "    plt.xlim([-dim_max,dim_max])\n",
    "    plt.xlabel('$y_1$')\n",
    "    plt.ylabel('$y_2$')\n",
    "    plt.title('y=Ax')\n",
    "\n",
    "visualize(norm_type = 2)\n",
    "print(\"Matrix Norm\", np.linalg.norm(np.matrix([[2,0],[0,0.5]])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By visual inspection of the plots above, we can see how $A$ stretches the elements in $X$ when mapping them to elements in $Y$. Notice that the elements along the $x_1$ axis are stretched by a factor of $2$ and the elements along the $x_2$ axis are squeezed by a factor of $0.5$. Since the linear operator $A$ stretched the elements of $x \\in X \\mid ||x|| = 1$ at most by $2$ then $||A|| = 2$. It is apparent now that the norm doesn't indicate how the linear operator will stretch all of the elements in $X$, rather it indicates the maximum extent it will stretch an element in $X$. i.e. \n",
    "\n",
    "$$||Ax|| \\leq ||A||||x||, \\forall x \\in X$$\n",
    "\n",
    "Knowing the most a linear operator will stretch the elements it operates on can help us know if a bounded input $x$ will produce a bounded output $y$. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bounded Operators\n",
    "\n",
    "The norm of an operator can be used to determine if a linear transformation is bounded, i.e. $A$ will map all finite values in $X$ to finite values in $Y$. \n",
    "\n",
    "**Definition 4.3** If the norm of a transformation is finite, the transformation is said to be *bounded*. \n",
    "\n",
    "Using example 4.2.2 from the book.\n",
    "\n",
    "Let $A:C^1[0,1] \\rightarrow C[0,1]$ be the operator\n",
    "\n",
    "$$ Ax = \\frac{d}{dt}x $$\n",
    "\n",
    "The function $x(t) = \\sin(w_0t) \\in C^1[0,1]$ has uniform norm 1 for any value of $w_0$, but\n",
    "\n",
    "$$||Ax|| = \\max_{t \\in [0,1]} w_0|\\cos w_0t|$$\n",
    "\n",
    "may have norm arbitrarily large by choosing $w_0$ to be arbitrarily large. Thus the operator $A$ bounded $\\iff w_0$ is not bounded. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,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IlARqAhUBCoCFYGKwO5FoBLA3Yttea4IVAQqAhWBikBFoCJwREagEsAj8rXUoCoCFYGKQEWgIlARqAjsXgQqAdy92JbnikBFoCJQEagIVAQqAkdkBCoBXOm1vOQlL2mnnXZa++IXv9huetObthe96EXt/6jObTeuN77xje2UU05pn/3sZ9tP/dRPtec85zntLne5y0qj318/64n1n/7pn7Y///M/b5/4xCc2D/mzP/uz7ZnPfOZh383+isbujdYTZx3F6173uvYbv/Eb7e53v3t7C3qpZYeNgDfOaJ0+6UlPam9+85vbV7/61fYTP/ET7fnPf359PybmmTfWxPVlL3tZ+/znP9+udrWrtXvc4x4b8c17VwAACXRJREFUNocf+qEfmvi1y98lH/zgBzfr4D/+4z+2Cy+8sP31X/91+7/o0B/G3v/+97fHPvax7bzzzttIsT75yU9uD3jAAy5/wduBJ64EcAeC6HXx+te/vt3vfvdrL3/5y9stbnGLzceYBO/Tn/50u8Y1rnGIu49+9KPttre97eZDcte73rX95V/+5SYBPOecc9qNb3xj789frq73xvo+97lP+4Vf+IV261vfevPRJs58lPjYXOc617lcxc7zsN44m282NL/4i7/YbnCDG7SrXvWqlQBuE3RvnL/1rW9t5jPflSc+8YmbOfy5z32uHXfccZuNZ9lyBLyx5rv8oAc9qL3yla/cfD/+5V/+ZZOY3Ote92rPe97zKtSDCJxxxhntIx/5yGaj/au/+qvbJoCf+cxnNmvewx/+8PaQhzykve9972uPfvSj2zve8Y52pzvdqWLsjEAlgM6A7cTlJH0///M/31784hdv3KEpzE7md3/3d9vjH//4Q37inve8Z/vmN7/Z/uZv/uayf3fLW96y3exmN9skkWXLEfDGuvf07W9/u/3oj/7o5l2RtJeNIxCJM7FlY8Oi+aEPfaiBVBUCePgZ5o0z3wcQlk996lPtB3/wB2v6OiLgjfXv/M7vtPPPP3+TlJj93u/9Xvv7v//79uEPf9jxy5fPS4866qhtE8CTTz55k+zZCQ2RIsHm2/Gud73r8hm4xFNXApgIXuRWduQ//MM/3N70pjd9D9R9//vffzOJ3/rWtx7i9nrXu94G8manY/bUpz51s1iee+65kWFcLu6JxLoPDGLhoCcgtKCvZYdGIBpn5vA///M/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\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "498cf63a67e744e790d2daba5b8adf2d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=10, description='w_0', max=1000, min=10, step=10), Output()), _dom_class…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<function __main__.update(w_0=10)>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from __future__ import print_function\n",
    "from ipywidgets import *\n",
    "import time\n",
    "\n",
    "fig,ax = plt.subplots()\n",
    "\n",
    "# Create x(t)\n",
    "dt = 0.001\n",
    "t = np.arange(0.0, 1.0, dt)\n",
    "w_0 = 10;\n",
    "x = np.sin(w_0*t)\n",
    "\n",
    "# Create Ax(t)\n",
    "y = w_0*np.cos(w_0*t)\n",
    "l, = ax.plot(t, y, lw=2, color='red')\n",
    "\n",
    "plt.ion()\n",
    "\n",
    "def update(w_0 = 10):\n",
    "    l.set_ydata( w_0*np.cos(w_0*t))\n",
    "    ax.axis(ymax=w_0, ymin=-w_0)\n",
    "    fig.canvas.draw()\n",
    "    \n",
    "\n",
    "interact(update, w_0 = widgets.IntSlider(min=10,max=1000,step=10,value=10))\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By moving the slider in the above figure, you can see as $w_0 \\rightarrow \\infty, ||Ax|| \\rightarrow \\infty$ while $x$ stays finite between $0$ and $1$. Thus the norm of the operator is not bounded for every finite value of $x$. The example at the end will show the importance of boundedness. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Submultiplicative Property\n",
    "\n",
    "Suppose you have a system described by $h(t)$ that amplifies audio input $X$. Unfortunately, clipping that is not modeled by the system occurs when the output $\\hat{Y}$ is above a certain threshold $y_m$ i.e.\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "\\hat{y} & = h(t)*x \\\\\n",
    " y & = sat(\\hat{y}, y_m)\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "whenever clipping occurs, the signal is degraded. So to prevent clipping we want to design $h(t)$ so that clipping never occurs and verify that $||Ax|| \\leq y_m \\,\\, \\forall x \\in X$. This task could be very difficult if you verified it by brute force. Fortunately, there is a simpler way. \n",
    "\n",
    "Suppose you knew the largest norm of all the elements in $X$ and you knew $h(t)$, then you could deduce \n",
    "\n",
    "$$||h(t)*x||_p \\leq ||h(t)||||x_m|| \\, \\forall x \\in X $$\n",
    "\n",
    "where $||x_m|| \\geq ||x|| \\, \\forall x \\in X$. This idea uses the submultiplicative property. \n",
    "\n",
    "**Definition** Let $X$ and $Y$ be $l_p$ or $L_p$, and let $A$ and $B$ be linear operators. The $p$ norm has the property for all $x \\in X$ that \n",
    "$$||Ax||_p \\leq ||A||_p||x||_p$$\n",
    "\n",
    "Also, the $p$ norm satisfies the submultiplicative property\n",
    "$$||AB||_p \\leq ||A||_p||B||_p$$\n",
    "\n",
    "From the previous equations we can deduce\n",
    "$$||ABx||_p \\leq ||A||_p||B||_p||x||_p$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matrix Norms\n",
    "So far we have generalized our study to any linear operator. The rest of this notebook will specialize on the matrix $p=1$, $p=2$, $p=\\infty$ norms and the Frobenius norm. \n",
    "\n",
    "We will start by creating a basic, python, matrix class and add to it as different matrix norms are introduced."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Matrix:\n",
    "    def __init__(self,A=np.eye(3)):\n",
    "        self.A = A"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Norm $p=\\infty$\n",
    "\n",
    "Let $A \\in \\mathbb{C}^{nxm}$, $\\mathbf{y} \\in \\mathbb{C}^n$ and $\\mathbf{x} \\in \\mathbb{C}^m$ the infinity norm is defined as\n",
    "$$||A||_{\\infty} = \\max_{||\\mathbf{x}||_{\\infty}=1} ||A\\mathbf{x}||_{\\infty} = \\max_{i}\\sum_{j}|a_{ij}|$$\n",
    "which is the largest row sum. This is saying that the largest element of $\\mathbf{y}$ is composed of the largest row of $A$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Matrix(Matrix):\n",
    "    def pInfNorm(self):\n",
    "        dim = self.A.shape\n",
    "        \n",
    "        pInf_max = 0\n",
    "        \n",
    "        # Find the abs, max, row sum\n",
    "        for i in range(dim[0]):\n",
    "            r_sum = np.sum(abs(self.A[i,:]))\n",
    "            if r_sum > pInf_max:\n",
    "                pInf_max = r_sum\n",
    "        return pInf_max\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Infinity Norm: 6\n"
     ]
    },
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,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\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "M = np.matrix([[4,2],[0,5]])\n",
    "m = Matrix(M)\n",
    "print(\"Infinity Norm:\", m.pInfNorm())\n",
    "\n",
    "visualize(m.A, norm_type=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By inspecting the above images, you can see that the infinity norm indicates how much $A$ stretches $\\mathbf{x}$ along the axes of $\\mathbf{y}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Norm $p=1$\n",
    "\n",
    "The $p=1$ norm is defined as\n",
    "$$||A||_1 = \\max_{||\\mathbf{x}||_{1}=1} ||A\\mathbf{x}||_{1} = \\max_{j}\\sum_{i}|a_{ij}|$$\n",
    "which is the largest column sum."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Matrix(Matrix):\n",
    "    def pOneNorm(self):\n",
    "        dim = self.A.shape\n",
    "        \n",
    "        pOne_max = 0\n",
    "        \n",
    "        # Find the abs, max, row sum\n",
    "        for i in range(dim[1]):\n",
    "            c_sum = np.sum(abs(self.A[:,i]))\n",
    "            if c_sum > pOne_max:\n",
    "                pOne_max = c_sum\n",
    "        return pOne_max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "norm p=1: 7\n"
     ]
    },
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,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N8rmzZslLy9Pdu/e7eqlTjrppKPabd++XbKysmTWrFlyxRVXyLhx4+T++++XHTt2SJkyZQra/uc//5EmTZrIOeec4wRS9bjtttuczwuqK4adOnVy9fo0ioYAATAa8xS5oxw5cmTBovHll1/KJZdcIg888IDceOONkRsLB4wAAggEKaDWS/XHslorK1eu7LzUzp075dRTT5Xbb79dxowZIzNnzpSBAwe6OgwVKgs/7rvvPhk1apTz/BUrVpRNmzY5f4g///zz0rNnz6PaqquC6q3iJ598UurVq+f8MX/DDTc4gZGHWQIEQLPmMzSjUW8btGzZUvbs2eP8U285qLc6+NBxaKaIA0EAgZAIfPLJJ9KwYUN57LHHZNCgQc5RTZ061QleKqypIPbFF184b826eai3ews/mjdvLnXr1nV2AOc/1PqsPpJT+L/l/+zcc8+Vf/7zn6KuJKo1W71zk/9xHjevT5toCBAAozFPkTzKlStXSqtWraRs2bKyfv16Z7HhgQACCCBQXEC9BVyhQgVZvHix88P8z/wtX77cF9eGDRucP8DVFbwLLrig4LmmT58uDz/8sHNVsFKlSke9xrZt25zAqN52TsbnD30NgM6BCRAAA6PlicePHy933HGHA6F2nv3yl78EBQEEEEAghoC64qc+IqNuz6KCl7rqp/7bH/7wB6e12mCXm5vryk7d6iX/od5CnjBhQtx+M2bMKPbW8lNPPeV8VlA9HnnkEbn66qtdvS6NoiVAAIzWfEXmaNVuMXX1T+1gU28ffP311/Lxxx8XfL4lMgPhQBFAAIEUCKg1Un3mT/3hrMLeXXfdJWrzRv6GDi+fAVSfBaxTp47z7st1111XbBRqM0jVqlXlzTffLPiZeqtZ3bFBrd9qg8iSJUuctVttVOFhlgAB0Kz5DMVoDh48KG3atJHvvvvOuW2A2lmWHwbVX5s8EEAAAQSKC/zmN7+RLVu2yP79+6V+/fry97///ahgpvsZwPfee0/OOussmT17tvTr16/YC6org2pzyNatW53wqR7qbWLVT90ORt2uS4VB9RnCN954g89wG1a0BEDDJjQMwxk9erRzm4G33npLunbt6hxS/tvB6h5UPXr0CMNhcgwIIIBAqASee+456d27t3NMc+fOFfXVbX4e1157rTz66KPy1VdfSZUqVYo9lQp5v/jFL0TtEh4+fLio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CCBggAAB0IBJZAgIIIAAAggggICOAAFQR4u2CCCAAAIIIICAAQIEQAMmkSEggAACCCCAAAI6AgRAHS3aIoAAAggggAACBggQAA2YRIaAAAIIIIAAAgjoCBAAdbRoiwACCCCAAAIIGCBAADRgEhkCAggggAACCCCgI0AA1NGiLQIIIIAAAgggYIAAAdCASWQICCCAAAIIIICAjgABUEeLtggggAACCCCAgAECBEADJpEhIIAAAggggAACOgIEQB0t2iKAAAIIIIAAAgYIEAANmESGgAACCCCAAAII6AgQAHW0aIsAAggggAACCBgg2UtrugAABvpJREFUQAA0YBIZAgIIIIAAAgggoCNAANTRoi0CCCCAAAIIIGCAAAHQgElkCAgggAACCCCAgI4AAVBHi7YIIIAAAggggIABAgRAAyaRISCAAAIIIIAAAjoCBEAdLdoigAACCCCAAAIGCBAADZhEhoAAAggggAACCOgIEAB1tGiLAAIIIIAAAggYIEAANGASGQICCCCAAAIIIKAjQADU0aItAggggAACCCBggAAB0IBJZAgIIIAAAggggICOAAFQR4u2CCCAAAIIIICAAQIEQAMmkSEggAACCCCAAAI6AgRAHS3aIoAAAggggAACBggQAA2YRIaAAAIIIIAAAgjoCBAAdbRoiwACCCCAAAIIGCBAADRgEhkCAggggAACCCCgI0AA1NGiLQIIIIAAAgggYIAAAdCASWQICCCAAAIIIICAjgABUEeLtggggAACCCCAgAECBEADJpEhIIAAAggggAACOgIEQB0t2iKAAAIIIIAAAgYIEAANmESGgAACCCCAAAII6AgQAHW0aIsAAggggAACCBggQAA0YBIZAgIIIIAAAgggoCNAANTRoi0CCCCAAAIIIGCAAAHQgElkCAgggAACCCCAgI4AAVBHi7YIIIAAAggggIABAgRAAyaRISCAAAIIIIAAAjoCBEAdLdoigAACCCCAAAIGCBAADZhEhoAAAggggAACCOgIEAB1tGiLAAIIIIAAAggYIEAANGASGQICCCCAAAIIIKAjQADU0aItAggggAACCCBggAAB0IBJZAgIIIAAAggggICOAAFQR4u2CCCAAAIIIICAAQIEQAMmkSEggAACCCCAAAI6AgRAHS3aIoAAAggggAACBggQAA2YRIaAAAIIIIAAAgjoCBAAdbRoiwACCCCAAAIIGCBAADRgEhkCAggggAACCCCgI0AA1NGiLQIIIIAAAgggYIAAAdCASWQICCCAAAIIIICAjgABUEeLtggggAACCCCAgAECBEADJpEhIIAAAggggAACOgIEQB0t2iKAAAIIIIAAAgYIEAANmESGgAACCCCAAAII6AgQAHW0aIsAAggggAACCBggQAA0YBIZAgIIIIAAAgggoCNAANTRoi0CCCCAAAIIIGCAAAHQgElkCAgggAACCCCAgI4AAVBHi7YIIIAAAggggIABAgRAAyaRISCAAAIIIIAAAjoCBEAdLdoigAACCCCAAAIGCBAADZhEhoAAAggggAACCOgIEAB1tGiLAAIIIIAAAggYIEAANGASGQICCCCAAAIIIKAjQADU0aItAggggAACCCBggAAB0IBJZAgIIIAAAggggICOAAFQR4u2CCCAAAIIIICAAQIEQAMmkSEggAACCCCAAAI6AgRAHS3aIoAAAggggAACBggQAA2YRIaAAAIIIIAAAgjoCBAAdbRoiwACCCCAAAIIGCBAADRgEhkCAggggAACCCCgI0AA1NGiLQIIIIAAAgggYIAAAdCASWQICCCAAAIIIICAjgABUEeLtggggAACCCCAgAECBEADJpEhIIAAAggggAACOgIEQB0t2iKAAAIIIIAAAgYIEAANmESGgAACCCCAAAII6AgQAHW0aIsAAggggAACCBggQAA0YBIZAgIIIIAAAgggoCNAANTRoi0CCCCAAAIIIGCAAAHQgElkCAgggAACCCCAgI4AAVBHi7YIIIAAAggggIABAgRAAyaRISCAAAIIIIAAAjoCBEAdLdoigAACCCCAAAIGCBAADZhEhoAAAggggAACCOgIEAB1tGiLAAIIIIAAAggYIEAANGASGQICCCCAAAIIIKAjQADU0aItAggggAACCCBggAAB0IBJZAgIIIAAAggggICOAAFQR4u2CCCAAAIIIICAAQIEQAMmkSEggAACCCCAAAI6AgRAHS3aIoAAAggggAACBggQAA2YRIaAAAIIIIAAAgjoCBAAdbRoiwACCCCAAAIIGCBAADRgEhkCAggggAACCCCgI0AA1NGiLQIIIIAAAgggYIAAAdCASWQICCCAAAIIIICAjgABUEeLtggggAACCCCAgAECBEADJpEhIIAAAggggAACOgIEQB0t2iKAAAIIIIAAAgYIEAANmESGgAACCCCAAAII6AgQAHW0aIsAAggggAACCBggQAA0YBIZAgIIIIAAAgggoCNAANTRoi0CCCCAAAIIIGCAAAHQgElkCAgggAACCCCAgI4AAVBHi7YIIIAAAggggIABAgRAAyaRISCAAAIIIIAAAjoCBEAdLdoigAACCCCAAAIGCBAADZhEhoAAAggggAACCOgIEAB1tGiLAAIIIIAAAggYIEAANGASGQICCCCAAAIIIKAjQADU0aItAggggAACCCBggAAB0IBJZAgIIIAAAggggICOwP8D2qywE9esWDEAAAAASUVORK5CYII=\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "M = np.matrix([[4,2],[0,5]])\n",
    "m = Matrix(M)\n",
    "print(\"norm p=1:\", m.pOneNorm())\n",
    "\n",
    "visualize(m.A, norm_type=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Norm $p=2$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The $p=2$ norm is defined as \n",
    "\n",
    "$$||A||_2 = \\sqrt{\\rho(A^HA)}$$\n",
    "\n",
    "where\n",
    "\n",
    "$$\\rho(A) = \\max_i |\\lambda_i|$$\n",
    "\n",
    "i.e. the square-root of the largest eigenvalue of $A^HA$.\n",
    "\n",
    "Note * The book goes through the derivation of this norm using optimization and principles of eigenvalue that has not yet been covered, so I will skip the derivation of it. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Matrix(Matrix):\n",
    "    def pTwoNorm(self):\n",
    "        \n",
    "        # Compose A^HA\n",
    "        B = self.A.getH()*self.A\n",
    "        \n",
    "        # Find the eigen values\n",
    "        w,v = np.linalg.eig(B)\n",
    "        \n",
    "        # get the square root of the largest eigen value\n",
    "        rho = np.sqrt(w.max())\n",
    "        \n",
    "        return rho"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "norm p=2: 5.727806217396338\n"
     ]
    },
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu3dBZgX5drH8R+wNCyhdHeKdEsIKoiFja+i6FGPHFRAj+0RbEQRGwsBFcUg7CAElJCWDpHuWnqJ3fd6BncldmHinzPfuS6v97zuPDPzfO57Hu//xDNZUlNTU8WCAAIIIIAAAgggEBiBLBSAgYk1HUUAAQQQQAABBCwBCkASAQEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAAQQQCJgABWDAAk53EUAAAQQQQAABCkByAAEEEEAAgQAIXHvttfr888/1wAMPqF+/fgHoMV08nQAFIPmBAAIIIICAzwV2796tYsWKqXjx4jp69KhWr16tLFmy+LzXdI8CkBxAAAEEEEAgwAIffPCB7rzzTv344486//zz9csvv6h169YBFqHrXAEkB0IqcODAAdWrV8/a5pw5c5Q7d27rf+/YsUO1atVShQoVNHnyZGXLli2k+2VjCCCAQDwKTJgwwSrIRo4cqc6dO5/QheHDh+v//u//NGXKFDVr1sxT99q3b6+cOXPq22+/Vc2aNdWyZUu988476dtMTU21jmPBggVauHChihYtav3t0KFDatCggfbv368//vhDefPm9XQcNI4dAQrA2ImFb45k+vTpatGihe655x4NGDDA6leXLl00ZswYzZ07V1WrVvVNX+kIAggg4EXAFF7lypVT48aN9cUXX5ywqU6dOmnp0qVa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AQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAiQAHoRIt1EUAAAQQQQAABHwhQAPogiHQBAQQQQAABBBBwIkAB6ESLdRFAAAEEEEAAAR8IUAD6IIh0AQEEEEAAAQQQcCJAAehEi3URQAABBBBAAAEfCFAA+iCIdAEBBBBAAAEEEHAi8P+HnbATg/hE6wAAAABJRU5ErkJggg==\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "M = np.matrix([[4,2],[0,5]])\n",
    "m = Matrix(M)\n",
    "print(\"norm p=2:\", m.pTwoNorm())\n",
    "\n",
    "visualize(m.A, norm_type=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above figures show how much the unit circle stretches along the eigenvectors of $A$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Frobenius Norm\n",
    "\n",
    "The Frobenius Norm is not a $p$ norm. This norm is often used in matrix analysis since it is relatively easy to compute. It is defined as\n",
    "\n",
    "$$||A||_F = \\sqrt{\\mathrm{tr}(A^HA)}$$\n",
    "\n",
    "i.e. the square root of the sum of all of the elements of $A$ squared."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Matrix(Matrix):\n",
    "    def frobNorm(self):\n",
    "            \n",
    "        # Square all of the elements of A\n",
    "        A_2 = np.square(self.A)\n",
    "        \n",
    "        # Sum all of the elemenst of A\n",
    "        f_sum = np.sum(A_2)\n",
    "        \n",
    "        # Square root the sum of all of the elements of A squared\n",
    "        f_norm = np.sqrt(f_sum)\n",
    "        \n",
    "        return f_norm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "norm p=2: 6.708203932499369\n"
     ]
    }
   ],
   "source": [
    "M = np.matrix([[4,2],[0,5]])\n",
    "m = Matrix(M)\n",
    "print(\"norm p=2:\", m.frobNorm())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Frobenius norm is often used when comparing how similar two matrices $A$ and $B$ are, using $||A-B||_F$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matrix Norm Relationships\n",
    "\n",
    "The follow relationships exist between the norms for an $m\\times n$ matrix $A$\n",
    "\n",
    "$$\n",
    "\\begin{array}{rcl} \n",
    "||A||_c                          & \\leq ||A||_F & \\leq \\sqrt{n}||A||_2 \\\\ \n",
    "\\max_{i,j}|a_{ij}|               & \\leq ||A||_2 & \\leq \\sqrt{mn}\\max_{i,j}|a_{ij}| \\\\\n",
    "\\frac{1}{\\sqrt{n}}||A||_{\\infty} & \\leq ||A||_2 & \\leq \\sqrt{m}||A||_{\\infty} \\\\\n",
    " \\frac{1}{\\sqrt{m}}||A||_{1}     & \\leq ||A||_2 & \\leq \\sqrt{n}||A||_{1} \n",
    "\\end{array}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example Problem\n",
    "\n",
    "![title](images/t11_massSpring.png)\n",
    "\n",
    "Consider a second order mass spring system\n",
    "\n",
    "$$ m\\ddot{z} + b\\dot{z} + kz = F $$\n",
    "\n",
    "where $m$ is the mass, $b$ is the damping coefficient, $k$ is the spring constant, $F$ the force being applied and $z$ the displacement of the mass from equilibrium.\n",
    "\n",
    "The state space representation of the system can be expressed as \n",
    "\n",
    "$$ \\dot{x} = Ax + Bu $$ \n",
    "\n",
    "where $A$ represents the internal dynamics of the system, $B$ represents the external dynamics of the system, $x$ represents the position and velocity of the mass, and $u$ represents the input. If we ignore the external dynamics of the system, the state space representation of the system can be expressed as\n",
    "\n",
    "$$ \\dot{x} = Ax$$\n",
    "\n",
    "where\n",
    "\n",
    "$$A=\n",
    "\\begin{bmatrix}\n",
    "    0       & 1  \\\\\n",
    "    -k/m       & -b/m     \n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "The solution to the second order system is \n",
    "\n",
    "$$x(t) = \\exp^{-A t}x_0$$\n",
    "\n",
    "by inspection, we can analyze $A$ to determine the rate of decay or how fast the perturbed system returns to equilibrium by analyzing the norm of $A$. The larger $||A||$ is, the faster the system moves to equilibrium. In essence, $||A||$ measures how fast a system can change. You can interact with the graph below to see the effect the matrix norm of $||A||$ on the system's response. \n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu3dCbiNVfvH8R96Rb2ZKjIlUkkKRYNK1D/NRUVKJQ1vkaGoUAlvKvJGJUMq0YhEs9JoakKmQlERSVScaFCG/3Xv1XaO4xxnn732/HzXdbkUz3qGz763dZ81PUW2b9++XRQEEEAAAQQQQACBwAgUIQEMzGfNgyKAAAIIIIAAAiEBEkACAQEEEEAAAQQQCJgACWDAPnAeFwEEEEAAAQQQIAEkBhBAAAEEEEAAgYAJkAAG7APncRFAAAEEEEAAARJAYgABBBBAAAEEEAiYAAlgwD5wHhcBBBBAAAEEECABJAYQQAABBBBAAIGACZAABuwD53ERQAABBBBAAAESQGIAAQQQQAABBBAImAAJYMA+cB4XAQQQQAABBBAgASQGEEAAAQQQQACBgAmQAAbsA+dxEUAAAQQQQAABEkBiAAEEEEAAAQQQCJgACWDAPnAeFwEEEEAAAQQQIAEkBhBAAAEEEEAAgYAJkAAG7APncRFAAAEEEEAAARJAYgABBBBAAAEEEAiYAAlgwD5wHhcBBBBAAAEEECABJAYQQAABBBBAAIGACZAABuwD53ERQAABBBBAAAESQGIAAQQQQAABBBAImAAJYMA+cB4XAQQQQAABBBAgASQGEEAAAQQQQACBgAmQAAbsA+dxEUAAAQQQQAABEkBiAAEEEEAAAQQQCJgACWDAPnAeFwEEEEAAAQQQIAEkBhBAAAEEEEAAgYAJkAAG7APncRFAAAEEEEAAARJAYgABBBBAAAEEEAiYAAlgwD5wHhcBBBBAAAEEECABJAYQQAABBBBAAIGACZAABuwD53ERQAABBBBAAAESQGIAAQQQQAABBBAImAAJYMA+cB4XgVQT6NOnj/r27avt27en2q1xPwgggEDGCpAAZuxHy4MhsLPA6NGj1a5du9AfTp8+XSeddNJOB1gCduCBB2rVqlU655xz9NprrxWa8N5771Xt2rXVvHnziOvGOgFs0qSJpk6dqnPPPVevvvrqTvexfPlyVa9eXQMHDtQtt9wS8T0m68BPP/1U9rl98sknWrBggbZs2VKoRHnbtm0aOXKkRowYoWXLlmnvvffW0UcfrV69eqlRo0Y7Huuqq67SmDFj8n1Mi4nKlSsr7Jffgddee60ee+yxZHFxXQQQKIQACWAhsDgUgXQWCCeAJUqUCCWCw4YN2+lxPvjgAzVt2lR77rmn/u///i+qBPDf//63Lr744lDSEmmxpMZ+2X3FooQTQDvX7Nmzdcwxx+w4bbolgJYcW1J91FFHaePGjfrqq68KlQB269ZNgwYN0uWXX66TTz5ZGzZs0KOPPqrvvvtOM2fO1LHHHhuy+eijj/T111/v8gPBDTfcoIMOOkhffPFF6O9+++03TZo0aZeP6c0339Szzz6r8ePHq2XLlrH4GDkHAgjEWYAEMM7AnB6BVBEIJ4AXXnihpk2bph9++EF77LHHjtv7z3/+o88++0w//fST6tSpE/cE0JIJ65GKdbEE8Ntvvw0lTNbL+corr8QtAfzzzz9VvHhxFS1aNNaPETrfjz/+qFKlSqlkyZLq2LGjhg4dGnECaEm11bXe3BdeeGHH/ZlNjRo11LlzZz300EP53veMGTNCSeM999yj22+/fbfPZz8wzJo1K3S/sUrk4wLKSRFAYIcACSDBgEBABMIJoCUDrVq10uuvv66zzjor9PR//fWXDjjgAN155516+OGHd0kA//e//2nixIn68ssv9fvvv4eGeXv27Bnq7QuXIkWK7CLZtm3bUG9geJjXepL69eunyZMnh3qW5s6du+PvwnMAn3zySV199dV64oknQr+Hi/WE3XHHHaH7Pvvss/P91CwBtCT2kksu0V133aU5c+aEhj2t5NcD+M0336h79+569913ZUmd9bjZMKklT+ES7iF9/vnn9fnnn8vu05LoX375RS+99FKoV9WG1q0XzI75+++/Q/cwZMiQkJklXOEh6euuu04DBgxQXmb5PVhhE8A//vhDe+21l2688UY98sgjO05ribclhrfeeqv69++fr2OHDh1CQ8dmY59VfsUMqlSpoiuvvDJkQkEAgfQQIAFMj8+Ju0TAWyCcAFpPTZcuXXTwwQfrqaeeCp335ZdflvUMrly5MjQ3LHcPYNWqVXX++eeHEj9LFseOHSubn2bzBMNJ0jPPPCObA2bDitabaMWuccIJJ+xI8qz+IYccojPOOCPUk2VJRl5zAM8777xQMrVw4ULZte33Bg0a6IorrtDjjz++W4twAvjhhx+GEpecvYB5JYDWa1W3bt0dSdq+++4bmg9n15wwYYJatGgRul44AbRnsF4/S3g2b94cSuws6bMEsF69eqFE2u7/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jqHhdVtlZpOHKfEReOmll9SiRYtQ70i4WC+J/WNetGhR2ftTc/5dfO4iOGetVq2aTj/9dD3++OM7HtpWRdq8S1sdTImtgM3VtnmXN954444Tm7XN/7OdBiixE2AIODaWJICxcYzZWWwRiG35Ylu/WLFhhQMPPFCWpLAIJGbMoRPZxGFbXGPbCXzwwQdsFxBb3l3OtnHjRq1YsWKnP7dVkrVq1QptVcK8y9h+AJdddpms1zXnIpCbb745NJUkZ69gbK8a3LPtu+++oeTaRhPCxVal2rY7X331VXBh4vDk+S0CsQUgthDEyq+//hpa1McikPw/ABLAOASnzyltroINFzz66KOhRNC2gRk/fnzoJ0hb0USJnYBNiH/uuedCvX859/4rXbp0aOUeJf4CDAHHz9iGem1vy759+4a23Pn0009DC0BsoQKLEmLvbnv+vfPOO6F/u22Nj/e/AAACn0lEQVQI2BYk/Oc//9HVV18d2l+U4idguwfYQj0rtr2RDa3bFke2oMw6SczY9hbNuQ3MggUL2AZmN+wkgH4xGZfatgVMeCNoW8H08MMPh/YEpMRWwH6KzKvYT+z2jzkl/gIkgPE1fu2110KLEGz/P5veYAtCWAUcH3Pr4ba952xEYe3ataFtSS699FLdddddsvmYFD8BG6WxhC93sQ4T6+ULbwRtP+DYYr6TTjoptNWUrcim5C1AAkhkIIAAAggggAACARMgAQzYB87jIoAAAggggAACJIDEAAIIIIAAAgggEDABEsCAfeA8LgIIIIAAAgggQAJIDCCAAAIIIIAAAgETIAEM2AfO4yKAAAIIIIAAAiSAxAACCCCAAAIIIBAwARLAgH3gPC4CCCCAAAIIIEACSAwggAACCCCAAAIBEyABDNgHzuMigAACCCCAAAIkgMQAAggggAACCCAQMAESwIB94DwuAggggAACCCBAAkgMIIAAAggggAACARMgAQzYB87jIoAAAggggAACJIDEAAIIIIAAAgggEDABEsCAfeA8LgIIIIAAAgggQAJIDCCAAAIIIIAAAgETIAEM2AfO4yKAAAIIIIAAAiSAxAACCCCAAAIIIBAwARLAgH3gPC4CCCCAAAIIIEACSAwggAACCCCAAAIBEyABDNgHzuMigAACCCCAAAIkgMQAAggggAACCCAQMAESwIB94DwuAggggAACCCBAAkgMIIAAAggggAACARMgAQzYB87jIoAAAggggAACJIDEAAIIIIAAAgggEDABEsCAfeA8LgIIIIAAAgggQAJIDCCAAAIIIIAAAgETIAEM2AfO4yKAAAIIIIAAAiSAxAACCCCAAAIIIBAwARLAgH3gPC4CCCCAAAIIIPD/DG75McsOR6gAAAAASUVORK5CYII=\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a94b0530e264426a8c0a850ac54285f7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=1.0, description='m', max=20.0, min=0.001, step=0.01), Output()), _dom…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<function __main__.updateDynamics(m=1)>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.linalg import expm\n",
    "\n",
    "fig2, ax2 = plt.subplots()\n",
    "\n",
    "k = 10\n",
    "b = 5\n",
    "\n",
    "# Create time\n",
    "dt = 0.2\n",
    "t_end = 10\n",
    "t = np.arange(0.0,t_end,dt)\n",
    "\n",
    "# Initial state of the system\n",
    "x_0 = np.matrix([[10],[0]])\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# Calculate the dynamics\n",
    "def calcDynamics(time,A):\n",
    "       \n",
    "    # State dynamics\n",
    "    z = []\n",
    "    z_dt = []\n",
    "    # Calculate the state at each time step\n",
    "    for t in time:\n",
    "        x_t = expm(A*t)*x_0\n",
    "        z.append(x_t[0,0].item())\n",
    "        z_dt.append(x_t[1,0].item())\n",
    "        \n",
    "    return z,z_dt\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "l_dynamics, = ax2.plot(t, t, lw=2, color='blue')\n",
    "\n",
    "def updateDynamics(m = 1):\n",
    "    \n",
    "    if (m < 1e-3):\n",
    "        m = 1e-3\n",
    "    \n",
    "    # Internal system dynamics\n",
    "    A = np.matrix([[0,1],[-k/m,-b/m]])\n",
    "    A_norm = np.linalg.norm(A) \n",
    "    \n",
    "    z,z_dt = calcDynamics(t,A)\n",
    "    l_dynamics.set_ydata(z)\n",
    "    \n",
    "    ax2.axis(ymax=max(z)+1, ymin=min(z)-1)\n",
    "    fig2.canvas.draw()\n",
    "    plt.title(\"Matrix Norm %1.3f\" % A_norm)\n",
    "    \n",
    "\n",
    "interact(updateDynamics, m = widgets.FloatSlider(min=1e-3,max=20,step=1e-2,value=1)) \n",
    "      \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}