
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / LAB5_1
.CPP#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
double eps=0.0001;
class vector
{
public:
double x1,x2;
vector(double x11=0.0,double x22=0.0)
{
x1=x11;
x2=x22;
}
friend double k1(vector& x)
{
return x.x1;
}
friend double k2(vector& x)
{
return x.x2;
}
friend double alfa(vector x,vector p);
friend double norma(vector& x);
friend double func(vector x);
friend vector df(vector x);
friend vector operator+ (vector a,vector b);
friend vector operator- (vector a,vector b);
friend vector operator* (double n,vector x);
friend double operator* (vector a,vector b);
friend vector operator/ (vector x,double n);
};
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 n, vector x)
{
return vector((n*x.x1),(n*x.x2));
}
ostream& operator<<(ostream&s,vector x)
{
return s <<"("<<k1(x)<<" ; "<<k2(x)<<") \n";
}
double operator* (vector a,vector b)
{
double c=a.x1*b.x1+a.x2*b.x2;
return c;
}
vector operator/ (vector x,double n)
{return vector((x.x1/n),(x.x2/n));}
double func(vector x)
{
// return ((1.5-x.x1*(1-x.x2))*(1.5-x.x1*(1-x.x2))+(2.25-x.x1*(1-x.x2*x.x2))*(2.25-x.x1*(1-x.x2*x.x2))+(2.625-x.x1*(1-x.x2*x.x2*x.x2))*(2.625-x.x1*(1-x.x2*x.x2*x.x2)));
return (100*(x.x2-x.x1*x.x1)*(x.x2-x.x1*x.x1)+(1+x.x1)*(1+x.x1));
}
vector grad(vector x)
{
vector g;
// g.x1=2*(x.x2-1)*(1.5-x.x1*(1-x.x2))+2*(x.x2*x.x2-1)*(2.25-x.x1*(1-x.x2*x.x2))+2*(x.x2*x.x2*x.x2-1)*(2.625-x.x1*(1-x.x2*x.x2*x.x2));
g.x1=-400*((x.x2-x.x1*x.x1)*x.x1+2+2*x.x1);
// g.x2=2*x.x1*(1.5-x.x1*(1-x.x2))+4*x.x1*x.x2*(2.25-x.x1*(1-x.x2*x.x2))+6*x.x1*x.x2*x.x2*(2.625-x.x1*(1-x.x2*x.x2*x.x2));
g.x2=200*x.x2-200*x.x1*x.x1;
return g;
}
double df(vector x,vector p)
{
return (grad(x)*p);
}
double norma(vector& x)
{
return sqrt(x.x1*x.x1+x.x2*x.x2);
}
vector DSK(vector x,vector p)
{
double alfa0,alfak;
vector x0(0,0),p0(0,0),a(0,0),b(0,0),c(0,0),d(0,0),x1(0,0),x11(0,0),xmin(0,0);
double n=fabs((func(x)-df(x,p))/df(x,p));
if(n>1)
{
alfa0=1;
}
else
{
alfak=n;
}
x0=x;
p0=p;
alfak=alfa0;
x1=x0+alfak*p0;
if(df(x0,p0)*df(x1,p0)>0)
{
p0=(-1)*p0;
}
x1=x0+alfak*p0;
while(func(x0)>func(x1))
{
x0=x1;
alfak=2*alfak;
x1=x0+alfak*p0;
}
x11=0.5*(x1+x0);
if(func(x0)<func(x11))
{
a=x0;
c=x11;
}
else
{
a=x11;
c=x0;
}
b=0.5*(a+c);
d=b+0.5*((func(a)-func(c))*(b-a))/(func(a)-2*func(b)+func(c));
while((sqrt((b-d)*(b-d)/(d*d))>eps)||((func(b)-func(d))/func(d))>eps)
{
alfak=alfa0;
x1=x0+alfak*p0;
if(df(x0,p0)*df(x1,p0)>0)
{
p0=(-1)*p0;
}
x1=x0+alfak*p0;
while(func(x0)>func(x1))
{
x0=x1;
alfak=2*alfak;
x1=x0+alfak*p0;
}
x11=0.5*(x1+x0);
if(func(x0)<func(x11))
{
a=x0;
c=x11;
}
else
{
a=x11;
c=x0;
}
b=0.5*(a+c);
d=b+0.5*((func(a)-func(c))*(b-a))/(func(a)-2*func(b)+func(c));
alfa0=alfa0/2;
if(func(b)>func(d))
{
x0=b;
}
else
{
x0=d;
}
}
xmin=0.5*(b+d);
return xmin;
}
vector FR(vector x1,vector x2,vector p)
{
double beta;
beta=(norma(grad(x2))*norma(grad(x2)))/(norma(grad(x1))*norma(grad(x1)));
return p=(-1)*(grad(x2))+beta*p;
}
void main()
{
clrscr();
div_t del;
double eps=0.0001;
int n=1;
vector x0(3,0.5),x1(0,0),x2(0,0),p(0,0);
x2=x1=x0;
while (norma(grad(x2))>=eps || (grad(x1))*(grad(x2))>=0.2*norma(grad(x2)));
{
del=div(n,2);
if(del.rem==1)
{
p=(-1)*(grad(x2));
}
else
{
p=FR(x1,x2,p);
}
x1=x2;
x2=DSK(x1,p);
n++;
}
cout<<"ЊЁЁ¬г¬ = "<<x2<<endl;
cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ© = "<<n-1<<endl;
getch();
}
Соседние файлы в папке all