- •Лабораторная работа №1. Безусловная одномерная оптимизация.
- •Содержание
- •Постановка задачи
- •Пассивный оптимальный метод
- •2.1. Расчет количества экспериментальных точек.
- •Блок-схема алгоритма
- •Алгоритм блочного равномерного поиска
- •3.2.Блок-схема алгоритма
- •3. Алгоритм деления интервала пополам
- •3.2. Блок-схема алгоритма
- •5. Метод дихотомии
- •5.2. Блок-схема алгоритма
- •6. Метод золотого сечения
- •6.2. Блок-схема алгоритма
- •7. Метод Фибоначчи
- •7.2. Блок-схема алгоритма
- •8. Метод касательных
- •8.2. Блок-схема алгоритма
- •9. Метод парабол
- •9.2. Блок-схема алгоритма
- •10. Результаты
3.2.Блок-схема алгоритма
3. Алгоритм деления интервала пополам
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()
{
const double e=0.00001; //tochnost`
double a=0, b=1;
double x[5], y[4], yl, xl;
int i, N, l;
clrscr();
printf("Method delenija intervala popolam \n");
x[2]=(a+b)/2; //seredina otrezka neopredelennosty
y[2]=f(x[2]);
N=1; //schetchik experimentov
while (b-a > 2*e)
{
x[0]=a;
x[4]=b;
x[1]=(a+x[2])/2;
y[1]=f(x[1]);
x[3]=(x[2]+b)/2;
y[3]=f(x[3]);
N+=2;
/*poisk minimuma*/
yl=y[1]; xl=x[1]; l=1;
for (i=2; i<4; i++)
if (yl>y[i]) {yl=y[i]; xl=x[i]; l=i;}
/*-------------*/
a=x[l-1];
b=x[l+1];
x[2]=xl;
y[2]=yl;
}
printf("\nx = %.5f \ny = %.5f \n\nKol-vo experimentov: %i", x[2], y[2], N);
getch();
}
3.2. Блок-схема алгоритма
5. Метод дихотомии
5.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()
{
const double e=0.00001, d=e/10; //tochnost` i delta
double a=0, b=1;
double x, y1, y2;
int N;
clrscr();
printf("Method dihotomii \n\n");
N=0; //schetchik experimentov
while (b-a > 2*e)
{
x=(a+b)/2;
y1=f(x-d);
y2=f(x+d);
N+=2;
(y1 < y2 ? b=x+d : a=x-d);
}
x=(a+b)/2;
y1=f(x);
printf("x = %.5f \ny = %.5f \n\nKov-vo experimentov: %i",x, y1, N);
getch();
}
5.2. Блок-схема алгоритма
6. Метод золотого сечения
6.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 sqr(double x) //kvadrat
{return x*x;
}
void main()
{
const double e=0.00001, t=0.5*(1+sqrt(5)); //tochnost` i proporcia (tau:)
double a=0, b=1;
double x1,x2, y1, y2, x;
int N=0;
clrscr();
printf("Method zolotogo sechenija \n\n");
x1=a+(b-a)/sqr(t);
y1=f(x1);
x2=a+(b-a)/t;
y2=f(x2);
N+=2;
while ((b-a)/t > 2*e)
if (y1<y2) {b=x2;
x2=x1;
y2=y1;
x1=a+b-x2;
y1=f(x1); N++;
}
else {a=x1;
x1=x2;
y1=y2;
x2=a+b-x1;
y2=f(x2); N++;
}
(y1<y2 ? x=(a+x2)/2 : x=(x1+b)/2);
y1=f(x);
printf("x = %.5f \ny = %.5f \n\nKov-vo experimentov: %i",x, y1, N);
getch();
}
6.2. Блок-схема алгоритма
7. Метод Фибоначчи
7.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()
{
const double e=0.00001, d=e/10;
const long Fn=50000; //N > (b-a)/(2*e)
long i, fnext, fpred, F, N;
double x1,x2, y1,y2, a=0, b=1;
clrscr();
cout<<"Method chisel Fibonachchi"<<endl<<endl;
//vychislyaem chisla fibbonachi
fpred=1; fnext=1; //f[0], f[1]
F=0; N=2;
while (F<Fn)
{F=fnext+fpred; //f[i]=[i-1]+f[i-2]
N++;
if (F<Fn)
{fpred=fnext; //[f[i-1] -> f[i-2]
fnext=F; //f[i] -> f[i-1]
}
}
/*fpred=f[n-2] , fnext=f[n-1], F=f[n] */
cout<<"Kol-vo chisel Fibonachchi: "<<N<<endl;
//vychislyaem ishodnye tochki
x1=a+fpred*(b-a)/F;
x2=a+fnext*(b-a)/F;
y1=f(x1);
y2=f(x2);
i=2; //schetchik experimentov
//umenshaem otrezok neopredelennosty (stepS 4-6)
do
{if (y1<y2) {b=x2; x2=x1; y2=y1; x1=a+b-x2; y1=f(x1);}
else {a=x1; x1=x2; y1=y2; x2=a+b-x1; y2=f(x2);}
i++;
} while (i<N-1);
if (y1<y2) {b=x2; x2=x1; y2=y1;}
else a=x1;
x1=x2-d;
y1=f(x1); i++;
if (y1<y2) b=x2;
else a=x1;
x1=(a+b)/2; y1=f(x1);
printf("x = %.5f \n", x1);
printf("y = %.5f \n \n", y1);
cout<<"kol-vo experimentov: "<<i;
getch();
}