Var x,d,s:Artype; b,hr,y0,y,qsi:real; i,l,k:integer;
Procedure Outt(x:Artype; y:real; kod:integer);
Var i:integer;a,b,c:string;
begin
for i:=1 to n do
begin
str( x[i]:8:3,a); str(y:9:3,b);
form1.ListBox3.Items.Add('X'+inttostr(i)+
'='+a);
if (kod=1) then
with formgraph do
begin
imGraph.Canvas.Pen.Color:=clRed;
imgraph.Canvas.LineTo(round( mx* x[1]+ Sx),
round( -my* x[2]+ Sy));
imGraph1_3.Canvas.Pen.Color:=clBlue;
imgraph1_3.Canvas.LineTo(round( mx* x[1]+ Sx),
round( -my* x[3]+ Sy));
imGraph2_3.Canvas.Pen.Color:=clBlack;
imgraph2_3.Canvas.LineTo(round( mx* x[2]+ Sx),
round( -my* x[3]+ Sy));
end;
end;
caseKodof
0: c:='Начальная точка';
1: c:='Функция убывает';
2: c:='Пробннаяточка';
end;
form1.ListBox3.Items.Add('----------- '+c+' ------'+' F='+b);
end;
// main
begin
f:=model;
b:=-1e20;
for i:=1 to n do
begin
d[i]:=xmax[i]-xmin[i];
if d[i]>b then
b:=d[i];
end;
for i:=1 to n do
s[i]:=d[i]/b;
hr:=h; y0:=f(xo); im:=1;
with formGraph do
begin
imGraph.Canvas.Pen.Width:=2;
imGraph1_3.Canvas.Pen.Width:=2;
imGraph2_3.Canvas.Pen.Width:=2;
for i:=1 to n do
begin //Перовначальнуюточку
imGraph.Canvas.TextOut(round( mx* xo[1]+ Sx),
round( -my* xo[2]+ Sy),inttostr(im));
imGraph.Canvas.MoveTo(round( mx* xo[1]+ Sx),
round( -my* xo[2]+ Sy));
imGraph1_3.Canvas.TextOut(round( mx* xo[1]+ Sx),
round( -my* xo[3]+ Sy),inttostr(im));
imGraph1_3.Canvas.MoveTo(round( mx* xo[1]+ Sx),
round( -my* xo[3]+ Sy));
imGraph2_3.Canvas.TextOut(round( mx* xo[2]+ Sx),
round( -my* xo[3]+ Sy),inttostr(im));
imGraph2_3.Canvas.MoveTo(round( mx* xo[2]+ Sx),
round( -my* xo[3]+ Sy));
end;
end;
Outt(xo,y0,0);
randomize;
9: k:=0;
10: l:=0;
for i:=1 to n do
begin
qsi:=2*random-1;
x[i]:=xo[i]+hr*s[i]*qsi;
if x[i]>xmax[i] then
begin
x[i]:=xmax[i]; l:=l+1
end
else if x[i]<xmin[i] then
begin
x[i]:=xmin[i]; l:=l+1
end
end;
if l<n then
begin
y:=f(x);
outt(x,y,2);
if y<y0 then outt(x,y,1);
im:=im+1;
if im>mf then
begin
showMessage('Число вычислений функции > '+IntTostr(mf)+#13+'Минимум не нейден !!!');
Yopt:=y0;
Exit
end;
if y<y0 then
begin
y0:=y;xo:=x;
goto 9;
end
end;
k:=k+1;
if k<m then goto 10
else
begin
hr:=hr/2;
if hr<hmin then
begin
Yopt:=y0;
for i:=1to n do
form1.ListBox3.Items.Add('X'+inttostr(i)+'опт'+'='+floattostrf(x[i],ffGeneral,5,2)) ;
form1.ListBox3.Items.Add( 'Yопт = '+floattostrf(Yopt,ffGeneral,5,2));
form1.ListBox3.Items.Add('Число вычислений функции = '+InttoStr(im)) ;
Exit end
else goto 9;
end;
end;
end.