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

// Точность вычислений
#define Epsilon 0.01
#define Delta 0.001

#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))

// Заданная функция
double Func (double x)
{
	return pow(x, 4) - 14*pow(x, 3) + 60*pow(x, 2) - 70*x;
}

// Реализация алгоритма Свенна (сокращение интервала поиска)
void Swann (double *a, double *b)
{
	double x1 = 2;						// Начальная точка поиска
	double h = Func(x1)*0.001;			// Начальный шаг
	if (Func(x1) < Func(x1+h)) h *= -1;	// Выбор направления поиска

	while (Func(x1) > Func(x1+h))		// Сокращение интервала с удвоением шага
	{
		x1 += h;
		h *= 2;
	}

	*a = min(x1+h, x1-h/2);
	*b = max(x1+h, x1-h/2);
}


double Dihotomy (double a, double b, int *k)
{
	*k = 0;
	double x1, x2;

	while (b-a > Epsilon)
	{
		x1 = (a+b-Delta) / 2;
		x2 = (a+b+Delta) / 2;

		if (Func(x1) < Func(x2))
			b = x2;
		else
			a = x1;

		(*k)++;
	}

	return (a+b) / 2;
}



double Pauell (double a, double b, int *k)
{
	double c = b, d;
	b = (a+c) / 2;
	*k = 0;

	do
	{
		if (!(*k))
			d = 0.5 * (Func(a)*(b*b-c*c) + Func(b)*(c*c-a*a) + Func(c)*(a*a-b*b)) /
				(Func(a)*(b-c) + Func(b)*(c-a) + Func(c)*(a-b));
		else
		{
			c = b;
			if (Func(d) < Func(b)) 
				b = d;

			//printf ("1 = %f, 2 = %f, 3 = %f\n", Func(a)*(b-c), Func(b)*(c-a), Func(c)*(a-b));
			d = (a+b)/2 + 0.5 * ((pow(Func(a)-Func(b), 2) * (b-c) * (c-a)) / 
				(Func(a)*(b-c) + Func(b)*(c-a) + Func(c)*(a-b)));
		}

		(*k)++;
		printf ("\nabs = %f, b = %f, d = %f\n", abs((b-d)/b), b ,d);
		getch ();
	}
	while ((abs((b-d)/b) > Epsilon*Epsilon) || (abs((Func(b)-Func(d))/Func(b)) > Epsilon*Epsilon));


	return (b+d) / 2;
}




int main (void)
{
	double a, b;
	int k1, k2;
	Swann(&a, &b);

	double min1 = Pauell (a, b, &k1);
	printf ("1. Dihotomy:\n   Minimum = %f\n   Made %d iterations.\n", min1, k1);


	//printf ("%f %f", a, b);

	getch ();
	return 0;
}
Соседние файлы в папке Lab2
  • #
    01.05.20142.01 Кб1Lab2.cpp
  • #
    01.05.201427.65 Кб1Lab2.ncb
  • #
    01.05.2014897 б1Lab2.sln
  • #
    01.05.20148.19 Кб1Lab2.suo
  • #
    01.05.20143.37 Кб1Lab2.vcproj
  • #
    01.05.20142.03 Кб1_Lab2.cpp