Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Численные методы.doc
Скачиваний:
14
Добавлен:
06.08.2019
Размер:
1.68 Mб
Скачать

Градиентные методы.

Требуют знания значения функции и ее градиента. Ясно, что основная идея метода заключается в отказе от “слепого” поиска вдоль фиксированных осей координат и переходе к движению сразу в направление возрастания функции (противоположное – убывание функции). Пусть сделан переход от точки х к точке х +hd , где d-некоторое направление , а h – шаг. Следовательно, перемещение происходит от точки (х1, х2 ,…, хn) в точку (х1 +δх1 , х2 +δx2 ,…, хn +δxn), где δхi=hdi

di – косинусы направления d (проекции направления d на оси координат) такие, что

Изменения значения функции df=f(х1 +δх1 ,…, хn +δxn) - f(х1 ,…, хn)=

Частные производные (0) вычисляются по ряду Тейлора f(x0+h) - f(x0)=

Наискорейший спуск

Возникает задача как выбрать направление d , чтобы получить наибольшее изменение функции df при

соблюдении условия (*) т.е. с ограничением.

Используем метод множетелей Лагранжа для поиска функции

или

На основе метода df достигает max , если φ достигает max. Берем производную от φ

(j=1,2,…,n) и приравниваем ее нулю , получаем ,

следовательно,

. “Направления” совпадают с градиентами функции f(x) в точке x, или g(x).

Для min - f(x) или – g(x). Уравнение (0) можно записать так , где Θ – угол между векторами g(x) и dx. Угол выбран Θ=1800 , чтобы обеспечить направление – g(x):

.

Значения λi , минимизирующее функцию φ может быть найдено любым методом одномерного поиска. В чистом виде метод работает медленно и не надежно. Но прежде чем перейти к более эффективным методам , рассмотрим свойства квадратичных функций.

F(x)= , где a – константа , b – постоянный вектор , G – положительно определенная симметрическая матрица.

min в точке .

Поставим задачу так, что в окресности точки х0 любую функцию φ(х) можно аппроксимировать

квадратичной функцией:

Пусть min φ(x) находится в точке хm

Берем производную и приравниваем ее к нулю.

, откуда :

, т.е. в итерационном виде:

, а с учетом множителей Лагранжа:

.

Видим, что по сравнению с методом наискорейшего спуска требуется умножение на G-1(xi), а это самая трудоемкая операция метода.

Но если проводить умножение на Hi , а не G-1(xi) , то получим метод Давидона – Флетчера – Пауэлла (ДФП). - симметрическая положительно определенная матрица. В ходе вычислений она приближается к матрице

Метод дфп

Начнем поиск из начальной точки , взяв H0 в виде Е.

  1. На шаге i имеется точка и матрица H.

  2. В качестве направления поиска взять направление

  3. Чтобы найти λi , необходимо минимизировать вдоль прямой .

  4. Положить

  5. Положить

  6. Найти и . Завершить процедуру, если или достаточно малы.

  7. Положить

  8. Обновить матрицу Н: , где ; .

  9. Увеличить i+1 и вернуться на шаг 2.

Доказательства использования Hi отсутствуют.

procedure DFP;

type tt=array[1..10] of real; var X,P,Q,R,D,G,U,V,Y,M:tt;

type mat=array[1..10,1..10] of real; var H:mat;

var I,J,N:integer;

var FP,GI;GP;QX,HH,BB,FQ,GQ,ZZ,FR,GR,KK,DK,WK:integer;

begin GQ:=0;

for I:=1 to N do

begin

for J:=1 to N do H[I,J]:=0; H[I,I]:=1;

end;

TT:=0;

4: for I:=1 to N do

begin

P[I]:=x[I]; Y[I]:=x[I];

end;

FUNK;

FP:=Z; GRAD; GI:=G0;

for I:=1 to N do

begin

U[I]:=G[I]; D[I]:=0;

for J:=1 to N do D[I]:=D[I]-H[I,J]*G[J];

6: GP:=0;

for I:=1 to N do CP:=GP+G[I]*D[I];

if GP<0 then goto 68;

QX:=abs(2*FP/GP);

if QX>1 then QX:=1;

for I:=1 to N do

begin x[I]:=P[I]-Qx*D[I]; P[I]:=x[I];

end;

FUNK;

FP:=Z; GRAD; G1:=G0; goto 6;

68: QX:=abs(2*FP/GP);

if QX>1 then Qx:=1;

HH:=QX; BB:=HH;

for I:=1 to N do

begin Q[I]:=P[I]+BB*D[I]; X[I]:=Q[I];

end;

FUNK; FQ:=Z; GRAD; GZ:=G0; GQ:=0;

7: BB:=HH;

for I:=1 to N do

begin Q[I]:=P[I]+BB*D[I]; X[I]:=Q[I];

end;

FUNK; FQ:=Z; GRAD; GZ:=G0; GQ:=0;

for I:=1 to N do GQ:=GQ+G[I]*D[I];

if ((GQ>0)or(FQ>FP)) then goto 83;

HH:=2*HH; goto 7;

83: ZZ:=3*(FP-FQ)/HH; ZZ:=ZZ+GP+GQ; WW:=ZZ*ZZ-GP*GQ;

if WW<0 then WW:=0; W:=sqr(WW);

DD:=HH*(1-(GQ+W-ZZ)/(GQ-GP+2*W));

for I:=1 to N do x[I]:=P[I]+DD*D[I]; FUNK; FR:=Z;

GRAD; G3:=G0; GR:=0;

for I:=1 to N do GR:=GR+G[I]*D[I];

if ((Z<=FP) and (Z<=FQ)) then goto 11;

if GR>0 then goto 99;

HH:=HH-DD;

for I:=1 to N do P[I]:=x[I];

FP:=Z; GP:=GR; G1:=G0; goto 83;

99: HH:=DD;

for I:=1 to N do Q[I]:=x[I];

11: KK:=0; WK:=0; DK:=0;

for I:=1 to N do

begin U[I]:=G[I]-U[I]; V[I]:=x[I]-Y[I];

end;

for I:=1 to N do

begin

M[I]:=0;

for J:=1 to N do M[I]:=M[I]+H[I,J]*U[J];

KK:=KK+M[I]*U[I]; WK:=WK+V[I]+U[I];

DK:=DK+V[I]*V[I];

end;

if ((KK=0) or (WK=0)) then goto 126