Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / Nelder-Mid
.CPP#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
class vector
{
public:
double x1;
double x2;
vector(double x,double y)
{x1=x; x2=y;}
vector()
{x1=0; x2=0;}
friend double k1(vector& v) {return v.x1;}
friend double k2(vector& v) {return v.x2;}
friend double al(vector x,vector p);
friend double norm(vector& v);
friend double f(vector v);
friend vector gradf(vector x);
friend vector operator+ (vector a,vector b);
friend vector operator- (vector a,vector b);
friend vector operator* (double k,vector a);
friend double operator * (vector a,vector b);
friend vector operator/ (vector a,double k);
};
// ЋЇаҐ¤Ґ«ҐЁҐ дгЄжЁ© ЇҐаҐЈаг§ЄЁ
vector operator+ (vector a,vector b)
{ return vector((a.x1+b.x1),(a.x2+b.x2));}
vector operator- (vector a,vector b)
{ return vector((a.x1-b.x1),(a.x2-b.x2));}
vector operator* (double k, vector v)
{ return vector((k*v.x1),(k*v.x2));}
ostream& operator<<(ostream&s,vector v)
{ return s <<"["<<k1(v)<<", "<<k2(v)<<"] \n";}
double operator * (vector a,vector b)
{
double c=a.x1*b.x1+a.x2*b.x2;
return c;
}
vector operator/ (vector a,double k)
{return vector((a.x1/k),(a.x2/k));}
//§ ¤ п дгЄжЁп
double f(vector x)
{
return (2*x.x1*x.x1+2*x.x2*x.x2-x.x1*x.x2+x.x1+10);
//return (x.x1*x.x1*x.x1+x.x2*x.x2-3*x.x1-2*x.x2+2);
// return (x.x1*x.x1+x.x2-1)*(x.x1*x.x1+x.x2-1)+(x.x1+x.x2*x.x2-7)*(x.x1+x.x2*x.x2-7);
}
void main()
{
clrscr();
vector x1(0,0),x2,x3,x0,xr;
double k=0,M=4,h=1.2,alfa=1,beta=0.5,gamma=2,eps=1e-6;
double yy,sigma;
vector e1(1,0), e2(0,1);
x2=x1+h*e1;
x3=x1+h*e2;
do{
//rangirovanie
/* cout<<x1<<endl;
cout<<x2<<endl;
cout<<x3<<endl;
cout<<f(x1)<<endl;
cout<<f(x2)<<endl;
cout<<f(x3)<<endl; */
vector xx1,xx2,xx3;
if (f(x1)<=f(x2))
{ if (f(x2)<=f(x3)) {xx1=x1;xx2=x2;xx3=x3;}
else
{if (f(x1)<=f(x3)) {xx1=x1;xx2=x3;xx3=x2;}
else {xx1=x3;xx2=x1;xx3=x2;}
}
}
else
{ if (f(x2)>=f(x3)) {xx1=x3;xx2=x2;xx3=x1;}
else
{if (f(x1)<=f(x3)) {xx1=x2;xx2=x1;xx3=x3;}
else {xx1=x2;xx2=x3;xx3=x1;}
}
}
x1=xx1;
x2=xx2;
x3=xx3;
/* cout<<f(x1)<<endl;
cout<<f(x2)<<endl;
cout<<f(x3)<<endl;
cout<<x1<<endl;
cout<<x2<<endl;
cout<<x3<<endl;
while(!kbhit());
clrscr(); */
x0=0.5*(x1+x2);
xr=x0+alfa*(x0-x3);
vector p,xl,xs,xt;
if ((f(x1)<=f(xr)) && (f(xr)<=f(x2)))
{x3=xr;}
if (f(xr)<=f(x1))
{ p=x0-x3;
xl=x0+gamma*p;
if (f(xl)<=f(xr)) {x3=xl;}
else {x3=xr;}
}
if ((f(x2)<=f(xr)) && (f(xr)<=f(x3)))
{ p=x0-x3;
xs=x0+beta*p;
if (f(xs)<=f(xr)) {x3=xs;}
else {x3=xr;}
}
if (f(xr)>=f(x3))
{ xt=x0+0.5*(x3-x0);
if (f(xt)<=f(x3))
{x3=xt;}
else
{ x1=x1;
x2=0.5*(x1+x2);
x3=0.5*(x1+x3);
}
}
yy=(f(x1)+f(x2)+f(x3))/3;
sigma=((f(x1)-yy)*(f(x1)-yy)+(f(x2)-yy)*(f(x2)-yy)+(f(x3)-yy)*(f(x3)-yy))/3;
k++;
}
while ((sigma>=eps));// && k<M);
cout<<x1<<endl;
cout<<k;
while(!kbhit());
}
Соседние файлы в папке all