- •Лабораторная работа №1. Безусловная одномерная оптимизация.
- •Содержание
- •Постановка задачи
- •Пассивный оптимальный метод
- •2.1. Расчет количества экспериментальных точек.
- •Блок-схема алгоритма
- •Алгоритм блочного равномерного поиска
- •3.2.Блок-схема алгоритма
- •3. Алгоритм деления интервала пополам
- •3.2. Блок-схема алгоритма
- •5. Метод дихотомии
- •5.2. Блок-схема алгоритма
- •6. Метод золотого сечения
- •6.2. Блок-схема алгоритма
- •7. Метод Фибоначчи
- •7.2. Блок-схема алгоритма
- •8. Метод касательных
- •8.2. Блок-схема алгоритма
- •9. Метод парабол
- •9.2. Блок-схема алгоритма
- •10. Результаты
7.2. Блок-схема алгоритма
8. Метод касательных
8.1. Текст программы на С++
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
double f(double x)
{double f;
f=pow(x, 3)-x+exp(-x);
return f;
}
double df(double x)
{double f;
f=3*pow(x, 2)-1-exp(-x);
return f;
}
void main()
{
const double e=0.00001;
double y1,y2, z1, z2, s, z, y, xr, yr, x, a=0, b=1;
int i, N;
clrscr();
//N=0; //Schetchik experimentov
y1=f(a);
y2=f(b);
z1=df(a);
z2=df(b);
N=4;
do
{
s=((z2*b - z1*a)-(y2-y1))/(z2-z1);
y=f(s);
z=df(s);
N+=2;
if (z==0) {x=s; break;}//smthwrng
if (z>0) {b=s; y2=y; z2=z;}
else {a=s; y1=y; z1=z;}
} while (b-a>2*e);
if (z!=0) {x=(a+b)/2; y=f(x);}
printf("Metod kasatelnyh \n \n");
printf("x = %.5f \n", x);
printf("y = %.5f \n \n", y);
printf("Kol-vo experimentov: %i", N);
getch();
}
8.2. Блок-схема алгоритма
9. Метод парабол
9.1. Текст программы на С++
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
double f(double x)
{double f;
f=pow(x, 3)-x+exp(-x);
return f;
}
void main()
{double a=0, b=1, c, ya, yb, yc, s, t, yt, x, y;
const double e=0.00001;
int N;
clrscr();
cout<<"Method parabol "<<endl<<endl;
do
{cout<<"Vv. c ";
cin>>c;
}while ((a>=c) || (b<=c) || (f(a)<=f(c)) || f(b)<=f(c));
ya=f(a);
yb=f(b);
yc=f(c);
N=3;//kol-vo experimentov
while (b-a>2*e)
{
s=c+0.5*( (b-c)*(b-c)*(ya-yc) - (c-a)*(c-a)*(yb-yc) )/( (b-c)*(ya-yc) + (c-a)*(yb-yc) );
if (s==c) t=(a+c)/2; //see here
else t=s;
yt=f(t); N++;
if (t<c)
{
if (yt<yc) {b=c; yb=yc; c=t; yc=yt;}
else if (yt>yc) {a=t; ya=yt;}
else {a=t; ya=yt; b=c; yb=yc; c=(a+b)/2; yc=f(c); N++;}
}
else if (t>c)
{
if (yt<yc) {a=c; ya=yc; c=t; yc=yt;}
else if(yt>yc) {b=t; yb=yt;}
else {a=c; ya=yc; b=t; yb=yt; c=(a+b)/2; yc=f(c); N++; }
}
}
x=(a+b)/2; y=f(x);
printf("\nx = %.5f \n", x);
printf("y = %.5f \n \n", y);
cout<<"Kol-vo tochek: "<<N;
getch();
}
9.2. Блок-схема алгоритма
10. Результаты
Метод |
Результат |
Кол-во экспериментов |
Пассивный оптимальный |
X=0.70564; y = 0.13951 |
99999 |
Блочный |
X=0.70565; y = 0.13951 (n=2) |
32 |
Деления интервала пополам |
X=0.70564; y = 0.13951 |
33 |
Дихотомии |
X=0.70564; y = 0.13951 |
32 |
Золотого сечения |
X=0.70565; y = 0.13951 |
24 |
Фибоначчи |
X=0.70564; y = 0.13951 |
25 |
Касательных |
X=0.70565; y = 0.13951 |
36 |
Парабол |
X=0.70564; y = 0.13951 (c=0.8) |
15 |
Вывод
Как следует из таблицы, лучшим методом для решения заданной оптимизационной задачи является метод парабол.