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

// Точность вычислений
#define Ln 0.0001
double Epsilon;

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

// Заданная функция
double Func (double x)
{
	return 2*x*x-exp(x);
}

// Реализация алгоритма Свенна (сокращение интервала поиска)
void Swann (double *a, double *b)
{
	double x1 = 1;						// Начальная точка поиска
	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);
}

// Расчет n-ых чисел Фибоначи
double Fib (int n)
{
	if (n < 1) return 0;
	if (n != 1 && n != 2) return Fib(n-1) + Fib(n-2);
	else return 1;
}

// Алогритм поиска минимума функции по алгоритму Фибоначи
double Fibonaci (double a, double b, int n)
{
	int k = 1;			// счетчик числа итераций
	double	x1 = a + (Fib(n-2)/Fib(n)) * (b-a),		// промежуточные точки
			x2 = a + (Fib(n-1)/Fib(n)) * (b-a);		//
	printf ("4. 1st iteration: x1 = %f, x2 = %f\n", x1, x2);

	while (k <= n-1)
	{
		if (Func(x1) < Func(x2))
		{
			b = x2;
			x2 = x1;
			x1 = a + (Fib(n-k-2)/Fib(n-k)) * (b-a);
		}
		else
		{
			a = x1;
			x1 = x2;
			x2 = a + (Fib(n-k-1)/Fib(n-k)) * (b-a);
		}

		k++;
	}

	printf ("   n-1 iter-s, x1 must be equal to x2: x1 = %f, x2 = %f\n", x1, x2);
	x2 = x1 + Epsilon;
	if (Func(x1) < Func(x2))
		return (a+x2) / 2;
	else
		return (b+x1) / 2;
}

int main(void)
{
	printf ("Laboratory work 1. Var. 3; Swann-Fibonacci-1\n\n");

	// Выбор начального интервала локализации минимума
	double a, b, x;
	Swann(&a, &b);						
	printf ("1. Swann: minimum [%f, %f]\n", a, b);

	// Выбор подходящего n
	double L1_div_Ln = (b-a) / Ln;		
	int n = 1;							
	while (Fib(n) < L1_div_Ln) n++;		
	printf ("2. n = %d, Fib (%d) = %d\n", n, n, (int)Fib(n));

	// Выбор критерия различимости значений
	Epsilon = 1 / Fib(n+1);
	printf ("3. Epsilon = %f\n", Epsilon);

	// Основной этап
	x = Fibonaci(a, b, n);
	printf ("5. Fibonacci: x = %f\n        Real: x = 0.357403\n", x);

	printf ("\nPress any key to exit...");
	getch();
	return 0;
}

Соседние файлы в папке Лабораторная работа №12
  • #
    01.05.2014143.36 Кб1blokshema.vsd
  • #
    01.05.201468.1 Кб3Lab1.doc
  • #
    01.05.20142.31 Кб2MO_Lab1.cpp
  • #
    01.05.201435.84 Кб1MO_Lab1.ncb
  • #
    01.05.2014907 б1MO_Lab1.sln
  • #
    01.05.20148.7 Кб1MO_Lab1.suo
  • #
    01.05.20143.85 Кб1MO_Lab1.vcproj
  • #
    01.05.20141.3 Кб1ReadMe.txt