Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №4

.cpp
Скачиваний:
4
Добавлен:
01.05.2014
Размер:
4.28 Кб
Скачать


#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>

struct point{
   double x1,x2;      //cokranit data dlya tochki
	    }x,xt;

typedef  struct point  pointt;
typedef pointt* ppoint;

struct vector{
   double p1,p2;
	    }p;

struct inter{
   double a1,b1;
	 }interv;

struct naprav
	    {
	      double px[2],pt[2];

	    }px,pt;

void init_point (double x0, double y0)
  {
      double e=0.1;
      x.x1=x0;  x.x2=y0;
      xt.x1=x0+e;  xt.x2=y0;

     }

void init_vector (double px0, double py0)

    {
      p.p1=px0;  p.p2=py0;

     }

double F(double k)
 {
   double x1,x2;

   x1=x.x1+k*px.px[0];
   x2=x.x2+k*px.px[1];
   return(4*(x1-5)*(x1-5)+(x2-6)*(x2-6));
 }

 double diff_F(double k)
 {
    double x1,x2;
    x1=x.x1+k*px.px[0];
    x2=x.x2+k*px.px[1];
    return(8*(x1-5)*px.px[0]+2*(x2-6)*px.px[1]);
 }

void Swenn(void)
  {
    int k=1;
    double s=0,t=1,help,help1;
    help1=diff_F(0);

    if(help1>0)    //izmenit napravlenia
	   {
	     t=-t;
	   }
    do
	{
	    s=s+k*t;
	    k=2*k;
	    help=diff_F(s);

	 }while(diff_F(0)*(help)>0);

	interv.a1=s-k/2;
	interv.b1=s;
     }

//**********************************************************

void bolcano(void)
{
  int k=1;
  double e = 0.0001,x1,a1,b1;
  a1=interv.a1;
  b1=interv.b1;

  while(k<5)
     {
       x1=(a1+b1)/2;

       if((fabs(diff_F(x1))<=e)&&(fabs((a1-b1)/2)<=e))
	 {
	    return ;
	 }
       if(diff_F(x1)>0)
	  {
	   b1=x1;
	  }
	else
	{
	   a1=x1;
	}
       k++;
     }

  interv.a1=a1;
  interv.b1=b1;

}

//**********************************************************

double powell(void)
	   {
	     double E=0.0001,a,b,c,d;
	     int k=1;

	     double help1,help2;
	     a=interv.a1;
	     c=interv.b1;
	     b=(a+c)/2;

		  help1=( (b*b-c*c)*F(a)+(c*c-a*a)*F(b)+(a*a-b*b)*F(c));
		  help2= (b-c)*F(a)+(c-a)*F(b)+(a-b)*F(c);
		  d=help1/(2*help2) ;

	     while(fabs((d-b)/b)>E && fabs( (F(d)-F(b))/F(b) )>E)
		  {
		    if(k>1)
		      {
			help1=(b-c)*(c-a)*(F(a)-F(b));
			help2=(b-c)*(F(a))+(c-a)*(F(b))+(a-b)*(F(c));
			d=((a+b)/2) + help1/(2*help2) ;
		      }
			if(b<d)
			   {
			    if(F(b)<F(d))
			      {
				c=d;
			      }
			    else{
				   a=b;
				   b=d;
				}
			   }

			if(b>d)
			   {
			    if(F(b)<F(d))
			       {
				 a=d;
			       }
			    else
			       {
				 b=d;
				 c=b;
				}
			    }
			 k++;
		       }
	   return((b+d)/2);
	  }

 //******************************************************
 double lab3(void)

  {
      Swenn();
      bolcano();

     double min;
     min = powell();

     return min;

}

//********************************************

void fonct_naprav(struct point x,struct point xt )

   {
		px.px[0]=8*(x.x1-5) ;
		px.px[1]=2*(x.x2-6);

		pt.pt[0]=8*(xt.x1-5) ;
		pt.pt[1]=2*(xt.x2-6);

  }


//*********************************************

  ppoint avragenie(void)
    {

       double e=0.01,min,d[2],help,help2;
       int k=1;
       struct point *x3;
       x3=new (struct point) ;

       do{
	   if(k==1)
	     {
	      fonct_naprav(x,xt);
	     }
	 min=lab3();

	 x.x1=x.x1+(min)*px.px[0];
	 x.x2=x.x2+(min)*px.px[1];

	 xt.x1=xt.x1+(min)*pt.pt[0];
	 xt.x2=xt.x2+(min)*pt.pt[1];

	 d[0]=x.x1- xt.x1;
	 d[1]=x.x2-xt.x2;

	 fonct_naprav(x,xt);
	 min=lab3();

	 x3->x1=x.x1+ (min)*d[0];
	 x3->x2=x.x2+ (min)*d[1];

	 init_point(x3->x1,x3->x2);

	 fonct_naprav(x,xt);

	 help2=( pow(px.px[0],2)+pow(px.px[1],2));

	 help= (pow(d[0],2)+pow(d[1],2) );

	 k++;
     }while(sqrt(help)>e||sqrt(help2)>e);
      cout<<"\n   tislo iterasi  "<<k;
      return x3;
  }

//****************************************************************

void main ()
{
   ppoint  min;
   double x0,y0 ;
   //int k;
   clrscr();
   cout<<"Enter  the starting interval"<<"\n";
   cin>>x0>>y0;
   init_point( x0,y0);

   cout<<"\n";

   min=avragenie();
   //cout<<"Chiclo iterasii"<<k;

   cout<<"\n\n"<<"***********Method lineinix poisk (Avragenie) ********"<<"\n";
   cout<<"The minimum point is:("<<min->x1 << ","<<min->x2 <<")"<<"\n";

   getch();

}