Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №51 / LABA5_1
.CPP#include <iostream.h>
#include <math.h>
class dot
{
private:
double x[5],p[5],step;
int num,fun,d;
public:
dot();
void input(int n, int fun1, int def);
double f1(double k);
void pass_into();
void out();
void vektor(int n);
double df1(int n,double k);
void create_step();
double get_step();
};
dot::dot()
{
for(int i=0;i<5;i++)
{
x[i]=0;p[i]=0;
}
step=0;
fun=0;
}
void dot::input(int n,int fun1, int def)
{
cout<<"Vvedite koordinati nachalnoy tochki\n";
for(int i=0;i<n;i++)
{
cin>>x[i];
}
num=n;
fun=fun1;
d=def;
}
double dot::f1(double k)
{
switch(fun)
{
case 1:
return (x[0]+k*p[0]-1)*(x[0]+k*p[0]-1)+(x[1]+k*p[1]-3)*(x[1]+k*p[1]-3)+4*(x[2]+k*p[2]+5)*(x[2]+k*p[2]+5);
break;
case 2:
return (x[0]+k*p[0])*(x[0]+k*p[0])*(x[0]+k*p[0])+(x[1]+k*p[1])*(x[1]+k*p[1])-3*(x[0]+k*p[0])-2*(x[1]+k*p[1])+2;
break;
case 3:
return 4*(x[0]+k*p[0]-5)*(x[0]+k*p[0]-5)+(x[1]+k*p[1]-6)*(x[1]+k*p[1]-6);
default:
return 0;
}
}
void dot::pass_into()
{
for(int i=0;i<num;i++)
{
x[i]=x[i]+step*p[i];
}
}
void dot::out()
{
cout<<"Koordinati tochki minimuma\n";
for(int i=0;i<num;i++)
{
cout<<x[i]<<" ";
}
cout<<'\n';
}
void dot::vektor(int n)
{
for(int i=0;i<num;i++)
{
if(i==n)
p[i]=df1(i,0);
else
p[i]=0;
}
}
double dot::df1(int n,double k)
{
double x1,h=0.0000001,d1,d2;
if(d==1)
{
switch(fun)
{
case 1:
switch(n)
{
case 0:
return 2*(x[0]+k*p[0])-2;
case 1:
return 2*(x[1]+k*p[1])-6;
case 2:
return 8*(x[2]+k*p[2])-40;
default:
return 0;
}
case 2:
switch(n)
{
case 0:
return 3*(x[0]+k*p[0])*(x[0]+k*p[0])-3;
case 1:
return 2*(x[1]+k*p[1])-2;
default:
return 0;
}
case 3:
switch(n)
{
case 0:
return 8*(x[0]+k*p[0])-40;
case 1:
return 2*(x[1]+k*p[1])-12;
default:
return 0;
}
default:
return 0;
}
}
else
{
x1=x[n];
x[n]=x[n]-h;
d1=f1(0);
x[n]=x[n]+2*h;
d2=f1(0);
x[n]=x1;
return (d1+d2)/2*h;
}
}
void dot::create_step()
{
double h1,x_1,x_2,a,b,n,e;
int k=0;
h1=0.01;
x_1=h1;
if(f1(0)<f1(x_1))
{
h1=-h1;
x_1=h1;
}
do
{
h1=2*h1;
x_1=x_1+h1;
}
while(f1(x_1-h1)>f1(x_1));
a=x_1-1.5*h1;
b=x_1;
if(a>b)
{
n=a;
a=b;
b=n;
}
e=0.001;
x_1=a+0.618*fabs(b-a);
do
{
x_2=a+b-x_1;
if((x_1<x_2)&&(f1(x_1)<f1(x_2)))
b=x_2;
if((x_1<x_2)&&(f1(x_1)>=f1(x_2)))
{
a=x_1;
x_1=x_2;
}
if((x_1>x_2)&&(f1(x_1)<f1(x_2)))
a=x_2;
if((x_1>x_2)&&(f1(x_1)>=f1(x_2)))
{
b=x_1;
x_1=x_2;
}
k++;
}
while((abs(b-a)>e)&&(k<200));
step=(a+b)/2;
}
double dot::get_step()
{
return step;
}
void main()
{
dot X;
double e,s;
int k=0,M,i,number,flag=1,fun1,def;
cout<<"1 - (x1-1)^2+(x2-3)^2+4*(x3+5)^2\n";
cout<<"2 - x1^3+x2^2-3*x1-2*x2+2\n";
cout<<"3 - 4*(x1-5)^2+(x2-6)^2\n";
cout<<"Vvedite nomer funkcii ";
cin>>fun1;
switch(fun1)
{
case 1:
number=3;
break;
case 2:
number=2;
break;
case 3:
number=2;
break;
default:
number=0;
break;
}
cout<<"Vvedite tochnost' KOP ";
cin>>e;
cout<<"Ogranichenie na kolichestvo iteraciy ";
cin>>M;
cout<<"Tip differencirovaniya\n1 - analiticheskiy\n2 - chislenniy\n";
cin>>def;
X.input(number,fun1,def);
do
{
for(i=0;i<number;i++)
{
X.vektor(i);
X.create_step();
X.pass_into();
s=X.get_step();
}
k++;
}
while((fabs(X.f1(0)-X.f1(-s))>=e) && (k<M));
cout<<"Kolichestvo shagov "<<k<<'\n';
X.out();
}
Соседние файлы в папке Лабораторная работа №51