Скачиваний:
2
Добавлен:
01.05.2014
Размер:
3.61 Кб
Скачать
#include <conio.h>
#include <stdio.h>
#include <math.h>

//структура для передачи интервала
struct interval
{
	double min_val;
	double max_val;
};

//расчет значения функции в точке Х
double function(double x)
{
	double x2 = x*x;
	return (x2*x2-14*x2*x+60*x2-70*x);
}

//Реализация метода Свенна
struct interval Svenn(double x0)
{
	struct interval result;
	double d = 1;
	int k;
	double x1,x2,x3;
	//Начальный этап
	double func_x0 = function(x0);
	double func_x1 = function(x0-d);
	double func_x2 = function(x0+d);
	double func_x3;
	printf("\nMethod Svenna\n");
	//Определяем направление поиска интервала
	if (func_x1 <= func_x0 && func_x0 <= func_x2)
		d *= -1;
	//Если условие выполняется, то интервал найден
	if (func_x1 > func_x0 && func_x0 <= func_x2)
	{
		result.min_val = x0-fabs(d);
		result.max_val = x0+fabs(d);
		return result;
	}
	//Получить точки Х1 и Х2
	k = 0;
	x1 = x0;
	x2 = x0+d*(1<<k);
	k++;
	//Получить точку Х3
	x3 = x1+d*(1<<k);
	//Рассчитать значения функций в этих точках
	//для уменьшения кол-ва вычислений функции
	func_x1 = function(x1);
	func_x2 = function(x2);
	func_x3 = function(x3);
	printf("Iteration %d. x1=%f x2=%f x3=%f d=%f\n",k,x1,x2,x3,d*(1<<k));
	//Основной этап
	while (func_x3 < func_x2)
	{
		k++;
		//Находим следующие точки
		x1 = x2;
		x2 = x3;
		x3 += d*(1<<k);
		printf("Iteration %d. x1=%f x2=%f x3=%f d=%f\n", k, x1, x2, x3, d*(1<<k));
		func_x2 = func_x3;
		func_x3 = function(x3);
	}
	//Возвращаем найденный интервал
	if (x1 > x3)
	{
		result.min_val = x3;
		result.max_val = x1;
	}
	else
	{
		result.min_val = x1;
		result.max_val = x3;
	}
	return result;
}

//Получение числа Фибоначчи
//Рекурсивная функция
int FNumber(int n)
{
	if (n <= 1)
		return 1;
	else
		return FNumber(n-1)+FNumber(n-2);
}
//Реализация метода Фибоначчи
double Fibonachchi(struct interval val,double eps)
{
	int n;
	double l,m;
	//Начальный этап.
	int k = 1;
	printf("\nMethod Fibonachchi\n");
	//Находим начальное число Фибоначчи
	double Lk = val.max_val-val.min_val;
	for (n=1;n<30;n++)
	{
		if ((double)FNumber(n) >= Lk/eps)
			break;
	}
	//Находим две пробные точки
	l = val.min_val+((double)FNumber(n-2)/(double)FNumber(n))*(val.max_val-val.min_val);
	m = val.min_val+((double)FNumber(n-1)/(double)FNumber(n))*(val.max_val-val.min_val);
	//Основной этап.
	while (k < n-1)
	{
		//Сокращаем ТИЛ
		//и находим новые точки для проверки
		if (function(l)<function(m))
		{
			val.max_val = m;
			m = l;
			l = val.min_val + (double)FNumber(n-k-2)/(double)FNumber(n-k)*(val.max_val - val.min_val);
		}
		else
		{
			val.min_val = l;
			l = m;
			m = val.min_val+(double)FNumber(n-k-1)/(double)FNumber(n-k)*(val.max_val - val.min_val);
		}
		printf("Iteration %d: (%f,%f)\n",k,val.min_val,val.max_val);
		k++;
	}
	//Находим аппроксимирующий минимум.
	m = l + eps;
	if (function(l) > function(m))
		return (l+val.max_val)/2;
	else
		return (val.min_val+m)/2;

}
//Основная программа
int main(int argc,char* argv[])
{
	double x;
	double eps;
	struct interval sv;
	double res;
	clrscr();
	//Установка начальных данных
	x = 2;
	eps = 1e-2;
	printf("Function: x^4-14*x^3+60*x^2-70*x\n");
	printf("Begin point: %f\n",x);
	printf("Eps: %f\n",eps);
	//Получение интервала методом Свенна.
	sv = Svenn(x);
	printf("Svenn return interval = (%f,%f)\n",sv.min_val,sv.max_val);
	//Получение локального минимума методом Фибоначчи
	res = Fibonachchi(sv,eps);
	printf("Fibonachchi result: %f\n",res);
        getch();
	return 0;
        getch();
}
Соседние файлы в папке Лабораторная№1 вариант№4