safronovba_opt_lab2x

реклама
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Национальный исследовательский
Томский Политехнический университет
Институт кибернетики
Кафедра информатики и проектирования систем
Отчет по лабораторной работе №2
по дисциплине МЕТОДЫ ОПТИМИЗАЦИИ
вариант 10
Одномерная оптимизация 1
Разработчик:
студент группы 8в83
Б.А. Сафронов
Согласовано:
Березняк Ю.В.
Томск 2011
2
Задание
Найти точку минимума x* функции f(x) на отрезке [a,b] с точностью
Ε=10-5 и минимальное значение f(x*).
Подсчитать число итераций и число вычислений функции f(x).
Применить методы:
1. Общего поиска;
2. Деления пополам;
3. Золотого сечения;
Сравнить результаты.
Описание методов сужения интервала неопределенности
Общий поиск
В этом методе интервал [a, b] делится на несколько равных частей с
последующим вычислением значений функции в узлах полученной сетки. В
качестве минимума принимается абсцисса с минимальным вычисленным
значением функции.
В результате интервал неопределенности сужается до двух шагов сетки.
Деление интервала пополам
Разделим интервал [a, b] на две равные части, а затем каждую из частей
еще на две равные части.
3
Это первый этап поиска минимума. На нем после пяти вычислений
функции (два - на краях и три - внутри интервала [a, b]) интервал
неопределенности сужается вдвое, то есть на этом этапе α =0,5. Новый
интервал неопределенности [x4,x5] снова разделим пополам, а затем каждую
половину снова пополам. Теперь значения функции по краям и в его
середине уже известны. Поэтому для завершения поиска на этом этапе
требуется вычислить только два значения функции, после чего интервал
неопределенности снова уменьшится вдвое.
Золотое сечение
Деление интервала на неравные части позволяет найти еще более
эффективный метод. Вычислим функцию на концах отрезка [a, b] и положим
a=x1, b=x2. Вычислим также функцию в двух внутренних точках x3, x4.
Сравним все четыре значения функции и выберем среди них наименьшее.
Пусть, например, наименьшим оказалось f(x3). Очевидно, минимум
находиться в одном из прилегающих к нему отрезков. Поэтому отрезок [x4,b]
можно отбросить и оставить отрезок [a,x4].
Первый шаг сделан. На отрезке [a,x4] снова надо выбрать две
внутренние точки, вычислив в них и на концах значения функции и сделать
следующий шаг. Но на предыдущем шаге вычислений мы уже нашли
функцию на концах нового отрезка [a,x4] и в одной его внутренней точке x4.
Потому достаточно выбрать внутри [a,x4] еще одну точку x5 определить в
ней значение функции и провести необходимые сравнения. Это вчетверо
уменьшает объем вычислений на одном шаге процесса. Как выгодно
размещать точки? Каждый раз оставшийся отрезок делиться на три части и
затем отбрасывается один из крайних отрезков.
4
Исходный код программы
double Fm;
int Countf;
int Counti;
double f(double x)
{
Countf++;
return pow(x,4)+8*pow(x,3)-6*pow(x,2)-72*x+90;
}
double Search(double e,double a,double b)
{
double h = e/2,Fn,xm;
Countf = 0;
Countf = 0;
Fm = f(a);
xm = a;
for ( double x = a+h; x < b+h/2; x+=h)
{
Fn = f(x);
if (Fn < Fm )
{
Fm = Fn;
xm = x;
}
}
Counti++;
return xm;
}
double Bisection(double e,double a,double b)
{
double h = 0,xm;
Countf = 0;
Counti = 0;
xm = (b+a)/2;
h = (b-a)/4;
double xh1
xh2
Fh1
Fh2
= a + h,
= b - h,
= f(xh1),
= f(xh2);
Fm = 0;
while( (b - a) > e)
{
Counti++;
if( Fh1 < Fm)
{
b = xm;
xm = xh1;
Fm = Fh1;
}
else
{
if( Fh2 < Fm)
{
a = xm;
xm = xh2;
Fm = Fh2;
}
else
{
5
a = xh1;
b = xh2;
}
}
h =
xh1
xh2
Fh1
Fh2
(b-a)/4;
= a + h;
= b - h;
= f(xh1);
= f(xh2);
}
return xm;
}
double GoldRatio(double e,double a,double b)
{
double h,xm;
Countf = 0;
Counti = 0;
double fi =(sqrt(5)+1)/2;
h = (b-a)/fi;
double xh1 = a + h,
xh2 = b - h,
Fh1 = f(xh1),
Fh2 = f(xh2);
while ((b - a) > e)
{
Counti++;
if (Fh2 < Fh1)
{
Fm = Fh2;
xm = xh2;
b = xh1;
h = (b-a)/fi;
xh1 = xh2;
xh2 = b - h;
Fh1 = Fh2;
Fh2 = f(xh2);
}
else
{
xm = xh1;
a = xh2;
xh2 = xh1;
h = (b-a)/fi;
xh1 = a + h;
Fm = Fh1;
Fh2 = Fh1;
Fh1 = f(xh1);
}
}
return xm;
}
int main()
{
double e,a,b;
double yS,yB,yG,xS,xB,xG;
cout<<"enter interval\n";
cin>>a;
6
cin>>b;
cout<<"enter e:\n";
cin>>e;
cout<<"Method
"<<"\n";
"<<" Calculations "<<" Iterations "<<"
xS = Search(e,a,b);
yS = Fm;
cout<<"Search
"<<Countf<<"
Xmin
"<<Counti<<"
"<<"
"<<xS<<"
F(Xmin)
"<<yS<<"\n";
xB = Bisection(e,a,b); yB = Fm;
cout<<"Bisection
"<<Countf<<"
"<<Counti<<"
"<<xB<<"
"<<yB<<"\n";
xG = GoldRatio(e,a,b); yG = Fm;
cout<<"GoldRatio
"<<Counti<<"
"<<Counti<<"
"<<xG<<"
"<<yG<<"\n";
cout<<"\n";
return 0;
}
Результаты
Рис. 1 Результаты работы программы
Вывод
В данной лабораторной работе была найдена точка минимума для
заданной функции с помощью различных методов.
Метод общего поиска является самым простым, однако требует
большого количества вычислений функции (более 100000). Метод деления
пополам требует намного меньше вычислений функции (34) засчёт того, что
интервал неопределённости сужается вдвое. Метод золотого сечения
является самым эффективным и находит точку минимума функции,
вычислив значение функции 23 раз. Это обусловлено делением интервала
неопределённости на неравные части и отбросом «лишних» частей,
гарантированно не имеющих точек минимума.
Скачать