Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
01.05.2014
Размер:
2.91 Кб
Скачать
#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();
}
Соседние файлы в папке Лабораторная работа №21