Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
01.05.2014
Размер:
3.43 Кб
Скачать
#include<math.h>
#include<conio.h>
#include<iostream.h>
#include<stdio.h>

double x,y,z,a,b;

double alphamin,px,py,pz;
int k;

double dfx(double x)    //производная функции по х
	{
		return(2*x-2);
	}
	

double dfy(double y)       //производная функции по у
	{
		return(2*y-6);
	}


double dfz(double z)		//производная функции по z
	{
		return(8*z+40);
	}



double func(double alpha)		// функция от альфа
{
  return (pow(x+alpha*px-1,2)+pow(y+alpha*py-3,2)+4*(pow(z+alpha*pz+5,2)));
}


void swann()			//локализация минимума
{
  double t=0,h=0.00001;
  if(func(t)<func(t+h))
  {
	h=-h;
  }

  double x1,x2;
  x1=0;
  x2=x1+h;

  while(func(x1)>func(x2))
  {
	h=2*h;
	x1=x2;
	x2=x1+h;
  }

  if((x1-1.5*h)<x1)
  {
	  a=x1-1.5*h;
	  b=x1;
	  cout<<endl<<"SWENN: ( "<<a<<"  "<<b<<" )"<<endl;
  }
  else
  {
	  b=x1-1.5*h;
	  a=x1;
	  cout<<endl<<"SWENN: ( "<<a<<"  "<<b<<" )"<<endl;
  }
}


double ZS_1(double a,double b)  //метод ЗС-1 для поиска альфа минимум
{
		double nu,lj,e;
		e=0.0000001;
		nu=a+0.618*(b-a);
		cout<<endl<<"nu="<<nu<<endl;
		lj=a+0.382*(b-a);
		cout<<endl<<"lj="<<lj<<endl;


	while(fabs(b-a)>=e)
	{
		if(func(lj)<=func(nu))
		{    
			b=nu;
			nu=lj;
			lj=a+0.382*(b-a);
			cout<<endl<<func(lj)<<"			"<<func(nu)<<endl;
			cout<<endl<<"a="<<a<<"   "<<"b="<<b<<endl;
			cout<<"lj="<<lj<<"   nu="<<nu<<endl;

		}
		else
		{
			a=lj;
			lj=nu;
			nu=a+0.618*(b-a);
			cout<<endl<<"a="<<a<<"   "<<"b="<<b<<endl;
			cout<<"lj="<<lj<<"   nu="<<nu<<endl;
		}
		
	}
	cout<<endl<<"alphamin="<<(a+b)/2<<endl;
  
  return (a+b)/2;
}



double Laba3()  // лабораторная работа номер три 
{
  swann();
  alphamin=ZS_1(a,b);
  return (alphamin);
}


void Gaussa_SeidelR()   //в этой ф-ии реализован метод Гаусса-Зейделя
{   
	double eps=0.000001;    
	int kolvo=0;
	
	while(sqrt(dfx(x)*dfx(x)+dfy(y)*dfy(y)+dfz(z)*dfz(z))>eps) //проверка КОП
	{	
		px=dfx(x);  cout<<endl<<"px="<<px ;    //вектор первого направления движения 
		py=0;				//движение происходит по оси Х
		pz=0;

		alphamin=Laba3();	//вызов лаб. работы три

		x=x+alphamin*px;
		y=y+alphamin*py;	//находим новые координаты в зависимости от найденнго альфа
		z=z+alphamin*pz;

		px=0;				//вектор второго направления движения
		py=dfy(y);			//вдоль оси У
		pz=0;

		alphamin=Laba3();	//вызов лаб. работы три

		x=x+alphamin*px;
		y=y+alphamin*py;	//находим новые координаты в зависимости от найденнго альфа
		z=z+alphamin*pz;

		px=0;				//вектор третьего направления движения
		py=0;				//вдоль оси Z
		pz=dfz(z);

		alphamin=Laba3();	//вызов лаб. работы три

		x=x+alphamin*px;
		y=y+alphamin*py;	//находим новые координаты в зависимости от найденнго альфа
		z=z+alphamin*pz;
		kolvo++;
	} 
	

	cout<<"Kol-vo iteracii : <"<<kolvo<<">"<<endl;
	cout<<"Minimum naiden : ( "<<x<<" ; "<<y<<" ; "<<z<<" )"<<endl;
}





void main()
{
	char n;
  cout<<"Welcome to the programm!                                       Avtor:Malgin S.A."<<endl<<"________________________________________________________________________________"<<endl;
  while(n!='n')
  {
	  cout<<"Vvedite koordinati na4alnoi to4ki X0(X;Y;Z):"<<endl<<"X=";
	cin>>x;
	cout<<endl<<"Y=";
	cin>>y;
	cout<<endl<<"Z=";
	cin>>z;

    Gaussa_SeidelR();
  cout<<endl<<"EWO?";
  cin>>n;
  cout<<endl<<endl<<endl;
  }
}

Соседние файлы в папке Лабораторная работа №41