
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / laba3
.cpp#include <stdio.h>
#include <conio.h>
#include <math.h>
double proizv(double);
double func(double);
double funcdsk(double, double*);
void svenn(double*);
void DIH();
int DSK(double*);
double Q=0.00005;
double P[2]={0,1};
void main(void)
{
double X[2]={5,2};
clrscr();
svenn(X);
printf("\nA:[%f,%f]",X[0]+Q*P[0],X[1]+Q*P[1]);
printf("\nB:[%f,%f]",X[0]+Q*P[0]/2,X[1]+Q*P[1]/2);
DIH();
printf("\nMetod Dihotomii:[%f,%f]",X[0]+Q*P[0],X[1]+Q*P[1]);
if(DSK(X)) printf("\nMetod DSK:[%f,%f]",X[0]+Q*P[0],X[1]+Q*P[1]);
getch();
}
//***********************************************
double func(double q)
{
double X[2]={5,2},Z[2];
Z[0]=X[0]+q*P[0];
Z[1]=X[1]+q*P[1];
return(2*Z[0]*Z[0]*Z[0]+4*Z[0]*Z[1]*Z[1]-10*Z[0]*Z[1]+Z[1]*Z[1]);
}
//***********************************************
double funcdsk(double q, double *X)
{
double Z[2];
Z[0]=X[0]+q*P[0];
Z[1]=X[1]+q*P[1];
return(2*Z[0]*Z[0]*Z[0]+4*Z[0]*Z[1]*Z[1]-10*Z[0]*Z[1]+Z[1]*Z[1]);
}
//***********************************************
double proizv(double q)
{
double a,b;
double X[2]={5,2},Z[2];
Z[0]=X[0]+q*P[0];
Z[1]=X[1]+q*P[1];
a=6*Z[0]*Z[0]+4*Z[1]*Z[1]*Z[1]-10*Z[1];
b=12*Z[0]*Z[1]*Z[1]-10*Z[0]+2*Z[1];
return(a*P[0]+b*P[1]);
}
//***********************************************
void svenn(double *X)
{
double Z[2];
if( proizv(0) >0) {P[0]=-P[0];P[1]=-P[1];}
int k=0;
do
{
k++;
Q=2*Q;
Z[0]=X[0]+Q*P[0];
Z[1]=X[1]+Q*P[1];
}
while( (proizv(0)*proizv(Q) ) >0);
}
//***********************************************
void DIH()
{
double e=0.0001,d=0.00001,alfaa=Q/2,alfab=Q,alfa1,alfa2,l[2],m[2];
int k=0;
do
{
k++;
alfa1=(alfab+alfaa)/2-d/2;
alfa2=(alfab+alfaa)/2+d/2;
if(func(alfa1)<func(alfa2)) alfab=alfa2;
else alfaa=alfa1;
}
while(fabs(alfab-alfaa)>e);
printf("\n\nk=%d",k);
Q=(alfaa+alfab)/2;
}
//***********************************************
int DSK(double *X)
{
double H,a,b,c,d,e=0.001,Z[2];
int k=0;
if( proizv(0) >0) {P[0]=-P[0];P[1]=-P[1];}
Q=H=0.00005;
for(;;)
{
k++;
while(funcdsk(H,X)>funcdsk(2*H,X)) { H=2*H; }
d=3*H/2;
if(funcdsk(d,X)>funcdsk(H,X))
{
a=H/2; b=H; c=2*H;
}
else
{
a=H; b=d; c=2*H;
}
d=b+0.5*( (b-a)*(b-a)*(funcdsk(b,X)-funcdsk(c,X))-(b-c)*(b-c)*(funcdsk(b,X)-funcdsk(a,X)) )/( (b-a)*(funcdsk(b,X)-funcdsk(c,X))-(b-c)*(funcdsk(b,X)-funcdsk(a,X)) );
if( fabs((d-b)/b)<=e || fabs((funcdsk(d,X)-funcdsk(b,X))/funcdsk(b,X))<=e ) {Q=(b+d)/2;printf("\n\nk=%d",k); return(1);}
Q=H=Q/2;
if(funcdsk(b,X)>funcdsk(d,X)) {X[0]=X[0]+d*P[0];X[1]=X[1]+d*P[1];}
else {X[0]=X[0]+b*P[0];X[1]=X[1]+b*P[1];}
}
}
Соседние файлы в папке all