Скачиваний:
9
Добавлен:
01.05.2014
Размер:
72.19 Кб
Скачать

Министерство образования РФ

Санкт-Петербургский государственный электротехнический

университет «ЛЭТИ»

Кафедра вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА № 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-го порядка.

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

  1. Взять ε, х 0 – начальную точку поиска, p – направление поиска.

  2. Найти начальный шаг α1 = min{ η,|(y1-y’)/y’1|}, где η=1,2. y1=y(x1), y’1 =y’(x1,p)

  3. Получить начальный интервал поиска [a,b] методом Свенна 4.

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

  1. Найти аппроксимирующий минимум, т.е. точку r по формулам:

r = a+αr *p

αr = α a +γ*( α b - αa )

γ=(z-f’a+W)/(fb-f’a+2*W)

W=√z2-f’a*f’b

z=f’a+f’b+3*(fa-fb)/(b-a)

  1. Проверить КОП если 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.

6

Соседние файлы в папке Лабораторная работа №4