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