- •Лабораторная работа № 3
- •Постановка задачи
- •Методы безусловной оптимизации
- •Поиск точного значения координаты точки минимума с помощью необходимых и достаточных условий экстремума.
- •1. Метод деформируемого многогранника (метод Нелдера-Мида)
- •2.Метод конфигураций (алгоритм Хука-Дживса)
- •3. Метод Розенброка
- •Сводная таблица
1. Метод деформируемого многогранника (метод Нелдера-Мида)
В
основу метода положено построение
последовательности систем
точек
которые являются вершинами выпуклого
многогранника. Точки системы
на
итерации совпадают с точками системы
кроме
,
где точка
-
наихудшая в системе
,
то есть,
.
Точка
заменяется на другую точку по специальным
правилам (смотри алгоритм). Построение
последовательности многогранников
заканчивается, когда значения функции
в вершинах текущего многогранника
отличаются от значений функции в центре
тяжести системы
не
более, чем на
.
Листинг программы:
[XnM FnM]=DefMnogogrannik(@func,[0.5 6.5],0.25,1,0.5,2)
Листинг функции DefMnogogrannik:
function [x fx]=DefMnogogrannik(f, vect, koef, alpha, betta, gamma)
%f-funkcia,vect-vector x0,koef-rast9j
q=to4ki(vect,koef);%q-matrica,to4ki-funkcia postroenia simplecsa
n=length(q(1,:));
k=0;
kk=4;
eps=0.001;
for i=1:n+1
b(1,i)=q(i,1);
b(2,i)=q(i,2);
end;
b(1,kk)=q(1,1);
b(2,kk)=q(1,2);
while 1
[fl il]=min([f(q(1,:)) f(q(2,:)) f(q(3,:))]);
[fs is]=max([f(q(1,:)) f(q(2,:)) f(q(3,:))]);
%is=nomer max,il=moner min
for i=1:n+1
if i~=il
if i~=is
ic=i;
end;
end;
end;
xs=q(is,:);
xl=q(il,:);
xc=q(ic,:);
centr=[0 0];
for i=1:n+1
if i~=is
centr=centr+q(i,:);
end;
end;
centr=centr/n;
fcentr=f(centr);
S=0;
for i=1:n+1
S=S+(f(q(i,:))-fcentr)^2;
end;
S=(S/(n+1))^0.5;
if S<=eps
x=xl;
break;
else
if S>eps
z1=centr+alpha*(centr-xs);
if f(z1)<=f(xl)
z2=centr+gamma*(z1-centr);
if f(z2)<f(xl)
q(is,:)=z2;
k=k+1;
kk=kk+1;
for i=1:n+1
b(1,kk)=q(i,1);
b(2,kk)=q(i,2);
kk=kk+1;
end;
b(1,kk)=q(1,1);
b(2,kk)=q(1,2);
else
if f(z2)>=f(xl)
q(is,:)=z1;
k=k+1;
kk=kk+1;
for i=1:n+1
b(1,kk)=q(i,1);
b(2,kk)=q(i,2);
kk=kk+1;
end;
b(1,kk)=q(1,1);
b(2,kk)=q(1,2);
end;
end;
else
if and(f(z1) > f(xc), f(z1) <= f(xs))
z3=centr+betta*(xs-centr);
q(is,:)=z3;
k=k+1;
kk=kk+1;
for i=1:n+1
b(1,kk)=q(i,1);
b(2,kk)=q(i,2);
kk=kk+1;
end;
b(1,kk)=q(1,1);
b(2,kk)=q(1,2);
else
if and(f(xl)<f(z1),f(z1)<=f(xc))
q(is,:)=z1;
k=k+1;
kk=kk+1;
for i=1:n+1
b(1,kk)=q(i,1);
b(2,kk)=q(i,2);
kk=kk+1;
end;
b(1,kk)=q(1,1);
b(2,kk)=q(1,2);
else
if f(z1)>=f(xs)
for i=1:n+1
q(i,:)=xl+0.5*(q(i,:)-xl);
k=k+1;
end;
kk=kk+1;
for i=1:n+1
b(1,kk)=q(i,1);
b(2,kk)=q(i,2);
kk=kk+1;
end;
b(1,kk)=q(1,1);
b(2,kk)=q(1,2);
end;
end;
end;
end;
end;
end;
end;
q = 0: .1 : 4;
z = 3: .1 :7 ;
[X, Y] = meshgrid(q, z);
Z = X.^2-4*X+4+Y.^2-10*Y+25;
figure;
[CMatr,h]=contour(X, Y, Z, 6);
clabel(CMatr,h)
clabel([2 5],h)
xlabel('X');
ylabel('Y');
grid on;
hold on;
plot(b(1,1:kk-1),b(2,1:kk-1),'-*k');
fx=f(x);
kNm=k
end
Функция to4ki(vect,koef)строит начальный симплекс, где vect- начальная точка,
Koef-коэффициент растяжения
Листинг функции:
function x = to4ki(k,alpha)
d=length(k);
w=eye(d,d);
x(1,:)=k(1,:);
for i=2:3
x(i,:)=x(1,:)+alpha*w(:,i-1)';
end;
end
Функция
func(x)считает
значение функции в точке
,
где x-вектор
Листинг функции:
function fxy = func(x)
fxy = (x(1) - 2).^2 + (x(2) - 5).^2;
end
Результаты:
График движения по линиям уровня
