Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / LAB4_1
.CPP#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
double func(double x1,double x2,double x3)
{
return (3*(x1-4)*(x1-4)+5*(x2+3)*(x2+3)+7*(2*x3+1)*(2*x3+1));
}
double df(double x1,double x2,double x3,double p1,double p2,double p3)
{
return (6*(x1-4)*p1+10*(x2+3)*p2+28*(2*x3+1)*p3);
}
double agrad1(double x1)
{
return (-6*(x1-4));
}
double agrad2(double x2)
{
return (-10*(x2+3));
}
double agrad3(double x3)
{
return (-28*(2*x3+1));
}
double odnom(double x1,double x2,double x3,double p1,double p2,double p3,double eps,int i)
{
double x1k,x2k,x3k,alfak,alfa0,a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,x11,x22,x33,xmin1,xmin2,xmin3;
double n=fabs((func(x1,x2,x3)-df(x1,x2,x3,p1,p2,p3))/df(x1,x2,x3,p1,p2,p3));
if(n>1) {alfa0=1;}
else {alfa0=n;}
alfak=alfa0;
x1k=x1+alfak*p1;
x2k=x2+alfak*p2;
x3k=x3+alfak*p3;
while(func(x1,x2,x3)>func(x1k,x2k,x3k))
{
x1=x1k;
x2=x2k;
x3=x3k;
alfak=alfak*2;
x1k=x1+alfak*p1;
x2k=x2+alfak*p2;
x3k=x3+alfak*p3;
}
x11=(x1k+x1)/2;
x22=(x2k+x2)/2;
x33=(x3k+x3)/2;
if (func(x1,x2,x3)<func(x11,x22,x33))
{
a1=x1;
a2=x2;
a3=x3;
c1=x11;
c2=x22;
c3=x33;
}
else
{
a1=x11;
a2=x22;
a3=x33;
c1=x1;
c2=x2;
c3=x3;
}
b1=(a1+c1)/2;
b2=(a2+c2)/2;
b3=(a3+c3)/2;
d1=b1+0.5*(b1-a1)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
d2=b2+0.5*(b2-a2)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
d3=b3+0.5*(b3-a3)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
while ((sqrt(((b1-d1)*(b1-d1)+(b2-d2)*(b2-d2)+(b3-d3)*(b3-d3))/(d1*d1+d2*d2+d3*d3))>eps)||((func(b1,b2,b3)-func(d1,d2,d3))/func(d1,d2,d3))>eps)
{
alfak=alfa0;
x1k=x1+alfak*p1;
x2k=x2+alfak*p2;
x3k=x3+alfak*p3;
while(func(x1,x2,x3)>func(x1k,x2k,x3k))
{
x1=x1k;
x2=x2k;
x3=x3k;
alfak=alfak*2;
x1k=x1+alfak*p1;
x2k=x2+alfak*p2;
x3k=x3+alfak*p3;
}
x11=(x1k+x1)/2;
x22=(x2k+x2)/2;
x33=(x3k+x3)/2;
if (func(x1,x2,x3)<func(x11,x22,x33))
{
a1=x1;
a2=x2;
a3=x3;
c1=x11;
c2=x22;
c3=x33;
}
else
{
a1=x11;
a2=x22;
a3=x33;
c1=x1;
c2=x2;
c3=x3;
}
b1=(a1+c1)/2;
b2=(a2+c2)/2;
b3=(a3+c3)/2;
d1=b1+0.5*(b1-a1)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
d2=b2+0.5*(b2-a2)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
d3=b3+0.5*(b3-a3)*(func(a1,a2,a3)-func(c1,c2,c3))/(func(a1,a2,a3)-2*func(b1,b2,b3)+func(c1,c2,c3));
alfa0=alfa0/2;
if (func(b1,b2,b3)>func(d1,d2,d3))
{
x1=b1;
x2=b2;
x3=b3;
}
else
{
x1=d1;
x2=d2;
x3=d3;
}
}
xmin1=(b1+d1)/2;
xmin2=(b2+d2)/2;
xmin3=(b3+d3)/2;
if (i==1)
{
return xmin1;
}
if (i==2)
{
return xmin2;
}
if (i==3)
{
return xmin3;
}
if (i==4)
{
return 2*alfa0;
}
}
void main()
{
clrscr();
double x0[3],x1[3],x2[3],p[3],eps=0.01,d[3],x11[3],xmin[3],alfaopt;
int k=1,i,n;
cout<<"‚ўҐ¤ЁвҐ з «мго в®зЄг\n";
for (n=1;n<4;n++)
{
cin>>x1[n];
}
cout<<"‚ўҐ¤ЁвҐ Ў §®ўго в®зЄг\n";
for (n=1;n<4;n++)
{
cin>>x0[n];
}
for (n=1;n<4;n++)
{
x1[n]=x0[n];
}
p[1]=agrad1(x1[1]);
p[2]=agrad2(x1[2]);
p[3]=agrad3(x1[3]);
for(n=1;n<4;n++)
{
if(p[1]!=0) { p[1]=0; p[2]=agrad1(x1[1]); break;}
if(p[2]!=0) { p[2]=0; p[3]=agrad2(x1[2]); break;}
if(p[3]!=0) { p[3]=0; p[1]=agrad3(x1[3]); break;}
}
for(i=1;i<4;i++)
{
x11[i]=odnom(x1[1],x1[2],x1[3],p[1],p[2],p[3],eps,i);
}
for(i=1;i<4;i++)
{
d[i]=x11[i]-x0[i];
}
while(sqrt(d[1]*d[1]+d[2]*d[2]+d[3]*d[3])>eps)
{
p[1]=agrad1(x1[1]);
p[2]=agrad2(x1[2]);
p[3]=agrad3(x1[3]);
for(n=1;n<4;n++)
{
if(p[1]!=0) { p[1]=0; p[2]=agrad1(x1[1]); break;}
if(p[2]!=0) { p[2]=0; p[3]=agrad2(x1[2]); break;}
if(p[3]!=0) { p[3]=0; p[1]=agrad3(x1[3]); break;}
}
for(i=1;i<4;i++)
{
x11[i]=odnom(x1[1],x1[2],x1[3],p[1],p[2],p[3],eps,i);
}
for(i=1;i<4;i++)
{
d[i]=x11[i]-x0[i];
}
alfaopt=odnom(x1[1],x1[2],x1[3],p[1],p[2],p[3],eps,4);
for(i=1;i<4;i++)
{
x2[i]=x11[i]+alfaopt*d[i];
}
for(i=1;i<4;i++)
{
x1[i]=x2[i];
x0[i]=x11[i];
}
k++;
}
for(i=1;i<4;i++)
{
xmin[i]=x11[i];
}
for(i=1;i<4;i++)
{
cout<<"ЊЁЁ¬г¬ =\n"<<xmin[i]<<"\n";
}
cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ© ="<<k;
getch();
}
Соседние файлы в папке all