Скачиваний:
0
Добавлен:
22.09.2026
Размер:
66 Кб
Скачать
☆

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Дисциплина: «Алгоритмы и структуры данных»

Лабораторная работа №3.

Выполнил: Студент группы ИКПИ-41

Летягина Е. А.

Проверил: Кандидат технических наук, доцент кафедры ПИиВТ

Дагаев А. В.

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

2026

  1. Описание алгоритмов

Для сравнения были выбраны два алгоритма решения уравнений: метод золотого сечения и метод Фибоначчи.

1.1. Метод золотого сечения

Метод золотого сечения относится к классу последовательных методов исключения отрезков. Он основан на делении текущего интервала неопределенности   двумя внутренними точками, расположенными симметрично относительно середины таким образом, чтобы отношение длины всего отрезка к большей части равнялось отношению большей части к меньшей. Это отношение называется золотым сечением и равно

Обратная величина   также часто используется.

Алгоритм:

  1. Задаём начальный интервал   и точность  .

  2. Вычисляем координаты двух внутренних точек:

  3. Вычисляем значения функции в этих точках:  ,  .

  4. Если  , то минимум находится на отрезке  , и мы полагаем  ,  ,  , а новую точку   вычисляем по той же формуле с новыми границами. Если  , то минимум на  , полагаем  ,  ,  , а новую точку   вычисляем заново. Если  , можно сократить интервал с любой стороны.

  5. Процесс повторяется, пока длина интервала  .

  6. В качестве приближённого минимума берётся середина последнего интервала:  .

Скорость сходимости: за одну итерацию интервал неопределенности уменьшается примерно в   раз. Для достижения точности   требуется число итераций

На каждой итерации, начиная со второй, вычисляется только одно новое значение функции.

1.2. Метод Фибоначчи

Метод Фибоначчи является оптимальным в смысле минимизации максимального числа вычислений функции при заданной точности. Он использует последовательность чисел Фибоначчи  , определяемых рекуррентно:

Алгоритм:

  1. Задаём начальный интервал и точность .

  2. Определяем минимальное целое   такое, что

  1. На первой итерации ( ) вычисляем точки:

(В общем виде для k-й итерации используются числа   и  .)

  1. Вычисляем  ,  .

  2. Сравниваем   и  :

Если  , то новый интервал  , полагаем  , и   становится   для следующего шага.

Если  , то новый интервал  , полагаем  , и   становится  .

Если  , можно сократить с любой стороны.

  1. Повторяем для  .

  2. После завершения итераций интервал неопределенности имеет длину не более  . В качестве ответа берём середину последнего интервала.

Скорость сходимости: метод требует ровно   вычислений функции (кроме первого шага, где вычисляются два значения, но одно из них переиспользуется). Число итераций фиксировано и определяется заранее.

  1. Описание программы

Программа реализована на языке 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 запусков даёт достаточно большое суммарное время, и погрешность усреднения мала.

Соседние файлы в папке Отчёты Дагаев