
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / Nelder
.cpp#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