Лабораторная работа №1

по предмету "оптимальное управление"

Выполнил: студент гр. А-14м-16 Мигаль И.А
Проверил: Зубков Павел Валерьевич

In [1]:
import sys
sys.path.insert(0, '/home/ivmig/OneDrive/Documents/A-14m-16/2CURSE3SEM/optimal_control/lab_1/')
print(sys.path)


['/home/ivmig/OneDrive/Documents/A-14m-16/2CURSE3SEM/optimal_control/lab_1/', '', '/home/ivmig/anaconda3/lib/python36.zip', '/home/ivmig/anaconda3/lib/python3.6', '/home/ivmig/anaconda3/lib/python3.6/lib-dynload', '/home/ivmig/anaconda3/lib/python3.6/site-packages', '/home/ivmig/anaconda3/lib/python3.6/site-packages/Sphinx-1.5.6-py3.6.egg', '/home/ivmig/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg', '/home/ivmig/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/home/ivmig/.ipython']

In [2]:
print(__doc__)

# Author: Ivan Migal ivan.migal@mail.ru
# License: BSD 3 clause

import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from pylab import rcParams
from matplotlib import colors as mcolors
import utils

from utils import array
from utils import TDMA


colors = list(mcolors.BASE_COLORS)
colors += list(mcolors.CSS4_COLORS.keys())


Automatically created module for IPython interactive environment

In [3]:
%matplotlib inline
rcParams['figure.figsize'] = 12, 12
plt.style.use('ggplot')
# Настройка шрифта
font = {'family' : 'DejaVu Sans',
        'weight' : 'bold',
        'size'   : 16}

matplotlib.rc('font', **font)

Инициализация данных

    Обозначения см. в описании Л.Р. №1

In [4]:
# Словарь параметров
p_d = {}

In [5]:
# Заданные положительные величины
p_d['a'], p_d['l'], p_d['v'], p_d['T'] = 1., 1., 1., 2.

# Решение тестового примера
def x(s, t):
    return math.sin(t) + math.sin(s + math.pi / 2.)

# Плотность источников тепла
def f(s, t):
    return math.cos(t) + p_d['a'] ** 2 * math.sin(s + math.pi / 2.)
    
# Температура внешней среды
def p(t):
    #return 1. / p_d['v'] * math.cos(p_d['l'] + math.pi / 2) + math.sin(t) + math.sin(p_d['l'] + math.pi / 2)
    return 0.
    
# Распределение температуры в начальный момент времени
def fi(s):
    return math.sin(s + math.pi / 2.)

p_d['p(t)'] = p

p_d['f(s, t)'] = f

# Заданные числа
p_d['p_min'], p_d['p_max'], p_d['R'] = -100., 100., 100.

p_d['fi(s)'] = fi

# Желаемое распределение температуры
def y(s):
    #return s * math.sin(s + math.pi / 2.)
    return math.sin(p_d['T']) + math.sin(s + math.pi / 2.)

p_d['y(s)'] = y

# Число точек на пространственной и временной сетке соответственно
N = 10
p_d['N'], p_d['M'] = N, 10 + N * N

# Шаг на пространственной и временной сетке соответственно
p_d['dh'], p_d['dt'] = p_d['l'] / p_d['N'], p_d['T'] / p_d['M']
p_d['l'], p_d['T'], p_d['dh'], p_d['dt']


Out[5]:
(1.0, 2.0, 0.1, 0.01818181818181818)

Создание модели и управление


In [6]:
model = utils.Lab1OptCtrlModel(p_d)

In [7]:
criterion = utils.criterion_3
get_alpha = utils.get_alpha_5

In [8]:
model.solve(criterion, get_alpha, eps=10**-5)


10000000.0
0.0138428341044
0.00458766570607
0.00228462757967
0.00138333980049
0.000941280975151
0.00069214837532
0.000537694584662
0.000434993861932
0.000362933252539
0.000310169991181
0.000270176830533
0.000238984409785
0.000214066589083
0.000193753153717
0.000176903263535
0.000162715444079
0.00015061263967
0.000140170288596
0.000131069966806
0.000123068718608
0.000115978286957
0.000109650750227
0.000103968399754
9.8836482511e-05
9.41779158313e-05
8.99293826798e-05
8.60384085586e-05
8.24611464627e-05
7.91606793541e-05
7.61057055642e-05
7.32695107799e-05
7.06291568045e-05
6.8164835922e-05
6.58593529532e-05
6.36977066371e-05
6.16667489032e-05
5.97549057032e-05
5.79519468492e-05
5.62487951333e-05
5.46373671413e-05
5.3110439794e-05
5.16615378988e-05
5.02848389516e-05
4.89750921786e-05
4.77275493923e-05
4.65379056957e-05
4.54022484332e-05
4.43170130787e-05
4.3278944982e-05
4.22850660829e-05
4.13326458554e-05
4.04191758633e-05
3.95423474143e-05
3.87000318781e-05
3.78902633043e-05
3.71112230304e-05
3.63612260186e-05
3.56387086975e-05
3.49422181171e-05
3.42704022556e-05
3.36220013344e-05
3.29958400225e-05
3.2390820424e-05
3.18059157587e-05
3.12401646554e-05
3.06926659915e-05
3.01625742157e-05
2.9649095104e-05
2.9151481901e-05
2.86690318068e-05
2.82010827738e-05
2.77470105805e-05
2.73062261569e-05
2.68781731339e-05
2.6462325597e-05
2.60581860235e-05
2.5665283386e-05
2.52831714068e-05
2.49114269499e-05
2.45496485364e-05
2.41974549742e-05
2.38544840906e-05
2.35203915591e-05
2.3194849813e-05
2.28775470367e-05
2.25681862306e-05
2.22664843407e-05
2.19721714505e-05
2.16849900277e-05
2.14046942224e-05
2.11310492133e-05
2.08638305966e-05
2.06028238159e-05
2.0347823629e-05
2.00986336088e-05
1.98550656764e-05
1.96169396636e-05
1.93840829024e-05
1.91563298402e-05
1.8933521678e-05
1.87155060313e-05
1.85021366103e-05
1.82932729198e-05
1.80887799763e-05
1.78885280416e-05
1.76923923719e-05
1.75002529807e-05
1.73119944159e-05
1.71275055482e-05
1.69466793723e-05
1.67694128184e-05
1.65956065741e-05
1.64251649156e-05
1.62579955485e-05
1.60940094565e-05
1.59331207581e-05
1.57752465709e-05
1.56203068828e-05
1.54682244298e-05
1.531892458e-05
1.5172335223e-05
1.50283866658e-05
1.48870115327e-05
1.47481446709e-05
1.46117230602e-05
1.44776857272e-05
1.43459736638e-05
1.42165297495e-05
1.40892986769e-05
1.39642268811e-05
1.38412624725e-05
1.37203551722e-05
1.3601456251e-05
1.34845184702e-05
1.33694960262e-05
1.32563444964e-05
1.31450207889e-05
1.30354830927e-05
1.29276908316e-05
1.28216046192e-05
1.27171862162e-05
1.26143984894e-05
1.25132053722e-05
1.24135718275e-05
1.23154638114e-05
1.22188482385e-05
1.21236929492e-05
1.20299666775e-05
1.19376390211e-05
1.18466804116e-05
1.17570620869e-05
1.16687560637e-05
1.15817351125e-05
1.14959727318e-05
1.14114431249e-05
1.13281211768e-05
1.12459824317e-05
1.11650030724e-05
1.10851598996e-05
1.10064303121e-05
1.09287922882e-05
1.08522243675e-05
1.07767056331e-05
1.07022156949e-05
1.06287346733e-05
1.05562431839e-05
1.04847223218e-05
1.04141536475e-05
1.03445191728e-05
1.0275801347e-05
1.02079830445e-05
1.01410475514e-05
1.00749785541e-05
1.0009760127e-05
9.94537672164e-06
Out[8]:
<utils.Lab1OptCtrlModel at 0x7fb6272af3c8>

In [9]:
model.final_step


Out[9]:
175

In [10]:
X_ = np.arange(0., p_d['l'] + p_d['dh'], p_d['dh'])
Y_ = np.arange(0., p_d['T'] + p_d['dt'], p_d['dt'])

Процесс управления


In [11]:
y_s = model.y_arr
bounds = [min(y_s), max(y_s)]

In [12]:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(X_, y_s, color='r', label='Желаемое')
part = 1
count = 5
step = int(model.final_step / count / part)
for i in range(0, int(model.final_step / part), step):
    ax.plot(X_, model.x_arr[i][-1,:], color=colors[int(i / step)], linestyle='--', label='{}-я итерация'.format(i))
ax.plot(X_, model.x_arr[-1][-1,:], color='b', label='Последняя итерация')
ax.set_ylim(bounds)
plt.xlabel('s')
plt.ylabel('y(s)')
plt.title('Распределения температуры стержня в процессе управления')
plt.legend(title='Легенда', loc='center left', bbox_to_anchor=(1.0, 0.5))
plt.show()



Желаемое и полученное распределение температур


In [13]:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(X_, y_s, color='r', label='Желаемое')
ax.plot(X_, model.x_arr[-1][-1,:], color='b', label='Полученное')
ax.set_ylim(bounds)
plt.xlabel('s')
plt.ylabel('y(s)')
plt.title('Желаемое и полученное распределения температуры стержня')
plt.legend(title='Легенда', loc='center left', bbox_to_anchor=(1.0, 0.5))
plt.show()



Управление


In [14]:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(Y_, model.p_arr[0], color='b', label='Начальный момент времени')
ax.plot(Y_, model.p_arr[-1], color='r', label='Полученное после управления')
plt.xlabel('t')
plt.ylabel('p(t)')
plt.title('Управление начальный и окончательный момент')
plt.legend(title='Температуры внешней среды', loc='center left', bbox_to_anchor=(1.0, 0.5))
plt.show()



График изменения ошибки


In [15]:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(model.err, color='black', label='Ошибка')
ax.set_ylim([min(model.err), min(model.err) + .1])


Out[15]:
(9.9453767216433133e-06, 0.10000994537672164)