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

class Vect
{
 double x,y,z;
 public:

 Vect(double x1=0,double y1=0,double z1=0)
   {
	x=x1;
	y=y1;
	z=z1;
   }
 Vect operator * (double k);
 Vect operator - (Vect& B);
 Vect operator + (Vect& B);

 void Print(void)
   {
     if(z)
        printf("( %6.4f ,%6.4f ,%6.4f )  ",x,y,z);
     else
        printf("( %6.4f ,%6.4f )  ",x,y);
   }
 void Invers(void)
   {
      x=-x;
      y=-y;
      z=-z;
   }
 double Modul(void)
   { return sqrt(x*x+y*y+z*z);
   }
 double GetX()
   { return x;
   }
 double GetY()
   { return y;
   }
 double GetZ()
   { return z;
   }
};
//////////////////////////////////////////////////////////
Vect Vect::operator + (Vect &W)
  {
    Vect V;
    V.x=this->x+W.x;
    V.y=this->y+W.y;
    V.z=this->z+W.z;
    return(V);
  }
Vect Vect::operator - (Vect &W)
  {
    Vect V;
    V.x=this->x-W.x;
    V.y=this->y-W.y;
    V.z=this->z-W.z;
    return(V);
  }
Vect Vect::operator * (double k)
  {
    Vect V;
    V.x=this->x*k;
    V.y=this->y*k;
    V.z=this->z*k;
    return(V);
  }
////////////////////////////////////////////
double F1(Vect V)
  {return (pow(V.GetX(),3)+pow(V.GetY(),2)-3*V.GetX()-2*V.GetY()+2);
  }
double F2(Vect V)
  {return (4*pow(V.GetX()-5,2)+pow(V.GetY()-6,2));
  }
double F3(Vect V)
  {return (pow(V.GetX()-1,2)+pow(V.GetY()-3,2)+4*pow(V.GetZ()+5,2));
  }
Vect GrF1(Vect V)
  {Vect gr(3*pow(V.GetX(),2)-3,2*V.GetY()-2);
   return gr;
  }
Vect GrF2(Vect V)
  {Vect gr(8*V.GetX()-40,2*V.GetY()-12);
   return gr;
  }
Vect GrF3(Vect V)
  {Vect gr(2*V.GetX()-2,2*V.GetY()-6,8*V.GetZ()+40);
   return gr;
  }
///////////////////////////////////////////////////////
Vect Pk,X0[3];
double Ex;
int Nfunc=0,N=2;
double (*Functions[3])(Vect)={F1,F2,F3};
Vect (*Grads[3])(Vect)={GrF1,GrF2,GrF3};
/////////////////////////////////////////////////////////
double GetGr(Vect V)
  {
    Vect Gr(Grads[Nfunc](V).GetX(),Grads[Nfunc](V).GetY(),Grads[Nfunc](V).GetZ());
    return(Gr.GetX()*Pk.GetX()+Gr.GetY()*Pk.GetY()+Gr.GetZ()*Pk.GetZ());
  }
//////////////////////////////////////////////////////////
void Swenn(double* del1,double* del2,Vect Xk)
  {
    double alfa=0.0001;
    int k=0;
    if(GetGr(Xk)>0)
       Pk.Invers();
    for(;GetGr(Xk)*GetGr(Xk+Pk*alfa)>0 && k<=10000;alfa*=2,k++);
    if (k==10000) printf("ЌҐ ¬®¦Ґв ­ ©вЁ Ё­вҐаў « ¬Ё­Ё¬Ё§ жЁЁ");
        *del2=alfa;
    *del1=alfa/2;
  }
////////////////////////////////////////////////////////////
double MZS(Vect Xk)
  {
    int i=0;
    double x1,x2,a=0,b=0;
    if (fabs(GetGr(Xk))>Ex)
       {
          Swenn(&a,&b,Xk);
	  x1=a+0.382*fabs(b-a);
	  x2=(x1<a+0.618*fabs(b-a))?a+0.618*fabs(b-a):a+0.382*fabs(b-a);
	  while(fabs(GetGr(Xk+Pk*((a+b)/2)))>Ex && i<=10000)
	    {
	       if (fabs(GetGr(Xk+Pk*x1))<fabs(GetGr(Xk+Pk*x2)))
	          {
		     b=x2;
		     x2=x1;
		     x1=a+0.382*fabs(b-a);
	          }
	       else
	          {
		     a=x1;
		     x1=x2;
		     x2=a+0.618*fabs(b-a);
	          }
	       i++;
	    }
	  if (i==10000) printf("ЌҐ ¬®¦Ґв ўлЇ®«­Ёвм ¬Ё­Ё¬Ё§ жЁо");
	  return((a+b)/2);
       }
    else
    return 0;
  }
////////////////////////////////////////////////////////////
void CPSM(void)
{
   int k=0;
   Vect X1,Xk,Ort[3];
   Xk=X0[Nfunc];
   Ort[0]=Vect (1,0,0);
   Ort[1]=Vect (0,1,0);
   Ort[2]=Vect (0,0,1);
   do{
      X1=Xk;
      for(int i=0;i<N;i++)
         {
            Pk=Ort[i];
            Xk=Xk+Pk*MZS(Xk);
            k++;
         }
      Pk=Ort[0]+Ort[1]+Ort[2];
      if (fabs(GetGr(Xk))>Ex && Grads[Nfunc](Xk).Modul()>Ex)
         {
	    Pk=Xk-X1;
	    Xk=Xk+Pk*MZS(Xk);
	    k++;
         }
   }while(Pk.Modul()>Ex && Grads[Nfunc](Xk).Modul()>0.0001 && k<=10000);
   if (k>=10000)
       printf("ЌҐ ¬®¦Ґв ўлЇ®«­Ёвм ¬Ё­Ё¬Ё§ жЁо");
   Xk.Print();
   printf("—Ёб«® ЁвҐа жЁ© %d",k);
}
/////////////////////////////////////////////////////////////////
void main(void)
 {
    X0[0]= Vect (0,0);
    X0[1]= Vect (8,9);
    X0[2]= Vect (4,-1,2);
    clrscr();
    Ex=0.0000001;
    Nfunc=0;
    if (Nfunc==2) N=3;
    printf("‚室­лҐ ¤ ­­лҐ:");printf("\n\n");
    printf("‘в ав®ў п в®зЄ :");
      X0[Nfunc].Print();printf("\n");
    printf("’®з­®бвм:%8.7f",Ex);printf("\n");
    printf("\n       ЋвўҐв:");printf("\n\n");
    CPSM();
    getch();
 }
Соседние файлы в папке all