Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб3.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.07 Mб
Скачать

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

Результаты:

График движения по линиям уровня

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]