Скачиваний:
3
Добавлен:
01.05.2014
Размер:
68.1 Кб
Скачать

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

кафедра ВТ

Лабораторная работа №1

Исследование методов поиска минимума унимодальных функций.

Выполнили: студенты гр. 3372

Варакин Д.

Манакова М.

Проверил:

Санкт-Петербург,

2005 г.

Цель работы:

Изучить методы поиска минимума унимодальной функции и реализовать в виде программы метод Свенна-Фибоначчи-1.

Вариант:

Вар. 3: функция f(x) = 2x2 – ex, начальная точка x = 1, точность локализации минимума =10–3, значение минимума 0.357403.

Описание метода:

Начальный этап:

  1. Методом Свенна, начиная от точки x1 определить начальный интервал локализации минимума заданной функции – [a1, b1]; Выбрать длину конечного интервала в пределах 10-4 - 10-8.

  2. Вычислить наименьшее число Фибоначчи, удовлетворяющее условию Fn > L1/Ln, определить номер этого числа в последовательности чисел Фибоначчи.

  3. Вычислить точки x1 = a1 + (Fn-2 / Fn) * L1 и x2 = a1 + (Fn-1 / Fn) * L1.

  4. Установить k = 1 – счетчик числа итераций.

Основной этап:

  1. Проверить КОП:

Если k = n-1, то сдвинуть x2 вправо на . Сравнить значения функции в новых промежуточных точках и выбрать интервал, в котором находится минимум. В качестве ответа вернуть середину этого интервала.

  1. Сократить ТИЛ:

Если 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. Увеличить счетчик числа итераций, вернуться к шагу 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.

Соседние файлы в папке Лабораторная работа №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