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

double funcxy (double,double);
double funca (double);
double defx (double,double);
double defy (double,double);
double DEF ( double*);
void ZS1 (double,double);
void pawell (double,double);

double X0[2]={-1,0}, p[2]={5,1};

void main (void)
{
//	clrscr();
	double  x[2], y[2], step=0.01, a=0, b=0 ;
	x[0]=y[0]=X0[0];
	x[1]=y[1]=X0[1];

	if( DEF(x)<0 )
	{
		p[0]=p[0];
		p[1]=p[1];
	}
	else
	{
		p[0]=-p[0];
		p[1]=-p[1];
	}

	do
	{
		x[0]=y[0]; x[1]=y[1];
		y[0]=X0[0]+step*p[0];
		y[1]=X0[1]+step*p[1];
		a=b;
		b=step;
		step=step*2;
	}
	while( DEF(x)*DEF(y)>0 );

	printf("A=%f,\tB=%f\n",a,b);
	while(getch()!=32);

	ZS1(a,b);

	printf("\nA=%f,\tB=%f\n",a,b);
	while(getch()!=32);

	pawell(a,b);


}

double funcxy (double x, double y)
{
		return( 100*(y-x*x)*(y-x*x)+(1-x)*(1-x) );

}

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

double defx (double x, double y)
{
		return( -400*y*x+400*pow(x,3)-2+2*x );

}


double defy (double x, double y)
{
		return( 200*y-200*x*x );

}

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

void ZS1 (double a, double b)
{
	double q, w, x[2], y[2], E=0.001;
	q=a+0.381966011*fabs(b-a);
	w=a+0.618033988*fabs(b-a);
	int z=0;
	do
	{
		x[0]=X0[0]+q*p[0];
		x[1]=X0[1]+q*p[1];
		y[0]=X0[0]+w*p[0];
		y[1]=X0[1]+w*p[1];
		if( fabs(DEF(x))<fabs(DEF(y)) )
		{
			b=w;
			w=q;
			q=a+0.381966011*fabs(b-a);

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

	a=(a+b)/2;
	x[0]=X0[0]+a*p[0];
	x[1]=X0[1]+a*p[1];

	printf("Minimum:(%f,  %f)\nIteratsii:  %d\n",x[0],x[1],z);
	while(getch()!=32);
}

void pawell (double a, double b)
{
	double E=0.001, c=b, d, x[2], y[2];
	int z=0;
	b=(a+c)/2;
	d=(a+b)/2 + 0.5*( ( (funca(a)-funca(b))*(b-c)*(c-a) )/( funca(a)*(b-c)+funca(b)*(c-a)+funca(c)*(a-b) ) );
	while( ( fabs((d-b)/2)>E )||( fabs((funca(d)-funca(b))/funca(b))>E ) )
	{
		if(b<d)
		{
			if( funca(b)<funca(d) )
				c=d;
			else
			{
				a=b;
				b=d;
			}
	 }
	 else
	 {
		 if( funca(b)<funca(d) )
			 a=d;
		 else
		 {
			 c=b;
			 b=d;
		 }
	 }
	 d=(a+b)/2 + 0.5*( ( (funca(a)-funca(b))*(b-c)*(c-a) )/( funca(a)*(b-c)+funca(b)*(c-a)+funca(c)*(a-b) ) );
	 z++;
	}
	a=(b+d)/2;
	x[0]=X0[0]+a*p[0];
	x[1]=X0[1]+a*p[1];

	printf("Minimum:(%f,  %f)\nIteratsii: %d\n",x[0],x[1],z);
	while(getch()!=32);

}
Соседние файлы в папке Метод Дэвидсона