- •Лабораторная работа №1. Безусловная одномерная оптимизация.
- •Содержание
- •Постановка задачи
- •Пассивный оптимальный метод
- •2.1. Расчет количества экспериментальных точек.
- •Блок-схема алгоритма
- •Алгоритм блочного равномерного поиска
- •3.2.Блок-схема алгоритма
- •3. Алгоритм деления интервала пополам
- •3.2. Блок-схема алгоритма
- •5. Метод дихотомии
- •5.2. Блок-схема алгоритма
- •6. Метод золотого сечения
- •6.2. Блок-схема алгоритма
- •7. Метод Фибоначчи
- •7.2. Блок-схема алгоритма
- •8. Метод касательных
- •8.2. Блок-схема алгоритма
- •9. Метод парабол
- •9.2. Блок-схема алгоритма
- •10. Результаты
Министерство общего и профессионального образования Российской Федерации
Уфимский государственный авиационный технический университет
Кафедра ТК
Лабораторная работа №1. Безусловная одномерная оптимизация.
Вариант 12.
Выполнила: студентка гр. ИВТ – 324
Данилина А.О.
Проверил: доцент каф. ТК
Хасанов А.Ю.
Уфа
2007
Содержание
-
Постановка задачи ………………………………..… …3
-
Пассивный оптимальный метод …………………... ….4
-
Алгоритм блочного равномерного поиска…………….7
-
Алгоритм деления интервала пополам……………….12
-
Метод дихотомии………………………………………16
-
Метод золотого сечения…………………………….....18
-
Метод Фибоначчи………………………………………21
-
Метод касательных……………………………………..25
-
Метод парабол…………………………………………..28
-
Результаты………………………………………………32
-
Постановка задачи
f(x) = x3 – x + e–x —> min на [0, 1] c точностью ε = 10–5.
График функции:
-
Пассивный оптимальный метод
2.1. Расчет количества экспериментальных точек.
По условию задана точность. Определим количество точек следующим образом:
Если N – нечетное, то:
Если N – нечетное, то:
Следовательно, N = 99999.
2.2. Текст программы на С++:
#include<iostream.h>
#include<math.h>
#include<conio.h>
void main()
{
long N=99999;//kol-vo tochek pri tochnosti e=0.00001;
long double x, y, yl, xl, a=0, b=1;
long i;
clrscr();
cout<<"Passivnyi optimalnyi algorytm"<<endl;
cout<<endl<<"Kol-vo tochek = "<<N<<" dlya tochnosti 0,00001"<<endl;
for (i=1; i<N+1; i++) //schet nachin. s 1 ^^
{
x=a+i*(b-a)/(N+1); //vychislenie koordinaty ocherednoy tochki
y=pow(x, 3)-x+exp(-x); //eksperiment y=f(x)
if ((i==1) || (yl>y)) {xl=x; yl=y;} //poisk minimuma
}
cout<<endl<<"y = "<<yl<<endl<<"x = "<<xl;
getch();
}
-
Блок-схема алгоритма
-
Алгоритм блочного равномерного поиска
3.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, x[1000], y[1000], xl, yl;
const double e=0.00001, d = e/10; //pogreshnost i delta
long i, j, n, N, k, l; //n - razmer bloka, N - chislo eksperimentov
clrscr();
cout<<"Vv. razmer bloka n ";
cin>>n;
N=0; //schetchik experimentov
if (n%2==0)
/*razmer bloka - chetnoe chislo*/
{k=n/2;
while (b-a> 2*e)
{for (j=1; j<k+1; j++) //chet nachin. c 1 ^^
{x[2*j]=a+j*(b-a)/(k+1);
x[2*j-1]=x[2*j]-d;
}
for (i=1; i<n+1; i++)
y[i]=f(x[i]);
x[0]=a;
x[n+1]=b;
N+=n; //chetchik experimentov
yl=y[1]; l=1;xl=x[1]; /*blok-shemu prodolj otsuda!!!*/
for (i=2; i<n+1; i++)
if (y[i]<yl) {yl=y[i]; xl=x[i]; l=i;}//opred. t.minimuma
a=x[l-1];//izmenenie otrezka neopred
b=x[l+1];
}
xl=(a+b)/2;
yl=f(xl);
}
/*razmer bloka - nechetnoe chislo*/
else
{
k=(n+1)/2; //nomer "sredney" tochki
x[k]=(a+b)/2;
y[k]=f(x[k]);
N=1;
while (b-a>2*e)
{
for (i=1; i<n+1; i++)
{x[i]=a+i*(b-a)/(n+1);
y[i]=f(x[i]);
}
x[0]=a;
x[n+1]=b;
N+=n-1;
yl=y[1]; xl=x[1]; l=1;
for (i=2; i<n+1; i++)
if (y[i]<yl) {yl=y[i]; xl=x[i]; l=i;} //poisk minimuma
a=x[l-1]; //izmenenie otrezka neopredelennosty
b=x[l+1];
x[k]=xl; y[k]=yl; //srednyja tochka
}
}
printf("x = %.5f \n", xl);
printf("y = %.5f \n", yl);
cout<<"Chislo experimentov: "<<N;
getch();
}