Скачиваний:
14
Добавлен:
01.05.2014
Размер:
2.2 Кб
Скачать
#include <conio.h>
#include <iostream.h>
#include <math.h>
#include <stdlib.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(3*(vec.x1-2)*(vec.x1-2)+4*(vec.x2-4)*(vec.x2-4));
}

Vector Nelder(Vector x1)
{
 Vector x[3],e1,e2,xx,x0,xr,xl,p,xs,xt;
 int h=1;
 double y[3]={0},yy,yr,b=0.5,c=2,sig,ysr,e=0.00001;
 e1=Vector(1,0);
 e2=Vector(0,1);
 x[0]=x1;
 x[1]=x[0]+e1*h;
 x[2]=x[1]+e2*h;
 do
 {
  sig=ysr=0;
  for (int i=0;i<3;i++)
   y[i]=function(x[i]);
  for (int k=0;k<2;k++)
   for (i=1;i<3;i++)
   {
    if (y[i-1]>y[i])
    {
     yy=y[i-1];
     y[i-1]=y[i];
     y[i]=yy;
     xx=x[i-1];
     x[i-1]=x[i];
     x[i]=xx;
    }
   }
  x0.x1=x[0].x1/2+x[1].x1/2;
  x0.x2=x[0].x2/2+x[1].x2/2;
  xr=x0*2-x[2];
  yr=function(xr);
  if ((y[0]<=yr) & (y[1]>=yr))
   x[2]=xr;
  if (yr<y[0])
  {
   p=x0-x[2];
   xl=x0+p*c;
   if (function(xl)<function(xr)) x[2]=xl;
   else x[2]=xr;
  }
  if ((y[1]<yr) & (y[2]>=yr))
  {
   p=xr-x0;
   xs=x0+p*b;
   if (function(xs)<function(xr)) x[2]=xs;
   else x[2]=xr;
  }
  if (yr>y[2])
  {
   p=x[2]-x0;
   xt=x0+p*b;
   if (function(xt)<function(xr)) x[2]=xt;
   else
   {
    x[1].x1=x[1].x1/2+x0.x1/2;
    x[1].x2=x[1].x2/2+x0.x2/2;
    x[2].x1=x[2].x1/2+x0.x1/2;
    x[2].x2=x[2].x2/2+x0.x2/2;
   }
  }
  for (i=0;i<3;i++)
  {
   y[i]=function(x[i]);
   ysr+=y[i]/3;
  }
  for (i=0;i<3;i++)
   sig+=(y[i]-ysr)*(y[i]-ysr)/e;
 }while(sig>e);
 return(x[0]);
}

void main()
{
 clrscr();
 Vector x1,x;
 x1=Vector(0,0);
 x=Nelder(x1);
 cout<<x.x1<<endl<<x.x2;
 getch();
}
Соседние файлы в папке all