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

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

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

Санкт-Петербургский Государственный

Электротехнический Университет «ЛЭТИ»

ФКТИ САПР

Лабораторная работа №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-го порядка.

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

  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 для получения оптимального шага для метода Коши. Присутствуют функции вычисления градиента и функция вычисления производной по направлению в точке. В качестве переменных-векторов используются обьекты класса 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 . Большое количество итераций и неточность минимума объясняется тем, что вблизи минимума для реальных (овражных) функций метод зацикливается, либо рыскает и останавливается.