- •Нелинейное программирование Постановка задачи безусловной оптимизации
- •Методы нулевого порядка. Метод Хука – Дживса.
- •Описание метода.
- •Методы первого порядка Градиентные методы
- •Градиентный метод с постоянным значением параметра шага.
- •Градиентный метод с дроблением шага.
- •Градиентный метод с оптимизацией шага.
- •Методы одномерной оптимизации.
- •Итерационные методы одномерной оптимизации
- •Править далее Квазиньютоновские методы
- •Метод дэвидона, флетчера, пауэлла
- •Метод бройдена-флетчера-шенно
- •Поправка единичного ранга[править | править исходный текст]
- •Поправки ранга два[править | править исходный текст]
- •Литература[править | править исходный текст]
- •Штрафные функции
Методы первого порядка Градиентные методы
Эта группа методов относится к поисковым методам первого порядка, поскольку для нахождения очередной толчки траектории оптимизации используют первую производную целевой функции.
Основная
идея методов – движение к минимуму в
направлении наискорейшего убывания
целевой функции
,
которое
задается антиградиентом
(в литературе градиент может быть
обозначен
или
).
Поиск начинается из начальной точки
.
Следующая точка траектории поиска
находится по формуле
или
,
k=0,1,2,....
Здесь
–
множитель, определяющий длину шага;
– градиент
в точке
;
– направление
поиска.
В
координатах :
,
.
Поиск минимума для градиентных методов выполняется по следующему общему для них алгоритму.
Критерием завершения поиска точки минимума может быть один из следующих критериев или их комбинация
,
,
,
где
-
соответственно допустимая погрешность
по модулю градиента, расстоянию между
соседними точками и значению целевой
функции в соседних точках траектории
оптимизации.
Различие
градиентных методов определяется
способом выбора длины шага
на
каждой
-
той итерации.
Шаг может быть выбран одним из следующих
способов:
Значение постоянно для всех итераций;
Значение выбирается дроблением для каждой итерации;
Выполняется оптимизация значения для каждой итерации.
Градиентный метод с постоянным значением параметра шага.
Выполняется
по рассмотренному выше алгоритму при
.
Поэтому,
помимо начальной точки и заданной
погрешности, параметр
является
исходным данным.
Значение
и, следовательно, длина шага определяется
из двух условий: если шаг очень велик,
то можно перешагнуть точку экстремума,
т.е. критерий завершения не сработает
и метод разойдется. Если шаг очень мал,
то количество шагов от начальной точки
до оптимальной будет очень велико, что
приведет к большим вычислительным
затратам. Заметим, что для гладкой
целевой функции в окрестности минимума
при приближении к оптимальной точке
величина градиента уменьшается. Поэтому
даже при
длина
шага уменьшается, что желательно для
любого итерационного метода.
Рассмотренный метод имеет низкую эффективность и представляет больший интерес для изучения, чем для применения.
Градиентный метод с дроблением шага.
Этот метод обеспечивает монотонное убывание целевой функции на каждой итерации и тем самым сходимость метода к точке минимума. Убывание функции обеспечивается коррекцией шага на каждой итерации. Расчетной формулой является рассмотренная выше
Итерация
выполняется следующим образом. Находится
точка
с шагом предыдущей k
– той итерации и вычисляется значение
.
Если функция не уменьшилась, т.е.
,
шаг уменьшается (дробится)
.
С уменьшенной величиной шага снова
находится
,
.
Процесс дробления продолжается пока
не будет получено уменьшение целевой
функции.
Если
в точке
,
найденной с шагом предыдущей k
– той итерации, функция
уменьшилась, шаг увеличивается
,
пока функция
продолжает убывать.
Описанный метод реализован в практическом алгоритме оптимизирующей функции, ориентированном на систему MATLAB.
Несколько первых строк кода функции:
function [ x,f ] = gradh(z,dz,x,e )
% Минимизация функции n переменных градиентным методом
% с дроблением шага
z=fcnchk(z);
dz=fcnchk(dz);
k=0;
hmax=-1;
hmin=1e7;
maxit=10000;
kz=0;
global xf;
d=-dz(x);
f=z(x);
h=1;
tic
while k<maxit
xf(1,k+1)=x(1);
xf(2,k+1)=x(2);
if norm(d)<e
toc
disp('gradh: минимум найден,')
disp(['итераций - ' num2str(k)....
', hmin=' num2str(hmin)....
', hmax=' num2str(hmax)])
disp(['вычислений функции - ' num2str(kz)])
disp(['вычислений градиента - ' num2str(k)])
f=z(x);
x=x';
return
end
. . . . . . . . . . . . . . . . .
Пример тестирующего скрипта
clear all
clc
x=[10 10];
e=0.00001;
x0=x
global xf;
[x,z]=gradh('fun','dfun',x,e), c='r';
plot(xf(1,:),xf(2,:),c)
hold on
x1=x(1)-5:0.1:x(1)+10;
x2=x(2)-5:0.1:x(2)+15;
[x1,x2]=meshgrid(x1,x2);
z=9*x1.^2+x2.^2-18*x1+6*x2+18;
contour3(x1,x2,z,[1 5 17 39 57 101 151 199 251 301])
Алгоритм функции градиентного метода с дроблением шага.
Результаты оптимизации функции z=9*x1^2+x2^2-8*x1+6*x2+18 из начальной точки [10 10]
x =
10 10
e =
1.0000e-005
Elapsed time is 0.005358 seconds.
gradh: минимум найден,
итераций - 46, hmin=0.0064, hmax=0.4398
вычислений функции - 193
вычислений градиента - 46
x =
1.0000
-3.0000
f =
5.2935e-012
Траектория оптимизации показана на рисунке
