Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №31

.doc
Скачиваний:
6
Добавлен:
01.05.2014
Размер:
59.9 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ

САНКТ ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ»

Кафедра САПР

ЛАБОРАТОРНАЯ РАБОТА № 3

Исследование градиентных методов

Выполнили:

Студенты: Волков Ю. А.

Мартьянов А. А.

Группа 2311

Санкт-Петербург

2004

Работа 3. Исследование градиентных методов.

Целью работы является разработка программы, реализующей процедуру минимизации функции многих переменных в заданном направлении методами Больцано-Девидона.

1. Метод средней точки (метод Больцано)

Данный метод является вариантом метода деления интервала пополам.Последовательные сокращения интервала неопределенности производятся на основе оценки производной минимизируемой функции в центре текущего интервала.

Начальный этап. Для запуска метода необходимо:

(1) задать [a1,b1]- начальный интервал локализации минимума, на границах которого знаки производных различны, т.е. f'(a1)f'(b1)<0;  - малое положительное число;

(2) положить к=1 и перейти к основному этапу.

Основной этап

Шаг 1. Взять пробную точку хk в центре текущего интервала и проверить критерий окончания поиска: (1) xk = (ak + bk)/2; (2) если f'(xk) ≤  и Lk= bk - ak≤ , то остановиться (хk = х* -аппроксимирующий минимум).

Шаг 2. Сократить текущий интервал:

(1) Если f (xk) > 0, то положить ak+1 = ak и bk+1 =xk, в противном случае - ak+1 =xk, bk+1 =bk;

(2) заменить k на k+1 и вернуться на шаг 1.

2.Схема алгоритма Девидона.

Начальный этап:

  1. Выбрать , Р, начальную точку Х1

  2. Вычислить производную в начальной точке по заданному направлению

Y1=Y(X’1,P)

  1. Найти начальный шаг Девидона.

α1=min{ή,2*|Y1-Y0|/|Y’1|}

ή=1 или 2

  1. Реализовать метод Свенна локализующий или определяющий начальный интервал [αa;αb] содержащий min α

Шаг1

Выбрать направление убывания функции.

P=+P, if Y’1<0

P=-P, if Y’1>0

Шаг2

Продвигаемся в направлении убывания шага, вычисляя значение функции в точках

Xk+1=XkkPk, αk=2αk-1

K=1,2,…,m-1,m

До тех пор, пока не придем в точку b=Xm такую что производная по направлению поменяет знак

Критерий окончания

Y’1*Y’b<0

Шаг 3

Фиксируем начальный интервал

A=Xm-1; b=Xm

Αa=αm-1

Αb=αm

Шаг4

Можно, но не обязательно сместить начало координат в точку a. α- шаг смещения.

Целесообразно при движении по правой ветви функции с помощью 3-ей точки зафиксировать интервал.

Основной этап.

Найти шаг аппроксимирующий минимум поформуле

L=Lb*(w-Y’a+z)/(2*w-Y’a+Y’b)

R=x=A+Lr*P

Шаг2

Проверить критерий окончания поиска(|Y’r|<=E=10-4) если КОП <Е min найден, тогда:

L*=Lr

Y(Xk+Lr*P)=Y*

X*=Xk+1=Xk+Lr*Pk

В противном случае сократить ТИЛ рассмотрением 4-х ситеаций

If (Yr’>0) then

{La=La}

{Lb=Lr}

else

{L0=L0+Lr}

{Lb=Lb-Lr}

{La=0}

И сместить начало координат на Lk

K=K+1

Go to шаг 1

Текст программы:

#include<iostream.h>

#include<conio.h>

#include<math.h>

double x10=-0.5,p1=1,x11=1,p2=0,e=0.01,x1min,x2min,x1,x2,aa,ab,ac;

double g1,g2;

int k=0;

int k1=0;

double y(double a)

{x1=x10+a*p1;

x2=x11+a*p2;

return (-12*x2+4*x1*x1+4*x2*x2-4*x1*x2); }

double grad(double(alpfa1))

{

x1=x10+alpfa1*p1;

x2=x11+alpfa1*p2;

g1=8*x1+-4*x2;

g2=-12+8*x2-4*x1;

return (g1*p1+g2*p2);

}

double ah=0.1,ah1,a2,a,a1,eps=0.00001,Amin;

void Swenn()

{

clrscr();

a1=0;

a2=a1+ah;

if(y(a2) > y(a1))

{ah=-ah;

a2=a1+ah;

}

ah1=ah;

a=a2;

do

{ah=2*ah;

a=a+ah;

}

while(y(a)<y(a-ah));

ab=a;

aa=a-1.5*ah;

if(ah1>0){ aa=aa;

ab=ab;}

else ac=aa,aa=ab,ab=ac;

cout<<"Laboratonaia rabota nomer 3"<<endl<<endl;

cout<<"Vipolnila: BRIGADA:"<<endl;

cout<<" Volkov"<<endl;

cout<<" Martyanov"<<endl<<endl;

cout<<"Nachalnii interval:"<<endl;

cout<<"["<<aa<<","<<ab<<"]"<<endl;

getch();

}

double alpfaA, alpfaB, alpfaC;

void Balsano()

{

alpfaA=aa;

alpfaB=ab;

do

{

alpfaC=(alpfaA+alpfaB)/2;

if (grad(alpfaC)>0) {

alpfaB=alpfaC;

} else {

alpfaA=alpfaC;

}

k++;

}

while(fabs(grad(alpfaC))>=eps);

{

x1min=x10+alpfaC*p1;

x2min=x11+alpfaC*p2;

Amin=-12*x2min+4*x1min*x1min+4*x2min*x2min-4*x1min*x2min;

}

cout<<endl<<"Balsamo:"<<endl<<"x1min = "<<x1min<<endl<<"x2min = "<<x2min<<endl;

cout<<"Amin= "<<Amin<<endl<<"alpfaC= "<<alpfaC<<endl;

cout << "k = " << k << endl<<endl;

getch();

}

double z,w,alr,x11min,x22min,Amin1,alr1,e1=0.01;

void Dev()

{

do

{

z=grad(aa)+grad(ab)+3*(y(aa)-y(ab))/(ab-aa);

w=sqrt(pow(z,2)-grad(aa)*grad(ab));

alr=aa+(ab-aa)*(w-grad(aa)+z)/(2*w-grad(aa)+grad(ab));

k1++;

if(grad(alr)>=0)

{

ab=alr;

aa=aa;

}

else

{

aa=alr;

ab=ab;

}

}

while (fabs(grad(alr)>=e1));

x11min=x10+alr*p1;

x22min=x11+alr*p2;

Amin1=-12*x22min+4*x11min*x11min+4*x22min*x22min-4*x11min*x22min;

cout<<endl<<"Dev: "<<endl<<"z = "<<z<<endl<<"w = "<<w<<endl<<"alr = "<<alr<<endl<<"Amin1 = "<<Amin1<<endl<<"k1= "<<k1<<endl;

cout<<"x11min = "<<x11min<<endl<<"x22min = "<<x22min<<endl;

cout<<"grad(alr)= "<<grad(alr)<<endl;

cout<<"grad(aa)= "<<grad(aa)<<endl<<"grad(ab)= "<<grad(ab)<<endl;

cout<<"y(aa)= "<<y(aa)<<endl<<"y(ab)= "<<y(ab)<<endl;

getch();

}

void main()

{

Swenn();

Balsano();

Dev();

}

Результаты тестирования программы

Функция, точность

Результат

Число шагов метода

Метод Бальзамо

Метод Девидона

Метод Бальзамо

Метод Девидона

f = (-12*x2+4*x1*x1+4*x2*x2-4*x1*x2)ε = 0,01

(0.5;1.0001)t

(0.5, 1)t

19

1

Ответы на контрольные вопросы

1. Поясните организацию линейного поиска на основе методов золотого сечения, Фибоначчи и Пауэлла.

Для методов ЗС, Фибоначчи, Пауэлла и других переход от минимизации функции 1 переменной к минимизации вдоль прямой с направляющим вектором pk для функции многих переменных предполагает:

1) замену точек a, b, c, x1, x2 векторами или шагами, доставляющими нас в эти точки

2) вместо процесса типа Свенна здесь реализуется вычислительный процесс xk+1=xk + αk*pk, где αk = 2 αk-1.

3) КОП. | a-b |  ε заменяется на || A - B ||  ε.

4) Производная от функции заменяется производной по направлению:

| fx’ |  ε заменяется на y’(x, pk)  ε.

2. Найти производную в точке x1=(1,0)t по направлению p1=(1,1)t для функции f(x) = x12 - x1x2 + 2x22 - 2x1.

f’(xk, pk) = fk+1 * pk.

Находим градиент функции f(x): f = (2 x1 – x2 – 2, - x1 + 4 x2)T.

Подставляем точку x1: f(x1) = (2 * 1 – 2, -1)T = (0, -1)T.

Находим f’(xk, pk) = (0, -1)T * (1, 1)T = 0*1 - 1*1 = -1.

4. Что является направлением наискорейшего спуска в точке x = (1,1)t для целевой функции y(x) = x12 + 2x22

Направление наискорейшего спуска – это антиградиентное направление. Т. о. получим:

pk = -yk = -(2 x1, 4 x2)|(1,1)t = (-2, -4)T.

5. Приведите 2 способа аналитического решения задачи для Вашего варианта задания.

6. Найдите минимум y(x) = x12 - x1x2 + 2x22 - 2x1 + ex1+x2, двигаясь из точки x1 = (0,0) в направлении наискорейшего спуска.

p1 = -y1 = -(2*x1-x2-2+exp(x1+x2), -x1+4*x2+exp(x1+x2))|(0,0)t = (1, -1)T.

α1 = || p1 || =  1,41.

x2= x1 + α1*p1 = (0, 0)T + 1,41*(1, -1)T = (1,41; -1,41)T.

p2 = (-3,23; 6,05)T; α2 = 6,86; x3= (-25,4; 47,5)T.

Алгоритм расходится, т.к. норма градиента увеличивается.

7. Найти шаг a1, доставляющий минимум в точку x2 = x1 + a1p для функции y(x)= x12 + 2x22 и направления антиградиента в точке x1 =(1,0)t.

p1 = -y1 = -(2*x1, 4*x2)|(1,0)t = (-2, 0)T.

α1 = || p1 || = 2

Заключение

В работе были исследованы методы Больцано и Девидона. В результате тестирования можно сделать вывод, что метод Девидона приходит к результату за значительно меньшее число итераций. Его точность также оказывается выше, чем у Больцано. При уменьшении ε увеличивается число итераций и точность нахождения минимума. Однако метод Девидона необходимо разгонять. В данной работе мы разгоняем его с помощью метода Больцано.