Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
01.05.2014
Размер:
3.68 Кб
Скачать
#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