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

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

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

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

In [1]:
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 [2]:
%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 [3]:
# Словарь параметров
p_d = {}

In [4]:
# Заданные положительные величины
p_d['a'], p_d['l'], p_d['v'], p_d['T'] = 1., 1., 10., 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[4]:
(1.0, 2.0, 0.1, 0.01818181818181818)

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


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

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

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


90909.09090909091
1289.62976391
18281.103382
23452.6414815
20273.9158525
18393.9387289
17913.1246032
17030.6216186
17049.2990712
16368.6541946
16581.038622
15971.5396307
14866.6320242
10794.1556683
6080.40711573
2677.74949518
911.699226813
241.929664445
48.6910744363
7.68085494252
0.877106085205
0.111515372215
0.0285541926258
0.0233651629178
0.0202791114493
0.018175607147
0.0162983540208
0.0146697803533
0.0132435059748
0.0119896559661
0.0108830579979
0.00990292040682
0.00903190836175
0.00825547621906
0.00756134787013
0.00693910833504
0.00637987937026
0.00587605943885
0.00542111359227
0.00500940246795
0.00463604222665
0.00429678916356
0.0039879441401
0.00370627304324
0.00344894028273
0.00321345295286
0.00299761376147
0.00279948120062
0.00261733572516
0.00244965093623
0.00229506895038
0.00215237928207
0.00202050068566
0.00189846549847
0.00178540610441
0.00168054320078
0.00158317560316
0.00149267136553
0.00140846002837
0.00133002583653
0.00125690179296
0.00118866443445
0.00112492923274
0.00106534653833
0.00100959799622
0.000957393373097
0.000908467743725
0.000862578991719
0.000819505585925
0.000779044598834
0.000741009937988
0.000705230765091
0.000671550080848
0.00063982345636
0.000609917894326
0.000581710805387
0.000555089086784
0.000529948292025
0.000506191881657
0.000483730546394
0.000462481594897
0.000442368399387
0.000423319893068
0.000405270114016
0.000388157790798
0.000371925965602
0.000356521651147
0.00034189551801
0.000328001609421
0.000314797080847
0.000302241961995
0.000290298939106
0.000278933155626
0.000268112029558
0.000257805085935
0.000247983803051
0.000238621471193
0.000229693062765
0.000221175112777
0.000213045608797
0.000205283889536
0.000197870551324
0.000190787361792
0.000184017180155
0.00017754388354
0.000171352298841
0.00016542813967
0.000159757947952
0.000154329039814
0.000149129455404
0.000144147912333
0.000139373762448
0.000134796951674
0.000130407982692
0.000126197880216
0.000122158158687
0.000118280792191
0.000114558186433
0.000110983152604
0.000107548883023
0.000104248928393
0.000101077176572
9.80278327468e-05
9.50954008932e-05
9.22746664501e-05
8.95606801063e-05
8.69487426258e-05
8.44343906392e-05
8.20133833324e-05
7.96816899695e-05
7.74354781946e-05
7.52711030559e-05
7.31850967063e-05
7.1174158732e-05
6.9235147068e-05
6.73650694618e-05
6.5561075448e-05
6.38204488002e-05
6.21406004303e-05
6.05190617034e-05
5.89534781448e-05
5.7441603511e-05
5.59812942032e-05
5.45705040005e-05
5.32072790939e-05
5.18897534011e-05
5.06161441447e-05
4.93847476783e-05
4.81939355446e-05
4.70421507515e-05
4.59279042528e-05
4.48497716213e-05
4.38063899025e-05
4.2796454639e-05
4.18187170537e-05
4.08719813841e-05
3.99551023583e-05
3.90669828039e-05
3.82065713828e-05
3.73728604442e-05
3.65648839894e-05
3.57817157413e-05
3.50224673134e-05
3.42862864727e-05
3.35723554904e-05
3.28798895761e-05
3.22081353911e-05
3.15563696358e-05
3.09238977078e-05
3.03100524258e-05
2.97141928173e-05
2.91357029645e-05
2.85739909081e-05
2.80284876028e-05
2.74986459238e-05
2.69839397217e-05
2.64838629213e-05
2.59979286642e-05
2.55256684918e-05
2.50666315666e-05
2.46203839302e-05
2.41865077957e-05
2.3764600873e-05
2.33542757257e-05
2.2955159157e-05
2.25668916238e-05
2.21891266781e-05
2.18215304326e-05
2.14637810516e-05
2.11155682642e-05
2.0776592899e-05
2.04465664401e-05
2.01252106023e-05
1.98122569257e-05
1.95074463871e-05
1.92105290291e-05
1.89212636053e-05
1.86394172409e-05
1.83647651072e-05
1.80970901115e-05
1.78361825985e-05
1.75818400663e-05
1.73338668927e-05
1.70920740744e-05
1.68562789763e-05
1.66263050916e-05
1.64019818121e-05
1.61831442076e-05
1.59696328149e-05
1.57612934348e-05
1.55579769385e-05
1.53595390805e-05
1.51658403204e-05
1.49767456513e-05
1.47921244349e-05
1.46118502438e-05
1.44358007097e-05
1.42638573778e-05
1.40959055667e-05
1.39318342346e-05
1.37715358497e-05
1.36149062666e-05
1.34618446067e-05
1.33122531444e-05
1.31660371962e-05
1.30231050155e-05
1.28833676906e-05
1.27467390467e-05
1.26131355522e-05
1.24824762276e-05
1.23546825588e-05
1.2229678413e-05
1.21073899583e-05
1.19877455856e-05
1.18706758345e-05
1.17561133204e-05
1.16439926661e-05
1.15342504344e-05
1.14268250641e-05
1.13216568078e-05
1.12186876726e-05
1.11178613621e-05
1.10191232212e-05
1.09224201827e-05
1.08277007157e-05
1.0734914776e-05
1.0644013758e-05
1.05549504487e-05
1.04676789832e-05
1.03821548015e-05
1.02983346071e-05
1.02161763271e-05
1.01356390735e-05
1.00566831059e-05
9.97926979567e-06
Out[7]:
<utils.Lab1OptCtrlModel at 0x7f597075c400>

In [8]:
model.final_step


Out[8]:
254

In [9]:
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 [10]:
y_s = model.y_arr
bounds = [min(min(y_s), min(model.x_arr[-1][-1,:])), max(max(y_s), max(model.x_arr[-1][-1,:]))]

In [11]:
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 [12]:
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 [13]:
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 [14]:
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[14]:
(9.9792697956693552e-06, 0.10000997926979567)