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

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

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

double Mod (double a) {	return a * (a > 0 ? 1 : -1); }
// Заданная функция
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 = 0;
	b = (a+c) / 2;
	*k = 0;

	while ((Mod((b-d)/b) >= Epsilon) || (Mod((Func(a)-Func(b))/Func(b)) >= Epsilon))
	{
		
		if (!(*k) || (*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
			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)));
		if (Func(b) > Func(d))
		{
			c = b;
			b = d;
		}
		else
		{
			a = b;
			b = d;
		}
		(*k)++;
	}
	return (b+d) / 2;
}

int main (void)
{
	double a, b;
	int k1, k2;
	Swann(&a, &b);
	double min1 = Dihotomy (a, b, &k1);
	printf ("1. Dihotomy:\n   Minimum = %f\n   Made %d iterations.\n\n", min1, k1);
	double min2 = Pauell (a, b, &k2);
	printf ("2. Pauell:\n   Minimum = %f\n   Made %d iterations.\n", min2, k2);
	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