Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
02.05.2014
Размер:
3.36 Кб
Скачать
// stdafx.cpp : source file that includes just the standard includes
// MOLab1.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

double f(double x)
{
	return 1.4 * x + exp( abs( x - 2 ) );
}

CDPoint find1(int k, int& nSteps)
{
	ASSERT( 1 < k );
	double a = X_LEFT;
	double b = X_RIGHT;
	int    n = 2 * k - 1;

	double* x = new double[ n + 3 ];
	double* y = new double[ n + 3 ];

	int j = 0;
	double min_y = 0;

	x[k] = ( b - a ) / 2;
	y[k] = f( x[ k ] );

	nSteps = 0;

	while ( abs( b - a ) > 2 * X_EPS )
	{
		nSteps++;
		min_y = y[k];
		j = k;

		for (int i = 0; i <= n + 1; i++)
		{
			if (i != k)
			{
				x[ i ] = a + i * ( b - a ) / ( n + 1 );
				y[ i ] = f( x[ i ] );
				if ( y[ i ] < min_y )
				{
					min_y = y[ i ];
					j = i;
				}
			}
		}

		a = x[ j - 1 ];
		b = x[ j + 1 ];
		x[ k ] = x[ j ];
		y[ k ] = y[ j ];
	}

	CDPoint pt(x[ k ], y[ k ]);

	delete[] x;
	delete[] y;

	return pt;
};

CDPoint find2(int& nSteps, int n)
{
	double a = X_LEFT;
	double b = X_RIGHT;
	int* fib = NULL;
	if (0 == n)
	{
		fib = new int[ 3 ];

		fib[ 0 ] = 0;
		fib[ 1 ] = 1;
		fib[ 2 ] = 1;

		nSteps = (int)(a + b);

		while ( abs( b - a ) / fib[ 2 ] > 2 * X_EPS )
		{
			fib[ 0 ] = fib[ 1 ];
			fib[ 1 ] = fib[ 2 ];
			fib[ 2 ] = fib[ 0 ] + fib[ 1 ];
			n++;
		}

		delete[] fib;
	}

	fib = new int[ n + 3 ];

	fib[ 0 ] = 0;
	fib[ 1 ] = 1;

	for (int i = 2; i <= n; i++)
		fib[ i ] = fib[ i - 2 ] + fib[ i - 1 ];

	double x1 = a + ( b - a ) * fib[ n - 2 ] / fib[ n ];
	double x2 = a + ( b - a ) * fib[ n - 1 ] / fib[ n ];
	double y1 = f( x1 );
	double y2 = f( x2 );

	for (int i = 0; i < n - 2; i++)
	{
		if (y1 <= y2)
		{
			b = x2;
			x2 = x1;
			y2 = y1;
			x1 = a + b - x2;
			y1 = f( x1 );
		}
		else
		{
			a = x1;
			x1 = x2;
			y1 = y2;
			x2 = a + b - x1;
			y2 = f ( x2 );
		}
	}

	delete[] fib;

	nSteps = n;

	if ( y1 < y2 )
	{
		return CDPoint( x1, y1 );
	}
	else
	{
		return CDPoint(x2, y2 );
	}
};

CDPoint find3(int& nSteps)
{
	double a = X_LEFT;
	double b = X_RIGHT;
	double c = ( a + b ) / 2;

	double ya = 0;
	double yb = 0;
	double yc = 0;
	double t  = 0;
	double x  = 0;
	double y  = 0;


	ya = f ( a );
	yb = f ( b );
	yc = f ( c );

	nSteps = 0;

	while ( abs( b - a ) > X_EPS )
	{
		nSteps++;
		t = c + 0.5 * ( ( b - c ) * ( b - c ) * ( ya - yc ) - ( c - a ) * ( c - a ) * ( yb - yc ) )
			/ ( ( b - c ) * ( ya - yc ) + ( c - a ) * ( yb - yc ) );

		if ( abs(t - c) < EPS )
			x = ( a + c ) / 2;
		else x = t;
		y = f( x );

		if ( x < c )
		{
			if ( abs( y - yc ) < EPS )
			{
				a = x;
				b = c;
				c = ( x + c ) / 2;
				ya = y;
				yb = yc;
				yc = f ( c );
			}
			else if ( y < yc )
			{
				b = c;
				c = x;
				yb = yc;
				yc = y;
			}
			else if ( y > yc)
			{
				a = x;
				ya = y;
			}
		}
		else if ( x > c )
		{
			if ( abs( y - yc ) < EPS )
			{
				a = c;
				b = x;
				c = ( x + c ) / 2;
				ya = yc;
				yb = y;
				yc = f ( c );
			}
			else if ( y < yc )
			{
				a = c;
				c = x;
				ya = yc;
				yc = y;
			}
			else if ( y > yc)
			{
				b = x;
				yb = y;
			}
		}
		else ASSERT( 0 );
	}
	return CDPoint( x, y );
};
Соседние файлы в папке MOLab1