Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

Метод покоординатного спуска

Методы безусловной оптимизации

Отчет по лабораторной работе №2

по дисциплине

«Оптимизация инженерных вычислений»

 

 

Студенты: Кучеренко Г. А.

Антонова А.Н.

Группа: Р-200301

Преподаватель: Селиванова И.А.

 

Метод наискорейшего спуска

В данном методе на каждой итерации величина шага выбирается из условия минимума функции в направлении движения, т.е.:

(47)

Таким образом, в данном варианте градиентного спуска на каждой итерации необходимо решить задачу одномерной минимизации (47). Алгоритм метода наискорейшего спуска состоит в следующем:

 

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

 

2. Осуществляется спуск в направлении антиградиента с выбранным шагом до тех пор, пока значение функции убывает, т.е. выполняется условие (46).

 

3. Если на i-ом шаге , то в точке вычисляются новые значения градиента и шага и выполняется переход к п.2

 

4. Критериями останова итерационного процесса служат следующие условия: если минимум вдоль данного направления спуска не может быть определен на последней итерации с помощью формулы (47); при превышении заданного числа итерации; при полученных значениях компонент градиента, меньших по абсолютной величине заданных минимально допустимых значений первой производной минимизируемой функции.

 

Алгоритм метода наискорейшего спуска:

1. Задаются: xº — начальное приближение, 1 > 0, 2> 0, M – предельное число итераций;

2. Количество итераций n = 0 ;

3. Вычисляется: gradf(x);

4. Вычисляется || gradf(x) || ;

4.1) если || gradf(x) || < 1 , то

x*= x ;

4.2) если || gradf(x) || > 1 , то к 5);

5. n < M

5.1) если выполняется, то к 6) ;

5.2) если нет, то x*= x ;

6. найти минимум функции (tn) = f( x — tn * gradf(x));

7. x ¹ = x — tn * gradf(x);

8. Проверяется условие f(x ¹ ) — f(x) < 0

8.1) если выполняется, то к 9) ;

8.2) если нет, то tn= tn / 2 и к 7) ;

9. Проверяется условие ||x ¹ – x ||< 2 и f(x ¹ ) — f(x) < 2

9.1) если оба условия выполняются, то x*= x ¹ ;

9.2) если хотя бы одно не выполняется , то n = n+1 и к 3).

 

Метод покоординатного спуска

Пусть требуется найти наименьшее значение целевой функции u = f(x1,x2,…,xn). В качестве начального приближения выберем в п-мерном пространстве некоторую точку M0 с координатами . Зафиксируем все координаты функции и, кроме первой. Тогда - функция одной переменной x1. Решая одномерную задачу оптимизации для этой функции, мы от точки M0 перейдем к точке , в которой функция ипринимает наименьшее значение по координате x1 при фиксированных остальных координатах. В этом состоит первый шаг процесса оптимизации, состоящий в спуске по координате x1.

 

Зафиксируем теперь все координаты, кроме x2, и рассмотрим функцию этой переменной . Снова решая одномерную задачу оптимизации, находим ее наименьшее значение при , т.е. в точке . Аналогично проводится спуск по координатам x3,x4,…,xn, а затем процедура снова повторяется от x1 до xn и т.д. В результате этого процесса получается последовательность точек M0,M1,…, в которых значения целевой функции составляют монотонно убывающую последовательность f . На любомk-м шаге этот процесс можно прервать, и значение f(Mk) принимается в качестве наименьшего значения целевой функции в рассматриваемой области.

Таким образом, метод покоординатного спуска сводит задачу о нахождении наименьшего значения функции многих переменных к многократному решению одномерных задач оптимизации по каждому проектному параметру.

Данный метод легко проиллюстрировать геометрически для случая функции двух переменных z=f(x,y), описывающей некоторую поверхность в трехмерном пространстве. На рис. 1 нанесены линии уровня этой поверхности. Процесс оптимизации в этом случае проходит следующим образом. Точка M0(x0,y0) описывает начальное приближение. Проводя спуск по координате х, попадем в точку M1(x1,y0). Далее, двигаясь параллельно оси ординат, придем в точку M2(x1,y1)и т.д.

Важным здесь является вопрос о сходимости рассматриваемого процесса оптимизации. Другими словами, будет ли последовательность значений целевой функции f(M0), f(M1),… сходиться к наименьшему ее значению в данной области? Это зависит от вида самой функции и выбора начального приближения.

 

Рис. 1.

Для функции двух переменных очевидно, что метод неприменим в случае наличия изломов в линиях уровня. Это соответствует так называемому оврагу на поверхности. Здесь возможен случай, когда спуск по одной координате приводит на “дно” оврага. Тогда любое движение вдоль любой координаты ведет к возрастанию функции, соответствующему подъему на “берег” оврага. Поскольку поверхности типа “оврага” встречаются в инженерной практике, то при использовании метода покоординатного спуска следует убедиться, что решаемая задача не имеет этого недостатка.

Для гладких функций при удачно выбранном начальном приближении (в некоторой окрестности минимума) процесс сходится к минимуму. К достоинствам метода покоординатного спуска следует также отнести возможность использования простых алгоритмов одномерной оптимизации.

Алгоритм метода покоординатного спуска:

В двумерном пространтсве R2. Решение задачи (2) методом покоординатного спуска, иначе называемого методом Гаусса - Зейделя, производят по следующей общей схеме.
Выбирают произвольно начальную точку х(0) из области определения функции f(х). Приближения х(k) определяются соотношениями (3):
x(k+1)=x(k)+t(k)S(k) (k=0,1,2, ...),
где вектор направления спуска s(k)- это единичный вектор, совпадающий с каким-либо координатным направлением (например, если S(k) параллелен х1, то S(k)= {1,0,0,...,0}, если он параллелен x2, то S(k)={0, 1, 0, . . . ,0} и т.д.) ; величина t(k) является решением задачи одномерной минимизации:
f(x(k)+ts(k)) --> min, t ОR1, (k=0,1,2, ...),
и может определяться, в частности, методом сканирования.
Детальная реализация общей схемы в двумерном случае R2 дает траекторий приближения к точке х* методом покоординатного спуска, состоящую из звеньев ломаной, соединяющих точки х(k), х~(k), x(k+1) (k=0, 1, 2,) (рис.2). При k=0, исходя из начальной точки х(0)=(x1(0),x2(0)), находят точку х~(0)= (x1~(0),x2(0)), минимума функции одной переменной f(x1,x2(0)); при этом f(x~(0))<=f(x(0)).Затем находят точку минимума x(1) функции f (x1~(0),x2) по второй координате. Далее делают следующий шаг вычислений при k=1. Полагают, что исходной точкой расчета является х(1). Фиксируя вторую координату точки х(1), находят точку минимума х~(1)= (x1~(1),x2(1)), функции f(x1,x2(1)) одной переменной x(1); при этом f(x~(1))<=f(x(1))<=f(x(0)). Точку х(2) получают, минимизируя целевую функцию f(x1~(1),x2), вновь по коорданате х2, фиксируя координату x1~(1) ,точки x(1) , и т.д.
Условием прекращения вычислительной процедуры при достижении заданной точности e может служить неравенство
||x(k+1) - x(k) ||<e (4)

 

 

Метод наискорейшего спуска:

clc

clear

 

%xx0=[2 3];

%xx0=[13 10];

xx0=[8.5 14.3];

[x11 x22]=meshgrid([-15:0.1:15],[-15:0.1:15]);

z=7.*x11.^2+2.*x11.*x22+5.*x22.^2-2.*x11-10.*x22;

contour(x11,x22,z);

hold on;

grid on;

syms x1 x2;

 

f=7*x1^2+2*x1*x2+5*x2^2-2*x1-10*x2;

eps=10^(-5);

h=1;

k=0;

plot(xx0(1),xx0(2),'o');

hold on

tic

 

while(1)

grad=[subs(diff(f,x1),[x1 x2],xx0)

subs(diff(f,x2),[x1 x2],xx0)];

l=norm(grad,inf);

grad1=grad./l;

fx0=subs(f,[x1 x2],xx0);

xxk=xx0-h*grad1';

fxk=subs(f,[x1 x2],xxk);

if (fxk<fx0)

fxp=fx0;

xxp=xx0;

while(fxk<fxp)

xxp=xxk;

xxk=xxp-h*grad1';

fxk=subs(f,[x1 x2],xxk);

xxp=xxk+h*grad1';

fxp=subs(f,[x1 x2],xxp);

plot(xxk(1),xxk(2),'.');

hold on

end

xx0=xxp;

plot(xx0(1),xx0(2),'o');

hold on

else

h=h/10;

end

 

if (h<eps)

break;

end

 

if (norm(grad,inf)<eps)

break;

end

k=k+1;

end

k

xxk

fxk

 

f=7*x1^2+2*x1*x2+5*x2^2-2*x1-10*x2;

xx0=[0 1];

 

 

 

Метод покоординатного спуска:

clc

clear

 

%xx0=[2 3];

%xx0=[13 10];

xx0=[8.5 14.3];

[x11 x22]=meshgrid([-15:0.1:15],[-15:0.1:15]);

z=7.*x11.^2+2.*x11.*x22+5.*x22.^2-2.*x11-10.*x22;

contour(x11,x22,z);

hold on;

grid on;

plot(xx0(1),xx0(2),'o');

hold on;

syms x1 x2;

 

f=7*x1^2+2*x1*x2+5*x2^2-2*x1-10*x2;

eps=10^(-5);

h1=1;

h2=1;

k=0;

tic

while(1)

dfx1=subs(f,[x1 x2],[xx0(1) xx0(2)]);

xxk_=[xx0(1)+h1 xx0(2)];

xx_k=[xx0(1)-h1 xx0(2)];

dfx1_=subs(f,[x1 x2],xxk_);

df_x1=subs(f,[x1 x2],xx_k);

 

if (dfx1_<df_x1)&&(dfx1_<dfx1)

xxk=xxk_;

fxk=dfx1_;

fx0=dfx1;

while(fxk<fx0)

fx0=fxk;

xx0=xxk;

xxk=[xx0(1)+h1 xx0(2)];

fxk=subs(f,[x1 x2],xxk);

plot(xxk(1),xxk(2),'.');

hold on

end

else

if (df_x1<dfx1_)&&(df_x1<dfx1)

xxk=xx_k;

fxk=df_x1;

fx0=dfx1;

while(fxk<fx0)

fx0=fxk;

xx0=xxk;

xxk=[xx0(1)-h1 xx0(2)];

fxk=subs(f,[x1 x2],xxk);

plot(xxk(1),xxk(2),'.');

hold on

end

else

h1=h1/10;

end

plot(xx0(1),xx0(2),'o');

hold on

end

 

 

dfx2=subs(f,[x1 x2],[xx0(1) xx0(2)]);

xxk_=[xx0(1) xx0(2)+h2];

dfx2_=subs(f,[x1 x2],xxk);

xx_k=[xx0(1) xx0(2)-h2];

df_x2=subs(f,[x1 x2],xx_k);

 

if (dfx2_<df_x2)&&(dfx2_<dfx2)

xxk=xxk_;

fxk=dfx2_;

fx0=dfx2;

while(fxk<fx0)

fx0=fxk;

xx0=xxk;

xxk=[xx0(1) xx0(2)+h2];

fxk=subs(f,[x1 x2],xxk);

plot(xxk(1),xxk(2),'.');

hold on

end

else

if (df_x2<dfx2_)&&(df_x2<dfx2)

xxk=xx_k;

fxk=df_x2;

fx0=dfx2;

while(fxk<fx0)

fx0=fxk;

xx0=xxk;

xxk=[xx0(1) xx0(2)-h2];

fxk=subs(f,[x1 x2],xxk);

plot(xxk(1),xxk(2),'.');

hold on

end

else

h2=h2/10;

end

end

 

 

if((h1<eps)&&(h2<eps))

break;

end

plot(xx0(1),xx0(2),'+');

hold on

fx0=subs(f,[x1 x2],xx0);

k=k+1;

end

 

fx0

k

xx0

toc

 

f=7*x1^2+2*x1*x2+5*x2^2-2*x1-10*x2;

 

xx0=[0 1];

 

 

Шаг h=1; eps=10^(-5);

 

X0=[2 3]

 

Название Число итераций Время работы
Метод наискорейшего спуска   1.683678 seconds
Метод покоординатного спуска 0.924417 seconds

 

X0=[13 10]

 

Название Число итераций Время работы
Метод наискорейшего спуска   1.978522 seconds
Метод покоординатного спуска 1.152933 seconds

 

 

X0=[8.5 14.3]

 

Название Число итераций Время работы
Метод наискорейшего спуска   2.023583 second
Метод покоординатного спуска 1.675416 seconds