зелень / Лаба2(Игорь)
.docМинистерство образования и науки,молодежи и спорта Украины
Государственное высшее учебное заведение Украинский государственный химики-технологический университет
Лабораторная работа №2 «Методы безусловной оптимизации функции
нескольких переменных»
Выполнил :
ст.группы 4-СКС-5 Пономарёв В.Н.
Проверил : Зеленцов Д.Г
Днепропетровск 2013
Задание для самостоятельной работы
Построить трех мерный график функции и найти минимум тремя методами
-
Методом покоординатный спуск.
-
Методом случайного поиска
-
Одним из методов:
-
метод градиентного спуска (метод простых итераций)
-
метод наискорейшего спуска
-
метод деформирующего многогранника на дополнительный бал.
Варіант 14
Текст программы:
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
double function(double x, double y)
{
return pow((x-2),4)+pow((x-2y),2);
};
double dX(double x)
{
return 6*x;};
double dY(double y)
{
return 10*y;
};
double norm(double x, double y)
{
return sqrt(dX(x)*dX(x)+dY(y)*dY(y));
};
void random_search ()
{
double min=100, x, y, x1, y1;
for (int i=0; i<=5000; i++)
{
x=(double)rand()/((double)RAND_MAX/0.1);
y=(double)rand()/((double)RAND_MAX/0.1);
if(function(x,y)<min)
{
min=function(x,y);
x1=x;
y1=y;
} }
cout<<"Metod sluchaynogo poiska:"<<endl;
cout<<"X="<<x1<<endl;
cout<<"Y="<<y1<<endl;
cout<<"F(X,Y)="<<function(x1,y1)<<endl<<endl;
}
void gradient()
{
double x1=0.11, y1=0.21, x=0.1, y=0.15, h=0.001;
while ((function(x1,y1)-function(x,y)) > 0.000001)
{
x1=x;
y1=y;
x=x-h*dX(x)/norm(x,y);
y=y-h*dY(y)/norm(x,y);
}
cout<<"Metod gradientnogo spuska:"<<endl;
cout<<"X="<<x<<endl;
cout<<"Y="<<y<<endl;
cout<<"F(X,Y)="<<function(x,y)<<endl<<endl;
}
void descent()
{
double x=-0.01, y=-0.025, h=0.0001, x1=0.1, y1=0.14;
while ((function(x1,y1)-function(x,y)) > 0.00001)
{
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(y)<dY(y+h))) y=y-h;
while (function(x,y-h)<function(x,y))
{ y=y-h; }
if (fabs(dY(y)>dY(y+h))) y=y+h;
while (function(x,y-h)> function(x,y))
{ y=y+h;}
x1=x; y1=y;
}
cout<<"Metod pokoordinatnogo spuska:"<<endl;
cout<<"X="<<x<<endl;
cout<<"Y="<<y<<endl;
cout<<"F(X,Y)="<<function(x,y)<<endl;
}
void main()
{
clrscr();
random_search();
gradient();
descent();
getch();
}
Результат