Индивидуальное задание.
Найдите минимум функции методом случайного поиска, выбрав начальной точкой Хо(0, 0, 0) при изменении аргументов Xi в пределах [ai, bi]. Предусмотрите отрисовку поиска минимума в координатах x1Ox2, x1Ox3, x2Ox3. Проведите сравнительный анализ по числу вычислений функции задавая параметр М=10, 15, 20 при шаге Н=20 и, задавая Н=0,5; 1; 2 при М=15
Рисунок 12 – блок-схема метода случайного поиска с перечётом.
Рисунок 13 решение задачи на ЭВМ и траектория поиска оптимальных значений функции Результаты работы программы изображены на рисунке 13. Вывод: в основе метода случайного поиска лежит внесение элементов случая в процедуру формирования пробных точек, которые используются для определения направления поиска. Данный метод эффективен для функций с большим количеством переменных, так как ограничивается количество вычислений функции за счёт нахождения антиградиентного направления с помощью пробных точек. Листинг подпрограммы метода unit Opt1_6;
interface uses Dialogs, SysUtils,Graphics;
Const n=3; Type Artype=array[1..n] of real; Funop=function(xi:Artype):real;
type MyClass=class public
procedure slpoisk(n,m,mf:integer; h,hmin:real; xmin,xmax:Artype; Var xo:Artype; Var Yopt:real; F:Funop);
end;
var opt6:MyClass; var F:FUNOP; i,m,mf,im:integer; h,hmin:real; xmin,xmax:Artype; xo,x:Artype; Yopt:real;
function model(x:Artype): real;
implementation uses main,unitGraph; function model(x:Artype): real; begin model:={25*sqr(x[1]+3)+4*sqr(x[3]-4)+10*sqr(x[1]-x[2])+10;} {10*sqr(x[1]-x[2])+4*sqr(x[1]-2)+25*sqr(x[3]+x[2])+8;} 16*sqr(x[1]+2)+4*sqr(x[2]-3)+5*sqr(x[3]-x[2])-8; end;
procedure Myclass.slpoisk(n,m,mf:integer; h,hmin:real; xmin,xmax:Artype; Var xo:Artype; Var Yopt:real; F:Funop); Label 9,10; 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; case Kod of 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.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (169)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |