Лабораторная работа №4
.docСанкт-Петербургский Государственный
Электротехнический Университет «ЛЭТИ»
ФКТИ САПР
Лабораторная работа №4
«Градиентные методы»
Вариант 1
Выполнили: Буторин
Данилович.
Проверил: Алешкевич П.А.
Санкт-Петербург
2004г
Описание методов оптимизации.
Метод Свенна 4.
Начальный этап. Для запуска метода необходимо:
(1) задать x0 – начальная точка.
(2) выбрать шаг h равным 0.001 или min{η,|(y1-y’)/y’1|}, где η=1,2.
(3) выбрать направление поиска p.
Основной этап
Шаг 1. Установить направление убывания функции. h=h, если y’(x0,p)<0 и h=-h, если y’(x0,p)>0.
Шаг 2.Двигаться в направлении р, вычисляя значение функции в точках xk+1=xk+hk*p, hk=2hk-1. Пока производная не поменяет знак, т.е. Y’m-1*Y’m<0
Шаг 3. Фиксируем начальный интервал: [Xm-1,Xm]
Метод Дэвидона.
Этот метод является аналогом метода кубической аппроксимации в задачах поиска минимума функции нескольких переменных по заданному направлению. Идея метода заключается в том, чтобы на ТИЛ найти аппроксимирующий минимум строя полином 3-го порядка.
Начальный этап:
-
Взять ε, х 0 – начальную точку поиска, p – направление поиска.
-
Найти начальный шаг α1 = min{ η,|(y1-y’)/y’1|}, где η=1,2. y1=y(x1), y’1 =y’(x1,p)
-
Получить начальный интервал поиска [a,b] методом Свенна 4.
Основной этап:
-
Найти аппроксимирующий минимум, т.е. точку r по формулам:
r = a+αr *p
αr = α a +γ*( α b - αa )
γ=(z-f’a+W)/(f’b-f’a+2*W)
W=√z2-f’a*f’b
z=f’a+f’b+3*(fa-fb)/(b-a)
-
Проверить КОП если Y’r<=ε, то остановиться. X= a+ αr *p Иначе сократить ТИЛ двумя способами:
Y’r<0 -> [r,b]
Y’r>0 -> [a,r]
Установить k=k+1 и вернуться на шаг 1.
Можно модифицировать алгоритм – ввести смещение точек на α0 .
Метод Коши
Начальный этап:
Взять ε - погрешность,
х 0 – начальную точку поиска,
k=1 – счетчик количества итераций.
Основной этап:
Шаг1: Вычислить антиградиентное направление pk = - grad (yk );
Шаг2: Найти оптимальный шаг αk с помощью метода Дэвидона;
Шаг3: Перейти в новую точку:
- xk+1= xk + αk*pk ;
- k=k+1;
Шаг4: Проверить КОП (любой):
(1) ||∆ xk||<= e1
(2) | ∆yk|<= e2
(3) ||grad (yk)||<= e3
(4) ||∆ xk||/(1+||∆ xk||)<= e4
(5) ||grad (yk)||/(1+||grad (yk)||)<= e5
Если КОП выполняется остановимся x* = xк+1 , иначе вернуться на
Шаг1.
Спецификация программы.
В прогорамме приведен метод Коши – градиентный метод наискорейшего спуска для функций нескольких переменных. Используется метод Дэвидона и вспомогательный метод Свенна 4 для получения оптимального шага для метода Коши. Присутствуют функции вычисления градиента и функция вычисления производной по направлению в точке. В качестве переменных-векторов используются обьекты класса complex, представляющие собой обьект из двух полей double, т.е. двумерные векторы. Также используются некоторые методы этого класса.
Текст программы.
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<complex.h>
#include<stdlib.h>
//++++++++++++++++++++++++++++++++++++++++++++++
complex a,b;
double r;
//++++++++++++++++++++++++++++++++++++++++++++++
double f (complex x)
{
return (100*pow(imag(x)-pow(real(x),2),2)+pow(1-real(x),2));
}
//++++++++++++++++++++++++++++++++++++++++++++++
complex grad(complex x)
{
return (complex(400*real(x)*(pow(real(x),2)-imag(x))+2*(real(x)-1),200*(imag(x)-pow(real(x),2))));
}
//++++++++++++++++++++++++++++++++++++++++++++++
double dy (complex x,complex p)
{
return (real(grad(x))*real(p)+imag(grad(x))*imag(p));
}
//++++++++++++++++++++++++++++++++++++++++++++++
void Svenn4(complex x0,complex p)
{
double h=0.001;
if (dy(x0,p)>0) h=-h;
x0=x0+h*p;
while (dy(x0,p)*dy((x0-h*p),p)>=0)
{
h=2*h;
x0=x0+h*p;
}
a=x0-h*p;
b=x0;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
complex Davidon(complex x0,complex p,double e)
{
double da=real(a-x0)/real(p),db=real(b-x0)/real(p),z,w;
if (da>db)
{
r=db;
db=da;
da=r;
}
a=x0+da*p;
b=x0+db*p;
z=dy(a,p)+dy(b,p)+3*(f(a)-f(b))/(db-da);
w=sqrt(z*z-dy(a,p)*dy(b,p));
r=da+(db-da)*(z-dy(a,p)+w)/(dy(b,p)-dy(a,p)+2*w);
while (dy((x0+r*p),p)>=e)
{
if (dy((x0+r*p),p)<0)
da=r;
else
db=r;
a=x0+da*p;
b=x0+db*p;
z=dy(a,p)+dy(b,p)+3*(f(a)-f(b))/(db-da);
w=sqrt(z*z-dy(a,p)+dy(b,p) );
r=da+(db-da)*(z-dy(a,p)+w)/(dy(b,p)-dy(a,p)+2*w);
}
return x0+r*p;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void main ()
{
clrscr();
double e=0.0001;
complex x0,x1,x;
int k=1,n;
do
{
clrscr();
cout<<"1. Startovaya tochka (-1.2,1)"<<endl;
cout<<"2. Startovaya tochka (1.5,2)" <<endl;
cout<<"3. Startovaya tochka (-2,-2)" <<endl;
cout<<"4. Exit";
switch(n=getch())
{
case '1': x0 = complex(-1.2,1);break;
case '2': x0 = complex(1.5,2); break;
case '3': x0 = complex(-2,-2); break;
case '4': exit(1);
}
clrscr();
while (1)
{
complex p = -grad(x0);
Svenn4(x0,p);
x0=Davidon(x0,p,e);
x1=x0+r*p;
k++;
if(abs(grad(x0))<=e && fabs(f(x1)-f(x0))<=e && abs(x1-x0)<=e && abs(x1-x0)/(1+abs(x1-x0))<=e && abs(grad(x0))/(1+abs(grad(x0)))<=e)
break;
}
x=x0;
cout << "Kolichestvo iteracii - k = " << k << endl;
cout << "Optimalniy shag - alfa = " << r << endl;
cout << "Minimum - x* = " << x;
}
while(n!=getch());
getch();
}
Результаты тестирования метода:
Ниже приведена таблица с результатами работы программы для функции f(x) = 100(x2 - x12)2 + (1 - x1)2, с различными стартовыми точками и точностями вычисления.
Точность: |
|
0.0001 |
|
0.00001 |
|
0.000001 |
Метод Коши |
К |
x* |
K |
x* |
K |
x* |
X0=(1.2,1) |
6241 |
(0.999902, 0.999803) |
9625 |
(0.999991, 0.999981) |
14207 |
(0.999999, 0.999998) |
X0=(1.5,2) |
614 |
(1.00011, 1.000221) |
812 |
(1.000011, 1.000022) |
1106 |
(1.000001, 1.000002) |
X0=(-2,-2) |
5704 |
(0.999899, 0.999797) |
7410 |
(0.99999, 0.99998) |
9114 |
(0.999999, 0.999998) |
Выводы:
В данной работе был использован метод Свенна4 и метод Дэвидона для получения оптимального шага. Поиск ведется в пространстве, начиная с заданной начальной точки x0 по антиградиентному направлению p0. И в результате выполнения метода Коши находится оптимальный шаг, доставляющий минимум в результате исчерпывающего спуска вдоль антиградиентного направления pк. Полученный шаг соответствует точке x* = xк+1 . Большое количество итераций и неточность минимума объясняется тем, что вблизи минимума для реальных (овражных) функций метод зацикливается, либо рыскает и останавливается.