{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы работы с блокнотом Jupyter Notebook и примеры решения задач" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[К оглавлению](00_contents.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Структура блокнота и основные операции" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ячейка Markdown\n", "\n", "**Markdown** - простой язык для оформления документов. Ячейки этого типа используются для пояснения методики расчетов. \n", "Помимо обычного текста, ячейка может содержать:\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- списки:\n", "\n", " 1. первый\n", " 1. второй\n", " 1. третий\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "- таблицы:\n", "\n", "Заголовок 1 | Заголовок 2\n", ":------------|:------------\n", " Ячейка 1 | Ячейка 2 \n", " Ячейка 3 | Ячейка 4 \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "- математические формулы: $ (x-a)^2 + (y-b)^2 = R^2 $,\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [гиперссылки](http://yandex.ru)," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- изображения: \n", "![Менделеев](http://www.new-cccp.ru/naukab/1341.jpg \"Менделеев\") \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- другие объекты, которые можно разместить на веб-странице (с помощью HTML-тегов).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ячейка кода\n", "\n", "В ячейках кода необходимо писать команды в соответствии с правилами Python. Эти команды при вычислении ячейки интерпретируются и выполняются. Результат выводится сразу после ячейки. \n", "\n", "При вычислении ячейки с кодом она получает последовательный номер ввода - `In[?]`. А результат вычисления ячейки - номер вывода - `Out[?]`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "2 * 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Режимы работы\n", "\n", "- режим выполнения (command mode) [Esc]\n", "- режим редактирования ячейки (edit mode) [Enter]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Выполнение кода в ячейках\n", "\n", "- `Shift-Enter` - выполнить и перейти к следующей\n", "- `Ctrl-Enter` - выполнить без перехода к следующей ячейке\n", "- `Alt-Enter` - выполнить и добавить новую ячейку ниже" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print('Hello!') # Потренируйтесь на этой ячейке" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Справка по клавишам\n", "\n", "Для часто выполняемых действий назначены \"горячие\" клавиши. \n", "\n", "См. Help/Keyboard Shortcuts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Операции с блокнотом\n", "\n", "- создание\n", "- переименование\n", "- сохранение\n", "- загрузка (.ipynb и .html)\n", "- открытие существующего блокнота\n", "- [nbviewer](http://nbviewer.jupyter.org)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Примеры решения задач" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Построение графика функции одной переменной\n", "\n", "\n", "Построить в одной системе координат графики функций:\n", "\n", "- $ f_1(x) = x^2 - 4 $\n", "- $ f_2(x) = x + 4$\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Подключаем пакеты:\n", "import numpy as np #работа с массивами\n", "import matplotlib.pyplot as plt #графики\n", "# Инициализация отображения графиков в блокноте:\n", "%matplotlib inline " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "run_control": { "marked": false } }, "outputs": [], "source": [ "# Задаем диапазон изменения независимой переменной:\n", "x = np.linspace(-5, 5, 21)\n", "\n", "# Задаем функции:\n", "f1 = lambda x: x**2 - 4\n", "f2 = lambda x: x + 4" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# График \"по-быстрому\"\n", "plt.plot(x, f1(x))\n", "plt.plot(x, f2(x));" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "run_control": { "marked": false } }, "outputs": [], "source": [ "# График красивый\n", "plt.plot(x, f1(x), label='$f_1(x)$')\n", "plt.plot(x, f2(x), label='$f_2(x)$')\n", "plt.xlabel('$x$', fontsize=16)\n", "plt.title('График функции', fontsize=18)\n", "plt.legend(loc='best', fontsize=14);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Задание**:\n", "> Построить \"красивый\" график функций: sin(x) и cos(x) на интервале $(-4\\pi;4\\pi)$\n", "\n", "\n", "> *Совет*: необходимые функции и константа содержатся в пакете numpy. К ним можно обратиться так: `np.pi`, `np.sin()`\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Здесь ваш код" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Работа с матрицами\n", "\n", "Вычислить скалярное произведение векторов: $V (1, 0, 0)$ и $W (6, 5, 4)$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "V = np.array([1, 0, 0])\n", "W = np.array([6, 5, 4])\n", "\n", "V.dot(W)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для заданной матрицы \n", "\n", "$$ A =\n", " \\begin{pmatrix} \n", " 1 & -2 & -3\\\\\n", " 4 & 5 & 6\\\\\n", " 7 & 8 & 9\\\\\n", " \\end{pmatrix}\n", "$$\n", "\n", "вычислить: \n", "\n", "- $A^T$, \n", "- $|A|$, \n", "- ранг $A$, \n", "- $A^{-1}$,\n", "- $A^{-1}A$,\n", "- $A\\cdot V$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Задаем матрицу:\n", "A = np.matrix([[1, -2, -3],\n", " [4, 5, 6],\n", " [7, 8, 9]])\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Транспонирование:\n", "A.T" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Определитель:\n", "np.linalg.det(A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.round(np.linalg.det(A)) #округление" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Ранг:\n", "np.linalg.matrix_rank(A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Обратная матрица:\n", "A.I" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "# Произведение матриц:\n", "A.I * A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.round(A.I * A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Произведение матрицы на вектор:\n", "print(A, V)\n", "A.dot(V)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Задание**:\n", "> Проверить, имеет ли решение данная система линейных уравнений:\n", "\n", "\n", ">$\n", "\\left{\n", "\\begin{array}\\\\\n", " x - y + z = 1 \\\\\n", " y + 2z = 2 \\\\\n", " x + z = 3 \n", "\\end{array}\n", "\\right.\n", "$\n", "\n", "> Если решение существует, то найти его" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Построение графика функции двух переменных\n", "\n", "Пусть требуется построить график функции: $ g(x,y) = \\sin \\sqrt{x^2 + y^2} $" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "g = lambda x, y: np.sin(np.sqrt(x**2 + y**2))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Интервалы изменения по X и Y\n", "x = np.linspace(-5, 5, 101)\n", "y = x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Координаты узлов сетки для построения графика\n", "X, Y = np.meshgrid(x, y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Значения функции в узлах сетки\n", "Z = g(X, Y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Графики встраиваются в блокнот\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Способ 1: Визуализация матрицы значений функции в узлах сетки как изображения" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plt.imshow(Z, cmap=plt.cm.viridis)\n", "plt.colorbar();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Способ 2: Контурный график" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "plt.contourf(X, Y, Z, 50, cmap = plt.cm.viridis)\n", "plt.colorbar()\n", "contours = plt.contour(X, Y, Z, 5, colors='black')\n", "plt.clabel(contours, inline=1);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Способ 3: График поверхности" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# График в отдельном окне\n", "%matplotlib" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from mpl_toolkits.mplot3d import Axes3D\n", "fig = plt.figure()\n", "ax = fig.gca(projection='3d')\n", "\n", "ax.plot_surface(X, Y, Z, alpha=0.3, cmap=plt.cm.viridis, linewidth=0, rstride=4, cstride=4)\n", "\n", "ax.set_xlabel('X')\n", "ax.set_ylabel('Y')\n", "ax.set_zlabel('Z')\n", "ax.set_title('График поверхности')\n", "\n", "# Направление обзора и расстояние до наблюдателя\n", "ax.view_init(elev=45, azim=23)\n", "#ax.dist=6\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Задание**: Требуется построить контурный график и поверхность функции Розенброка:\n", ">\n", ">\n", ">$f(x,y) = (1-x)^2 + 100(y-x^2)^2 $\n", ">\n", "> Интересным является поведение функции в окрестности точки $(0, 0)$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Символьная математика\n", "\n", "Символьные вычисления (symbolic math) используются для аналитического решения математических задач. Например, можно вычислять производные, интегралы, оперировать с матрицами, искать корни уравнений, упрощать выражения... \n", "\n", "В Python символьные вычисления реализованы в пакете SymPy.\n", "\n", "\n", "#### Исследование функции\n", "Необходимо найти нули и экстремумы функции:\n", "\n", "$ f(x) = x^2 - 2x + 1 $\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sympy as sp\n", "sp.init_printing() " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = sp.symbols('x') # Переменная x теперь содержит символ 'x'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "f = x**2 - 2*x + 1 - 4# Выражение для функции\n", "f" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# График функции\n", "%matplotlib inline\n", "sp.plot(f, (x, -2, 4)); #sympy содержит свою функцию для быстрого построения графиков" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нули функции:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sp.solve(f, x) #Корни уравнения f(x) = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Производная:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df = f.diff(x)\n", "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Вычислить значение производной при x = 5:\n", "df.subs(x, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Стационарные точки:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sp.solve(df) # Точки, в которых производная равна 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Тип экстремума:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "f.diff(x, 2) # Вторая производная" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Знак второй производной положителен, следовательно найден минимум" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Задание**: Найти экстремумы функции: $ f(x) = x^4 - 4x^3 - 8x^2$ и определить их тип.\n", ">\n", "> Проверить решение с помощью графика" ] } ], "metadata": { "hide_input": false, "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.4.3" }, "latex_envs": { "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 0 }, "toc": { "toc_cell": false, "toc_number_sections": false, "toc_threshold": 4, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 0 }