МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Лабораторна робота №
«Дослідження функцій»
Постановка задачі:
Дослідити функцію на мінімум та оптимальне значення на відрізку [-10;10], за допомогою методів:
Покрокового методу;
Методом Золотого перерізу;
Пошуковим методом.
Написати програму визначення мінімуму та оптимального значення.
Покроковий метод:
Програма:
# include <stdlib.h>
# include <stdio.h>
main()
{float min,y,a=-10,b=10,h,x=a,xopt;
int i,n=20;float f(float);
min=f(a);h=(b-a)/n;
for(i=1;i<=n;i++)
{y=f(x);
if(y<min){min=y;xopt=x;}
x+=h;}
printf("xopt=%.2f min=%.2f\n",xopt,min);
getchar();}
float f(float x)
{return(x*x+4*x+5);}
Блок-схема:
Результат:
xopt=-2.00 min=1.00
Метод Золотого перерізу:
Програма
# include <stdlib.h>
# include <stdio.h>
# include <math.h>
main()
{float a=-10,b=10,c,d,eps=1e-4;
int i;float f(float);
while(fabs(b-a)>eps)
{d=b-0.38*(b-a);c=a+0.38*(b-a);
if(f(c)<f(d))b=d;else a=c;
}
printf("xopt=%.2f min=%.2f\n",c,f(c));
getchar();}
float f(float x)
{return(x*x+4*x+5);}
Блок-схема:
Результат:
xopt=-2.00 min=1.00
Пошуковий метод:
Програма
# include <stdlib.h>
# include <stdio.h>
main()
{float min,y,a=-10,b=10,x,xopt;
int i,n=20;float f(float);
min=f(a);randomize();
for(i=1;i<=n;i++)
{x=a+(b-a)*random(n)/n;
y=f(x);
if(y<min){min=y;xopt=x;}
}
printf("xopt=%.2f min=%.2f\n",xopt,min);
getchar();}
float f(float x)
{return(x*x+4*x+5);}
Блок-схема:
Результат:
xopt=-2.00 min=1.00