Лабораторная работа №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'] = 10., 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[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
2538510.44898
4542495.0402
4381181.95141
4485947.35645
4342277.67733
4452523.85625
4322971.24227
4432828.97793
4311435.64006
4406030.03416
4268135.81241
4351106.11072
4236668.65196
4310601.85965
4212596.60366
4279406.10096
4193484.2967
4254585.59307
4177876.62261
4234331.88923
4164846.89773
4217466.98177
4153774.88904
4203189.33581
4144228.59867
4190933.90157
4135897.14767
4180290.45945
4128550.63591
4142118.98197
4085248.82181
4094961.94247
4045875.44552
4054421.19697
4010333.62881
4018925.14819
3978273.94033
3987438.77108
3949292.74859
3959234.15694
3923005.28878
3933772.92329
3899069.0993
3910641.47983
3877187.97623
3889512.9255
3857108.7165
3870123.22214
3838615.66188
3852255.48737
3821525.03969
3835729.16691
3805679.83023
3820392.28936
3790945.36374
3806115.75637
3777205.63949
3792789.02843
3764360.28507
3780316.79935
3752322.05592
3768616.39003
3741014.78038
3757615.67747
3730371.66795
3747251.42983
3720333.91219
3737467.9542
3710849.53254
3728215.98865
3701872.41012
3719451.78745
3693361.48143
3711136.3602
3685280.06105
3703234.83519
3677595.2702
3695715.92343
3670277.55248
3688551.46518
3663300.26175
3681716.04419
3656639.31
3675186.65816
3627509.46333
3623768.85961
3579356.27706
3576519.84922
3533873.23352
3532250.21891
3491081.18558
3490605.00959
3450772.69318
3451345.79787
3412738.6032
3414269.81102
3376789.96493
3379197.59974
3342757.88378
3345969.01389
3310491.20897
3314440.5767
3279854.3016
3284483.35715
3250725.10074
3255981.17089
3222993.46728
3228829.0431
3196559.76354
3202931.88854
3171333.63095
3178203.37373
3147232.93433
3154564.93259
3124182.84713
3131944.91185
3102115.05588
3110277.82683
3080967.06639
3089503.71129
3060681.59665
3069567.54775
3041206.04422
3050418.76694
3022492.01754
3032010.80672
3004494.92245
3014300.72257
2987173.59653
2997248.84249
2970489.98482
2980818.46077
2954408.85164
2964975.56549
2938897.52396
2949688.59546
2923925.66219
2934928.22308
2909465.05524
2920667.15988
2895489.43674
2906879.98196
2881974.32004
2893542.97319
2868896.84968
2880633.98388
2856235.66755
2868132.30325
2843970.79197
2856018.54428
2832083.50832
2844274.5393
2820556.26998
2832883.24547
2809372.60839
2821828.65875
2798517.0513
2811095.73583
2787975.04835
2800670.32286
2777732.90325
2790539.09053
2767777.71186
2780689.47472
2758097.30558
2771109.62217
2748680.19949
2761788.34083
2739515.54493
2752715.05419
2730593.08584
2743879.75945
2721903.11875
2735272.98898
2713436.45595
2726885.77491
2705184.39153
2718709.61648
2697138.67014
2710736.44989
2689291.45807
2702958.62052
2681635.31663
2695368.85717
2674163.17742
2687960.24828
2666868.31954
2680726.21989
2659744.34837
2673660.51521
2652785.17595
2666757.17561
2645985.00279
2660010.52304
2639338.30082
2653415.14361
2632839.79774
2646965.87237
2626484.46225
2640657.77909
2620267.49044
2634486.15502
2614184.293
2628446.50056
2608230.48334
2622534.51368
2602401.86645
2616746.07922
2596694.42853
2611077.25872
2591104.32724
2605524.28108
2585627.88264
2600083.53366
2580261.56862
2594751.55404
2575002.00495
2589525.02224
2569845.94974
2584400.75344
2564790.29243
2579375.69116
2559832.04714
2574446.90079
2554968.3465
2569611.56356
2550196.43577
2564866.97089
2545513.66736
2560210.51897
2540917.49561
2555639.70376
2536405.47193
2551152.11622
2531975.2402
2546745.43783
2527624.53241
2542417.43633
2523351.16456
2538165.96177
2519153.0328
2533988.94269
2515028.10974
2529884.38258
2510974.44102
2525850.35649
2506990.14201
2521885.00782
2503073.39472
2517986.54532
2499222.44487
2514153.24024
2495435.59911
2510383.42356
2491711.22236
2506675.48346
2488047.73533
2503027.86287
2484443.61216
2499439.05712
2480897.37813
2495907.6118
2477407.60756
2492432.12062
2473972.92176
2489011.22345
2470591.9871
2485643.6044
2467263.51316
2482327.99006
2463986.25101
2479063.14778
2460758.99153
2475847.88402
2457580.56384
2472681.04284
2454449.83377
2469561.50438
2451365.70244
2466488.1835
2448327.10488
2463460.0284
2445333.00874
2460476.01934
2442382.41301
2457535.16746
2439474.3469
2454636.51358
2436607.8686
2451779.12709
2433782.0643
2448962.1049
2430996.04709
2446184.5704
2428248.95598
2443445.67253
2425539.95497
2440744.58482
2422868.23214
2438080.50449
2420232.99878
2435452.65165
2417633.48855
2432860.26844
2415068.9567
2430302.61826
2412538.67933
2427778.98507
2410041.9526
2425288.67259
2407578.09212
2422831.0037
2405146.4322
2396316.12543
2367490.5719
2314349.48302
2243102.85405
2151451.79253
2045729.64956
1925208.54359
1796009.97776
1658409.66288
1517935.59159
1375298.55177
1235105.12433
1098033.13231
967568.184322
844050.29452
729804.598725
624706.106016
530027.538024
445201.743796
370660.011034
305513.078339
249606.745736
201888.597964
161866.585622
128475.120319
101086.843976
78734.8055937
60797.2740137
46469.6269351
35216.031143
26414.3219236
19646.1615134
14460.7102585
10556.2495247
7624.83489571
5463.22993522
3872.32059318
2723.39294384
1894.17427683
1307.69184732
892.446139894
604.85154067
405.005201787
269.498245739
177.033393842
115.676518522
74.5350115445
47.8343510443
30.2247909195
19.0577557974
11.804314925
7.31622607408
4.43969774776
2.70680727694
1.60782150029
0.965379545209
0.560526090285
0.332051865504
0.188053844792
0.110238003942
0.0606880023138
0.0353780351484
0.018830695412
0.011008514885
0.00561881576697
0.00334275650477
0.00161722769739
0.00100475883654
0.00045527772761
0.00030865406627
0.000131566219551
0.000103404332099
4.42660473325e-05
4.16222974059e-05
2.05609402732e-05
2.14883912626e-05
1.32442899133e-05
1.37515686661e-05
1.0114666991e-05
1.00270296836e-05
8.19663612715e-06
Out[7]:
<utils.Lab1OptCtrlModel at 0x7f96af314358>

In [8]:
model.final_step


Out[8]:
394

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]:
(8.1966361271548536e-06, 0.10000819663612716)