Численные методы¶

При возникновении вопросов пишите в телеграме, @olga_dmit.

Занятие 1. Построение графиков.¶

Считывание данных¶

Открываем файл на чтение:

In [ ]:
f = open('data.txt', 'r')
# 'r' 'w'

Считываем данные из файла построчно:

In [12]:
# data = [list(map(float, line.split('\t'))) for line in f] # way 1
# data = [[float(val) for val in line.split('\t')] for line in f] # way 2
data[1][1]
Out[12]:
5.0379023818155595

Преобразуем считанные данные в массив numpy.array.

Внимание! При обращении к элементам numpy.array нумерация начинается от 0 (а не от 1)!

In [17]:
import numpy as np
data_array = np.array(data)
data_array[:,0]
Out[17]:
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
       13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
       26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
       39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 51.,
       52., 53., 54., 55., 56., 57., 58., 59., 60., 61., 62., 63., 64.,
       65., 66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76., 77.,
       78., 79., 80., 81., 82., 83., 84., 85., 86., 87., 88., 89., 90.,
       91., 92., 93., 94., 95., 96., 97., 98., 99.])

Инициализируем переменные данными, считанными из файла:

In [18]:
t = data_array[:,0]
x = data_array[:,1]
y = data_array[:,2]
# t
x
# y
Out[18]:
array([ 5.        ,  5.03790238,  5.14981636,  5.33043573,  5.57115847,
        5.86043998,  6.18426955,  6.52675245,  6.87077668,  7.19873944,
        7.49330673,  7.73817765,  7.91882462,  8.02318119,  8.04225101,
        7.97061338,  7.8068048 ,  7.55355958,  7.21789755,  6.81105208,
        6.34823701,  5.84825702,  5.33297121,  4.82662531,  4.35507255,
        3.94490771,  3.62254242,  3.41325217,  3.3402276 ,  3.42366272,
        3.67991284,  4.12075286,  4.7527643 ,  5.57687576,  6.58807693,
        7.77532099,  9.12162459, 10.60436797, 12.19579171, 13.86367954,
       15.57221094, 17.28296066, 18.95601756, 20.55119016, 22.02926286,
       23.35326431, 24.48970775, 25.40976335, 26.0903234 , 26.51492378,
       26.67448862, 26.56786975, 26.20215838, 25.59275278, 24.76317307,
       23.74462168, 22.5752962 , 21.29946855, 19.96635262, 18.62878907,
       17.34178234, 16.1609306 , 15.14079311, 14.33324289, 13.7858538 ,
       13.54037154, 13.63131653, 14.08476375, 14.91734055, 16.13547749,
       17.73494096, 19.70066793, 22.00691535, 24.61772692, 27.48771115,
       30.56311485, 33.78316732, 37.08166189, 40.38873372, 43.63278618,
       46.74251259, 49.6489565 , 52.28755093, 54.60007685, 56.53648196,
       58.05650397, 59.131047  , 59.7432661 , 59.88932225, 59.57877927,
       58.83462389, 57.69290075, 56.20196512, 54.42136734, 52.42039393,
       50.27630049, 48.07228147, 45.89522987, 43.83334735, 41.97367046])

Построение простых графиков¶

In [27]:
import matplotlib.pyplot as plt
plt.plot(t[0::10],y[0::10])
plt.show() # is needed to see figure while using command line or IDE

Документация на matplotlib.pyplot.plot

Управление внешним видом линии/точек¶
In [36]:
plt.subplots(figsize=(4, 3))
plt.plot(x, y, '--m')
plt.show()
In [37]:
plt.subplots(figsize=(4, 3))
plt.plot(x, y, 'r-')
plt.show()
In [45]:
plt.subplots(figsize=(4, 3))
plt.plot(x[1::10], y[1::10], color=[0, 0, 0], marker='o', linestyle='dashed',
     linewidth=2, markersize=12)
plt.show()

Список свойств линии (color, marker и т. п.) и их возможных значений

Легенда¶
In [49]:
plt.subplots(figsize=(4, 3))
plt.plot(t, x, 'b-', label='x(t)')
plt.plot(t, y, 'ob', label='y(t)')

plt.legend()
plt.show()
Управление полем графика и осями¶
In [58]:
fig, ax = plt.subplots(figsize=(4, 3))
plt.plot(x, y, 'ob', label='trajectory')

ax.set(title='Trajectory', 
       xlabel='X coorfinates, meters', ylabel='Y coordinate, meters', 
       xlim = (-10,110), ylim=(-5,40))
plt.grid(1)
# plt.title('Center Title')
# plt.title('Left Title', loc='left')
# plt.title('Right Title', loc='right')

plt.show()

Несколько графиков на одном рисунке¶

In [76]:
fig, (ax1, ax2) = plt.subplots(2,1,figsize=(3, 4))
ax1.plot(t,x, '+b')
ax2.plot(t,y, '*r')
ax1.set(title='x(t)', xlabel='t, s', ylabel='x, m')
ax2.set(title='y(t)', xlabel='t, s', ylabel='y, m')
plt.show()
In [80]:
fig, ax = plt.subplots(2,3)
ax[1,1].plot(x**2,y)
ax[0,2].plot(t,x)
ax[0,0].plot(x,y)
ax[1,2].plot(x,y)
plt.show()
In [92]:
fig = plt.figure(figsize=(8, 6))
ax1 = plt.subplot2grid((2,3), (0,0), rowspan=2)
ax2 = plt.subplot2grid((2,3), (0,1), colspan=2)
# ax3 = plt.subplot2grid((2,3), (1,1))
ax4 = plt.subplot2grid((2,3), (1,2))
ax1.plot(x,y)
ax4.plot(x,y)
ax4.set(title = "T")
plt.show()

Задание¶

Пользуясь данными из файла, построить следующие графики. На каждом графике подписать оси, указав единицы измерения (координаты в метрах, времена в секундах).

1.. На одном графике построить зависимости x(t) и y(t): x - пунктирной линией зелёного цвета, y - штрих-пунктирной линией оранжевого цвета. Добавить легенду.

2*. Добавить на график сетку из пунктирных линий серого цвета.

3.. Построить на одном рисунке три графика: x(t), y(t), y(x) - первые два в первой строчке, второй под ними во всю ширину. Для всех трёх графиков задать заголовки.

4.. Рассчитать по массиву координат массив, содержащий скорость vx(t) движения вдоль оси x. Рассчитать массив, содержащий скорость vy(t) движения вдоль оси y. По теореме Пифагора найдите массив, содержащий полную скорость v(t) движения тела. Построить графики vx, vy и v по аналогии с 3 заданием.

5*. Построить график с двумя линиями - vx(t) и vy(t). Оформить график, чтобы линии можно было легко различить по их виду, и добавить легенду.

6*. Рассчитать массивы ускорений ax, ay и a. Построить графики по аналогии с 3-м заданием.

7*. Построить график с двумя линиями - ax(t) и ay(t). Оформить график, чтобы линии можно было легко различить по их виду, и добавить легенду.

8*. Построить на одном рисунке шесть графиков: в первом столбце x(t), vx(t), ax(t), во втором столбце y(t), vy(t), ay(t). Добавьте заголовок к каждому графику.

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