Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / Labopt4
.cpp#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
class MyVector
{
public:
double x1;
double x2;
double x3;
MyVector(double x=0.0,double y=0.0,double z=0.0)
{
x1=x; x2=y; x3=z;
}
friend double mv1(MyVector& x)
{
return x.x1;
}
friend double mv2(MyVector& x)
{
return x.x2;
}
friend double mv3(MyVector& x)
{
return x.x3;
}
friend double norma(MyVector& x);
friend MyVector grad(MyVector x);
friend MyVector operator+ (MyVector a,MyVector b);
friend MyVector operator- (MyVector a,MyVector b);
friend MyVector operator* (double k,MyVector a);
friend double operator *(MyVector a,MyVector b);
friend MyVector operator/ (MyVector a,double k);
};
MyVector operator+ (MyVector a,MyVector b)
{
return MyVector((a.x1+b.x1),(a.x2+b.x2),(a.x3+b.x3));
}
MyVector operator- (MyVector a,MyVector b)
{
return MyVector((a.x1-b.x1),(a.x2-b.x2),(a.x3-b.x3));
}
MyVector operator* (double k, MyVector x)
{
return MyVector((k*x.x1),(k*x.x2),(k*x.x3));
}
ostream& operator<<(ostream&s,MyVector x)
{
return s <<"["<<mv1(x)<<" , "<<mv2(x)<<" , "<<mv3(x)<<"] \n";
}
double operator *(MyVector a,MyVector b)
{
double c=a.x1*b.x1+a.x2*b.x2+a.x3*b.x3;
return c;
}
MyVector operator/ (MyVector a,double k)
{
return MyVector((a.x1/k),(a.x2/k),(a.x3/k));
}
double func(MyVector x)
{
return ((3*(x.x1-4)*(x.x1-4))+(5*(x.x2+3)*(x.x2+3))+(7*(2*x.x3+1)*(2*x.x3+1)));
}
MyVector grad(MyVector x)
{
MyVector gradient;
gradient.x1=6*x.x1-24;
gradient.x2=10*x.x2+30;
gradient.x3=56*x.x3+28;
return gradient;
}
double df(MyVector x,MyVector p)
{
return (grad(x)*p);
}
double alfaopt(MyVector x,MyVector p)
{
return ((-6*(x.x1-4)*p.x1-10*(x.x2+3)*p.x2-28*(2*x.x3+1)*p.x3)/(6*(p.x1-4)+10*(p.x2+3)+28*(2*p.x3+1)));
}
double norma(MyVector& x)
{
return sqrt(x.x1*x.x1+x.x2*x.x2);
}
MyVector ort(MyVector ek)
{
for (int i=0; i<3;i++)
{
if(ek.x1==1) {ek.x1=0;ek.x2=1;break;}
if(ek.x2==1) {ek.x2=0;ek.x3=1;break;}
if(ek.x3==1) {ek.x3=0;ek.x1=1;break;}
}
return ek;
}
MyVector DSK(MyVector x,MyVector p)
{
MyVector x1,x11,xmin,a,b,c,d;
double alfa0,alfak,epsDSK=0.0001;
int k1=0,k2=0;
double n=fabs((func(x)-df(x,p))/df(x,p));
if (n>1)
{
alfa0=1;
}
else
{
alfa0=n;
}
alfak=alfa0;
x1=x+alfak*p;
if(func(x1)>func(x))
{
p=-1*p;
}
x1=x+alfak*p;
while(func(x)>func(x1))
{
x=x1;
alfak=2*alfak;
x1=x+alfak*p;
k1++;
}
x11=(x1+x)/2;
if(func(x)<func(x11))
{
a=x;
c=x11;
}
else
{
a=x11;
c=x;
}
b=(a+c)/2;
d=b+0.5*(((func(a)-func(c))*(b-a))/(func(a)-2*func(b)+func(c)));
while (((norma(d-b)/norma(d))>=epsDSK)||(abs((func(b)-func(d))/func(d))>=epsDSK))
{
alfak=alfa0;
x1=x+alfak*p;
if(func(x1)>func(x))
{
p=(-1)*p;
}
x1=x+alfak*p;
while(func(x)>func(x1))
{
x=x1;
alfak=2*alfak;
x1=x+alfak*p;
k1++;
}
x11=(x1+x)/2;
if(func(x)<func(x11))
{
a=x;
b=x11;
}
else
{
a=x11;
c=x;
}
b=(a+c)/2;
d=b+0.5*(((func(a)-func(c))*(b-a))/(func(a)-2*func(b)+func(c)));
alfa0=alfa0/2;
if(func(b)>func(d))
{
x=b;
}
else
{
x=d;
}
k2++;
}
xmin=(b+d)/2;
return (xmin);
}
void main()
{
clrscr();
MyVector x0(2,-2,-2),p,x1(0,0,0),d,x11,x22,xmin,ek(0,0,1),help(0,0,0);
int n=1;
double eps=0.000001;
x1=x0;
do
{
x11=x1;
for (int i=0;i<3;i++)
{
ek=ort(ek);
p=ek;
x11=DSK(x1,p);
if(i==0) help.x1=mv1(x11);
if(i==1) help.x2=mv2(x11);
if(i==2) help.x3=mv3(x11);
}
x11=help;
d=x11-x0;
x22=x11+alfaopt(x11,p)*d;
x1=x22;
x0=x11;
ek=ort(ek);
p=ek;
n++;
}
while(norma(d)>eps);
xmin=x11;
cout<<"\nMinimum = "<<xmin;
cout<<"\nKol-vo iteraci = "<<n;
getch();
}
Соседние файлы в папке all