Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / DAVID
.CPP#include <iostream.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
double Y(double alfa)
{
double x1, x2, x01=1, x02=1, p1=2, p2=-4;
x1=x01+alfa*p1;
x2=x02+alfa*p2;
return x1*x1+x2*x2-x1*x2+x2;
}
double y(double alfa)
{
double g1, g2, x1, x2, x01=1, x02=1, p1=2, p2=-4;
x1=x01+alfa*p1;
x2=x02+alfa*p2;
g1=2*x1-x2;
g2=2*x2-x1+1;
return g1*p1+g2*p2;
}
void sven (double &alfa_x, double &alfa, double &alfa_a, double &alfa_b)
{
if (y(alfa_x)>0)
alfa=-alfa;
// cout<<"alfa="<<alfa<<endl;
while ( y(alfa_x)*y(alfa_x+alfa)>0 )
{
alfa_x=alfa_x+alfa;
alfa=2*alfa;
}
// cout<<"alfa="<<alfa<<endl;
if (alfa>0)
{
alfa_a=alfa_x-alfa;
alfa_b=alfa_x;
}
else
{
alfa_b=alfa_x-alfa;
alfa_a=alfa_x;
}
}
void zs2 (double &alfa_a, double &alfa_b)
{
double l ,alfa_x1 ,alfa_x2;
l=fabs(alfa_b-alfa_a);
alfa_x1=alfa_a+0.382*l;
alfa_x2=alfa_a+alfa_b-alfa_x1;
while (fabs(alfa_b-alfa_a)>0.002)
{
if ((Y(alfa_x1)<Y(alfa_x2))&&(alfa_x1<alfa_x2))
{
alfa_b=alfa_x2;
alfa_x2=alfa_a+alfa_b-alfa_x1;
}
else
{
if ((Y(alfa_x1)>=Y(alfa_x2))&&(alfa_x1<alfa_x2))
{
alfa_a=alfa_x1;
alfa_x1=alfa_a+alfa_b-alfa_x2;
}
else
{
if ((Y(alfa_x1)<Y(alfa_x2))&&(alfa_x1>alfa_x2))
{
alfa_a=alfa_x2;
alfa_x2=alfa_x1;
alfa_x1=alfa_a+alfa_b-alfa_x2;
}
else
{
alfa_b=alfa_x1;
alfa_x1=alfa_x2;
alfa_x2=alfa_a+alfa_b-alfa_x1;
}
}
}
}
}
void dev(double &alfa_a, double &alfa_b)
{
double alfa_r=0, w, z, alfa0;
z=y(alfa_a)+y(alfa_b)+3*((Y(alfa_a)-Y(alfa_b))/(alfa_b-alfa_a));
w=exp(0.5*log(z*z-y(alfa_a)*y(alfa_b)));
alfa_r=(alfa_b-alfa_a)*((w-y(alfa_a)+z)/(2*w-y(alfa_a)+y(alfa_b)));
cout<<"alfa_r"<<alfa_r<<endl;
while(y(alfa_r+alfa_a)>0.001)
{
z=y(alfa_a)+y(alfa_b)+(3*(Y(alfa_a)-Y(alfa_b)))/(alfa_b-alfa_a);
w=sqrt(z*z-y(alfa_a)*y(alfa_b));
alfa_r=((alfa_b-alfa_a)*(w-y(alfa_a)+z))/(2*w-y(alfa_a)+y(alfa_b));
if (y(alfa_r+alfa_a)<0)
alfa_a=alfa_a+alfa_r;
else
alfa_b=alfa_a+alfa_r;
}
cout<<"alfa_a="<<alfa_a<<endl;
cout<<"a="<<Y(alfa_a)<<endl;
cout<<"y(a)="<<y(alfa_a)<<endl;
cout<<"alfa_b="<<alfa_b<<endl;
cout<<"b="<<Y(alfa_b)<<endl;
cout<<"y(b)="<<y(alfa_a)<<endl;
cout<<"alfa_r="<<alfa_r<<endl;
cout<<"alfa_r+alfa_a="<<alfa_r+alfa_a<<endl;
cout<<"Y(alfa_r+alfa_a)=x="<<Y(alfa_r+alfa_a);
}
void main()
{
clrscr();
double alfa_x=0, alfa, alfa_a, alfa_b;
if ((fabs((Y(0)-y(0))/y(0))<1)&&(fabs((Y(0)-y(0))/y(0))>0))
{ alfa=fabs((Y(0)-y(0))/y(0));
cout<<"Y(0)"<<Y(0);
cout<<"y(0)"<<y(0);
}
else
alfa=1;
sven(alfa_x,alfa,alfa_a,alfa_b);
cout<<"alfa_a="<<alfa_a<<endl;
cout<<"a="<<Y(alfa_a)<<endl;
cout<<"y(a)="<<y(alfa_a)<<endl;
cout<<"alfa_b="<<alfa_b<<endl;
cout<<"b="<<Y(alfa_b)<<endl;
cout<<"y(b)="<<y(alfa_b)<<endl;
zs2(alfa_a,alfa_b);
cout<<"alfa_a="<<alfa_a<<endl;
cout<<"a="<<Y(alfa_a)<<endl;
cout<<"y(a)="<<y(alfa_a)<<endl;
cout<<"alfa_b="<<alfa_b<<endl;
cout<<"b="<<Y(alfa_b)<<endl;
cout<<"y(b)="<<y(alfa_b)<<endl;
dev(alfa_a,alfa_b);
getch();
}
Соседние файлы в папке all