Лабораторная работа №31
.docМИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ
САНКТ ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ»
Кафедра САПР
ЛАБОРАТОРНАЯ РАБОТА № 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
-
Вычислить производную в начальной точке по заданному направлению
Y1=Y(X’1,P)
-
Найти начальный шаг Девидона.
α1=min{ή,2*|Y1-Y0|/|Y’1|}
ή=1 или 2
-
Реализовать метод Свенна локализующий или определяющий начальный интервал [αa;αb] содержащий min α
Шаг1
Выбрать направление убывания функции.
P=+P, if Y’1<0
P=-P, if Y’1>0
Шаг2
Продвигаемся в направлении убывания шага, вычисляя значение функции в точках
Xk+1=Xk+αkPk, α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
Заключение
В работе были исследованы методы Больцано и Девидона. В результате тестирования можно сделать вывод, что метод Девидона приходит к результату за значительно меньшее число итераций. Его точность также оказывается выше, чем у Больцано. При уменьшении ε увеличивается число итераций и точность нахождения минимума. Однако метод Девидона необходимо разгонять. В данной работе мы разгоняем его с помощью метода Больцано.