Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / DSK-DAV
.CPP#define E1 0.00000000001
#define E2 0.00000000001
#define X1 8
#define Y1 9
#define X2 1
#define Y2 0
#define NumIter 1
#include <conio.h>
#include <iostream.h>
#include <math.h>
#include <stdio.h>
struct Vect
{
double x,y;
};
Vect Xst;
double H=0.00000001;
char f=1;
/////////////////////////////////////
Vect umn (Vect vec,double mnoz)
{
Vect tmp;
tmp.x =vec.x*mnoz;
tmp.y =vec.y*mnoz;
return tmp;
}
//////////////////////////////////////
double proizved (Vect tmp,Vect tmp1)
{
return (tmp.x*tmp1.x+tmp.y*tmp1.y);
}
//////////////////////////////////////
Vect sum (Vect tmp,Vect tmp1)
{
Vect temp;
temp.x =tmp.x+tmp1.x;
temp.y =tmp.y+tmp1.y;
return temp;
}
///////////////////////////////////////
Vect razn (Vect tmp,Vect tmp1)
{
Vect temp;
temp.x =tmp.x-tmp1.x;
temp.y =tmp.y-tmp1.y;
return temp;
}
///////////////////////////////////////
double function(Vect vec)
{
return (4*pow((vec.x-5),2)+pow((vec.y-6),2));
}
/////////////////////////////////
double f_dx1(Vect vec)
{
return (8*vec.x-40);
}
/////////////////////////////////
double f_dx2(Vect vec)
{
return (2*vec.y-12);
}
/////////////////////////////////
double proizv(Vect vec,Vect p)
{
Vect grad;
grad.x= f_dx1(vec);
grad.y= f_dx2(vec);
return ( proizved (grad, p));
}
/////////////////////////////////
double func_a(Vect p, double alpha)
{
return(function(sum(Xst,umn(p,alpha))));
}
/////////////////////////////////
Vect normir(Vect tmp)
{
double length;
Vect temp;
length = sqrt(tmp.x*tmp.x+tmp.y*tmp.y);
temp.x = tmp.x /length;
temp.y = tmp.y /length;
return temp;
}
//////////////////////////////////
void Swann4(Vect *x1,Vect *x2,double *a,double *b,Vect *p)
{
double pr;
Vect temp;
*x1 = Xst;
pr=proizv(*x1,*p);
if(pr>0)
*p=umn(*p,(-1));
*a=0;
*b=H;
*x2 = sum (*x1 , umn (*p, *b) );
while( proizv(*x1,*p) * proizv(*x2,*p) > 0 && (fabs( (func_a(*p,*b)-func_a(*p,*a)) / func_a(*p,*b))>E2 ))
{
(*a)=(*b);
(*b)*=2;
*x1=*x2;
*x2=sum( *x1,umn(*p,*b));
}
if(f)
{
cout<<" €вҐаў «, Ї®«гзҐл© ¬Ґв®¤®¬ ‘ўҐ "<<endl;
cout<<" "<< (*x1).x<<" +x1+ "<<(*x1).y<<" a="<<*a<<endl;
cout<<" "<<(*x2).x<<" +x2+ "<<(*x2).y<<" b="<<*b<<endl;
}
}
///////////////////////////////////////////////
void DSK(Vect *x1,Vect *x2,double *a,double *c,Vect *p)
{
int i=0;
double b,d;
f=0;
while( fabs( (func_a(*p,b)-func_a(*p,d)) / func_a(*p,d))>E2 && i<NumIter )
{
b=(*a+*c)/2;
d=b+0.5* (b-*a)* (func_a(*p,*a)-func_a(*p,*c))/ (func_a(*p,*a)-2*func_a(*p,b)+func_a(*p,*c));
if( func_a(*p,b) > func_a(*p,d) )
Xst=sum(Xst,umn(*p,d));
else
Xst=sum(Xst,umn(*p,b));
H/=2;
Swann4(x1,x2,a,c,p);
i++;
}
cout<<" "<<" result";
cout<<" "<<sum(Xst,umn(*p,(*a+*c)/2 )).x<<"-x2-"<<sum(Xst,umn(*p,(*a+*c)/2 )).y<<" b="<<(*a+*c)/2<<endl;
}
///////////////////////////////////////////////
void Davidon(double a, double b, Vect x1, Vect x2, Vect p)
{
double w,z,ar,k;
int n=1;
Vect r;
z= proizv(x1,p) + proizv(x2,p) + 3*(function(x1)-function(x2))/(b-a);
w= sqrt( z*z - proizv(x1,p) * proizv(x2,p));
ar= b* (w-proizv(x1,p)+z) / (2*w-proizv(x1,p) + proizv(x2,p));
r=sum( x1, umn(p,ar));
k=proizv(r,p);
while(fabs(k)>E1)
{
if(k<0)
{
a=ar;
x1=r;
}
else
{
b=ar;
x2=r;
}
z = proizv(x1,p) +proizv(x2,p) +3*(function(x1)-function(x2))/(b-a);
w= sqrt(z*z-proizv(x1,p) *proizv(x2,p));
ar= b*(w-proizv(x1,p)+z) /(2*w -proizv(x1,p) +proizv(x2,p));
r=sum(x1,umn(p,ar));
k=proizv(r,p);
n++;
}
printf("ЊЁЁ¬г¬ дгЄжЁЁ");
cout<<" "<< r.x<<"-r-"<<r.y<<" —Ёб«® ЁвҐа жЁ© ="<<n-1;
}
/////////////////////////////////////////////////
void main()
{
Xst.x=X1;
Xst.y=Y1;
clrscr();
cout<<" ЊҐв®¤ „нўЁ¤® "<<endl;
printf("‚е®¤лҐ ¤ лҐ:");printf("\n\n");
printf("‘в ав®ў п в®зЄ :(%5.3f;%5.3f)\n",Xst.x,Xst.y);
printf("’®з®бвм:%e",E1);printf("\n");
printf("\n ЋвўҐв:");printf("\n\n");
Vect p,x1,x2;
double a=0,b=0;
x1=Xst;
p.x=X2;
p.y=Y2;
//p=normir(p);
Swann4(&x1,&x2,&a,&b,&p);
DSK(&x1,&x2,&a,&b,&p);
Davidon(a,b,x1,x2,p);
getch();
}
Соседние файлы в папке all