- •Курсовой проект
- •Часть 1. Преобразование формулы и решение ее с помощью Метода Эйлера
- •Часть 2. Моделирование метода оптимизации. Метод покоординатного спуска
- •Описание метода поиска
- •Результаты работы программы:
- •Квадратичная функция (Эллипс)
- •Функция Розенброка
- •Часть 3. Шум.
- •Часть 4. Целевая функция.
Часть 4. Целевая функция.
Создадим математическую модель процесса с коэффициентами a1=8 и T=1 и подберем их таким образом, чтобы при данных значениях целевая функция была минимальна.
Выберем шаг h = 0.2. Точность EPSILON = 0.0001. Количество итераций ITERATION_AMOUNT = 1000.
Результаты пошагового приближения показаны в таблице 3 “Зависимость CF от значений a1 и T”, график CF представлен на рис.7
CF1min = 8,901453
CF2min = 44,05068
CF3min = 132,7882
Таблица 3
«Зависимость CF от значений параметров a1 и T»
№ шага |
A1 |
T |
CF1 (m=0,005) |
CF2 (m=0,01) |
CF 3(m=0,02) |
1 |
8 |
1 |
1,884E+12 |
1,884E+12 |
1,884E+12 |
2 |
8 |
1 |
1,884E+12 |
1,884E+12 |
1,884E+12 |
3 |
7,8 |
1 |
1,784E+12 |
1,784E+12 |
1,784E+12 |
4 |
7,6 |
1 |
1,686E+12 |
1,686E+12 |
1,686E+12 |
5 |
7,4 |
1 |
1,591E+12 |
1,591E+12 |
1,591E+12 |
6 |
7,2 |
1 |
1,499E+12 |
1,499E+12 |
1,499E+12 |
7 |
7 |
1 |
1,409E+12 |
1,409E+12 |
1,409E+12 |
8 |
6,8 |
1 |
1,323E+12 |
1,323E+12 |
1,323E+12 |
9 |
6,6 |
1 |
1,239E+12 |
1,239E+12 |
1,239E+12 |
10 |
6,4 |
1 |
1,158E+12 |
1,158E+12 |
1,158E+12 |
11 |
6,2 |
1 |
1,079E+12 |
1,079E+12 |
1,079E+12 |
12 |
6 |
1 |
1,004E+12 |
1,004E+12 |
1,004E+12 |
13 |
5,8 |
1 |
9,309E+11 |
9,309E+11 |
9,309E+11 |
14 |
5,6 |
1 |
8,609E+11 |
8,609E+11 |
8,609E+11 |
15 |
5,4 |
1 |
7,936E+11 |
7,936E+11 |
7,936E+11 |
16 |
5,2 |
1 |
7,291E+11 |
7,291E+11 |
7,291E+11 |
17 |
5 |
1 |
6,673E+11 |
6,673E+11 |
6,673E+11 |
18 |
4,8 |
1 |
6,083E+11 |
6,083E+11 |
6,083E+11 |
19 |
4,6 |
1 |
5,521E+11 |
5,521E+11 |
5,521E+11 |
20 |
4,4 |
1 |
4,987E+11 |
4,987E+11 |
4,987E+11 |
21 |
4,2 |
1 |
4,48E+11 |
4,48E+11 |
4,48E+11 |
22 |
4 |
1 |
4,001E+11 |
4,001E+11 |
4,001E+11 |
23 |
3,8 |
1 |
3,55E+11 |
3,55E+11 |
3,55E+11 |
24 |
3,6 |
1 |
3,126E+11 |
3,126E+11 |
3,126E+11 |
25 |
3,4 |
1 |
2,73E+11 |
2,73E+11 |
2,73E+11 |
26 |
3,2 |
1 |
2,362E+11 |
2,362E+11 |
2,362E+11 |
27 |
3 |
1 |
2,021E+11 |
2,021E+11 |
2,021E+11 |
28 |
2,8 |
1 |
1,708E+11 |
1,708E+11 |
1,708E+11 |
29 |
2,6 |
1 |
1,423E+11 |
1,423E+11 |
1,423E+11 |
30 |
2,4 |
1 |
1,166E+11 |
1,166E+11 |
1,166E+11 |
31 |
2,2 |
1 |
9,359E+10 |
9,359E+10 |
9,359E+10 |
32 |
2 |
1 |
7,337E+10 |
7,337E+10 |
7,337E+10 |
33 |
1,8 |
1 |
5,592E+10 |
5,592E+10 |
5,592E+10 |
34 |
1,6 |
1 |
4,124E+10 |
4,124E+10 |
4,124E+10 |
35 |
1,4 |
1 |
2,933E+10 |
2,933E+10 |
2,933E+10 |
36 |
1,2 |
1 |
2,019E+10 |
2,019E+10 |
2,019E+10 |
37 |
1 |
1 |
1,381E+10 |
1,381E+10 |
1,381E+10 |
38 |
0,8 |
1 |
1,021E+10 |
1,021E+10 |
1,021E+10 |
39 |
0,6 |
1 |
9,37E+09 |
9,37E+09 |
9,371E+09 |
40 |
0,6 |
1,2 |
586850,911 |
585505,007 |
588790,108 |
41 |
0,6 |
1,4 |
124642,353 |
124498,296 |
125774,153 |
42 |
0,6 |
1,6 |
105470,917 |
105284,132 |
105939,099 |
43 |
0,6 |
1,8 |
98001,114 |
98219,831 |
98781,217 |
44 |
0,8 |
1,8 |
94310,316 |
94510,650 |
95055,002 |
45 |
1 |
1,8 |
90793,658 |
90975,608 |
91502,927 |
46 |
1,2 |
1,8 |
87451,139 |
87614,705 |
88124,991 |
47 |
1,4 |
1,8 |
84282,760 |
84427,942 |
84921,195 |
48 |
1,6 |
1,8 |
81288,521 |
81415,318 |
81891,538 |
49 |
1,8 |
1,8 |
78468,421 |
78576,834 |
79036,021 |
50 |
2 |
1,8 |
75822,460 |
75912,490 |
76354,643 |
51 |
2,2 |
1,8 |
73350,640 |
73422,285 |
73847,405 |
52 |
2,4 |
1,8 |
71052,958 |
71106,220 |
71514,306 |
53 |
2,6 |
1,8 |
68929,416 |
68964,294 |
69355,347 |
54 |
2,8 |
1,8 |
66980,014 |
66996,507 |
67370,527 |
55 |
3 |
1,8 |
65204,751 |
65202,860 |
65559,847 |
56 |
3,2 |
1,8 |
63603,628 |
63583,353 |
63923,306 |
57 |
3,4 |
1,8 |
62176,644 |
62137,985 |
62460,905 |
58 |
3,6 |
1,8 |
60923,800 |
60866,757 |
61172,644 |
59 |
3,8 |
1,8 |
59845,095 |
59769,668 |
60058,522 |
60 |
4 |
1,8 |
58940,529 |
58846,719 |
59118,539 |
61 |
4,2 |
1,8 |
58210,104 |
58097,909 |
58352,696 |
62 |
4,4 |
1,8 |
57653,818 |
57523,239 |
57760,992 |
63 |
4,6 |
1,8 |
57271,671 |
57122,708 |
57343,429 |
64 |
4,8 |
1,8 |
57063,664 |
56896,317 |
57100,004 |
65 |
5 |
1,8 |
57029,796 |
56844,065 |
57030,719 |
66 |
5 |
2 |
32987,463 |
33084,055 |
33539,979 |
67 |
5,2 |
2 |
30410,132 |
30504,267 |
30945,503 |
68 |
5,4 |
2 |
27937,650 |
28029,328 |
28455,877 |
69 |
5,6 |
2 |
25570,018 |
25659,237 |
26071,099 |
70 |
5,8 |
2 |
23307,234 |
23393,996 |
23791,170 |
71 |
6 |
2 |
21149,300 |
21233,604 |
21616,090 |
72 |
6,2 |
2 |
19096,214 |
19178,060 |
19545,860 |
73 |
6,4 |
2 |
17147,978 |
17227,366 |
17580,478 |
74 |
6,6 |
2 |
15304,590 |
15381,521 |
15719,945 |
75 |
6,8 |
2 |
13566,052 |
13640,525 |
13964,261 |
76 |
7 |
2 |
11932,362 |
12004,378 |
12313,427 |
77 |
7,2 |
2 |
10403,522 |
10473,079 |
10767,441 |
78 |
7,4 |
2 |
8979,530 |
9046,630 |
9326,304 |
79 |
7,6 |
2 |
7660,388 |
7725,030 |
7990,017 |
80 |
7,8 |
2 |
6446,094 |
6508,279 |
6758,578 |
81 |
8 |
2 |
5336,650 |
5396,377 |
5631,989 |
82 |
8,2 |
2 |
4332,055 |
4389,323 |
4610,248 |
83 |
8,4 |
2 |
3432,308 |
3487,119 |
3693,356 |
84 |
8,6 |
2 |
2637,411 |
2689,764 |
2881,314 |
85 |
8,8 |
2 |
1947,362 |
1997,258 |
2174,120 |
86 |
9 |
2 |
1362,163 |
1409,601 |
1571,776 |
87 |
9,2 |
2 |
881,813 |
926,793 |
1074,280 |
88 |
9,4 |
2 |
506,311 |
548,834 |
681,634 |
89 |
9,6 |
2 |
235,659 |
275,724 |
393,836 |
90 |
9,8 |
2 |
69,856 |
107,463 |
210,888 |
91 |
10 |
2 |
8,901 |
44,051 |
132,788 |
N = 91
(рис.7)
Листинг программы:
%Часть 2. Оптимизация покоординатно.
function SecondPart_OptimizationCoordinate(function_name, h, EPSILON, ITERATION_AMOUNT, a, b)
global x;
global y;
%Перем. для пропуска проверки условия на то, предыд. y min из последних трех или нет.
change_coord = 1;
%Для выхода из цикла, если кол-во. итераций больше ITERATION_AMOUNT.
number_iteration = 1;
change = 1;
constant = 2;
i = 2;
x(1,1) = 2; %первая координата, первое значение.
x(2,1) = 2; %вторая координата, первое значение.
x(1,2) = x(change,i-1) + h; %первая координата, второе значение.
x(2,2) = x(constant,i-1); %вторая координата, второе значение.
y(1) = EllipseFunct_or_FunctRosenbrock(function_name, x(1,1), x(2,1), a, b);
new_value_of_function = EllipseFunct_or_FunctRosenbrock(function_name, x(1,2), x(2,2), a, b);
if new_value_of_function > y(1)
h = h* (-1);
x(1,2) = x(change,i-1) + h;
y(2) = EllipseFunct_or_FunctRosenbrock(function_name, x(change,i), x(constant,i), a ,b);
else
y(2) = new_value_of_function;
end
%Цикл пока модуль разности функций больше точности эпсилон и количество итераций меньше ITERATION_AMOUNT(10000).
while (abs(y(i)-y(i-1)) > EPSILON && (number_iteration < ITERATION_AMOUNT))
number_iteration = number_iteration + 1;
i = i + 1;
change_coord = change_coord + 1;
%прибавляем шаг к первой координате.
x(change,i) = x(change,i-1) + h;
%вторую координату переписываем.
x(constant,i) = x(constant,i-1);
%находим значение функции от новых значений.
new_value_of_function = EllipseFunct_or_FunctRosenbrock(function_name, x(1,i), x(2,i), a, b);
%если функция от текущих значений больше функции от предыдущих, то h = h* (-1), ... иначе y(i) = new_value_of_function.
if new_value_of_function > y(i-1)
%обнуляем последнее значение
x(change,i) = NaN;
i = i - 1; %чтобы вернуться к предыдущему минимальному значению функции
h = h* (-1);
%Если после смены координаты, по которой шагаем сделали не меньше 3 точек, то делаем проверку min y из последних 3-х. значений.
if (change_coord >= 3)
%если функция от значений на предыдущем шаге меньше текущих и меньше чем на шаге i-2, то меняем координату перемещения.
if y(i-1) >= y(i)
%После перемены координаты по которой шагаем - обнуляем change_coord.
change_coord = 0;
if (constant == 1)
constant = 2;
change = 1;
else
constant = 1;
change = 2;
end
end
end
else
y(i) = new_value_of_function;
end
end %конец цикла while
%=====================Графическая часть==========================
%построение графика
x_contour = -5:0.1:5;
y_contour = -5:0.1:5;
[X, Y] = meshgrid(x_contour, y_contour);
if strcmp(function_name, 'ELLIPSE') == 1
title_plot = ('Функция Эллипса');
Z = (X/a).^2 + (Y/b).^2;
min_x = 0;
min_y = 0;
contour_amount = 50;
elseif strcmp(function_name, 'ROSENBROCK') == 1
title_plot = ('Функция Розенброка');
Z = 100 * (Y - X.^2).^2 + (1 - X).^2;
min_x = 1;
min_y = 1;
contour_amount = 200;
end
%figure
%mesh(X,Y,Z);
figure
contour(X, Y, Z, contour_amount);
% отображение меток уровня
hold on;
plot(x(1, :), x(2, :), '<-');
%вывод точки минимума.
plot(min_x, min_y, 'r*');
title(title_plot);
text(min_x-0.2, min_y-0.4,'MIN')
% выводначальной точки на график
text(x(1,1), x(2,1), 'A0', ...
'BackgroundColor',[.7 .7 .7]);
% вывод решения на график
text(-4.9, -3.9, ...
char(['x1 = ' num2str(x(1,i))], ...
['x2 = ' num2str(x(2,i))], ...
['y = ' num2str(y(i))], ...
['итераций - ' num2str(number_iteration)]), ...
'BackgroundColor',[.7 .7 .7]);
end
Код функции y = EllipseFunct_or_FunctRosenbrock:
%Функция для вычисления значения ф-ии. F(x1, x2) по Розенброку или по ф-ии. Эллипса.
function y = EllipseFunct_or_FunctRosenbrock(function_name, x_0_i, x_1_i, a, b)
if strcmp(function_name, 'ROSENBROCK') == 1
y = 100 * (x_1_i - x_0_i.^2).^2 + (1 - x_0_i).^2;
return
elseif strcmp(function_name, 'ELLIPSE') == 1
y = x_0_i.^2/a.^2 + x_1_i.^2/b.^2;
return
else
y = -1;
return
end
end
