Кочура_lab1 / gershkovich-yu-b-shirokov-k-a-primenenie-paketa-matlab-dlya-resheniya-
.pdf% Производные
dfdx1 = @(x1, x2)(2*c1*x1); dfdx2 = @(x1, x2)(2*c2*x2); dgdx1 = @(x1, x2)(-2*x1 + 2*a); dgdx2 = @(x1, x2)(-2*x2 + 2*b);
% Коэффициенты gamma = 0.1; alpha = 1.9;
while k < kmax;
% Вычисление шага по каждой координате if g(x1, x2) > 0;
% Текущая точка принадлежит области допустимых решений alpha = 0;
else
% Текущая точка не принадлежит области допустимых
решений
alpha = max(0, alpha - gamma*g(x1, x2));
end
step_x1 = dfdx1(x1, x2) + alpha*dgdx1(x1, x2); step_x2 = dfdx2(x1, x2) + alpha*dgdx2(x1, x2); % Вычисление новых координат
new_x1 = max(0, x1 + gamma*step_x1); new_x2 = max(0, x2 + gamma*step_x2);
%Сохранение координат x1trace(i) = new_x1; x2trace(i) = new_x2;
i = i + 1; x1 = new_x1; x2 = new_x2;
%Проверка условия останова
if (dfdx1(x1, x2)/dgdx1(x1, x2)) - (dfdx2(x1, x2)/dgdx2(x1, x2)) <= d;
break; % Выход из цикла в случае выполнения условия
end;
k = k + 1;
end
%Построение графика x = 0:0.1:10;
y = 0:0.1:10;
[X, Y] = meshgrid(x, y);
%Отображение допустимого множества
Zl = (X - a).^2 + (Y - b).^2;
[C, h] = contour(X, Y, Zl, [R R], 'LineWidth', 2); hold on;
%Отображение линий уровня
Z |
= |
c1*X.^2 + c2*Y.^2; |
Z); |
|
[C, |
h] = contour(X, Y, |
|||
clabel(C, h); |
% Отображение меток на линиях уровня |
|||
% |
Отображение |
"траектории" алгоритма |
||
plot(x1trace, |
x2trace, |
'-+'); |
21
%Вывод начальной точки на график text(x1trace(1) + 0.1, x2trace(1), 'M0');
%Вывод решения на график
text(x1 + 0.3, x2, ...
strvcat(['x1 = ' num2str(x1)], ...
['x2 = ' num2str(x2)], ...
['k = ' num2str(k)]));
На Рис.10 изображено движение точки из начального положения в точку решения (которые не изменились по сравнению с Рис.9). Но в случае специального расчета коэффициента штрафа уменьшилось число итераций и увеличилась точность (см. Табл.2)
Рис.10
Табл.2. |
Сравнение результатов |
|
|
Метод |
|
Отклонение |
Число |
|
|
|
шагов |
Штрафных функций |
|
0.3682873 |
14 |
Эрроу-Гурвица |
|
0.2965951 |
10 |
22
ПРИЛОЖЕНИЕ
1. Некоторые замечания по реализации алгоритмов в среде
Matlab.
Предполагается, что читатель знаком с основами работы в Matlab и создание m-файла и запуск программы не вызывает затруднений. Все приведенные примеры можно разбить на три части: инициализация, рабочий цикл и вывод результата.
Инициализация представляет собой определение коэффициентов целевой функции, ограничений, коэффициента шага и т.п. Также выделяются массивы для хранения промежуточных точек алгоритма, т.е. его «траектории».
Содержательный смысл алгоритма реализуется в следующей части – в рабочем цикле. Каждую итерацию производится соответствующая вычислительная процедура, сохранение вычисленной точки и проверка условия останова. Количество итераций ограничивается для предотвращения зацикливания программы.
Вывод результата заключается в отображении линий уровня целевой функции, «траектории» алгоритма и текста, содержащего решение. В задачах с ограничениями также отображается граница допустимого множества.
Стоит отменить некоторые особенности реализации. Там, где требовалось определить функцию, использовался механизм анонимных функций, а не определение функции в одноименном m-файле. Анонимные функции определяются следующим образом: @(список аргументов)(принимаемое значение).
В реализации метода Франка – Вульфа для решения задачи линейного программирования на каждой итерации используется функция linprog из стандартной библиотеки Matlab. Именно для удобства использования этой функции ограничения задаются в матричном виде. Подробнее об использовании linprog можно узнать например из встроенной справки набрав команду help linpog.
23
В некоторых местах для удобства последующей печати используется троеточие перед концом строки. В таком случае интерпретатор Matlab воспринимает следующую строку как продолжение текущей.
2. Блок-схема алгоритма метода покоординатного спуска
f (x) = f (x ,K, x |
|
) |
||
|
γ ,δ1 |
|
n |
|
x0 = (x0 ,K, x0 ) |
|
|
||
|
1 |
n |
|
|
gri |
= grad i |
f (x) |
|
|
xi |
= xi +γ gri |
|
|
|
n |
2 |
|
|
|
∑grad i f (x) |
≤ δ |
|||
i =1 |
|
|
|
x*
f * = f (x* )
Рис.1П.
Пример реализации метода покоординатного спуска в среде MATLAB:
%Значения коэффициентов c1 = -2;
c2 = -1;
c12 = 1;
g = 0.2; % постоянная шага d = 0.01; % дельта
%Начальная точка
x1 = 16;
24
x2 = 18;
k = 1; % Счетчик шагов
kmax = 100; % Предельное число шагов,
%задается для предотвращения зацикливания
%Массивы для хранения промежуточных координат
x1trace = [x1]; x2trace = [x2]; i = 2;
while k < kmax
%Спуск по первой координате gr1 = 2*c1*x1 + c12*x2;
x1 = x1 + g*gr1;
%Сохранение координат x1trace(i) = x1; x2trace(i) = x2;
i = i + 1;
%Спуск по второй координате gr2 = 2*c2*x2 + c12*x1;
x2 = x2 + g*gr2;
%Сохранение координат x1trace(i) = x1; x2trace(i) = x2;
i = i + 1;
%Проверка условия останова if sqrt(gr1^2 + gr2^2) <= d;
break; % Выход из цикла в случае выполнения условия
end
k = k + 1;
end
%Построение графика x = -20:0.1:20;
y = -20:0.1:20;
[X, Y] = meshgrid(x, y);
Z = c1*X.^2 + c2*Y.^2 + c12*X.*Y; [C, h] = contour(X, Y, Z); clabel(C, h);
%Отображение меток на линиях уровня hold on;
plot(x1trace, x2trace, '-');
%Вывод начальной точки на график text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0');
%Вывод решения на график
text(x1 + 2, x2, ... |
num2str(x1)], ... |
|
strvcat(['x1 = ' |
||
['x2 |
= ' |
num2str(x2)], ... |
['k |
= ' |
num2str(k)])); |
25
3. Блок-схема алгоритма градиентного метода с постоянным шагом.
f(x) = f (x1 ,K, xn )
γ,δ
x0 = (x10 ,K, xn0 )
gri = grad i f (x)
xi = xi +γ gri |
n 2
∑grad
i
i =1
x*
f (x) ≤ δ
f * = f (x* )
Рис.2П.
Пример реализации метода с постоянным шагом в среде MATLAB.
% Значения коэффициентов c1 = -2;
c2 = -1;
c12 = 1;
g = 0.2; % постоянная шага d = 0.01; % дельта
26
%Начальная точка x1 = 16;
x2 = 18;
k = 1; % Счетчик шагов
kmax = 100; % Предельное число шагов,
%задается для предотвращения зацикливания
%Массивы для хранения промежуточных координат x1trace = [x1];
x2trace = [x2]; i = 2;
while k < kmax
% Спуск по обеим координатам сразу gr1 = 2*c1*x1 + c12*x2;
gr2 = 2*c2*x2 + c12*x1; x1 = x1 + g*gr1;
x2 = x2 + g*gr2;
%Сохранение координат x1trace(i) = x1; x2trace(i) = x2;
i = i + 1;
%Проверка условия останова if sqrt(gr1^2 + gr2^2) <= d;
break; % Выход из цикла в случае выполнения условия
end
k = k + 1;
end
% Построение графика x = -20:0.1:20;
y = -20:0.1:20;
[X, Y] = meshgrid(x, y);
Z = c1*X.^2 + c2*Y.^2 + c12*X.*Y; [C, h] = contour(X, Y, Z);
clabel(C, h); % Отображение меток на линиях уровня hold on;
plot(x1trace, x2trace, '-+');
%Вывод начальной точки на график text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0');
%Вывод решения на график
text(x1 + 2, x2, ... |
num2str(x1)], ... |
|
strvcat(['x1 = ' |
||
['x2 |
= ' |
num2str(x2)], ... |
['k |
= ' |
num2str(k)])); |
27
4. Блок-схема алгоритма с дроблением шага. |
||||
f (x) = f (x ,K, x |
) |
|
||
|
γ,δ1 |
n |
|
|
x0 = (x0 ,K, x0 ) |
|
|
||
|
1 |
n |
|
|
|
n |
2i f (x) ≤δ |
||
grS = |
∑grad |
|||
|
i =1 |
|
|
|
gri = grad i |
f (x) |
|
|
|
|
xi = xi +γ gri |
|
|
|
|
n |
2i f (x) ≤δ |
||
grS = |
∑grad |
|||
|
i =1 |
|
|
|
|
gr < grS |
|
|
|
gr ≤δ |
|
xi |
= xi −γ gri |
|
|
|
|||
x* |
|
|
|
|
f * = f (x* ) |
|
|
|
|
|
|
|
|
γ = 0.5γ |
Рис.3П. |
|
|
|
28
Пример реализации метода дробления шага в среде MATLAB:
% Значения коэффициентов
c1 = -2; с2 = |
-1; с12 = 1; |
|||
g = 0.5; |
% |
постоянная шага |
||
d |
= |
0.01; |
% |
дельта |
l |
= |
0.5; |
% |
коэффициент дробления шага |
%Начальная точка x1 = 16; х2 = 18;
k = 1; % Счетчик шагов
kmax = 100; % Предельное число шагов,
%задается для предотвращения зацикливания
%Массивы для хранения промежуточных координат x1trace = [x1]; x2trace = [x2];
i = 2;
%Градиенты
gr1 = 2*c1*x1 + c12*x2; gr2 = 2*c2*x2 + c12*x1; while k < kmax
% Модуль градиента
grS = sqrt(gr1^2 + gr2^2);
%Спуск по обеим координатам сразу x1 = x1 + g*gr1;
x2 = x2 + g*gr2;
%Пересчет градиентов
new_gr1 |
= 2*c1*x1 + |
c12*x2; |
new_gr2 |
= 2*c2*x2 + |
c12*x1; |
% Проверка модуля |
+ new_gr2^2); |
|
gr = sqrt(new_gr1^2 |
||
if gr < grS; |
|
|
gr1 |
= new_gr1; |
|
gr2 |
= new_gr2; |
|
%Сохранение координат x1trace(i) = x1; x2trace(i) = x2;
i = i + 1;
%Проверка условия останова if sqrt(gr1^2 + gr2^2) <= d;
break; % Выход из цикла в случае выполнения условия
end
k = k + 1;
else
%Отмена изменения координат x1 = x1 - g*gr1;
x2 = x2 - g*gr2;
%Дробление шага
g = l * g;
end
end
%Построение графика
x= -20:0.1:20; y = -20:0.1:20; [X, Y] = meshgrid(x, y);
Z = c1*X.^2 + c2*Y.^2 + c12*X.*Y;
29
[C, h] = contour(X, Y, |
Z); |
|
clabel(C, h); |
% Отображение меток на линиях уровня |
|
hold on; |
|
'-+'); |
plot(x1trace, x2trace, |
%Вывод начальной точки на график text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0');
%Вывод решения на график
text(x1 + 2.5, x2, ...
strvcat(['x1 = ' num2str(x1)], ...
['x2 = ' num2str(x2)], ...
['k = ' num2str(k)]));
5. Блок-схема алгоритма метода наискорейшего спуска.
f (x) = f (x ,K, x |
n |
) |
|||||||||
x0 = |
|
δ |
1 |
|
|
|
0 ) |
|
|||
( x0 |
,K, x |
|
|
||||||||
|
|
|
1 |
|
|
|
n |
|
|
||
|
|
|
|
|
|
|
|
γk |
|
|
|
xk +1 = xk |
+ γ |
k |
f |
′(xk ) |
|||||||
i |
|
|
i |
|
|
|
|
i |
|
|
|
f |
′ |
|
k +1 |
) |
≤ δ |
|
|
||||
|
(x |
|
|
|
|
||||||
|
|
|
x* |
|
|
|
|
|
|
||
f * = f (x* ) |
|
|
|
||||||||
Рис.4П. |
|
|
|
|
|
|
|
|
|
30