Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №21 / LABA2
.CPP#include<conio.h>
#include<math.h>
#include<iostream.h>
float f(float x)
{
return 2*x*x+3*exp(-x);
}
float Fib(float n)
{
float i,F1=1,F2,F0=1;
if((n==1)||(n==2)) return 1;
for(i=3;i<=n;i++)
{
F2=F0+F1;
F0=F1;
F1=F2;
}
return F2;
}
float N(float Fn)
{
float F2,F0=1,F1=1,n=2;
do
{
F2=F0+F1;
F0=F1;
F1=F2;
n++;
}
while(F2<Fn);
return n;
}
void Swann1(float x1, float* a, float* b)
{
float h, x2;
h=0.0001*fabs(x1);
x2=x1+h;
if (f(x2)>f(x1))
{
h=-h;
x2=x1+h;
}
do
{
x1=x2;
h=2*h;
x2=x1+h;
}
while (f(x2)<f(x1));
*a=x1-0.5*h;
*b=x2;
if (*a>*b)
{
*a=*b+*a;
*b=*a-*b;
*a=*a-*b;
}
}
float Fib1(float* a,float* b)
{
float Ln=0.00001,L1,E,x1,x2;
long n,Fn;
int k=1;
L1=fabs(*b-*a);
Fn=(int)(L1/Ln+0.5);
n=N(Fn);
E=L1/Fib(n+1);
x1=*a+Fib(n-2)/Fn*L1;
x2=*a+Fib(n-1)/Fn*L1;
while(k<5)
{
if (f(x1)<f(x2))
{
*b=x2;
x2=x1;
L1=fabs(*b-*a);
x1=*a+Fib(n-k-2)/Fn*L1;
}
else
{
*a=x1;
x1=x2;
L1=fabs(*b-*a);
x2=*a+Fib(n-k-1)/Fn*L1;
}
k++;
}
x2=x1+E;
if (f(x1)<f(x2)) return (*a+x2)/2;
else return (x1+*b)/2;
}
float DSK(float x1)
{
float E1,E2,h,x2,x3,a,b,c,d;
E1=0.0001;
E2=E1;
if(x1!=0) h=0.01*fabs(x1);
else h=0.01;
do
{
x2=x1+h;
if(f(x2)>f(x1))
{
h=-h;
x2=x1+h;
}
do
{
x1=x2;
h=2*h;
x2=x1+h;
}
while (f(x2)<f(x1));
x3=(x2+x1)/2;
if(f(x3)<f(x1))
{
a=x1;
b=x3;
c=x2;
}
else
{
a=x1-0.5*h;
b=x1;
c=x3;
}
d=b+1/2*((b-a)*(f(a)-f(c)))/(f(a)-2*f(b)+f(c));
if((fabs((d-b)/b)<=E1)&&(fabs((f(d)-f(b))/f(b))<=E2)) return (b+d)/2;
if(f(b)<f(d))
x1=b;
else
x1=d;
h=h/2;
}
while(1);
}
void main()
{
clrscr();
float x0,a,b,Xmin;
cout<<" Laboratornaya rabota 2"<<'\n';
cout<<" Metod polinomial'noy interpoyacii dliya poiska"<<'\n';
cout<<" minimuma celevyih funkciy"<<'\n';
cout<<"Vipolnila: studentka gr.2375"<<'\n';
cout<<" Nikitina T."<<'\n';
cout<<" Variant 1"<<'\n';
cout<<" Metod Fibona44i 1 - Metod Devisa-Svenna-Kempi"<<'\n';
cout<<" "<<'\n';
cout<<"Vvedite na4alnuyu to4ku lokalizacii minimuma: Xo=";
cin>>x0;
Swann1(x0, &a, &b);
cout<<"Interval, polu4ennyiy metodom Swenna: ["<<a<<";"<<b<<"]"<<'\n';
x0=Fib1(&a,&b);
Xmin=DSK(x0);
cout<<"Naydenyiy minimum: x*="<<Xmin;
getch();
}