Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / LAB4_2
.CPP#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
double grad1,grad2,grad3,eps=0.00001;
class vector
{
double x1,x2,x3;
public:
vector (double x11=0.0,double x22=0.0,double x33=0.0)
{
x1=x11;
x2=x22;
x3=x33;
}
friend double k1(vector& x)
{
return x.x1;
}
friend double k2(vector& x)
{
return x.x2;
}
friend double k3(vector& x)
{
return x.x3;
}
friend double func(vector x);
friend double df(vector x,vector p);
friend double norma(vector x);
friend vector operator+ (vector a,vector b);
friend vector operator- (vector a,vector b);
friend vector operator* (double k,vector a);
};
vector operator +(vector a,vector b)
{
return vector((a.x1+b.x1),(a.x2+b.x2),(a.x3+b.x3));
}
vector operator -(vector a,vector b)
{
return vector((a.x1-b.x1),(a.x2-b.x2),(a.x3-b.x3));
}
vector operator* (double k, vector x)
{
return vector((k*x.x1),(k*x.x2),(k*x.x3));
}
ostream& operator<<(ostream&s,vector x)
{
return s <<"["<<k1(x)<<", "<<k2(x)<<", "<<k3(x)<<"] ";
}
double func(vector x)
{
return (3*(x.x1-4)*(x.x1-4)+5*(x.x2+3)*(x.x2+3)+7*(2*x.x1+1)*(2*x.x1+1));
}
double df(vector x,vector p)
{
double h=0.0001;
vector e1(1,0,0), e2(0,1,0), e3(0,0,1);
grad1=(func(x+h*e1)-func(x-h*e1))/2*h;
grad2=(func(x+h*e2)-func(x-h*e2))/2*h;
grad1=(func(x+h*e3)-func(x-h*e3))/2*h;
return (grad1*p.x1+grad2*p.x2+grad3*p.x3);
}
double norma(vector x)
{
return sqrt(x.x1*x.x2+x.x2*x.x2+x.x3*x.x3);
}
void main()
{
clrscr();
double alfa;
int k=0;
vector x0(2,-2,-2), x1(0,0,0), p0(1,1,1), xk(0,0,0), a(0,0,0), b(0,0,0), xmin(0,0,0),L(0,0,0);
alfa=0.01;
if (df(x0,p0)>0)
{
p0=-1*p0;
}
x1=x0;
while(df(x1,p0)*df(x0,p0)>0)
{
alfa=2*alfa;
x1=x1+alfa*p0;
}
a=x1+(-1)*alfa*p0;
b=x1;
cout<<"Ќ з «мл© ЁвҐаў « = "<<a<<b;
xk=0.5*(a+b);
L=b-a;
while((norma(L)>eps)||(df(xk,p0)>eps))
{
xk=0.5*(a+b);
if(df(xk,p0)>0)
{
b=xk;
}
else
{
a=xk;
}
L=b-a;
k++;
}
xmin=xk;
cout<<"\nЊЁЁ¬г¬ = "<<xmin;
cout<<"\nЉ®«ЁзҐбвў® ЁвҐа жЁ© = "<<k;
getch();
}
Соседние файлы в папке all