Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №4
.cpp
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
struct point{
double x1,x2; //cokranit data dlya tochki
}x,xt;
typedef struct point pointt;
typedef pointt* ppoint;
struct vector{
double p1,p2;
}p;
struct inter{
double a1,b1;
}interv;
struct naprav
{
double px[2],pt[2];
}px,pt;
void init_point (double x0, double y0)
{
double e=0.1;
x.x1=x0; x.x2=y0;
xt.x1=x0+e; xt.x2=y0;
}
void init_vector (double px0, double py0)
{
p.p1=px0; p.p2=py0;
}
double F(double k)
{
double x1,x2;
x1=x.x1+k*px.px[0];
x2=x.x2+k*px.px[1];
return(4*(x1-5)*(x1-5)+(x2-6)*(x2-6));
}
double diff_F(double k)
{
double x1,x2;
x1=x.x1+k*px.px[0];
x2=x.x2+k*px.px[1];
return(8*(x1-5)*px.px[0]+2*(x2-6)*px.px[1]);
}
void Swenn(void)
{
int k=1;
double s=0,t=1,help,help1;
help1=diff_F(0);
if(help1>0) //izmenit napravlenia
{
t=-t;
}
do
{
s=s+k*t;
k=2*k;
help=diff_F(s);
}while(diff_F(0)*(help)>0);
interv.a1=s-k/2;
interv.b1=s;
}
//**********************************************************
void bolcano(void)
{
int k=1;
double e = 0.0001,x1,a1,b1;
a1=interv.a1;
b1=interv.b1;
while(k<5)
{
x1=(a1+b1)/2;
if((fabs(diff_F(x1))<=e)&&(fabs((a1-b1)/2)<=e))
{
return ;
}
if(diff_F(x1)>0)
{
b1=x1;
}
else
{
a1=x1;
}
k++;
}
interv.a1=a1;
interv.b1=b1;
}
//**********************************************************
double powell(void)
{
double E=0.0001,a,b,c,d;
int k=1;
double help1,help2;
a=interv.a1;
c=interv.b1;
b=(a+c)/2;
help1=( (b*b-c*c)*F(a)+(c*c-a*a)*F(b)+(a*a-b*b)*F(c));
help2= (b-c)*F(a)+(c-a)*F(b)+(a-b)*F(c);
d=help1/(2*help2) ;
while(fabs((d-b)/b)>E && fabs( (F(d)-F(b))/F(b) )>E)
{
if(k>1)
{
help1=(b-c)*(c-a)*(F(a)-F(b));
help2=(b-c)*(F(a))+(c-a)*(F(b))+(a-b)*(F(c));
d=((a+b)/2) + help1/(2*help2) ;
}
if(b<d)
{
if(F(b)<F(d))
{
c=d;
}
else{
a=b;
b=d;
}
}
if(b>d)
{
if(F(b)<F(d))
{
a=d;
}
else
{
b=d;
c=b;
}
}
k++;
}
return((b+d)/2);
}
//******************************************************
double lab3(void)
{
Swenn();
bolcano();
double min;
min = powell();
return min;
}
//********************************************
void fonct_naprav(struct point x,struct point xt )
{
px.px[0]=8*(x.x1-5) ;
px.px[1]=2*(x.x2-6);
pt.pt[0]=8*(xt.x1-5) ;
pt.pt[1]=2*(xt.x2-6);
}
//*********************************************
ppoint avragenie(void)
{
double e=0.01,min,d[2],help,help2;
int k=1;
struct point *x3;
x3=new (struct point) ;
do{
if(k==1)
{
fonct_naprav(x,xt);
}
min=lab3();
x.x1=x.x1+(min)*px.px[0];
x.x2=x.x2+(min)*px.px[1];
xt.x1=xt.x1+(min)*pt.pt[0];
xt.x2=xt.x2+(min)*pt.pt[1];
d[0]=x.x1- xt.x1;
d[1]=x.x2-xt.x2;
fonct_naprav(x,xt);
min=lab3();
x3->x1=x.x1+ (min)*d[0];
x3->x2=x.x2+ (min)*d[1];
init_point(x3->x1,x3->x2);
fonct_naprav(x,xt);
help2=( pow(px.px[0],2)+pow(px.px[1],2));
help= (pow(d[0],2)+pow(d[1],2) );
k++;
}while(sqrt(help)>e||sqrt(help2)>e);
cout<<"\n tislo iterasi "<<k;
return x3;
}
//****************************************************************
void main ()
{
ppoint min;
double x0,y0 ;
//int k;
clrscr();
cout<<"Enter the starting interval"<<"\n";
cin>>x0>>y0;
init_point( x0,y0);
cout<<"\n";
min=avragenie();
//cout<<"Chiclo iterasii"<<k;
cout<<"\n\n"<<"***********Method lineinix poisk (Avragenie) ********"<<"\n";
cout<<"The minimum point is:("<<min->x1 << ","<<min->x2 <<")"<<"\n";
getch();
}
Соседние файлы в предмете Методы оптимизации