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). После нахождения частного экстремума по одной из осей начинается поиск экстремума по другой оси до частного минимума при условии, что значение первой переменной равно найденному минимуму (максимуму) на первой оси. И так поочередно. Процесс последовательно продолжается до тех пор, пока не будет достигнута заданная точность локализации экстремума, т. е. если шаг по каждой из осей приводит к возрастанию (уменьшению) функции, а величина шага меньше или равна заданной точности поиска, то расчет закончен.