Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
01.05.2014
Размер:
5.31 Кб
Скачать
#include <iostream.h>
#include <conio.h>
#include <math.h>
/*************************Global'nie peremennie******************************/
double p[2],x0[2],a,b;
/******************************Moya funkciya*********************************/
double f(double t)
{
   double x[2];
      for(int k=0;k<2;k++)
          x[k]=x0[k]+t*p[k];
   return (100*pow((x[1]-x[0]*x[0]),2)+pow((1-x[0]),2));
}
/**************************Proizvodnaya funkcii******************************/
double df(double t)
{
   double x[2];
      for(int k=0;k<2;k++)
         x[k]=x0[k]+t*p[k];
   return ((-400*(x[1]-x[0]*x[0])*x[0]-2*(1-x[0]))*p[0]+200*(x[1]-x[0]*x[0])*p[1]);
}
/**********************Antigradientnoe napravlenie***************************/
void napr()
{
   p[0]=400*(x0[1]-x0[0]*x0[0])*x0[0]+2*(1-x0[0]);
   p[1]=-200*(x0[1]-x0[0]*x0[0]);
}
/**********************************Norma*************************************/
double norma(double x1[])
{
   return(sqrt(pow((x1[0]-x0[0]),2)+pow((x1[1]-x0[1]),2)));
}
/****************************Metod Svenna 4**********************************/
void Swann4(double t)
{
   double s=0;
   if(t>fabs((f(0)-df(0))/df(0)))
      t=fabs((f(0)-df(0))/df(0));
   if(df(0)>0)
      for(int k=0;k<2;k++)
	 p[k]=-p[k];
   do
      {
      s=s+t;
      t=2*t;
      }
   while((df(0)*df(s))>0);
   a=s-t/2;
   b=s;
}
/***************************Metod Zolotogo Se4eniya 2************************/
void zs_2()
{
   double e,x1,x2;
   int k=0;
   e=0.001;
   Swann4(1);
	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);
}
/***************************Ras4etnie formuli********************************/
double gam(double c)
{
   double z,w;
   z=df(a)+df(b)+3*(f(a)-f(b))/b;
   w=sqrt(z*z-df(a)*df(b));
   c=a+((z-df(a)+w)/(df(b)-df(a)+2*w))*(b-a);
   return c;
}
/*****************************Metod Devidona*********************************/
double Davidon(double e)
{
   double c;
   zs_2 ();
   do
      {
      c=gam(c);
	   if(df(c)<0)
	 a=c;
	   else
	 b=c;
	   }
   while(fabs(df(c))>e);
   return c;
}
/*****************************Metod Koshi***********************************/
void Koshi (double e)
{
   double alfa,x1[2];
   int k;
   int g=0;
   for(k=0;k<2;k++)
      x1[k]=x0[k];
   do
      {
      g++;
      for(k=0;k<2;k++)
         x0[k]=x1[k];
      napr();
      alfa=Davidon(e);
      for(int k=0;k<2;k++)
         x1[k]=x0[k]+alfa*p[k];
      }
   while((norma(x1)>e)||(fabs(f(0)-f(alfa))>e));
   for(k=0;k<2;k++)
      x0[k]=x1[k];
}
/******************************Huka-Dshivse***********************************/
void Huka_Dshivse(double e)
{
   double alfa, x1[2], x2[2], dlina[2], Xmin[2], x[2];
	int k, d=1, i=0, flag=0, g=0, iter=1;
//Vi4islyaem bazovuyu to4ku vne cikla
  do {
    	 if (d==1)
     		 {
     		 p[0]=1;
     		 p[1]=0;
     		 }
    	 else
    		 {
    		 p[0]=0;
			 p[1]=1;
          d=1;
     		 }
       alfa=Davidon(e);
       for(k=0;k<2;k++)
		 x1[k]=x0[k]+alfa*p[k];
		 d++;
		 i++;
		 for(k=0;k<2;k++)
		 x0[k]=x1[k]+alfa*p[k];
	  }
  while (i<2);
i=0;
d=1;
for(k=0;k<2;k++)
x[k]=x1[k];
//Organizuem osnovnoy cikl
while (iter<100)
//while (flag==0)
{
g++; //Kolli4estvo iteraciy
      //Spusk vdol' koordinatnih osey
  do {
    	 if (d==1)
     		 {
     		 p[0]=1;
     		 p[1]=0;
     		 }
    	 else
    		 {
    		 p[0]=0;
			 p[1]=1;
          d=1;
     		 }
       alfa=Davidon(e);
       for(k=0;k<2;k++)
		 x1[k]=x0[k]+alfa*p[k];
		 d++;
		 i++;
		 for(k=0;k<2;k++)
		 x0[k]=x1[k]+alfa*p[k];
	  }
  while (i<2);
  i=0;
  d=1;
       //Proveryaem KOP
  for(k=0;k<2;k++)
  dlina[k]=x1[k]-x[k];
  if (norma(dlina)<e)
	 {
  for(k=0;k<2;k++)
  Xmin[k]=x1[k];
	 flag=1;
	 }
       //Perehodim v sleduyuwuyu to4ku
  for(k=0;k<2;k++)
  x2[k]=x1[k]+alfa*dlina[k];
		 //Pereimenovivaem to4ki dlya zaciklivaniya
  for(k=0;k<2;k++)
	{
	x0[k]=x2[k];
	x[k]=x1[k];
   }
iter++;
}
}
/***************************Osnovnaya programma******************************/
void main()
{
   clrscr();
   double x01[2]={-1.2,1};
// double x02[2]={1.5,2};
// double x03[2]={-2,-2};
   double e;
   int k;
   cout<<"\n---Laboratornaya rabota 4. Issledovanie gradientnih metodov.---";
   cout<<"\n-------------------------Variant 1-----------------------------";
   cout<<"\n--------------------Metod Huka-Dshivse-------------------------";
   cout<<"\n-------------- Vipolnila: Nikitina T., gr. 2375 ---------------";
   cout<<"\n\n\nCelevaya funkciya: 100(x2-x1^2)^2+(1-x1)^2";
   cout<<"\nNa4al'naya to4ka poiska: Xo = ( -1.2 ; 1 )";
   cout<<"\nVvedite to4nost' poiska: E = ";
	cin>>e;
	Koshi(e);
	cout<<"\nRezul'tat minimizacii metodom Koshi: ";
	cout<<"( "<<x0[0]<<" ; "<<x0[1]<<" )";
	Huka_Dshivse(e);
	cout<<"\nRezul'tat minimizacii metodom Huka-Dshivsa: ";
   cout<<"( "<<x0[0]<<" ; "<<x0[1]<<" )";
   getch();
}
/*********************************The End************************************/
Соседние файлы в папке LABA5