- •Описание алгоритмов
- •1.1. Метод золотого сечения
- •1.2. Метод Фибоначчи
- •Задаём начальный интервал и точность .
- •Описание программы
- •Сравнительный анализ алгоритмов
- •3.1. Пример работы метода золотого сечения
- •3.2. Пример работы метода Фибоначчи
- •Приложение. Листинг программных модулей
- •3.3 Сравнение алгоритмов.
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Дисциплина: «Алгоритмы и структуры данных»
Лабораторная работа №3.
Выполнил: Студент группы ИКПИ-41
Летягина Е. А.
Проверил: Кандидат технических наук, доцент кафедры ПИиВТ
Дагаев А. В.
г. Санкт-Петербург
2026
Описание алгоритмов
Для сравнения были выбраны два алгоритма решения уравнений: метод золотого сечения и метод Фибоначчи.
1.1. Метод золотого сечения
Метод золотого сечения относится к
классу последовательных методов
исключения отрезков. Он основан на
делении текущего интервала
неопределенности
двумя
внутренними точками, расположенными
симметрично относительно середины
таким образом, чтобы отношение длины
всего отрезка к большей части равнялось
отношению большей части к меньшей. Это
отношение называется золотым
сечением и равно
Обратная величина
также
часто используется.
Алгоритм:
Задаём начальный интервал и точность
.Вычисляем координаты двух внутренних точек:
Вычисляем значения функции в этих точках:
,
.Если
,
то минимум находится на отрезке
,
и мы полагаем
,
,
,
а новую точку
вычисляем
по той же формуле с новыми границами.
Если
,
то минимум на
,
полагаем
,
,
,
а новую точку
вычисляем
заново.
Если
,
можно сократить интервал с любой
стороны.Процесс повторяется, пока длина интервала
.В качестве приближённого минимума берётся середина последнего интервала:
.
Скорость сходимости: за одну итерацию
интервал неопределенности уменьшается
примерно в
раз.
Для достижения точности
требуется
число итераций
На каждой итерации, начиная со второй, вычисляется только одно новое значение функции.
1.2. Метод Фибоначчи
Метод Фибоначчи является оптимальным
в смысле минимизации максимального
числа вычислений функции при заданной
точности. Он использует последовательность
чисел Фибоначчи
,
определяемых рекуррентно:
Алгоритм:
Задаём начальный интервал и точность .
Определяем минимальное целое
такое,
что
На первой итерации (
)
вычисляем точки:
(В
общем виде для k-й итерации используются
числа
и
.)
Вычисляем , .
Сравниваем
и
:
Если , то новый интервал , полагаем , и становится для следующего шага.
Если , то новый интервал , полагаем , и становится .
Если , можно сократить с любой стороны.
Повторяем для
.После завершения итераций интервал неопределенности имеет длину не более . В качестве ответа берём середину последнего интервала.
Скорость сходимости: метод требует
ровно
вычислений
функции (кроме первого шага, где
вычисляются два значения, но одно из
них переиспользуется). Число итераций
фиксировано и определяется заранее.
Описание программы
Программа реализована на языке C++ в среде Visual Studio Code. Использованы стандартные библиотеки: iostream, vector, cmath, chrono, iomanip, windows.h (для поддержки UTF-8 в консоли).
Функции программы
double func(double x) — целевая функция
.double goldenSection(double a, double b, double eps, int &iter) — реализует метод золотого сечения. Принимает границы интервала, точность, ссылку на переменную для числа итераций. Возвращает найденную точку минимума.
vector<unsigned long long> precomputeFibonacci(int n) — предвычисляет первые n чисел Фибоначчи (начиная с
).
Используется для метода Фибоначчи.double fibonacciMethod(double a, double b, double eps, const vector<unsigned long long>& fib, int &iter) — реализует метод Фибоначчи. Принимает интервал, точность, предвычисленный массив чисел Фибоначчи и ссылку на число итераций. Возвращает точку минимума.
main() — управляет экспериментом: задаёт массив точностей , для каждого значения запускает оба метода многократно (1 000 000 раз), усредняет время и количество итераций, выводит таблицу результатов.
Параметры эксперимента
Исследуемая функция: (минимум в точке
).Начальный интервал:
.Точности:
-9.Количество запусков для усреднения: 10000.
Для измерения времени используется библиотека <chrono> с часами high_resolution_clock. Время каждого запуска измеряется в микросекундах. Чтобы исключить влияние накладных расходов на вызов функции и цикл, общее время делится на количество запусков. Отдельное измерение пустого цикла не требуется, так как 10 000 запусков даёт достаточно большое суммарное время, и погрешность усреднения мала.
