Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
| Download
"Guiding Future STEM Leaders through Innovative Research Training" ~ thinkingbeyond.education
Project: stephanie's main branch
Path: ThinkingBeyond Activities / BeyondAI-2024-Mentee-Projects / shaana-karuna / Approximation_Using_a_Piecewise_Constant_Function_in_2D_Final.ipynb~2
Views: 1083Image: ubuntu2204
{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "authorship_tag": "ABX9TyP9Ac6YSsYCiw2HmM7hg4x+", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "d565073e3c0b46329614eb54d8c32dc7": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonModel", "model_module_version": "2.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "", "description": "y=sin(6x)", "disabled": false, "icon": "", "layout": "IPY_MODEL_6707ad53709443c79c2234ff39b72746", "style": "IPY_MODEL_fda8a17187ae4d8abb743a044a7c3aae", "tabbable": null, "tooltip": null } }, "6707ad53709443c79c2234ff39b72746": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": "50px", "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "200px" } }, "fda8a17187ae4d8abb743a044a7c3aae": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonStyleModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": "black", "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": "bold", "text_color": null, "text_decoration": null } }, "1006992ec0a3492f923a5f99e564c251": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonModel", "model_module_version": "2.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "", "description": "y=0.05(7x-2)^2(7x-6)^2", "disabled": false, "icon": "", "layout": "IPY_MODEL_783401f1110d4d59a142f8971628ecbc", "style": "IPY_MODEL_b06b5d60568f407e909ce9754fb485b1", "tabbable": null, "tooltip": null } }, "783401f1110d4d59a142f8971628ecbc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": "50px", "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "200px" } }, "b06b5d60568f407e909ce9754fb485b1": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonStyleModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": "black", "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": "bold", "text_color": null, "text_decoration": null } }, "5ac4a294ff864f27bbe65d1d684d730a": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonModel", "model_module_version": "2.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ButtonView", "button_style": "", "description": "y=e^(x-1)", "disabled": false, "icon": "", "layout": "IPY_MODEL_efc19a5d077a4934a566f5158bf642cc", "style": "IPY_MODEL_9230a5626fc84e0aab54eb0801eeebc1", "tabbable": null, "tooltip": null } }, "efc19a5d077a4934a566f5158bf642cc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": "50px", "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "200px" } }, "9230a5626fc84e0aab54eb0801eeebc1": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonStyleModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "button_color": "black", "font_family": null, "font_size": null, "font_style": null, "font_variant": null, "font_weight": "bold", "text_color": null, "text_decoration": null } }, "a006fa5190eb4b0488bbb754d799bb71": { "model_module": "@jupyter-widgets/controls", "model_name": "VBoxModel", "model_module_version": "2.0.0", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_5b75f6aada4f444c9bf3cb3c842ef5be", "IPY_MODEL_8d4003185ce545159c93344ee2f3d732" ], "layout": "IPY_MODEL_f377223cd78247d0bdf9088694a78a89", "tabbable": null, "tooltip": null } }, "5b75f6aada4f444c9bf3cb3c842ef5be": { "model_module": "@jupyter-widgets/controls", "model_name": "IntSliderModel", "model_module_version": "2.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "IntSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "IntSliderView", "behavior": "drag-tap", "continuous_update": true, "description": "n_sections", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_dc713447b39a42eea45581e02f1ad158", "max": 100, "min": 1, "orientation": "horizontal", "readout": true, "readout_format": "d", "step": 1, "style": "IPY_MODEL_8f967e66995f4277a0042107c0915f1e", "tabbable": null, "tooltip": null, "value": 33 } }, "8d4003185ce545159c93344ee2f3d732": { "model_module": "@jupyter-widgets/output", "model_name": "OutputModel", "model_module_version": "1.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_4f6ecf8d2e8b4e7ca5bfb400c60827a9", "msg_id": "", "outputs": [ { "output_type": "display_data", "data": { "text/plain": "<Figure size 800x400 with 1 Axes>", "image/png": "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CRNsyn/77bciJiZGKBQK0b59e/Hzzz+3cMR0pYbUYVhYmABQ5WfatGktHzhZNfR9eDkmpvbX0Prbvn276Nmzp1AqlaJNmzbi7bffFhUVFS0cNV2uIXVYXl4upk+fLiIjI4VKpRIhISHiySefFLm5uS0fOAkhhNi0aVO1f9sq623ChAli4MCBVc7p0qWLUCgUok2bNmLp0qUtHrcQQkiEYDs7EREREdkfx5gSERERkUNgYkpEREREDoGJKRERERE5BCamREREROQQmJgSERERkUNgYkpEREREDoGJKRERERE5BCamREREROQQmJgSERERkUNgYkpEREREDoGJKRERERE5BCamRER2lpmZCX9/f8ycOdN6bPv27VAoFPjzzz/tGBkRUcuSCCGEvYMgIrrW/fLLLxg9ejS2b9+Otm3bokuXLrj11lsxf/58e4dGRNRimJgSETmISZMmYcOGDejevTsOHz6MPXv2QKlU2jssIqIWw8SUiMhBlJaWokOHDrhw4QL27duHjh072jskIqIWxTGmREQO4uzZs0hJSYHZbEZSUpK9wyEianFsMSUicgBGoxE9evRAly5d0LZtWyxYsACHDx+Gr6+vvUMjImoxTEyJiBzAiy++iDVr1uCff/6Bm5sbBg4cCL1ej59++sneoRERtRh25RMR2dnmzZuxYMECfP3119DpdJBKpfj666+xdetWLFmyxN7hERG1GLaYEhEREZFDYIspERERETkEJqZERERE5BCYmBIRERGRQ2BiSkREREQOgYkpERERETkEJqZERERE5BCYmBIRERGRQ2BiSkREREQOgYkpERERETkEJqZERERE5BCYmBIRERGRQ/h/Nzugdh70W/kAAAAASUVORK5CYII=\n" }, "metadata": {} } ], "tabbable": null, "tooltip": null } }, "f377223cd78247d0bdf9088694a78a89": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "dc713447b39a42eea45581e02f1ad158": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8f967e66995f4277a0042107c0915f1e": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "4f6ecf8d2e8b4e7ca5bfb400c60827a9": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "2.0.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "<a href=\"https://colab.research.google.com/github/ThinkingBeyond/BeyondAI-2024/blob/main/shaana-karuna/Approximation_Using_a_Piecewise_Constant_Function_in_2D_Final.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" ] }, { "cell_type": "markdown", "source": [ "#Summary of code\n", "\n", "The purpose of this code is to create a piecewise constant function that the user can interact with, to aid understanding of how a piecewise constant function can approximate a continuous function. The user can choose the continuous function being approximated out of 3 choices. When the functions are plotted, the user can change the number of sections in the piecewise function to see that when the number of sections increases, the approximation improves." ], "metadata": { "id": "zQANDG0Jc5iv" } }, { "cell_type": "markdown", "source": [ "#Installing packages" ], "metadata": { "id": "ZmOrkypGzeDg" } }, { "cell_type": "code", "source": [ "!pip install numpy==1.23.5\n", "!pip install matplotlib==3.7.1\n", "!pip install ipywidgets==8.1.0\n", "!pip install ipython==8.15.0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "LCr8a0OD0IC7", "outputId": "d1d341e5-7432-453c-c98e-8831b89e52e0", "collapsed": true }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: numpy==1.23.5 in /usr/local/lib/python3.10/dist-packages (1.23.5)\n", "Collecting matplotlib==3.7.1\n", " Using cached matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.6 kB)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (1.3.1)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (4.55.3)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (1.4.7)\n", "Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (1.23.5)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (24.2)\n", "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (11.0.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (3.2.0)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.7.1) (2.8.2)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib==3.7.1) (1.17.0)\n", "Using cached matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB)\n", "Installing collected packages: matplotlib\n", " Attempting uninstall: matplotlib\n", " Found existing installation: matplotlib 3.8.0\n", " Uninstalling matplotlib-3.8.0:\n", " Successfully uninstalled matplotlib-3.8.0\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "bigframes 1.29.0 requires numpy>=1.24.0, but you have numpy 1.23.5 which is incompatible.\n", "plotnine 0.14.4 requires matplotlib>=3.8.0, but you have matplotlib 3.7.1 which is incompatible.\n", "pymc 5.19.1 requires numpy>=1.25.0, but you have numpy 1.23.5 which is incompatible.\u001b[0m\u001b[31m\n", "\u001b[0mSuccessfully installed matplotlib-3.7.1\n" ] }, { "output_type": "display_data", "data": { "application/vnd.colab-display-data+json": { "pip_warning": { "packages": [ "matplotlib", "mpl_toolkits" ] }, "id": "1097aea0b8d6436faadb31bc79a638de" } }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: ipywidgets==8.1.0 in /usr/local/lib/python3.10/dist-packages (8.1.0)\n", "Requirement already satisfied: comm>=0.1.3 in /usr/local/lib/python3.10/dist-packages (from ipywidgets==8.1.0) (0.2.2)\n", "Requirement already satisfied: ipython>=6.1.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets==8.1.0) (7.34.0)\n", "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets==8.1.0) (5.7.1)\n", "Requirement already satisfied: widgetsnbextension~=4.0.7 in /usr/local/lib/python3.10/dist-packages (from ipywidgets==8.1.0) (4.0.13)\n", "Requirement already satisfied: jupyterlab-widgets~=3.0.7 in /usr/local/lib/python3.10/dist-packages (from ipywidgets==8.1.0) (3.0.13)\n", "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (75.1.0)\n", "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (0.19.2)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (4.4.2)\n", "Requirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (0.7.5)\n", "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (3.0.48)\n", "Requirement already satisfied: pygments in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (2.18.0)\n", "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (0.2.0)\n", "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (0.1.7)\n", "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=6.1.0->ipywidgets==8.1.0) (4.9.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets==8.1.0) (0.8.4)\n", "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets==8.1.0) (0.7.0)\n", "Requirement already satisfied: wcwidth in /usr/local/lib/python3.10/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=6.1.0->ipywidgets==8.1.0) (0.2.13)\n", "\u001b[31mERROR: Operation cancelled by user\u001b[0m\u001b[31m\n", "\u001b[0mCollecting ipython==8.15.0\n", " Downloading ipython-8.15.0-py3-none-any.whl.metadata (5.9 kB)\n", "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (0.2.0)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (4.4.2)\n", "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (0.19.2)\n", "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (0.1.7)\n", "Requirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (0.7.5)\n", "Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (3.0.48)\n", "Requirement already satisfied: pygments>=2.4.0 in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (2.18.0)\n", "Collecting stack-data (from ipython==8.15.0)\n", " Downloading stack_data-0.6.3-py3-none-any.whl.metadata (18 kB)\n", "Requirement already satisfied: traitlets>=5 in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (5.7.1)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (1.2.2)\n", "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython==8.15.0) (4.9.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython==8.15.0) (0.8.4)\n", "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython==8.15.0) (0.7.0)\n", "Requirement already satisfied: wcwidth in /usr/local/lib/python3.10/dist-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython==8.15.0) (0.2.13)\n", "Collecting executing>=1.2.0 (from stack-data->ipython==8.15.0)\n", " Downloading executing-2.1.0-py2.py3-none-any.whl.metadata (8.9 kB)\n", "Collecting asttokens>=2.1.0 (from stack-data->ipython==8.15.0)\n", " Downloading asttokens-3.0.0-py3-none-any.whl.metadata (4.7 kB)\n", "Collecting pure-eval (from stack-data->ipython==8.15.0)\n", " Downloading pure_eval-0.2.3-py3-none-any.whl.metadata (6.3 kB)\n", "Downloading ipython-8.15.0-py3-none-any.whl (806 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m806.6/806.6 kB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading stack_data-0.6.3-py3-none-any.whl (24 kB)\n", "Downloading asttokens-3.0.0-py3-none-any.whl (26 kB)\n", "Downloading executing-2.1.0-py2.py3-none-any.whl (25 kB)\n", "Downloading pure_eval-0.2.3-py3-none-any.whl (11 kB)\n" ] } ] }, { "cell_type": "markdown", "source": [ "# Importing packages" ], "metadata": { "id": "csvR1AY60DYF" } }, { "cell_type": "code", "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from ipywidgets import interact\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "import math" ], "metadata": { "id": "XcJ1dhTJ0I6s" }, "execution_count": 4, "outputs": [] }, { "cell_type": "markdown", "source": [ "#Defining a function which applies the chosen function" ], "metadata": { "id": "Kr2MaqI60QLH" } }, { "cell_type": "markdown", "source": [ "This function allows us to use the same code to calculate the outputs of the continuous function regardless of the function chosen." ], "metadata": { "id": "Ku61D3DD8NbD" } }, { "cell_type": "code", "source": [ "def function(input):\n", " if chosen_func == 1:\n", " return math.sin(6*input)\n", " elif chosen_func == 2:\n", " return 0.05*((7*input-2)**2)*((7*input-6)**2)\n", " elif chosen_func == 3:\n", " return (math.e)**(input-1)" ], "metadata": { "id": "-xEY-_SP0ab7" }, "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "source": [ "#Defining a function which creates a list of outputs for the piecewise function" ], "metadata": { "id": "EPYtFZ1y0a6Z" } }, { "cell_type": "markdown", "source": [ "For i from 0 to n_sections (the number of sections that the piecewise function has), if each $x$ in the list of inputs $\\frac{i}{\\text{n_sections}}\\leq x<\\frac{i+1}{\\text{n_sections}}$, then the output of the piecewise function for this input x is $f(\\frac{i}{\\text{n_sections}})$, where $f$ is the continuous function chosen.\n", "\n", "```\n", " y_1[999] = function(1)\n", "```\n", "ensures that the last value is not missed, otherwise this will result in a value of 0 for the final output value. All the outputs are stored in an array y_1 which the function returns." ], "metadata": { "id": "K2g7JE2r8KgH" } }, { "cell_type": "code", "source": [ "def piecewise_function(x, n_sections):\n", " y_1 = np.piecewise(x,\n", " [((i / n_sections) <= x) & (x < ((i + 1) / n_sections)) for i in range(n_sections)],\n", " [lambda x, i=i: function(i/n_sections) for i in range(n_sections)])\n", " y_1[999] = function(1)\n", " return y_1" ], "metadata": { "id": "Biwfxttx0gHz" }, "execution_count": 6, "outputs": [] }, { "cell_type": "markdown", "source": [ "#Defining a function which plots both functions" ], "metadata": { "id": "IKSAMfGY09oz" } }, { "cell_type": "markdown", "source": [ "This functions defines the input space, which is 1000 points equally spaced from 0 to 1. Then, it uses the piecewise_function function to define the outputs for the piecwise function. Then, it plots both functions. The outputs for the continuous function is defined simply but applying the continuous function chosen to all values in x." ], "metadata": { "id": "KICjqUJ28Pwx" } }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "NGZghxXGEvuf" }, "outputs": [], "source": [ "def plot_piecewise(n_sections):\n", " x = np.linspace(0, 1, 1000)\n", " y = piecewise_function(x, n_sections)\n", "\n", " plt.figure(figsize=(8, 4))\n", " ax = plt.gca()\n", " ax.set_facecolor('#17282A')\n", " plt.plot(x, y, label=f'{n_sections} sections', color=\"#F5F5DD\")\n", " plt.plot(x, [function(i) for i in x], color='#93C280')\n", " plt.title(\"Approximation Using a Piecewise Constant Function in 2D\")\n", " plt.xlabel(\"x\")\n", " plt.ylabel(\"y\")\n", " plt.grid()\n", " plt.legend()\n", " plt.show()" ] }, { "cell_type": "markdown", "source": [ "#Defining functions for when a function is chosen (by clicking one of three buttons)" ], "metadata": { "id": "Llt28Fk61LLP" } }, { "cell_type": "markdown", "source": [ "Each of these functions are called when the corresponding button is pressed. They set the value of chosen_func to represent the correct function, which stores the choice of function. Then they call the function to plot the piecewise and continuous function, with a slider allowing the user to control the number of sections in the function." ], "metadata": { "id": "lTSBfyQd-AJF" } }, { "cell_type": "code", "source": [ "def sin_clicked(b):\n", " global chosen_func\n", " chosen_func = 1\n", " interact(plot_piecewise, n_sections=(1, 100, 1))\n", "def quartic_clicked(b):\n", " global chosen_func\n", " chosen_func = 2\n", " interact(plot_piecewise, n_sections=(1, 100, 1))\n", "def exp_clicked(b):\n", " global chosen_func\n", " chosen_func = 3\n", " interact(plot_piecewise, n_sections=(1, 100, 1))\n" ], "metadata": { "id": "rBme4a5y1J6f" }, "execution_count": 8, "outputs": [] }, { "cell_type": "markdown", "source": [ "#Creating buttons for choosing a continuous function\n" ], "metadata": { "id": "wh8-W2HP1dp1" } }, { "cell_type": "markdown", "source": [ "This code creates buttons for each function. When each button is pressed, it calls its corresponding function, which in turn calls a function which plots the correct graphs." ], "metadata": { "id": "JPwL7y-E-C1m" } }, { "cell_type": "code", "source": [ "sin_button = widgets.Button(description=\"y=sin(6x)\", layout=widgets.Layout(width='200px', height='50px'),\n", " style=widgets.ButtonStyle(\n", " button_color='black',\n", " color='black',\n", " font_weight='bold'))\n", "sin_button.on_click(sin_clicked)\n", "\n", "quartic_button = widgets.Button(description=\"y=0.05(7x-2)^2(7x-6)^2\", layout=widgets.Layout(width='200px', height='50px'),\n", " style=widgets.ButtonStyle(\n", " button_color='black',\n", " font_weight='bold'))\n", "quartic_button.on_click(quartic_clicked)\n", "\n", "exp_button = widgets.Button(description=\"y=e^(x-1)\", layout=widgets.Layout(width='200px', height='50px'),\n", " style=widgets.ButtonStyle(\n", " button_color='black',\n", " font_weight='bold'))\n", "exp_button.on_click(exp_clicked)" ], "metadata": { "id": "gfRFbJFrkc8W" }, "execution_count": 9, "outputs": [] }, { "cell_type": "markdown", "source": [ "#Displaying the buttons" ], "metadata": { "id": "kZkKfSAY1se7" } }, { "cell_type": "markdown", "source": [ "Finally, the buttons are displayed." ], "metadata": { "id": "ua4bbcFO-RSL" } }, { "cell_type": "code", "source": [ "display(sin_button)\n", "display(quartic_button)\n", "display(exp_button)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 604, "referenced_widgets": [ "d565073e3c0b46329614eb54d8c32dc7", "6707ad53709443c79c2234ff39b72746", "fda8a17187ae4d8abb743a044a7c3aae", "1006992ec0a3492f923a5f99e564c251", "783401f1110d4d59a142f8971628ecbc", "b06b5d60568f407e909ce9754fb485b1", "5ac4a294ff864f27bbe65d1d684d730a", "efc19a5d077a4934a566f5158bf642cc", "9230a5626fc84e0aab54eb0801eeebc1", "a006fa5190eb4b0488bbb754d799bb71", "5b75f6aada4f444c9bf3cb3c842ef5be", "8d4003185ce545159c93344ee2f3d732", "f377223cd78247d0bdf9088694a78a89", "dc713447b39a42eea45581e02f1ad158", "8f967e66995f4277a0042107c0915f1e", "4f6ecf8d2e8b4e7ca5bfb400c60827a9" ] }, "id": "vkFJBCgA1uLd", "outputId": "f47cd3c2-1b09-45fd-b9bc-defb9dea3835" }, "execution_count": 10, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "Button(description='y=sin(6x)', layout=Layout(height='50px', width='200px'), style=ButtonStyle(button_color='b…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "d565073e3c0b46329614eb54d8c32dc7" } }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "Button(description='y=0.05(7x-2)^2(7x-6)^2', layout=Layout(height='50px', width='200px'), style=ButtonStyle(bu…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "1006992ec0a3492f923a5f99e564c251" } }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "Button(description='y=e^(x-1)', layout=Layout(height='50px', width='200px'), style=ButtonStyle(button_color='b…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "5ac4a294ff864f27bbe65d1d684d730a" } }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "interactive(children=(IntSlider(value=50, description='n_sections', min=1), Output()), _dom_classes=('widget-i…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "a006fa5190eb4b0488bbb754d799bb71" } }, "metadata": {} } ] } ] }