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

double grad1,grad2,grad3,eps=0.00001;

class vector
{
 double x1,x2,x3;
 public:

   vector (double x11=0.0,double x22=0.0,double x33=0.0)
	{
	 x1=x11;
	 x2=x22;
	 x3=x33;
	}

   friend double k1(vector& x)
	{
	 return x.x1;
	}
   friend double k2(vector& x)
	{
	 return x.x2;
	}
   friend double k3(vector& x)
	{
	 return x.x3;
	}

   friend double  func(vector x);
   friend double  df(vector x,vector p);
   friend double norma(vector x);

   friend vector operator+ (vector a,vector b);
   friend vector operator- (vector a,vector b);
   friend vector operator* (double k,vector a);

};
  vector operator +(vector a,vector b)
	{
	 return vector((a.x1+b.x1),(a.x2+b.x2),(a.x3+b.x3));
	}

  vector operator -(vector a,vector b)
  {
   return vector((a.x1-b.x1),(a.x2-b.x2),(a.x3-b.x3));
  }

  vector operator* (double k, vector x)
  {
   return vector((k*x.x1),(k*x.x2),(k*x.x3));
  }

  ostream& operator<<(ostream&s,vector x)
  {
   return s <<"["<<k1(x)<<", "<<k2(x)<<", "<<k3(x)<<"] ";
  }

  double func(vector x)
  {
   return (3*(x.x1-4)*(x.x1-4)+5*(x.x2+3)*(x.x2+3)+7*(2*x.x1+1)*(2*x.x1+1));
  }

  double df(vector x,vector p)
	{
	 double h=0.0001;
	 vector e1(1,0,0), e2(0,1,0), e3(0,0,1);
	 grad1=(func(x+h*e1)-func(x-h*e1))/2*h;
	 grad2=(func(x+h*e2)-func(x-h*e2))/2*h;
	 grad1=(func(x+h*e3)-func(x-h*e3))/2*h;
	 return (grad1*p.x1+grad2*p.x2+grad3*p.x3);
	}

 double norma(vector x)
	{
	 return sqrt(x.x1*x.x2+x.x2*x.x2+x.x3*x.x3);
	}

void main()
{
 clrscr();

 double alfa;
 int k=0;

 vector x0(2,-2,-2), x1(0,0,0), p0(1,1,1), xk(0,0,0), a(0,0,0), b(0,0,0), xmin(0,0,0),L(0,0,0);

 alfa=0.01;

 if (df(x0,p0)>0)
   {
	p0=-1*p0;
   }

 x1=x0;

 while(df(x1,p0)*df(x0,p0)>0)
  {
   alfa=2*alfa;
   x1=x1+alfa*p0;
  }

 a=x1+(-1)*alfa*p0;
 b=x1;

 cout<<"Ќ з «м­л© Ё­вҐаў « = "<<a<<b;

 xk=0.5*(a+b);
 L=b-a;

 while((norma(L)>eps)||(df(xk,p0)>eps))
	{
	 xk=0.5*(a+b);

	 if(df(xk,p0)>0)
		{
		 b=xk;
		}
	 else
		{
		 a=xk;
		}
	 L=b-a;
	 k++;
	}

 xmin=xk;
 cout<<"\nЊЁ­Ё¬г¬ = "<<xmin;
 cout<<"\nЉ®«ЁзҐбвў® ЁвҐа жЁ© = "<<k;

 getch();

}
Соседние файлы в папке all