Скачиваний:
13
Добавлен:
01.05.2014
Размер:
1.46 Кб
Скачать
#include <conio.h>
#include <math.h>
#include <iostream.h>

double e = 0.0000001;
double Xo[2] = {0, 0};
double p[2];


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

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

double Swenn4(int i)
{
 double a = 0.1, A, x = 0, B;
 if (dy(x) > 0)
  {
   p[0] = -p[0];
   p[1] = -p[1];
  }
 do
  {
   a = 2*a;
   x += a;
  }
 while(dy(x-a)*dy(x) > 0); //poka znak proizv. ne izm-sa
 A = x-a;
 B = x;
 if (i == 1)
  return(A);
 else
  return(B);
}

double Boltsano()
{
 double x, K = 1, L, A, B;
 A = Swenn4(1);
 B = Swenn4(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] = -3*Xo[0]*Xo[0] +3 ;
 p[1] = -2*Xo[1] + 2;
 }

double Norma(double x, double y)
{
 double res;
 res = sqrt(x*x + y*y);
 return(res);
}

void Method()
{
 double Min, K = 1;

 do
  {
   AntiGrad();
   Min = Boltsano();
   Xo[0] += Min*p[0]; //perexod v novuju to4ku
   Xo[1] += Min*p[1];
   K++;
  }
 while(Norma(Min*p[0], Min*p[1]) > e);

}

void main()
{
 clrscr();

 Method();

 cout << "Min = (" << Xo[0] << " ," << Xo[1] << ")" << endl;

 getch();
}









Соседние файлы в папке Методы Гаусса-Зейделя, Хука-Дживса и Коши