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

class MyVector
{
 public:
 double x1;
 double x2;
 double x3;

 MyVector(double x=0.0,double y=0.0,double z=0.0)
	{
	 x1=x; x2=y; x3=z;
	}

 friend double  mv1(MyVector& x)
	{
	 return x.x1;
	}
 friend double  mv2(MyVector& x)
	{
	 return x.x2;
	}
 friend double  mv3(MyVector& x)
	{
	 return x.x3;
	}

 friend double norma(MyVector& x);

 friend MyVector grad(MyVector x);

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

};

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

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

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

  ostream& operator<<(ostream&s,MyVector x)
	{
	 return s <<"["<<mv1(x)<<" , "<<mv2(x)<<" , "<<mv3(x)<<"] \n";
	}

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

  MyVector operator/ (MyVector a,double k)
	{
	 return MyVector((a.x1/k),(a.x2/k),(a.x3/k));
	}


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

 MyVector grad(MyVector x)
	{
	 MyVector gradient;
	 gradient.x1=6*x.x1-24;
	 gradient.x2=10*x.x2+30;
	 gradient.x3=56*x.x3+28;
	 return gradient;
	}

 double df(MyVector x,MyVector p)
	{
	 return (grad(x)*p);
	}

 double alfaopt(MyVector x,MyVector p)
	{
	 return ((-6*(x.x1-4)*p.x1-10*(x.x2+3)*p.x2-28*(2*x.x3+1)*p.x3)/(6*(p.x1-4)+10*(p.x2+3)+28*(2*p.x3+1)));
	}


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

 MyVector ort(MyVector ek)
	{
	 for (int i=0; i<3;i++)
		{
		 if(ek.x1==1) {ek.x1=0;ek.x2=1;break;}
		 if(ek.x2==1) {ek.x2=0;ek.x3=1;break;}
		 if(ek.x3==1) {ek.x3=0;ek.x1=1;break;}
		}
	 return ek;
	}

 MyVector DSK(MyVector x,MyVector p)
	  {
	   MyVector x1,x11,xmin,a,b,c,d;
	   double alfa0,alfak,epsDSK=0.0001;
	   int k1=0,k2=0;

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

	   alfak=alfa0;
	   x1=x+alfak*p;

	   if(func(x1)>func(x))
		{
		 p=-1*p;
		}

	   x1=x+alfak*p;

	   while(func(x)>func(x1))
		{
		 x=x1;
		 alfak=2*alfak;
		 x1=x+alfak*p;
		 k1++;
		}

	   x11=(x1+x)/2;

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

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

	   while (((norma(d-b)/norma(d))>=epsDSK)||(abs((func(b)-func(d))/func(d))>=epsDSK))
		{
		 alfak=alfa0;
		 x1=x+alfak*p;

		 if(func(x1)>func(x))
			{
			 p=(-1)*p;
			}

		 x1=x+alfak*p;
		 while(func(x)>func(x1))
			{
			 x=x1;
			 alfak=2*alfak;
			 x1=x+alfak*p;
			 k1++;
			}

		 x11=(x1+x)/2;
		 if(func(x)<func(x11))
			{
			 a=x;
			 b=x11;
			}
		 else
			{
			 a=x11;
			 c=x;
			}

		 b=(a+c)/2;
		 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))
			{
			 x=b;
			}
		 else
			{
			 x=d;
			}
		 k2++;
		}

		xmin=(b+d)/2;
		return (xmin);
	   }

 void main()
	{
	 clrscr();
	 MyVector x0(2,-2,-2),p,x1(0,0,0),d,x11,x22,xmin,ek(0,0,1),help(0,0,0);
	 int n=1;
	 double eps=0.000001;

	 x1=x0;

	 do
		{
		 x11=x1;
		 for (int i=0;i<3;i++)
			{
			 ek=ort(ek);
			 p=ek;
			 x11=DSK(x1,p);
			 if(i==0) help.x1=mv1(x11);
			 if(i==1) help.x2=mv2(x11);
			 if(i==2) help.x3=mv3(x11);
			}

		 x11=help;
		 d=x11-x0;

		 x22=x11+alfaopt(x11,p)*d;
		 x1=x22;
		 x0=x11;
		 ek=ort(ek);
		 p=ek;
		 n++;
		}
	 while(norma(d)>eps);

	 xmin=x11;
	 cout<<"\nMinimum = "<<xmin;
	 cout<<"\nKol-vo iteraci = "<<n;

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