Основы работы с Python: инструментарий на Python для решения научных и прикладных задач#

Инструментарий для научной визуализации#

Построения графиков функций с библиотекой Matplotlib#

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import ipywidgets as widgets
from ipywidgets import interact, interact_manual, Label
import seaborn as sns
sns.set()
sns.set(style="whitegrid")

%matplotlib inline
A = 1
omega = 1


def f_sin(t, A, omega):
    ''' Определяет значение функции A*sin(omega*t),
        A, omega - параметры'''
    return (A*np.sin(omega*t))
print(f_sin.__doc__)
 Определяет значение функции A*sin(omega*t),
        A, omega - параметры

Массивы в numpy#

# Массив чисел: линейная последовательность с 0 по 30 с шагом 2

x = np.arange(0, 30, 2)
print(x)
[ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28]

Еще один способ задания массива См. ссылку. :

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)[source]
Return evenly spaced numbers over a specified interval.

Returns num evenly spaced samples, calculated over the interval [start, stop].

The endpoint of the interval can optionally be excluded.
x2 = np.linspace(0, 30, 20, endpoint=True)
print(x2)
print(x2.shape)
[ 0.          1.57894737  3.15789474  4.73684211  6.31578947  7.89473684
  9.47368421 11.05263158 12.63157895 14.21052632 15.78947368 17.36842105
 18.94736842 20.52631579 22.10526316 23.68421053 25.26315789 26.84210526
 28.42105263 30.        ]
(20,)
t = np.linspace(-4*np.pi, 4*np.pi, 150, endpoint=True)
print(t.shape)
(150,)
fig = plt.figure(figsize=(6, 6))
plt.plot(t, f_sin(t, A, omega), label='$y=A*sin(\\omega t )$', linewidth=3.0)
plt.xlabel('t', size=12)
plt.ylabel('y=f(x)', size=12)
plt.legend(loc='upper right')
plt.show()
_images/e05453cfd9c5bd62111edce5a919e9344f07a3d4d0619793c33d29977990f768.png

Интерактивное управление в Jupyter Notebooks: библиотека IPywidgets#

Для решения задач интерактивного управления параметрами воспользуемся библиотекой IPywidgets (См. ссылку). С помощью этой библиотеки блокнот Jupyter превращается в диалоговую панель, удобную для визуализации и работы с данными (больше о возможностях, предоставляемых библиотекой, см статью Интерактивное управление в Jupyter Notebooks).

Для работа с IPywidgets создаем ячейку с :

import ipywidgets as widgets
from ipywidgets import interact, interact_manual, Label

Список доступных виджетов (Widget List) можно найти на сайте библиотеки.

Однако, в библиотеке есть удобная функция (ipywidgets.interact), котороя автоматически создает элементы управления пользовательского интерфейса (UI) для интерактивного изучения кода и данных. Это самый простой способ начать использовать виджеты IPython. Мы воспользуемся конструкцией (декоратор):

                                                                          
@interact 

которая автоматически создаёт и текстовое поле и слайдер для выбора колонки и числа. Декоратор смотрит на введённые параметры и создаёт панель диалогового управления, основываясь на типах данных. Пример

%matplotlib widget 
@interact(t=1.0, A=1, omega=1)
def f_sin(t, A, omega):
    ''' Определяет значение функции A*sin(omega*t),
        A, omega - параметры'''
    return A*np.sin(omega*t)

Некоторые улучшения Sliders#

Добавим для слайдеров интервалы и шаг изменения. Пример:

@interact(x=(0.0, 20.0, 0.5))
def h(x=5.5):
    return x

Для нашей задачи определим функцию, с интерактивными всеми параметрами (амплитуда и частота):

@interact
def show_sin(A=1, omega=1):
    t = np.linspace(-4*np.pi, 4*np.pi, 150, endpoint=True)
    fig = plt.figure(figsize=(6, 6))
    plt.plot(t, f_sin(t, A, omega),
             label='$y=A*sin(\\omega_t )$', linewidth=3.0)
    plt.xlabel('t')
    plt.ylabel('y=f(x)')
    plt.legend(loc='upper right')
    plt.show()
@interact
def show_sin(A=(1.0, 5.0, 1.0), omega=(0.1, 5.0, 0.1)):
    t = np.linspace(-4*np.pi, 4*np.pi, 150, endpoint=True)
    fig = plt.figure(figsize=(6, 6))
    plt.plot(t, f_sin(t, A, omega),
             label='$y=A*sin(\\omega_t )$', linewidth=3.0)
    plt.xlabel('t')
    plt.ylabel('y=f(x)')
    plt.legend(loc='upper right')
    plt.show()