Скачиваний:
13
Добавлен:
01.05.2014
Размер:
3.16 Кб
Скачать
#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-2)*(vec.x1-2)*(vec.x1-2)*(vec.x1-2)+(vec.x1-2*vec.x2)*(vec.x1-2*vec.x2));
}

double f_dx1(Vector vec)
{
 return (4*(vec.x1-2)*(vec.x1-2)*(vec.x1-2)+2*(vec.x1-2*vec.x2));
}

double f_dx2(Vector vec)
{
 return (-4*(vec.x1-2*vec.x2));
}

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=p*(-1);
 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;
 }
}

void Davidon(double &a,double &b,Vector &x1,Vector &x2,Vector p)
{
 double e=0.0001,w,z,ar,k;
 int n=1;
 Vector 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=x1+p*ar;
 k=proizv(r,p);
 while(fabs(k)>e)
 {
  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=x1+p*ar;
  k=proizv(r,p);
  n++;
 }
 cout<<r.x1<<endl<<r.x2<<endl<<n-1;
}

void Fibonachi(Vector &x1,Vector &p,double &b)
{
 Vector L1,L2,L3,Ln,min,x2,al,mu,x;
 L1=p*b;
 Ln=Vector(0.0000001,0.0000001);
 x2=x1+p*b;
 double Fn,e=0.0000001,F[200]={0},f1,f2;
 int i=1,n;
 Fn=L1.x1/Ln.x1;
 F[0]=F[1]=1;
 do
 {
  i++;
  F[i]=F[i-1]+F[i-2];
 }while(F[i]<Fn);
 n=i;
 L3=L1*(F[n-1]/F[n]);
 L2=L1*(F[n-2]/F[n]);
 al=x1+L3;
 mu=x1+L2;
 for(i=1;i<n;i++)
 {
  f1=function(x1);
  f2=function(x2);
  L1=L2;
  L3=L1*(F[n-i-1]/F[n]);
  L2=L1*(F[n-i-2]/F[n]);
  if (f1<f2)
  {
   x2=mu;
   mu=al;
   al=x1+L3;
  }
  else
  {
   x1=al;
   al=mu;
   mu=x1+L2;
  }
 }
 mu.x1=al.x1+e;
 mu.x2=al.x2+e;
 f1=function(x1);
 f2=function(x2);
 if (f1<f2) x=(x1+mu)*0.5;
 else x=(x2+al)*0.5;
 cout<<x.x1<<endl<<x.x2<<endl<<n;
}

void main()
{
 clrscr();
 int k;
 cout<<"‚лЎҐаЁвҐ ¬Ґв®¤:"<<endl;
 cout<<"1. ”ЁЎ®­ зЁ"<<endl;
 cout<<"2. „ ўЁ¤®­ "<<endl;
 cin>>k;
 clrscr();
 Vector p,x1,x2;
 double a=0,b=0;
 x1=Vector(0,3);
 p=Vector(1,0);
 Swann4(x1,a,b,p);
 if(k==1) Fibonachi(x1,p,b);
 else if(k==2) Davidon(a,b,x1,x2,p);
 else cout<<"Ќ гзЁбм зЁв вм!!!";
 getch();
}
Соседние файлы в папке all