Скачиваний:
14
Добавлен:
01.05.2014
Размер:
4.5 Кб
Скачать
#define E1 0.00000000001
#define E2 0.00000000001
#define X1 8
#define Y1 9
#define X2 1
#define Y2 0
#define NumIter 1

#include <conio.h>
#include <iostream.h>
#include <math.h>
#include <stdio.h>
struct Vect
{
 double x,y;
};
Vect Xst;
double H=0.00000001;
char f=1;
/////////////////////////////////////
Vect umn (Vect vec,double mnoz)
 {
    Vect tmp;
    tmp.x =vec.x*mnoz;
    tmp.y =vec.y*mnoz;
    return tmp;
 }
//////////////////////////////////////
double proizved (Vect tmp,Vect tmp1)
   {
       return (tmp.x*tmp1.x+tmp.y*tmp1.y);
   }
//////////////////////////////////////
Vect sum (Vect tmp,Vect tmp1)
 {
     Vect temp;
     temp.x =tmp.x+tmp1.x;
     temp.y =tmp.y+tmp1.y;
     return temp;
 }
///////////////////////////////////////
Vect razn (Vect tmp,Vect tmp1)
 {
     Vect temp;
     temp.x =tmp.x-tmp1.x;
     temp.y =tmp.y-tmp1.y;
     return temp;
 }
///////////////////////////////////////
double function(Vect vec)
{
 return (4*pow((vec.x-5),2)+pow((vec.y-6),2));
}
/////////////////////////////////
double f_dx1(Vect vec)
{
 return (8*vec.x-40);
}
/////////////////////////////////
double f_dx2(Vect vec)
{
   return (2*vec.y-12);
}
/////////////////////////////////
double proizv(Vect vec,Vect p)
{
 Vect grad;
 grad.x= f_dx1(vec);
 grad.y= f_dx2(vec);
 return ( proizved (grad, p));
}
/////////////////////////////////
double func_a(Vect p, double alpha)
{
 return(function(sum(Xst,umn(p,alpha))));
}
/////////////////////////////////
Vect normir(Vect tmp)
{
   double length;
   Vect temp;
   length = sqrt(tmp.x*tmp.x+tmp.y*tmp.y);
   temp.x = tmp.x /length;
   temp.y = tmp.y /length;
   return temp;
}
//////////////////////////////////
void Swann4(Vect *x1,Vect *x2,double *a,double *b,Vect *p)
{
 double pr;
 Vect temp;

 *x1 = Xst;
 pr=proizv(*x1,*p);
 if(pr>0)
    *p=umn(*p,(-1));
 *a=0;
 *b=H;
  *x2 = sum (*x1 , umn (*p, *b) );
 while( proizv(*x1,*p) * proizv(*x2,*p) > 0 &&  (fabs( (func_a(*p,*b)-func_a(*p,*a)) / func_a(*p,*b))>E2 ))
   {
     (*a)=(*b);
     (*b)*=2;
     *x1=*x2;
     *x2=sum( *x1,umn(*p,*b));
   }
 if(f)
   {
     cout<<" €­вҐаў «, Ї®«г祭­л© ¬Ґв®¤®¬ ‘ўҐ­­ "<<endl;
     cout<<"  "<< (*x1).x<<" +x1+ "<<(*x1).y<<" a="<<*a<<endl;
     cout<<"  "<<(*x2).x<<" +x2+ "<<(*x2).y<<"  b="<<*b<<endl;
   }
}
///////////////////////////////////////////////
void DSK(Vect *x1,Vect *x2,double *a,double *c,Vect *p)
 {
   int i=0;
   double b,d;
   f=0;
   while( fabs( (func_a(*p,b)-func_a(*p,d)) / func_a(*p,d))>E2 && i<NumIter )
     {
       b=(*a+*c)/2;
       d=b+0.5* (b-*a)* (func_a(*p,*a)-func_a(*p,*c))/ (func_a(*p,*a)-2*func_a(*p,b)+func_a(*p,*c));
       if( func_a(*p,b) > func_a(*p,d) )
          Xst=sum(Xst,umn(*p,d));
       else
          Xst=sum(Xst,umn(*p,b));
       H/=2;
       Swann4(x1,x2,a,c,p);
       i++;
     }
   cout<<"  "<<" result";
   cout<<"  "<<sum(Xst,umn(*p,(*a+*c)/2 )).x<<"-x2-"<<sum(Xst,umn(*p,(*a+*c)/2  )).y<<"  b="<<(*a+*c)/2<<endl;
 }
///////////////////////////////////////////////
void Davidon(double a, double b, Vect x1, Vect x2, Vect p)
{
  double w,z,ar,k;
  int n=1;
  Vect r;
  z= proizv(x1,p) + proizv(x2,p) + 3*(function(x1)-function(x2))/(b-a);
  w= sqrt( z*z - proizv(x1,p) * proizv(x2,p));
  ar= b* (w-proizv(x1,p)+z) / (2*w-proizv(x1,p) + proizv(x2,p));
  r=sum( x1, umn(p,ar));
  k=proizv(r,p);
  while(fabs(k)>E1)
    {
      if(k<0)
        {
          a=ar;
          x1=r;
        }
      else
        {
          b=ar;
          x2=r;
        }
      z = proizv(x1,p) +proizv(x2,p) +3*(function(x1)-function(x2))/(b-a);
      w= sqrt(z*z-proizv(x1,p) *proizv(x2,p));
      ar= b*(w-proizv(x1,p)+z) /(2*w -proizv(x1,p) +proizv(x2,p));
      r=sum(x1,umn(p,ar));
      k=proizv(r,p);
      n++;
    }
  printf("ЊЁ­Ё¬г¬ дг­ЄжЁЁ");
  cout<<"  "<< r.x<<"-r-"<<r.y<<" —Ёб«® ЁвҐа жЁ© ="<<n-1;
}
/////////////////////////////////////////////////
void main()
{
   Xst.x=X1;
   Xst.y=Y1;
   clrscr();
   cout<<" ЊҐв®¤ „нўЁ¤®­ "<<endl;
   printf("‚室­лҐ ¤ ­­лҐ:");printf("\n\n");
   printf("‘в ав®ў п в®зЄ :(%5.3f;%5.3f)\n",Xst.x,Xst.y);
   printf("’®з­®бвм:%e",E1);printf("\n");
   printf("\n       ЋвўҐв:");printf("\n\n");
   Vect p,x1,x2;
   double a=0,b=0;
   x1=Xst;
   p.x=X2;
   p.y=Y2;
   //p=normir(p);
   Swann4(&x1,&x2,&a,&b,&p);
   DSK(&x1,&x2,&a,&b,&p);
   Davidon(a,b,x1,x2,p);
   getch();
}
Соседние файлы в папке all