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

Градиентные методы / 4_gaysazeidelya+ZS

.CPP
Скачиваний:
7
Добавлен:
01.05.2014
Размер:
2.49 Кб
Скачать
#include<conio.h>
#include<stdio.h>
#include<math.h>

double funcxy (double, double, double);
double funca (double, double*);
double defx (double);
double defy (double);
double defz (double);
double DEF ( double*, double*);
double ZS1 (double,double,int);

double X0[3]={0,0,0};
double t[3];
double   p[3][3]= {
			 { 1,0,0 },
			 { 0,1,0 },
			 { 0,0,1 },
			};

void main (void)
{
	clrscr();
	double  x[3], y[3],  step, a, b, norma, E=0.1 ;
	int i;
	t[0]=X0[0];
	t[1]=X0[1];
	t[2]=X0[2];
	do
	{
		for(i=0;i<3;i++)
		{
			//p[i][i]=1;
			step=0.01; a=0; b=0;
			x[0]=y[0]=t[0];
			x[1]=y[1]=t[1];
			x[2]=y[2]=t[2];
			switch(i)
			{
				case 1: p[1][1]=defx(t[1]);
						 break;
				case 2: p[2][2]=defy(t[2]);
						 break;
				case 3: p[3][3]=defz(t[3]);
						 break;
			}
			if( DEF(x,*(p+i))>0 )
			{
				p[i][0]=-p[i][0];
				p[i][1]=-p[i][1];
				p[i][2]=-p[i][2];
			}
			do
			{
				x[0]=y[0]; x[1]=y[1]; x[2]=y[2];
				y[0]=t[0]+step*p[i][0];
				y[1]=t[1]+step*p[i][1];
				y[2]=t[2]+step*p[i][2];
				a=b;
				b=step;
				step=step*2;
			}
			while( DEF(x,*(p+i))*DEF(y,*(p+i))>0 );
			a=ZS1(a,b,i);
			t[0]=t[0]+a*p[i][0];
			t[1]=t[1]+a*p[i][1];
			t[2]=t[2]+a*p[i][2];

		}
		norma = sqrt( pow( defx(t[0]),2 ) + pow( defy(t[1]),2 ) + pow( defz(t[2]),2 ) );
	}
	while( norma>E );

	printf("Minimum: ( %f , %f , %f )", t[0],t[1],t[2]);
	while(getch()!=32);


}

double funcxy (double x, double y, double z)
{
		 //		return( (x-1)*(x-1)+(y-3)*(y-3)+4*(z-5)*(z-5) );
			return( 3*(x-4)*(x-4) + 5*(y+3)*(y+3)+7*(2*z+1)*(2*z+1) );
}

double funca (double a, double*p)
{
	return( funcxy( t[0]+a*p[0], t[1]+a*p[1], t[2]+a*p[2] ) );
}

double defx ( double x )
{
			//		return( 2*x-2 );
			return( 6*x-24 );
}


double defy ( double y )
{
			 //		return( 2*y-6 );
			 return( 10*y+30 );
}

double defz ( double z )
{
			 //		return( 8*z-40 );
			 return( 56*z+28 );
}

double DEF ( double *x, double*p )
{
	return( defx( *x ) * (*p) + defy( *(x+1) ) * (*(p+1)) + defz( *(x+2) ) * (*(p+2)) );
}

double ZS1 (double a, double b, int v)
{
	double q, w, E=0.001;
	q=a+0.381966011*fabs(b-a);
	w=a+0.618033988*fabs(b-a);

	do
	{
		if( fabs(funca(q,*(p+v)))<fabs(funca(w,*(p+v))) )
		{
			b=w;
			w=q;
			q=a+0.381966011*fabs(b-a);

		}
		else
		{
			a=q;
			q=w;
			w=a+0.618033988*fabs(b-a);
		}

	}while(fabs(b-a)>E);

	return((a+b)/2);

}
Соседние файлы в папке Градиентные методы