Мегаобучалка Главная | О нас | Обратная связь


Индивидуальное задание.



2019-12-29 169 Обсуждений (0)
Индивидуальное задание. 0.00 из 5.00 0 оценок




Найдите минимум функции  методом случайного поиска, выбрав начальной точкой Хо(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.

 



2019-12-29 169 Обсуждений (0)
Индивидуальное задание. 0.00 из 5.00 0 оценок









Обсуждение в статье: Индивидуальное задание.

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (169)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)