- •Лабораторная работа № 3
- •Постановка задачи
- •Методы безусловной оптимизации
- •Поиск точного значения координаты точки минимума с помощью необходимых и достаточных условий экстремума.
- •1. Метод деформируемого многогранника (метод Нелдера-Мида)
- •2.Метод конфигураций (алгоритм Хука-Дживса)
- •3. Метод Розенброка
- •Сводная таблица
3. Метод Розенброка
Задается
начальная точка
.
Из нее осуществляется итеративный поиск
направления убывания функции с помощью
изменяемых дискретных шагов вдоль
линейно независимых и ортогональных
направлений.
(Векторы называются
взаимно ортогональными, если для всех
справедливо соотношение
,
где
- линейно независимые векторы, по норме
равные единице).
В случае удачного шага в исследуемом направлении его значение на следующей итерации увеличивается с помощью коэффициента растяжения, а в случае неудачи уменьшается за счет умножения на коэффициент сжатия. При этом направление поиска изменяется на противоположное.
Поиск в системе текущих направлений производится до тех пор, пока все возможности уменьшения функции не будут исчерпаны. Если по каждому направлению поиска имеет место неудача, то строится новое множество линейно независимых и ортогональных направлений. Циклический поиск точки экстремума продолжается в новых направлениях.
Процесс поиска завершается, если отличия между координатами точек на двух соседних итерациях не превышают заданной погрешности.
Листинг программы:
[Xroz Froz]=Rosenbrock(@func,[0.5 6.5],3,-0.5,[1 2],0.001)
Листинг функции Rosenbrock:
function [x fx] = Rosenbrock(f,x0,alpha,beta,dx,eps)
L = 10;
n = length(x0);
dx0 = dx;
d = eye(n);
y1 = x0;
miss = 0;
i = 1;
k=0;
m(1,1)=y1(1,1);
m(2,1)=y1(1,2);
kk=2;
while (1)
while (i <= n)
if (i >= 2)
y1 = y2;
end;
if (f(y1 + dx(i).*d(i,:)) < f(y1))
y2 = y1 + dx(i).*d(i,:);
m(1,kk)=y2(1,1);
m(2,kk)=y2(1,2);
kk=kk+1;
dx(i) = alpha*dx(i);
else
y2 = y1;
dx(i) = beta*dx(i);
miss = miss + 1/n;
end;
i = i + 1;
end;
if (f(y2) < f(y1))
miss = 0;
y1 = y2;
i = 1;
continue;
elseif (f(y2) == f(y1))
if (f(y2) < f(x0))
x1 = y2;
if (norm(x1 - x0) < eps)
x = x1;
m(1,kk)=y2(1,1);
m(2,kk)=y2(1,2);
break;
end;
lam = (d)^(-1)*(x1 - x0)';
a = d;
for j = 1:n
if (lam(j) ~= 0)
s = [0;0];
for p = j:n
s = s + lam(p)*d(:,p);
end;
a(:,j) = s;
end;
end;
b = a;
dn = b./norm(b(:,1));
for j = 2:n
s = [0;0];
for p = 1:j-1
s = s + dot(a(:,j)',dn(:,p)).*dn(:,p);
end;
b(:,j) = a(:,j) - s;
dn(:,j) = b(:,j)./norm(b(:,j));
end;
d = dn;
dx = dx0;
x0 = x1;
i = 1;
y1 = x1;
k=k+1;
continue;
elseif (f(y2) == f(x0))
if (miss >= L)
x = x0;
m(1,kk)=y2(1,1);
m(2,kk)=y2(1,2);
break;
end;
flag = false;
for k = 1:n
if (abs(dx(k)) > eps)
flag = true;
break;
end;
end;
if (flag)
y1 = y2;
i = 1;
continue;
else
x = x0;
m(1,kk)=y2(1,1);
m(2,kk)=y2(1,2);
break;
end;
end;
end;
end;
fx = f(x);
k
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(m(1,1:kk),m(2,1:kk),'-*r');
end
Результаты:
График движения по линиям уровня
