Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кочура_lab1 / gershkovich-yu-b-shirokov-k-a-primenenie-paketa-matlab-dlya-resheniya-

.pdf
Скачиваний:
241
Добавлен:
12.04.2015
Размер:
519.1 Кб
Скачать

% Производные

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

Соседние файлы в папке Кочура_lab1