Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №12 / MO_Lab1
.cpp#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;
}