Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы Гаусса-Зейделя, Хука-Дживса и Коши / циклического покоординатного спуска

.cpp
Скачиваний:
13
Добавлен:
01.05.2014
Размер:
2.15 Кб
Скачать
#include<conio.h>
#include<math.h>
#include<iostream.h>
#include<stdlib.h>
double *grad (double x1,double x2){
double *g;
g=new double [2];
//g[0]=(-4*(x2-x1*x1)*x1-2*(1-x1));;
//g[1]=(2*(x2-x1*x1));
g[0]=16*x1+4*x2;
g[1]=4*x1+10*x2;
return g;
}
double *ort(int k)
{
  double *o;
  o=new double [2];
	if(k%2==0){ o[0]=0; o[1]=1; }
	else {o[0]=1; o[1]=0;}
return o;
}
double fun(double a,double x01,double x02,double p[2]){
//return (x02+a*p[1]-(x01+a*p[0])*(x01+a*p[0]))*(x02+a*p[1]-(x01+a*p[0])*(x01+a*p[0]))+(1-(x01+a*p[0]))*(1-(x01+a*p[0]));
return (8*(x01+a*p[0])*(x01+a*p[0])+4*(x02+a*p[1])*(x01+a*p[0])+5*(x02+a*p[1])*(x02+a*p[1]));
}
void main(void)

{
//  clrscr();
  double I0=0,al,I1,x,y,a,b,n,d,c,x1,x2,x01,x02,h1=0.01,e=0.0001,*p,*g;
  p=new double [2];
  g=new double [2];
  int k=1;
  x01=10;
  x02=10;
  do{
  x1=x01;
  x2=x02;
  p=ort(k);
  I1=I0+h1;
  if(fun(I0,x1,x2,p)<fun(I1,x1,x2,p))
  {
	 h1=-h1;
	 //I1=I0+h1;
  }
  do
  {
	 h1=2*h1;
	 I1=I1+h1;

	x=fun((I1-h1),x1,x2,p);
	y=fun((I1),x1,x2,p);
  }
  while(fun((I1-h1),x1,x2,p)>fun(I1,x1,x2,p));
  a=I1-1.5*h1;
  b=I1;
  if(a>b)
  {
	 n=a;
	 a=b;
	 b=n;
  }
//////////////////////Paulla/////////////////////////

 double c,d;
 c=b;
 b=(a+b)/2;
 d=((a+b)/2+0.5* (((fun(a,x1,x2,p)-fun(b,x1,x2,p))*(b-c)*(c-a))/ (fun(a,x1,x2,p)*(b-c)+fun(b,x1,x2,p)*(c-a)+fun(c,x1,x2,p)*(a-b))));
 while ( (fabs((d-b)/2)>=e) || (fabs((fun(d,x1,x2,p)-fun(b,x1,x2,p))/fun(b,x1,x2,p))>=e) )
 {
  if (b<d)
  {
	if (fun(b,x1,x2,p)<fun(d,x1,x2,p))
	{
	c=d;
	}
	else
	{
	a=b;
	b=d;
	};
  }
  else
  {
	if (fun(b,x1,x2,p)<fun(d,x1,x2,p))
	{
	a=d;
	}
	else
	{
	c=b;
	b=d;
	};
  };

 d=((a+b)/2+0.5* (((fun(a,x1,x2,p)-fun(b,x1,x2,p))*(b-c)*(c-a))/ (fun(a,x1,x2,p)*(b-c)+fun(b,x1,x2,p)*(c-a)+fun(c,x1,x2,p)*(a-b))));
 }

	cout<<"k: "<<k<<"\n";
	c=(b+d)/2;

	al=c;
	x01=x1+al*p[0];
	x02=x2+al*p[1];
	cout <<"\nmin: "<<x01<<"\n";
	cout <<"\nmin: "<<x02<<"\n";
  
	g=grad(x01,x02);
  k++;
  } while(sqrt((g[0]*g[0])+(g[1]*g[1]))>e);
  //cout<<"\nKol-vo iterracii: "<<k;
  delete[] p;
  delete[] g;

}
Соседние файлы в папке Методы Гаусса-Зейделя, Хука-Дживса и Коши