Градиентный спуск с дроблением шага
INCLUDEPICTURE "http://nsft.narod.ru/Programming/crackstep.gif" \* MERGEFORMATINET
Таблица итераций
(точность eps=10e-3)
Пример приведен для квадратичной функции INCLUDEPICTURE "http://nsft.narod.ru/Programming/func.gif" \* MERGEFORMATINET
procedure TfrmMain.FastFallWithCrackingStep(eps:double;fp: HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "TWorldPoint" TWorldPoint);
var k:integer;
gamma,cappa:double;
lastx,x,grad: HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "TWorldPoint" TWorldPoint;
Screen2: HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "TScreenPoint" TScreenPoint;
const cappa0=1;
begin
k:=1;gamma:=0.5;//gamma - Коэффициент дробления шага
x:=fp;//fp - начальная точка
lastx:=fp;
HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "gradientfunc" GradientFunc(fp.x,fp.y,grad);//вычисляем антиградиент функции
//Условие останова - длина вектора (анти)градиента меньше заданной точности eps
while sqrt(sqr(grad.x)+sqr(grad.y))>eps do
begin
cappa:=cappa0;
HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "gradientfunc" GradientFunc(lastx.x,lastx.y,grad);
x.x:=lastx.x+cappa*grad.x;
x.y:=lastx.y+cappa*grad.y;
while HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "func" Func(lastx.x,lastx.y)- HYPERLINK "http://nsft.narod.ru/Programming/colmetopt.html" \l "func" Func(x.x,x.y)<0.5*cappa*(sqr(grad.x)+sqr(grad.y)) do
begin
cappa:=cappa*gamma;
x.x:=lastx.x+cappa*grad.x;
x.y:=lastx.y+cappa*grad.y;
end;
BuiltReport(x,grad,k,cappa);//Вывод отчета об итерациях
//Построение звена траектории спуска
World2Screen(Area, copyscr.Canvas.ClipRect,x,screen2);
SetPoint(x);
lastx:=x;
copyscr.Canvas.LineTo(screen2.x,screen2.y);
inc(k);//Счетчик итераций
end;{while}
end;