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

struct Vector
{
 double x1,x2;
 Vector()
 {
  x1=0;
  x2=0;
 }
 Vector(double ax1,double ax2)
 {
  x1=ax1;
  x2=ax2;
 }
 const Vector operator * (const double &vec) const
 {
  return Vector(x1*vec,x2*vec);
 }

 const void operator = (const Vector &vec)
 {
  x1=vec.x1;
  x2=vec.x2;
 }

 const double operator * (const Vector &vec) const
 {
  return (x1*vec.x1+x2*vec.x2);
 }

 const Vector operator + (const Vector &vec) const
 {
  return Vector(x1+vec.x1,x2+vec.x2);
 }

 const Vector operator - (const Vector &vec) const
 {
  return Vector(x1-vec.x1,x2-vec.x2);
 }
};

double function(Vector vec)
{
//return((vec.x1*vec.x1+vec.x2-11)*(vec.x1*vec.x1+vec.x2-11)+(vec.x1+vec.x2*vec.x2-7)*(vec.x1+vec.x2*vec.x2-7));
return(4*vec.x1*vec.x1+3*vec.x2*vec.x2-4*vec.x1*vec.x2+vec.x1);
//return(-12*vec.x2+4*vec.x1*vec.x1+4*vec.x2*vec.x2-4*vec.x1*vec.x2);
//return(3*vec.x1*vec.x1+3*vec.x2*vec.x2-vec.x1*vec.x2+vec.x1);
//return (4*(vec.x1-5)*(vec.x1-5)+(vec.x2-6)*(vec.x2-6));
}

double f_dx1(Vector vec)
{
//return(4*vec.x1*(vec.x1*vec.x1+vec.x2-11)+2*(vec.x1+vec.x2*vec.x2-7));
return(8*vec.x1-4*vec.x2+1);
//return(8*vec.x1-4*vec.x2);
//return(6*vec.x1-vec.x2+1);
//return (8*(vec.x1-5));
}

double f_dx2(Vector vec)
{
//return(2*(vec.x1*vec.x1+vec.x2-11)+4*vec.x2*(vec.x1+vec.x2*vec.x2-7));
return(6*vec.x2-4*vec.x1);
//return(-12+8*vec.x2-4*vec.x1);
//return(6*vec.x2-vec.x1);
//return (2*(vec.x2-6));
}

Vector Angrad(Vector vec)
{
 Vector grad;
 grad=Vector(f_dx1(vec),f_dx2(vec));
 return (grad*(-1));
}
double proizv(Vector vec,Vector p)
{
 Vector grad;
 grad=Vector(f_dx1(vec),f_dx2(vec));
 return (grad*p);
}

void Swann4(Vector &x1,double &a,double &b,Vector &p)
{
 double pr;
 Vector x2;
 pr=proizv(x1,p);
 if(pr>0) p=Vector(0,0)-p;
 b=fabs(function(x1)/pr-1);
 if(b>1) b=1;
 x2=x1+p*b;
 while(proizv(x1,p)*proizv(x2,p)>0)
 {
  a=b;
  b*=2;
  x1=x2;
  x2=x1+p*b;
 }
}

double Alfa(Vector &x1,Vector p,double a1,double b1)
{
 double w,z,ar,k;
 Vector r;
 Swann4(x1,a1,b1,p);
 z=proizv(x1+p*a1,p)+proizv(x1+p*b1,p)+3*(function(x1+p*a1)-function(x1+p*b1))/(b1-a1);
 w=sqrt(z*z-proizv(x1+p*a1,p)*proizv(x1+p*b1,p));
 ar=b1*(w-proizv(x1+p*a1,p)+z)/(2*w-proizv(x1+p*a1,p)+proizv(x1+p*b1,p));
 return(ar);
}


void main()
{
 clrscr();
 double otv1,otv2,a1,b1,a,e=0.00001,A1[2][2]={0},A2[2][2]={0},B1[2][2]={0},C1[2][2]={0};
 Vector x1,x2,x3,p1,p2,g1,g2,dx,gamma1,S1;
 x1=Vector(0,0);
 p1=Angrad(x1);
 g1=p1*(-1);
 a=Alfa(x1,p1,a1,b1);
 x2=x1+p1*a;
 if ((sqrt(g1.x1*g1.x1+g1.x2*g1.x2))<e) cout<<x2.x1<<endl<<x2.x2;
 A1[0][0]=1;
 A1[0][1]=0;
 A1[1][0]=0;
 A1[1][1]=1;
 dx=Vector(x2)-Vector(x1);
 g2=Angrad(x2)*(-1);
 g1=Angrad(x1)*(-1);
 gamma1=Vector(g2)-Vector(g1);
 otv1=dx.x1*gamma1.x1+dx.x2*gamma1.x2;
 B1[0][0]=(dx.x1*dx.x1)/otv1;
 B1[0][1]=(dx.x1*dx.x2)/otv1;
 B1[1][0]=(dx.x2*dx.x1)/otv1;
 B1[1][1]=(dx.x2*dx.x2)/otv1;
 S1.x1=A1[0][0]*gamma1.x1+A1[0][1]*gamma1.x2;
 S1.x2=A1[1][0]*gamma1.x1+A1[1][1]*gamma1.x2;
 otv2=S1.x1*gamma1.x1+S1.x2*gamma1.x2;
 C1[0][0]=(S1.x1*S1.x1)/(-otv2);
 C1[0][1]=(S1.x1*S1.x2)/(-otv2);
 C1[1][0]=(S1.x2*S1.x1)/(-otv2);
 C1[1][1]=(S1.x2*S1.x2)/(-otv2);
  for (int i=0;i<2;i++)
  for (int j=0;j<2;j++)
  {
   A2[i][j]=A1[i][j]+B1[i][j]+C1[i][j];
  }
  while ((sqrt(g2.x1*g2.x1+g2.x2*g2.x2))>e)
  {
   p2.x1=-(A2[0][0]*g2.x1+A2[0][1]*g2.x2);
   p2.x2=-(A2[1][0]*g2.x1+A2[1][1]*g2.x2);
   a=Alfa(x2,p2,a1,b1);
   x1=x2;
   x2=x2+p2*a;
   g2=Angrad(x2)*(-1);
   dx=Vector(x2)-Vector(x1);
   g1=Angrad(x1)*(-1);
   gamma1=Vector(g2)-Vector(g1);
   otv1=dx.x1*gamma1.x1+dx.x2*gamma1.x2;
   B1[0][0]=(dx.x1*dx.x1)/otv1;
   B1[0][1]=(dx.x1*dx.x2)/otv1;
   B1[1][0]=(dx.x2*dx.x1)/otv1;
   B1[1][1]=(dx.x2*dx.x2)/otv1;
   S1.x1=A1[0][0]*gamma1.x1+A1[0][1]*gamma1.x2;
   S1.x2=A1[1][0]*gamma1.x1+A1[1][1]*gamma1.x2;
   otv2=S1.x1*gamma1.x1+S1.x2*gamma1.x2;
   C1[0][0]=(S1.x1*S1.x1)/(-otv2);
   C1[0][1]=(S1.x1*S1.x2)/(-otv2);
   C1[1][0]=(S1.x2*S1.x1)/(-otv2);
   C1[1][1]=(S1.x2*S1.x2)/(-otv2);
  for (int i=0;i<2;i++)
   for (int j=0;j<2;j++)
  {
   A2[i][j]=A1[i][j]+B1[i][j]+C1[i][j];
  }
 }
  cout<<x2.x1<<endl<<x2.x2;
  getch();
}









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