Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / FIBDAV
.CPP#include <conio.h>
#include <iostream.h>
#include <math.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 ((vec.x1-2)*(vec.x1-2)*(vec.x1-2)*(vec.x1-2)+(vec.x1-2*vec.x2)*(vec.x1-2*vec.x2));
}
double f_dx1(Vector vec)
{
return (4*(vec.x1-2)*(vec.x1-2)*(vec.x1-2)+2*(vec.x1-2*vec.x2));
}
double f_dx2(Vector vec)
{
return (-4*(vec.x1-2*vec.x2));
}
double proizv(Vector vec,Vector p)
{
Vector grad;
grad=Vector(f_dx1(vec),f_dx2(vec));
return (grad*p);
}
void Swann4(Vector &x1,double &a,double &b,Vector &p)
{
double pr;
Vector x2;
pr=proizv(x1,p);
if(pr>0) p=p*(-1);
b=fabs(function(x1)/pr-1);
if(b>1) b=1;
x2=x1+p*b;
while(proizv(x1,p)*proizv(x2,p)>0)
{
a=b;
b*=2;
x1=x2;
x2=x1+p*b;
}
}
void Davidon(double &a,double &b,Vector &x1,Vector &x2,Vector p)
{
double e=0.0001,w,z,ar,k;
int n=1;
Vector 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=x1+p*ar;
k=proizv(r,p);
while(fabs(k)>e)
{
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=x1+p*ar;
k=proizv(r,p);
n++;
}
cout<<r.x1<<endl<<r.x2<<endl<<n-1;
}
void Fibonachi(Vector &x1,Vector &p,double &b)
{
Vector L1,L2,L3,Ln,min,x2,al,mu,x;
L1=p*b;
Ln=Vector(0.0000001,0.0000001);
x2=x1+p*b;
double Fn,e=0.0000001,F[200]={0},f1,f2;
int i=1,n;
Fn=L1.x1/Ln.x1;
F[0]=F[1]=1;
do
{
i++;
F[i]=F[i-1]+F[i-2];
}while(F[i]<Fn);
n=i;
L3=L1*(F[n-1]/F[n]);
L2=L1*(F[n-2]/F[n]);
al=x1+L3;
mu=x1+L2;
for(i=1;i<n;i++)
{
f1=function(x1);
f2=function(x2);
L1=L2;
L3=L1*(F[n-i-1]/F[n]);
L2=L1*(F[n-i-2]/F[n]);
if (f1<f2)
{
x2=mu;
mu=al;
al=x1+L3;
}
else
{
x1=al;
al=mu;
mu=x1+L2;
}
}
mu.x1=al.x1+e;
mu.x2=al.x2+e;
f1=function(x1);
f2=function(x2);
if (f1<f2) x=(x1+mu)*0.5;
else x=(x2+al)*0.5;
cout<<x.x1<<endl<<x.x2<<endl<<n;
}
void main()
{
clrscr();
int k;
cout<<"‚лЎҐаЁвҐ ¬Ґв®¤:"<<endl;
cout<<"1. ”ЁЎ® зЁ"<<endl;
cout<<"2. „ ўЁ¤® "<<endl;
cin>>k;
clrscr();
Vector p,x1,x2;
double a=0,b=0;
x1=Vector(0,3);
p=Vector(1,0);
Swann4(x1,a,b,p);
if(k==1) Fibonachi(x1,p,b);
else if(k==2) Davidon(a,b,x1,x2,p);
else cout<<"Ќ гзЁбм зЁв вм!!!";
getch();
}
Соседние файлы в папке all