
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / NUTON
.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 ((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 (x.x1*x.x1*x.x1+x.x2*x.x2-3*x.x1-2*x.x2+2);
}
//Ја ¤ЁҐв дгЄжЁЁ
vector gradf(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=3*x.x1*x.x1-3;
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=2*x.x2-2;
return g;
}
//Їа®Ё§ў®¤ п дгЄжЁЁ
double df(vector x,vector p)
{
return (gradf(x)*p);
}
//Ќ®а¬ ўҐЄв®а
double norm (vector& v)
{
return sqrt(v.x1*v.x1+v.x2*v.x2);
}
//df/dx1
vector H1(vector x)
{
vector g;
g.x1=2*(x.x2-1)*(x.x2-1)+2*(x.x2*x.x2-1)*(x.x2*x.x2-1)+2*(x.x2*x.x2*x.x2-1)*(x.x2*x.x2*x.x2-1);
g.x2=2*(1.5-x.x1*(1-x.x2))+2*x.x1*(x.x2-1)+4*x.x2*(2.25-x.x1*(1-x.x2*x.x2))+4*x.x1*x.x2*(x.x2*x.x2-1)+6*x.x2*x.x2*(2.625-x.x1*(1-x.x2*x.x2*x.x2))+6*x.x1*x.x2*x.x2*(x.x2*x.x2*x.x2-1);
// g.x1=6*x.x1;
// g.x2=0;
return g;
}
//df/dx2
vector H2(vector x)
{
vector g;
g.x1=2*(1.5-x.x1*(1-x.x2))+2*x.x1*(x.x2-1)+4*x.x2*(2.25-x.x1*(1-x.x2*x.x2))+4*x.x1*x.x2*(x.x2*x.x2-1)+6*x.x2*x.x2*(2.625-x.x1*(1-x.x2*x.x2*x.x2))+6*x.x1*x.x2*x.x2*(x.x2*x.x2*x.x2-1);
g.x2=2*x.x1*x.x1+4*x.x1*(2.25-x.x1*(1-x.x2*x.x2))+8*x.x1*x.x1*x.x2*x.x2+12*x.x1*x.x2*(2.625-x.x1*(1-x.x2*x.x2*x.x2))+18*x.x1*x.x1*x.x2*x.x2*x.x2*x.x2;
// g.x1=0;
// g.x2=2;
return g;
}
//ЊҐв®¤ 3-Ґ© « Ў®а в®а®© а Ў®вл (¬Ґв®¤ „нўЁ¤® ) ўлзЁб«ҐЁҐ «мд Ё Ї®ЁбЄ б«Ґ¤го饩 в®зЄЁ
vector Davidon(vector x,vector p)
{ double al,al1,al2;
double n=fabs((f(x)-df(x,p))/df(x,p));
if(n>1) {al=1;}
else {al=n;}
vector x0=x;
vector p0=p;
vector xx;
int t;
if (df(x0,p)>0)
{
p=(-1)*p;
}
double ddf=df(x0,p0);
while(ddf*df(x,p0)>=0)
{
if (df(x,p)!=0)
{
x=x+al*p;
al=2*al;
p=p0;
}
else
{
xx=x;
return (xx);
}
t++;
}
if (t==1) {al1=0; al2=al/2;}
else { al1=al/4; al2=al/2;}
x0=x-al2*p0;
vector x1=x;
double w,z;
while (fabs(df(x,p0))>=1e-5)
{
z=df(x0,p0)+df(x1,p0)+3*(f(x0)-f(x1))/norm(x1);
w=sqrt(z*z-df(x0,p0)*df(x1,p0));
al=al2*((w+z-df(x0,p0))/(w-df(x0,p0)+df(x1,p0)));
x=x0+al*p0;
if (df(x,p0)<0)
{x0=x0+al*p0;}
else
{x1=x0+al*p0;al2=al;}
}
xx=x;
return (xx);
}
void main()
{ clrscr();
double eps=1e-4;
int k=0;
vector x0(0,0),x1,x2,p;
x2=x1=x0;
double H[2][2];
do
{
H[1][1]=H1(x2).x1;
H[1][2]=H1(x2).x2;
H[2][1]=H2(x2).x1;
H[2][2]=H2(x2).x2;
vector dy=(-1)*gradf(x2);
p.x1=(-1)*(-dy.x2+dy.x1*H[2][1])*H[1][2]/H[1][1]*(H[1][1]*H[2][2]-H[1][2]*H[2][1])-(dy.x1)/(H[1][1]);
p.x2=(-dy.x2+dy.x1*H[2][1])/(H[1][1]*H[2][2]-H[1][2]*H[2][1]);
x1=x2;
x2=Davidon(x1,p);
k++;
}
while (k>=100 && (norm(x2-x1)>=eps || norm(gradf(x2))>=eps));
cout<<"ЂЇЇа®ЄбЁ¬ЁагойЁ© ¬ЁЁ¬г¬ е = "<<x2<<endl;
cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ© = "<<k<<endl;
while(!kbhit());
}
Соседние файлы в папке all