Рис.2.10.1. Переход от худшей вершины к отраженной

5) Сравниваем значения функции  

6) Условие выполняется. За новый симплекс принимаем симплекс с вершиной и повторяем с пункта 3

7) Условие не выполняется. Проверяем условие окончания h< ε

8) Условие окончания выполняется. Выводим координаты и значение функции лучшей вершины

9) Условие не выполняется. За принимаем лучшую вершину последнего симплекса, уменьшаем длину грани h=h/3 и повторяем с пункта 2.

Операторы МАТЛАБа позволяют это сделать так:

fxx=inline(‘8*x(1)^2+5*x(2)^2+4x(1)*x(2)')

[x,y,opt]=fminsearch(fxx,[0;0])

Метод сканирования. В области исследуемой функции двух переменных выбирается значение одной из переменных, соответствующее краю области поиска. По другой переменной интервал поиска разбивается на равные участки, длина каждого из которых равна шагу поиска. Далее значение функции последовательно определяется во всех точках разбиения и на краях отрезка, наименьшее из них запоминается. Затем увеличивают переменную, значение которой было постоянным, на шаг поиска и повторяют процедуру. И так до тех пор, пока не будет исследована вся область поиска с заранее выбранным шагом по каждой из переменных. Минимальное из всех сохраненных значений минимумов и есть глобальный минимум.

Для повышения точности повторяют сканирование в области, края которой отстоят от найденной точки минимума на величину шага предыдущего сканирования. Новое значение шага сканирования будет многократно меньше.

Программа. Многомерная оптимизация. Сканирование.

function DATA

global xl xr yl yr nx ny m;

xl=-5;

xr=5;

yl=-5;

yr=5;

nx=6;

ny=6;

m=3;

end

 

function [ fx ] = f(x,y)

fx=x.^2+y.^2-5;

end

 

function [zmin,xmin,ymin]=minZ(z,x,y,nx,ny)

zmin=z(1,1);

xmin=x(1);

ymin=y(1);

for i=1:nx

for j=1:ny

   if zmin>z(i,j)

       zmin=z(i,j);

       xmin=x(i);

       ymin=y(j);

   end %if

end %for j

end %for i

end % function

 

function [ x,y,fx ] = fun_MnogomernOpt_Scanir(xl,xr,yl,yr,nx,ny,m)

for i=1:m

hx=(xr-xl)/nx;

hy=(yr-yl)/ny;

for j=1:nx

   if j==1

       x(j)=xl;

   else

       x(j)=x(j-1)+hx;

   end %if

   for k=1:ny

       if k==1

           y(k)=yl;

       else

           y(k)=y(k-1)+hy;

       end %if

       z(j,k)=f(x(j),y(k));

   end%for k

end %for j

[zmin,xmin,ymin]=minZ(z,x,y,nx,ny);

xl=xmin-hx;

xr=xmin+hx;

yl=ymin-hy;

yr=ymin+hy;

end %for i

x=xmin;

y=ymin;

fx=zmin;

end % function

 

function GLAV_MnogomernOpt_Scanir

global xl xr yl yr nx ny m x y fx;

DATA;

[ x,y,fx ] = fun_MnogomernOpt_Scanir(xl,xr,yl,yr,nx,ny,m);

REPORT;

end % function

 

function REPORT

global xl xr yl yr nx ny x y fx;

disp('Mnogomernaya optimizaciya scanirovaniye');

disp(' ');

disp('Results');

disp(['x = ' num2str(x,'%10.5f') ]);

disp(['y = ' num2str(y,'%10.5f') ]);

disp(['zmin = ' num2str(fx,'%10.5f') ]);

hx=(xr-xl)/nx;

hy=(yr-yl)/ny;

[x,y]=meshgrid(xl:hx:xr,yl:hy:yr);

z=f(x,y);

mesh(x,y,z);

xlabel('x');

ylabel('y');

zlabel('z');

title('Mnogomernaya optimizaciya scanirovaniye');

end % function

Метод Гаусса-Зейделя. Движение к оптимуму происходит поочередно по каждой из осей до нахождения частного экстремума (ниже на рис.2.10.2). После нахождения частного экстремума по одной из осей  начинается поиск экстремума по другой оси до частного минимума при условии, что значение первой переменной равно найденному минимуму (максимуму) на первой оси. И так поочередно. Процесс последовательно продолжается до тех пор, пока не будет достигнута заданная точность локализации экстремума, т. е. если шаг по каждой из осей приводит к возрастанию (уменьшению) функции, а величина шага меньше или равна заданной точности поиска, то расчет закончен.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: