Лабораторная работа №4 / 4
.DOCМинистерство образования РФ
Санкт-Петербургский государственный электротехнический
университет «ЛЭТИ»
Кафедра вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА № 4
по учебной дисциплине «МЕТОДЫ ОПТИМИЗАЦИИ»
на тему «исследование градиентных методов»
Вариант 1
Выполнила:
Студентка ___Никитина Т.И._______
Группа _________2375____________
Руководитель:
Алешкевич Павел Александрович
(должность, Ф.И.О.)
Санкт-Петербург
2004
Оглавление:
Задание…………………………………………………………………………….3
Описание методов оптимизации…………………………………………………3
Спецификация программы………………………………………………………..4
Листинг программы ………………………………………………………………4
Результаты тестирования и Выводы…………………….……………………….6
Ответы на контрольные вопросы………………………………………………...6
Задание
Целью работы является разработка программы многомерной минимизации целевых функций на основе применения градиентных методов поиска. В нашем варианте таким методом является метод циклического покоординатного спуска с ускоряющим шагом.
Описание методов оптимизации.
Метод Свенна 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 для получения оптимального шага для метода Коши. Присутствуют функции вычисления градиента и функция вычисления производной по направлению в точке.
Текст программы.
#include <iostream.h>
#include <conio.h>
#include <math.h>
/*************************Global'nie peremennie******************************/
double p[2],x0[2],a,b;
/******************************Moya funkciya*********************************/
double f(double t)
{
double x[2];
for(int k=0;k<2;k++)
x[k]=x0[k]+t*p[k];
return (100*pow((x[1]-x[0]*x[0]),2)+pow((1-x[0]),2));
}
/**************************Proizvodnaya funkcii******************************/
double df(double t)
{
double x[2];
for(int k=0;k<2;k++)
x[k]=x0[k]+t*p[k];
return ((-400*(x[1]-x[0]*x[0])*x[0]-2*(1-x[0]))*p[0]+200*(x[1]-x[0]*x[0])*p[1]);
}
/**********************Antigradientnoe napravlenie***************************/
void napr()
{
p[0]=400*(x0[1]-x0[0]*x0[0])*x0[0]+2*(1-x0[0]);
p[1]=-200*(x0[1]-x0[0]*x0[0]);
}
/**********************************Norma*************************************/
double norma(double x1[])
{
return(sqrt(pow((x1[0]-x0[0]),2)+pow((x1[1]-x0[1]),2)));
}
/****************************Metod Svenna 4**********************************/
void Swann4(double t)
{
double s=0;
if(t>fabs((f(0)-df(0))/df(0)))
t=fabs((f(0)-df(0))/df(0));
if(df(0)>0)
for(int k=0;k<2;k++)
p[k]=-p[k];
do
{
s=s+t;
t=2*t;
}
while((df(0)*df(s))>0);
a=s-t/2;
b=s;
}
/***************************Ras4etnie formuli********************************/
double gam(double c)
{
double z,w;
z=df(a)+df(b)+3*(f(a)-f(b))/b;
w=sqrt(z*z-df(a)*df(b));
c=a+((z-df(a)+w)/(df(b)-df(a)+2*w))*(b-a);
return c;
}
/*****************************Metod Devidona*********************************/
double Davidon(double e)
{
double c;
Swann4(1);
do
{
c=gam(c);
if(df(c)<0)
a=c;
else
b=c;
}
while(fabs(df(c))>e);
return c;
}
/******************************Metod Koshi***********************************/
void KOSHI(double e)
{
double alfa,x1[2];
int k;
int g=0;
for(k=0;k<2;k++)
x1[k]=x0[k];
do
{
g++;
for(k=0;k<2;k++)
x0[k]=x1[k];
napr();
alfa=Davidon(e);
for(int k=0;k<2;k++)
x1[k]=x0[k]+alfa*p[k];
}
while((norma(x1)>e)||(fabs(f(0)-f(alfa))>e));
for(k=0;k<2;k++)
x0[k]=x1[k];
cout<<"\nKolli4estvo iteraciy: k = "<<g;
}
/***************************Osnovnaya programma******************************/
void main()
{
clrscr();
double x01[2]={-1.2,1};
// double x02[2]={1.5,2};
// double x03[2]={-2,-2};
double e;
int k;
cout<<"\n---Laboratornaya rabota 4. Issledovanie gradientnih metodov.---";
cout<<"\n-------------------------Variant 1-----------------------------";
cout<<"\n------------------------Metod Koshi----------------------------";
cout<<"\n-------------- Vipolnila: Nikitina T., gr. 2375 ---------------";
cout<<"\n\n\nCelevaya funkciya: 100(x2-x1^2)^2+(1-x1)^2";
cout<<"\nNa4al'naya to4ka poiska: Xo = ( -1.2 ; 1 )";
cout<<"\nVvedite to4nost' poiska: E = ";
cin>>e;
KOSHI(e);
cout<<"\nRezul'tat minimizacii: ";
cout<<"( "<<x0[0]<<" ; "<<x0[1]<<" )";
getch();
}
/*********************************The End************************************/
Результаты тестирования метода:
Ниже приведена таблица с результатами работы программы для функции 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 . Большое количество итераций и неточность минимума объясняется тем, что вблизи минимума для реальных (овражных) функций метод зацикливается, либо рыскает и останавливается.
Контрольные вопросы:
1. Представьте один шаг аналитического решения задачи Вашего варианта задания.
2. Сравните методы М4 - М7 с точки зрения организации поиска.
3. Дана функция y(x) = x12 + x22 + x32 - 4x1 - 8x2 - 12x3 + 100.
Исследовать характер стационарной точки.
4. Найти минимум функции y(x) = (x2 - x1)2 + (1 - x1)2.
5. Найти точку экстремума функции y(x1, х2, x3) = x12 + 2x22 + 5x32 - 2x1x2 – 4x2x3 – 2x3.