{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "667ac137-1e1d-403b-968b-ff18ecec6684",
   "metadata": {
    "tags": []
   },
   "source": [
    "# Основы работы с Python: инструментарий на Python для решения научных и прикладных задач\n",
    "\n",
    "## Инструментарий для  научной визуализации\n",
    "\n",
    "### Построения графиков функций с библиотекой *Matplotlib*\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ecab20a3-bc9d-44fa-9441-b0b4a804f6a9",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.integrate import odeint\n",
    "import matplotlib.pyplot as plt\n",
    "import ipywidgets as widgets\n",
    "from ipywidgets import interact, interact_manual, Label\n",
    "import seaborn as sns\n",
    "sns.set()\n",
    "sns.set(style=\"whitegrid\")\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6f2499d3-b7b4-440c-89ab-6cd68c903042",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = 1\n",
    "omega = 1\n",
    "\n",
    "\n",
    "def f_sin(t, A, omega):\n",
    "    ''' Определяет значение функции A*sin(omega*t),\n",
    "        A, omega - параметры'''\n",
    "    return (A*np.sin(omega*t))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "93264bc4-3991-4127-b44f-d990603a78da",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Определяет значение функции A*sin(omega*t),\n",
      "        A, omega - параметры\n"
     ]
    }
   ],
   "source": [
    "print(f_sin.__doc__)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b95126b0-8353-4674-82ae-05eeb600c18f",
   "metadata": {},
   "source": [
    "###  Массивы в numpy\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "afbe8b18-97d4-4c82-9e55-2e88f2b8d372",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28]\n"
     ]
    }
   ],
   "source": [
    "# Массив чисел: линейная последовательность с 0 по 30 с шагом 2\n",
    "\n",
    "x = np.arange(0, 30, 2)\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9e68f1c-0b80-428a-a697-e35cc64ed684",
   "metadata": {},
   "source": [
    "Еще один способ задания массива  [См. ссылку](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html).\n",
    ":\n",
    "```python\n",
    "numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)[source]\n",
    "Return evenly spaced numbers over a specified interval.\n",
    "\n",
    "Returns num evenly spaced samples, calculated over the interval [start, stop].\n",
    "\n",
    "The endpoint of the interval can optionally be excluded.\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f36e9007-96e0-42d5-a07c-de1be2c9e058",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.          1.57894737  3.15789474  4.73684211  6.31578947  7.89473684\n",
      "  9.47368421 11.05263158 12.63157895 14.21052632 15.78947368 17.36842105\n",
      " 18.94736842 20.52631579 22.10526316 23.68421053 25.26315789 26.84210526\n",
      " 28.42105263 30.        ]\n",
      "(20,)\n"
     ]
    }
   ],
   "source": [
    "x2 = np.linspace(0, 30, 20, endpoint=True)\n",
    "print(x2)\n",
    "print(x2.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "bca517e8-895b-462d-8b56-f3af73398c45",
   "metadata": {},
   "outputs": [],
   "source": [
    "t = np.linspace(-4*np.pi, 4*np.pi, 150, endpoint=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "44776aa1-8b0e-486b-8b2a-a66b13229e0c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(150,)\n"
     ]
    }
   ],
   "source": [
    "print(t.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bd6c5a96-808f-44da-9678-149ad0a35e55",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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4e///u+5/vrreetb32p7pnO5HN3d3Xzuc5/jzW9+My996Uvp6OgA4PDhw+zatYuWlhYOHz7M/fffT1dXFwCZTIZ169bR0tJCf38/mzZtoqWlhb6+Pp5++mnuvPNOWlpa+Lu/+zve85730N3dTS6Xo7GxkZaWFqSUvPOd75yVALp69WrGxsbmTAytr6/n6qtLGnAikVhwcR5EIfMd4ENCiH8FVgBvIR8ssNg5bTlwfIif7C65ov7HO3dx57/sJZHMcKJvjIMnhrlia7ePLdSLiekUvUdKK7P/5x3X8I/3P8d0IsOp8+P87OkzvLwnMFZS10mlszy656z1+rfefjXf/qFkaGyGsckk9/5I8rHbvDGbveVl27j3RweZTjgvaJoaYrzlZdsquvbaa6/lySef5MiRI9x6661s2lQaL9lcjt/75P/LubNnAIhFI+Ry+fcB7v6/97BxXel5PHr0KN/5znfo7Ozk3//934G8Q/3gwYOWkCkKlI9//ONzticSifCv//qvPProozz88MP89V//NQ899BBnz56lra2NtrY2Tp8+TWtrK+vXrwdgbGyM6elp1q5dC+Q1tEQiLxiff/55LrvsMlpbW5mYmODLX/4yH/vYx4C8H+a1r30tqVSK48ePs3379lntSSQSji22tRIyQojPA28D1gIPCyEGpZRXCiEeBO6QUu4GvgHcABwufOxTUspjheOFzmnLA4+XmnjjC9fx8p5NPHvkIj/+xSkAHnziuBEyCg89cYJkOv/Ab1rTyiuv3cz5wSnue/gQAN/+keSlL9pofFkFdh84z/hUEoBVXU388vVb6G5v5FP/9+cAPLmvj4/eepUnvqy3vnwbb315ZYLAzRIr1157LZ/73OdYvXo13/3ud23nphNp/vCOzwFQF4uwZV0704k0ZwfyC5tULkIul7P667Of/Sx33HEHt956q/Udf/zHf8yBAwd4xSteUVF7jh49ytatW7nxxhvZunUr73//+4lEIuzfv58XvCCvmR04cMC2odnzzz9vnYP8hovHjx9n9erV5HI5pqamyOVy3HPPPbS1tTE5Ocnzzz/P+Pg4N910E/39/bS1tc3yDWUyGU6fPs2OHTsq7c4F0UrISCl/G5jlbZJS3qIcZ4CPzvP5ec/pSjab45lDA9brd7w6/4e95SVbLSHz2DPn+OCbdtLRGtjNjBwjm83xHz8r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\n",
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6, 6))\n",
    "plt.plot(t, f_sin(t, A, omega), label='$y=A*sin(\\\\omega t )$', linewidth=3.0)\n",
    "plt.xlabel('t', size=12)\n",
    "plt.ylabel('y=f(x)', size=12)\n",
    "plt.legend(loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d50ed41-2fc9-4509-bfce-bd56eecdd0ad",
   "metadata": {},
   "source": [
    "### Интерактивное управление в Jupyter Notebooks:  библиотека *IPywidgets*\n",
    "Для решения задач интерактивного управления параметрами воспользуемся библиотекой *IPywidgets* ([См. ссылку](https://ipywidgets.readthedocs.io/en/stable/index.html)). С помощью этой библиотеки  блокнот Jupyter превращается в диалоговую панель, удобную для визуализации и работы с данными (больше о возможностях, предоставляемых библиотекой, см статью [_Интерактивное управление в Jupyter Notebooks_](https://medium.com/nuances-of-programming/%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-jupyter-notebooks-4fd1fccb5788)).\n",
    "\n",
    "Для работа с *IPywidgets*  создаем ячейку с :\n",
    "```python\n",
    "import ipywidgets as widgets\n",
    "from ipywidgets import interact, interact_manual, Label\n",
    "```\n",
    "\n",
    " Список доступных виджетов (*Widget List*) можно найти на [сайте библиотеки](https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20List.html#Widget-List). \n",
    " \n",
    " Однако, в библиотеке есть удобная функция (*ipywidgets.interact*), котороя  автоматически создает элементы управления пользовательского интерфейса (UI) для интерактивного изучения кода и данных. Это самый простой способ начать использовать виджеты IPython.\n",
    "  Мы воспользуемся конструкцией (декоратор):\n",
    "  \n",
    "```python\n",
    "                                                                          \n",
    "@interact \n",
    "```\n",
    "которая автоматически создаёт  и текстовое поле и слайдер для выбора колонки и числа. Декоратор смотрит на введённые параметры и создаёт панель диалогового управления, основываясь на типах данных. \n",
    "[Пример](https://ipywidgets.readthedocs.io/en/stable/examples/Using%20Interact.html#Basic-interact)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "113cb357-7cc2-4400-b003-3a0c0cf8a1e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib widget "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "115acb29-9585-4292-b28a-497fbf699076",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "16f1d24b77f8406e9c347b175e1d58e8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=1.0, description='t', max=3.0, min=-1.0), IntSlider(value=1, descripti…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact(t=1.0, A=1, omega=1)\n",
    "def f_sin(t, A, omega):\n",
    "    ''' Определяет значение функции A*sin(omega*t),\n",
    "        A, omega - параметры'''\n",
    "    return A*np.sin(omega*t)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cacd245f-9724-4b97-9a78-da61cff9ed1a",
   "metadata": {},
   "source": [
    "#### Некоторые улучшения *Sliders*\n",
    "Добавим для слайдеров интервалы и шаг изменения.\n",
    "Пример:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "eac2fd2d-0a37-4c38-8e73-73d7ce5bebf0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e93a9b46c7d94df7851ea6119b246e12",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=5.5, description='x', max=20.0, step=0.5), Output()), _dom_classes=('w…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact(x=(0.0, 20.0, 0.5))\n",
    "def h(x=5.5):\n",
    "    return x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d1d31ca-cfe2-436a-a664-472aa1aa4daa",
   "metadata": {},
   "source": [
    "Для нашей задачи определим функцию, с интерактивными всеми параметрами (амплитуда и частота):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "da730280-b5b8-4dfa-877f-60c2a8475812",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "43d49f827545448fa14a93f147ff49ef",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=1, description='A', max=3, min=-1), IntSlider(value=1, description='omeg…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact\n",
    "def show_sin(A=1, omega=1):\n",
    "    t = np.linspace(-4*np.pi, 4*np.pi, 150, endpoint=True)\n",
    "    fig = plt.figure(figsize=(6, 6))\n",
    "    plt.plot(t, f_sin(t, A, omega),\n",
    "             label='$y=A*sin(\\\\omega_t )$', linewidth=3.0)\n",
    "    plt.xlabel('t')\n",
    "    plt.ylabel('y=f(x)')\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5f219b92-9e4d-429e-81d3-3db46e36d500",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f80432c4fecf4c9bac03c8367f8c2bf6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=3.0, description='A', max=5.0, min=1.0, step=1.0), FloatSlider(value=2…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact\n",
    "def show_sin(A=(1.0, 5.0, 1.0), omega=(0.1, 5.0, 0.1)):\n",
    "    t = np.linspace(-4*np.pi, 4*np.pi, 150, endpoint=True)\n",
    "    fig = plt.figure(figsize=(6, 6))\n",
    "    plt.plot(t, f_sin(t, A, omega),\n",
    "             label='$y=A*sin(\\\\omega_t )$', linewidth=3.0)\n",
    "    plt.xlabel('t')\n",
    "    plt.ylabel('y=f(x)')\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0781e3b0-7448-4152-9722-e1009af26d6e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
