Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
01.05.2014
Размер:
2.22 Кб
Скачать
#include <conio.h>
#include <math.h>
#include <iostream.h>

double Xo[2];
double p[2];
double e = 0.0000001;

double y(double);
double dy(double);
double Swenn4();
double Devidona();
void AntiGrad();
void ParKas();

double y(double a)
{
 double res, x[2] = {Xo[0] + a*p[0], Xo[1] + a*p[1]};
 res = 4*(x[0] - 5)*(x[0] - 5) + (x[1] - 6)*(x[1] - 6);
 return(res);
}

double dy(double ax)
{
 double res;
 res = (y(ax+e) - y(ax))/e;
 return(res);
}

double Swenn4()
{
 double a = 0.1, A, x = 0;
 static double B = 0, f = 0;
 if (f)
  {
   A = B;
   B = 0;
   f = 0;
   return(A);
  }
 if (dy(x) > 0)
  {
   a = -a;
  }
 do
  {
   a = 2*a;
   x += a;
  }
 while(dy(0)*dy(x) > 0);
 if (a < 0)
  {
   A = x;
   B = x-a;
  }
 else
  {
   A = x-a;
   B = x;
  }
 f = 1;
 return (A);
}

double Devidona()
{
 double r, Z, W, j, K = 1, A, B;
 A = Swenn4();
 B = Swenn4();
 do
 {
  Z = dy(A) + dy(B) + 3*(y(A) - y(B))/(B-A);
  W = sqrt(Z*Z - dy(A)*dy(B));
  j = (W - dy(A) + Z)/(2*W - dy(A) + dy(B));
  r = A + (B-A)*j;
  if (dy(r) > 0)
   B = r;
  else
   A = r;
  K++;
 }
 while(fabs(dy(r)) > e);
 return(r);
}

void AntiGrad()
{
 p[0] = -8*(Xo[0] - 5);
 p[1] = -2*(Xo[1] - 6);
}

void ParKas()
{
 double K = 1, Min, X1[2] = {Xo[0], Xo[1]}, X2[2], NormaD;

 AntiGrad();
 Min = Devidona();
 Xo[0] += Min*p[0];
 Xo[1] += Min*p[1];      

 X2[0] = Xo[0];
 X2[1] = Xo[1];

 do
  {
   AntiGrad();
   Min = Devidona();
   Xo[0] += Min*p[0];
   Xo[1] += Min*p[1];

   p[0] = Xo[0] - X1[0];
   p[1] = Xo[1] - X1[1];
   Min = Devidona();
   Xo[0] += Min*p[0];
   Xo[1] += Min*p[1];

   NormaD = sqrt(p[0]*p[0] + p[1]*p[1]);
   if(NormaD < e)
    {
     cout << "K = " << K << endl;
     return;
    }

   X1[0] = X2[0];
   X1[1] = X2[1];

   X2[0] = Xo[0];
   X2[1] = Xo[1];

   K++;
  }
 while(1);
}

void main ()
{
 do
  {
   clrscr();
   cout << "Xo[0] = ";
   cin >> Xo[0];
   cout << "Xo[1] = ";
   cin >> Xo[1];
   cout << endl;
   ParKas();
   cout << "Min = (" << Xo[0] << ", " << Xo[1] << ")" << endl << endl;
   cout << "Esc - exit, Enter - continue";
  }
 while(getch() != 27);
}
Соседние файлы в папке Лабораторная работа №41