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

зелень / Лаба3(Игорь)

.doc
Скачиваний:
2
Добавлен:
20.02.2016
Размер:
268.29 Кб
Скачать

Министерство образования и науки,молодежи и спорта Украины

Государственное высшее учебное заведение Украинский государственный химики-технологический университет

Лабораторная работа №3 «Задачи двумерной оптимизации с ограничениями»

Выполнил

ст.группы 4-СКС-5 Пономарёв В.Н.

Проверил : Зеленцов Д.Г

Днепропетровск 2013

Найти минимум функции методом штрафных функций.

На дополнительный бал методом проекции градиента.

  1. Покоординатный спуск.

  2. Случайного поиска

  3. Одним из:

а)метод градиентного спуска (метод простых итераций)

б)метод наискорейшего спуска

метод деформирующего многогранника на дополнительный

14.

Код программы:

#include <iostream.h>

#include <math.h>

#include <conio.h>

#include <stdlib.h>

double function (double x, double y)

{

return 4*x*x+y*y +2*y;

};

double g (double x, double y)

{

return pow(x-1,2)/2-2-y;

};

double C (double x, double y, double H)

{

return function(x,y)+H*g(x,y);

};

double dX (double x,double y)

{

return 8*x-y+2;

};

double dY (double x,double y)

{

return 2*y-3+4*x;

};

double norm (double x, double y)

{

return sqrt(dX(x,y)*dX(x,y)+dY(x,y)*dY(x,y));

};

double compare (double x, double y)

{

if(g(x,y)>0) return 10000;

else return 0;

};

//Метод случайного поиска

void random_search ()

{

double min=100, x, y, x1, y1, H=compare(x,y);

for (int i=0; i<=2000; i++)

{

x=(double)rand()/((double)RAND_MAX/2.7);

y=(double)rand()/((double)RAND_MAX/3);

if(C(x,y,H)<min)

{

min=C(x,y,H);

x1=x;

y1=y;

H=compare(x,y);

}

}

cout«"Metod sluchaynogo poiska:"«endl;

cout«"X="«x1«endl;

cout«"Y="«y1«endl;

cout«"F(X,Y)="«C(x1,y1,H)«endl«endl;

}

//Метод покоординатного спуска

void descent()

{

double x=0.1, y=1.2, x1=0.4, y1=1.1, h=0.001, H1=0, H=compare(x,y);

while ((C(x1,y1,H1)-C(x,y,H)) > 0.0001)

{

H1=H;

if (fabs(function(x,y)<function(x+h,y))) x=x-h;

while (function(x-h,y)<function(x,y))

{ x=x-h;}

if (fabs(function(x,y)>function(x+h,y))) x=x+h;

while (function(x-h,y)>function(x,y))

{ x=x+h;}

if (fabs(dY(x,y)<dY(x+h,y+h))) y=y-h;

while (function(x,y-h)<function(x,y))

{ y=y-h; }

if (fabs(dY(x,y)>dY(x+h,y+h))) y=y+h;

while (function(x,y-h)> function(x,y))

{ y=y+h;}

H=compare(x,y);

x1=x;

y1=y;

}

cout«"Metod pokoordinatnogo spuska:"«endl;

cout«"X="«x«endl;

cout«"Y="«y«endl;

cout«"F(X,Y)="«C(x,y,h)«endl«endl;

}

//Метод градиентного спуска

void gradient()

{

double x=0.1, y=1.2, x1=0.3, y1=1.1, h=0.0001, H1=0, H=compare(x,y);

while ((C(x1,y1,H1)-C(x,y,H)) > 0.0001)

{

x1=x;

y1=y;

H1=H;

x=x-h*dX(x,y)/norm(x,y);

y=y-h*dY(x,y)/norm(x,y);

H=compare(x,y);

}

cout«"Metod gradientnogo spuska:"«endl;

cout«"X="«x«endl;

cout«"Y="«y«endl;

cout«"F(X,Y)="«C(x,y,H)«endl«endl;

}

void main()

{

clrscr();

gradient();

descent();

random_search();

getch();

}

Результат:

Соседние файлы в папке зелень