зелень / Лаба3(Игорь)
.docМинистерство образования и науки,молодежи и спорта Украины
Государственное высшее учебное заведение Украинский государственный химики-технологический университет
Лабораторная работа №3 «Задачи двумерной оптимизации с ограничениями»
Выполнил
ст.группы 4-СКС-5 Пономарёв В.Н.
Проверил : Зеленцов Д.Г
Днепропетровск 2013
Найти минимум функции методом штрафных функций.
На дополнительный бал методом проекции градиента.
-
Покоординатный спуск.
-
Случайного поиска
-
Одним из:
а)метод градиентного спуска (метод простых итераций)
б)метод наискорейшего спуска
метод деформирующего многогранника на дополнительный
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();
}
Результат: