Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / LAB4
.CPP#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
class Vect
{
double x,y,z;
public:
Vect(double x1=0,double y1=0,double z1=0)
{
x=x1;
y=y1;
z=z1;
}
Vect operator * (double k);
Vect operator - (Vect& B);
Vect operator + (Vect& B);
void Print(void)
{
if(z)
printf("( %6.4f ,%6.4f ,%6.4f ) ",x,y,z);
else
printf("( %6.4f ,%6.4f ) ",x,y);
}
void Invers(void)
{
x=-x;
y=-y;
z=-z;
}
double Modul(void)
{ return sqrt(x*x+y*y+z*z);
}
double GetX()
{ return x;
}
double GetY()
{ return y;
}
double GetZ()
{ return z;
}
};
//////////////////////////////////////////////////////////
Vect Vect::operator + (Vect &W)
{
Vect V;
V.x=this->x+W.x;
V.y=this->y+W.y;
V.z=this->z+W.z;
return(V);
}
Vect Vect::operator - (Vect &W)
{
Vect V;
V.x=this->x-W.x;
V.y=this->y-W.y;
V.z=this->z-W.z;
return(V);
}
Vect Vect::operator * (double k)
{
Vect V;
V.x=this->x*k;
V.y=this->y*k;
V.z=this->z*k;
return(V);
}
////////////////////////////////////////////
double F1(Vect V)
{return (pow(V.GetX(),3)+pow(V.GetY(),2)-3*V.GetX()-2*V.GetY()+2);
}
double F2(Vect V)
{return (4*pow(V.GetX()-5,2)+pow(V.GetY()-6,2));
}
double F3(Vect V)
{return (pow(V.GetX()-1,2)+pow(V.GetY()-3,2)+4*pow(V.GetZ()+5,2));
}
Vect GrF1(Vect V)
{Vect gr(3*pow(V.GetX(),2)-3,2*V.GetY()-2);
return gr;
}
Vect GrF2(Vect V)
{Vect gr(8*V.GetX()-40,2*V.GetY()-12);
return gr;
}
Vect GrF3(Vect V)
{Vect gr(2*V.GetX()-2,2*V.GetY()-6,8*V.GetZ()+40);
return gr;
}
///////////////////////////////////////////////////////
Vect Pk,X0[3];
double Ex;
int Nfunc=0,N=2;
double (*Functions[3])(Vect)={F1,F2,F3};
Vect (*Grads[3])(Vect)={GrF1,GrF2,GrF3};
/////////////////////////////////////////////////////////
double GetGr(Vect V)
{
Vect Gr(Grads[Nfunc](V).GetX(),Grads[Nfunc](V).GetY(),Grads[Nfunc](V).GetZ());
return(Gr.GetX()*Pk.GetX()+Gr.GetY()*Pk.GetY()+Gr.GetZ()*Pk.GetZ());
}
//////////////////////////////////////////////////////////
void Swenn(double* del1,double* del2,Vect Xk)
{
double alfa=0.0001;
int k=0;
if(GetGr(Xk)>0)
Pk.Invers();
for(;GetGr(Xk)*GetGr(Xk+Pk*alfa)>0 && k<=10000;alfa*=2,k++);
if (k==10000) printf("ЌҐ ¬®¦Ґв ©вЁ ЁвҐаў « ¬ЁЁ¬Ё§ жЁЁ");
*del2=alfa;
*del1=alfa/2;
}
////////////////////////////////////////////////////////////
double MZS(Vect Xk)
{
int i=0;
double x1,x2,a=0,b=0;
if (fabs(GetGr(Xk))>Ex)
{
Swenn(&a,&b,Xk);
x1=a+0.382*fabs(b-a);
x2=(x1<a+0.618*fabs(b-a))?a+0.618*fabs(b-a):a+0.382*fabs(b-a);
while(fabs(GetGr(Xk+Pk*((a+b)/2)))>Ex && i<=10000)
{
if (fabs(GetGr(Xk+Pk*x1))<fabs(GetGr(Xk+Pk*x2)))
{
b=x2;
x2=x1;
x1=a+0.382*fabs(b-a);
}
else
{
a=x1;
x1=x2;
x2=a+0.618*fabs(b-a);
}
i++;
}
if (i==10000) printf("ЌҐ ¬®¦Ґв ўлЇ®«Ёвм ¬ЁЁ¬Ё§ жЁо");
return((a+b)/2);
}
else
return 0;
}
////////////////////////////////////////////////////////////
void CPSM(void)
{
int k=0;
Vect X1,Xk,Ort[3];
Xk=X0[Nfunc];
Ort[0]=Vect (1,0,0);
Ort[1]=Vect (0,1,0);
Ort[2]=Vect (0,0,1);
do{
X1=Xk;
for(int i=0;i<N;i++)
{
Pk=Ort[i];
Xk=Xk+Pk*MZS(Xk);
k++;
}
Pk=Ort[0]+Ort[1]+Ort[2];
if (fabs(GetGr(Xk))>Ex && Grads[Nfunc](Xk).Modul()>Ex)
{
Pk=Xk-X1;
Xk=Xk+Pk*MZS(Xk);
k++;
}
}while(Pk.Modul()>Ex && Grads[Nfunc](Xk).Modul()>0.0001 && k<=10000);
if (k>=10000)
printf("ЌҐ ¬®¦Ґв ўлЇ®«Ёвм ¬ЁЁ¬Ё§ жЁо");
Xk.Print();
printf("—Ёб«® ЁвҐа жЁ© %d",k);
}
/////////////////////////////////////////////////////////////////
void main(void)
{
X0[0]= Vect (0,0);
X0[1]= Vect (8,9);
X0[2]= Vect (4,-1,2);
clrscr();
Ex=0.0000001;
Nfunc=0;
if (Nfunc==2) N=3;
printf("‚е®¤лҐ ¤ лҐ:");printf("\n\n");
printf("‘в ав®ў п в®зЄ :");
X0[Nfunc].Print();printf("\n");
printf("’®з®бвм:%8.7f",Ex);printf("\n");
printf("\n ЋвўҐв:");printf("\n\n");
CPSM();
getch();
}
Соседние файлы в папке all