Лабораторная работа №12 / Lab1
.docСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра ВТ
Лабораторная работа №1
Исследование методов поиска минимума унимодальных функций.
Выполнили: студенты гр. 3372
Варакин Д.
Манакова М.
Проверил:
Санкт-Петербург,
2005 г.
Цель работы:
Изучить методы поиска минимума унимодальной функции и реализовать в виде программы метод Свенна-Фибоначчи-1.
Вариант:
Вар. 3: функция f(x) = 2x2 – ex, начальная точка x = 1, точность локализации минимума =10–3, значение минимума 0.357403.
Описание метода:
Начальный этап:
-
Методом Свенна, начиная от точки x1 определить начальный интервал локализации минимума заданной функции – [a1, b1]; Выбрать длину конечного интервала в пределах 10-4 - 10-8.
-
Вычислить наименьшее число Фибоначчи, удовлетворяющее условию Fn > L1/Ln, определить номер этого числа в последовательности чисел Фибоначчи.
-
Вычислить точки x1 = a1 + (Fn-2 / Fn) * L1 и x2 = a1 + (Fn-1 / Fn) * L1.
-
Установить k = 1 – счетчик числа итераций.
Основной этап:
-
Проверить КОП:
Если k = n-1, то сдвинуть x2 вправо на . Сравнить значения функции в новых промежуточных точках и выбрать интервал, в котором находится минимум. В качестве ответа вернуть середину этого интервала.
-
Сократить ТИЛ:
Если f(x1) < f(x2), то bk+1 = x2, x2 = x1, x1 = ak+1 + (Fn-k-2 / Fn-k) * Lk+1.
иначе ak+1 = x1, x1 = x2, x2 = ak+1 + (Fn-k-1 / Fn-k) * Lk+1.
-
Увеличить счетчик числа итераций, вернуться к шагу 1.
Спецификация основных переменны и функций:
-
Имя
Тип
Входные данные
Вых. данные
Описание
Epsilon
double
-
-
Определяет критерий различимости значений функции.
a, b, x1, x2
double
-
-
На всех этапах указывают на границы ТИЛ и на новые промежуточные точки.
n
int
-
-
Определяет число итераций алгоритма (номер числа Фибоначчи, соответствующий п.2. начального этапа).
Func()
-
double x
double Func(x)
Заданная мат. функция.
Swann()
-
double *a, *b
double *a, *b
Реализует метод Свенна.
Fib()
-
int n
double Fib(n)
Определяет n-ое число Фиб.
Fibonacci()
-
double a,b; int n
double x
Реализует алгоритм Фиб-1.
Текст программы:
#include "math.h"
#include "conio.h"
// Точность вычислений
#define Ln 0.001
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)
{
// Выбор начального интервала локализации минимума
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;
}
Примеры выполнения программы:
-
Точность
Результаты
Ln = 10-4
1. Swann: minimum [-0.470323, 0.632958]
2. n = 22, Fib (22) = 17711
3. Epsilon = 0.000035
4. 1st iteration: x1 = -0.048907, x2 = 0.211542
n-1 iter-s, x1 must be equal to x2: x1 = 0.357434, x2 = 0.357434
5. Fibonacci: x = 0.357451
Real: x = 0.357403
Ln = 10-3
1. Swann: minimum [-0.470323, 0.632958]
2. n = 17, Fib (17) = 1597
3. Epsilon = 0.000387
4. 1st iteration: x1 = -0.048907, x2 = 0.211542
n-1 iter-s, x1 must be equal to x2: x1 = 0.357310, x2 = 0.357310
5. Fibonacci: x = 0.357504
Real: x = 0.357403
Ln = 10-2
1. Swann: minimum [-0.470323, 0.632958]
2. n = 12, Fib (12) = 144
3. Epsilon = 0.004292
4. 1st iteration: x1 = -0.048931, x2 = 0.211566
n-1 iter-s, x1 must be equal to x2: x1 = 0.357138, x2 = 0.357138
5. Fibonacci: x = 0.359284
Real: x = 0.357403
Выводы:
Мы изучили методы поиска минимума унимодальной функции и реализовали в виде программы метод Свенна-Фибоначчи-1.