Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
01.05.2014
Размер:
3.14 Кб
Скачать
#include <math.h>
#include <conio.h>
#include <iostream.h>
/**********************************Strukturi*********************************/
struct Dot
{
   double x1,x2;
};
struct Vek
{
   double x1,x2,len;
};
Dot x;
Vek p;
/******************************Celevaya funkciya*****************************/
double f(double k)
{
   return (x.x1+k*p.x1)*(x.x1+k*p.x1)+3*(x.x2+k*p.x2)*(x.x2+k*p.x2)+2*(x.x1+k*p.x1)*(x.x2+k*p.x2);
}
/**********************************Ee proizvodnaya***************************/
double df(double k)
{
   return (2*(x.x1+k*p.x1)+2*(x.x2+k*p.x2))*p.x1+(6*(x.x2+k*p.x2)+2*(x.x1+k*p.x1))*p.x2;
}
/*********************************Metod Swenna*******************************/
void swann(double* a,double* b)
{
   float h1,x1;
   h1=0.01;
   x1=h1;
	if(f(0)<f(x1))
      {
	   h1=-h1;
	   x1=h1;
      }
   do
   {
      h1=2*h1;
	   x1=x1+h1;
   }
   while(f(x1-h1)>f(x1));
   *a=x1-1.5*h1;
	*b=x1;
}
/***********************Metod Zolotogo Se4eniya 2****************************/
double zs_2(double a,double b)
{
   double e,x1,x2;
   int k=0;
	e=0.001;
	x1=a+0.618*fabs(b-a);
   do
	{
      x2=a+b-x1;
      if((x1<x2)&&(f(x1)<f(x2)))
			b=x2;
      if((x1<x2)&&(f(x1)>=f(x2)))
         {
         a=x1;
         x1=x2;
         }
		if((x1>x2)&&(f(x1)<f(x2)))
         a=x2;
		if((x1>x2)&&(f(x1)>=f(x2)))
		   {
         b=x1;
         x1=x2;
		   }
      k++;
   }
   while(k<5);
   return (a+b)/2;
}
/*******************************Metod Devidona*******************************/
double david()
{
	int k=1;
	double e=0.000000001,dfun,a,b,n,h,r,z,w,a0;
	dfun=df(0);
	h=0.000001;
	if(dfun>0)
	{
		p.x1=-p.x1;
		p.x2=-p.x2;
		dfun=df(0);
	}
	do
	{
		h=h+2*h;
	}
	while(dfun*df(h)<0);
	a=h/3;
	b=h;
	do
	{
		z=df(a)+df(b)+3*(f(a)-f(b))/(b-a);
		w=sqrt(z*z-df(a)*df(b));
		r=(w-df(a)+z)/(2*w-df(a)+df(b));
		r*=(b-a);
		if(df(r)<=e) return r;
		if(df(r)>0) b=r;
		else a=r;
	}
	while(k<10);
	return r;
}
/********************************Osnovnaya programma*************************/
void main()
{
	double a,b,n,kmin;
	Dot min;
	clrscr();
   cout<<"\n-Laboratornaya rabota 3. Issledovanie metodov lineynogo poiska.-";
   cout<<"\n-------------------------Variant 1------------------------------";
   cout<<"\n----------------------MZS -> Devidona---------------------------";
   cout<<"\n-------------- Vipolnila: Nikitina T., gr. 2375 ----------------";
   cout<<"\n\n\nCelevaya funkciya: x1^2+3*x2^2+2*x1*x2";
	cout<<"\nVvedite koordinati na4al'noy to4ki poiska: "<<'\n';
	cin>>x.x1>>x.x2;
	cout<<"\nZadayte napravlenie poiska: "<<'\n';
	cin>>p.x1>>p.x2;
	p.len=sqrt(p.x1*p.x1+p.x2*p.x2);
	p.x1=p.x1/p.len;
	p.x2=p.x2/p.len;
	p.len=1;
	swann(&a,&b);
	if(a>b)
   {
     n=a;
     a=b;
	  b=n;
	}
	kmin=zs_2(a,b);
	x.x1=x.x1+kmin*p.x1;
	x.x2=x.x2+kmin*p.x2;
	kmin=david();
	min.x1=x.x1+kmin*p.x1;
	min.x2=x.x2+kmin*p.x2;
	cout<<"\nNaydenaya to4ka minimuma: ("<<min.x1<<" "<<min.x2<<")"<<'\n';
	getch();
}
/*****************************************************************************/
Соседние файлы в папке LABA3