Скачиваний:
14
Добавлен:
01.05.2014
Размер:
4.15 Кб
Скачать
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
double eps=0.0001;

class vector
{
 public:
 double x1,x2;

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

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


	 friend double alfa(vector x,vector p);
	 friend double norma(vector& x);

	 friend double  func(vector x);
	 friend vector df(vector x);

	 friend vector operator+ (vector a,vector b);
	 friend vector operator- (vector a,vector b);
	 friend vector operator* (double n,vector x);
	 friend double operator* (vector a,vector b);
	 friend vector operator/ (vector x,double n);

};

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

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

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

	ostream& operator<<(ostream&s,vector x)
		{
		 return s <<"("<<k1(x)<<" ; "<<k2(x)<<") \n";
		}

	double operator* (vector a,vector b)
	{
	 double c=a.x1*b.x1+a.x2*b.x2;
   return c;
	}

	vector operator/ (vector x,double n)
	{return vector((x.x1/n),(x.x2/n));}

	double func(vector x)
		{
	// return ((1.5-x.x1*(1-x.x2))*(1.5-x.x1*(1-x.x2))+(2.25-x.x1*(1-x.x2*x.x2))*(2.25-x.x1*(1-x.x2*x.x2))+(2.625-x.x1*(1-x.x2*x.x2*x.x2))*(2.625-x.x1*(1-x.x2*x.x2*x.x2)));
		 return (100*(x.x2-x.x1*x.x1)*(x.x2-x.x1*x.x1)+(1+x.x1)*(1+x.x1));
		}

	vector grad(vector x)
		{
		 vector g;
//	 g.x1=2*(x.x2-1)*(1.5-x.x1*(1-x.x2))+2*(x.x2*x.x2-1)*(2.25-x.x1*(1-x.x2*x.x2))+2*(x.x2*x.x2*x.x2-1)*(2.625-x.x1*(1-x.x2*x.x2*x.x2));
		 g.x1=-400*((x.x2-x.x1*x.x1)*x.x1+2+2*x.x1);
//	 g.x2=2*x.x1*(1.5-x.x1*(1-x.x2))+4*x.x1*x.x2*(2.25-x.x1*(1-x.x2*x.x2))+6*x.x1*x.x2*x.x2*(2.625-x.x1*(1-x.x2*x.x2*x.x2));
		 g.x2=200*x.x2-200*x.x1*x.x1;
		 return g;
		}
	double df(vector x,vector p)
		{
		 return (grad(x)*p);
		}

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

 vector DSK(vector x,vector p)
	{
	 double alfa0,alfak;
	 vector x0(0,0),p0(0,0),a(0,0),b(0,0),c(0,0),d(0,0),x1(0,0),x11(0,0),xmin(0,0);

	 double n=fabs((func(x)-df(x,p))/df(x,p));
	 if(n>1)
		{
		 alfa0=1;
		}
	 else
		{
		 alfak=n;
		}

	 x0=x;
	 p0=p;
	 alfak=alfa0;

	 x1=x0+alfak*p0;

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

	 while(func(x0)>func(x1))
		{
		 x0=x1;
		 alfak=2*alfak;
		 x1=x0+alfak*p0;
		}

	 x11=0.5*(x1+x0);

	 if(func(x0)<func(x11))
		{
		 a=x0;
		 c=x11;
		}
	 else
		{
		 a=x11;
		 c=x0;
		}

	 b=0.5*(a+c);

	 d=b+0.5*((func(a)-func(c))*(b-a))/(func(a)-2*func(b)+func(c));

	 while((sqrt((b-d)*(b-d)/(d*d))>eps)||((func(b)-func(d))/func(d))>eps)
		{
		 alfak=alfa0;

		 x1=x0+alfak*p0;

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

		 while(func(x0)>func(x1))
			{
			 x0=x1;
			 alfak=2*alfak;
			 x1=x0+alfak*p0;
			}

		 x11=0.5*(x1+x0);

		 if(func(x0)<func(x11))
			{
			 a=x0;
			 c=x11;
			}
		 else
			{
			 a=x11;
			 c=x0;
			}

		 b=0.5*(a+c);
		 d=b+0.5*((func(a)-func(c))*(b-a))/(func(a)-2*func(b)+func(c));
		 alfa0=alfa0/2;
		 if(func(b)>func(d))
			{
			 x0=b;
			}
		 else
			{
			 x0=d;
			}
		}
	 xmin=0.5*(b+d);
	 return xmin;
	}
 vector FR(vector x1,vector x2,vector p)
	{
	 double beta;
	 beta=(norma(grad(x2))*norma(grad(x2)))/(norma(grad(x1))*norma(grad(x1)));
	 return p=(-1)*(grad(x2))+beta*p;
	}


void main()
	{
	 clrscr();
	 div_t del;
	 double eps=0.0001;
	 int n=1;
	 vector x0(3,0.5),x1(0,0),x2(0,0),p(0,0);
	 x2=x1=x0;
	while (norma(grad(x2))>=eps || (grad(x1))*(grad(x2))>=0.2*norma(grad(x2)));
			{
			 del=div(n,2);
			 if(del.rem==1)
				{
				 p=(-1)*(grad(x2));
				}
			 else
				{
				 p=FR(x1,x2,p);
				}
			 x1=x2;
			 x2=DSK(x1,p);
			 n++;
			}
			cout<<"ЊЁ­Ё¬г¬  = "<<x2<<endl;
			cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ© = "<<n-1<<endl;
			getch();
}
Соседние файлы в папке all