 
        
        
          Добавил:
          
          
        
        
    
            Studfiles2
            
            
            
            
            
            Опубликованный материал нарушает ваши авторские права? Сообщите нам.
          
          Вуз:
          Предмет:
          Файл:Градиентные методы / XUKA-DZI
.CPP#include <conio.h>
#include <math.h>
#include <iostream.h>
double e = 0.0000001;
double Xo[2] = {6, 6};
double p[2];
double y(double a)
{
 double res, x[2] = {Xo[0] + a*p[0], Xo[1] + a*p[1]};
 res = 8*x[0]*x[0] + 4*x[0]*x[1] + 5*x[1]*x[1];
 return(res);
}
double dy(double x)
{
 double res;
 res = (y(x+e) - y(x))/e;
 return(res);
}
double Swenn(int i)
{
 double a = 0.1, A, x1 = 0, x2, B;
 x2 = x1 + a;
 if (y(x1) < y(x2))
  {
   p[0] = -p[0];
   p[1] = -p[1];
  }
 while(y(x1) > y(x2)) 
  {
   a = 2*a;
   x1 = x2;
   x2 = x1 + a;
  }
 A = x1-a;
 B = x2;
 if (i == 1)
  return(A);
 else
  return(B);
}
double Boltsano()
{
 double x, K = 1, L, A, B;
 A = Swenn(1);
 B = Swenn(2);
 x = (A + B)/2;
 while((fabs(dy(x)) > e) || (L > e))
  {
   if (dy(x) < 0)
    A = x;
   else
    B = x;
   L = B - A;
   x = (A + B)/2;
   K++;
  }
 return(x);
}
void AntiGrad()
{
 p[0] = -16*Xo[0] - 4*Xo[1];
 p[1] = -4*Xo[0] - 10*Xo[1];
 
}
double Norma(double x, double y)
{
 double res;
 res = sqrt(x*x + y*y);
 return(res);
}
void Method()
{
 double Min, X1[2], K = 1;
 X1[0] = Xo[0];
 X1[1] = Xo[1];
 do
  {
   p[0] = 1;
   p[1] = 0;
   Min=Boltsano();
   Xo[0]+=Min*p[0];
   p[0] = 0;
   p[1] = 1;
   Min=Boltsano();
   Xo[1]+=Min*p[1];
   p[0] = Xo[0]-X1[0];
   p[1] = Xo[1]-X1[1];
   X1[0] = Xo[0];
   X1[1] = Xo[1];
   K++;
   if(Norma(p[0],p[1])<e)
    break;
   Min=Boltsano();
   Xo[0]+=Min*p[0];
   Xo[1]+=Min*p[1];
  }
 while(K < 100);
 cout << "K ="  << K << endl;
}
void main()
{
 clrscr();
 Method();
 cout << "Min = (" << Xo[0] << " ," << Xo[1] << ")" << endl;
 getch();
}
          Соседние файлы в папке Градиентные методы
          
      
    
    
    
          