Task3 — метод половинного деления - gogafefe/StAlGoLM GitHub Wiki

Task3 — метод половинного деления

Вариант №3 из общего списка курса: дана непрерывная функция, отрезок смены знака [a, b] и точность ε; нужно найти приближённое значение корня методом половинного деления (дихотомии). Автор — Степан.

Идея метода

Если функция непрерывна и на концах отрезка имеет разные знаки, корень лежит внутри. Делим отрезок пополам, оставляем ту половину, где знак меняется, и повторяем — пока длина отрезка не станет меньше 2ε:

while ((b - a) / 2 > epsilon) {
    middle = (a + b) / 2;
    if (f(a) * f(middle) <= 0)  b = middle;   // корень в левой половине
    else                        a = middle;   // корень в правой
}
ответ: (a + b) / 2

Почему это выбор из 4 вариантов

Как и в task2, система проверки сверяет целый номер варианта, а корень — дробный. Сервер сам считает корень методом дихотомии и подмешивает 3 неверных значения, отстоящих от корня дальше ε (минимальный шаг 0.02, чтобы варианты различались при выводе 4 знаков). Варианты перемешиваются (Fisher–Yates), студент выбирает номер 1–4.

10 шаблонов функций (num от 1 до 10)

num Функция Отрезок
1 c·x − d симметрично вокруг корня d/c
2 x² − c [0, c+1]
3 x³ − c [0, c+1]
4 sin(x) − k [0, π/2]
5 cos(x) − k [0, π/2]
6 eˣ − c [0, ln c + 1]
7 x³ + x − c [0, c]
8 x² + x − c [0, c]
9 ln(x) − c [0.5, e^c + 1]
10 x⁵ − c [0, c+1]

Точность ε выбирается случайно из {0.01; 0.005; 0.001}. Границы отрезков подобраны так, чтобы f(a) и f(b) гарантированно имели разные знаки (иначе задание не генерируется).

Где что лежит

  • Генератор: task3.h/.cpp; диспетчер: cmd_task, ветка case 3 в server_functions.cpp
  • Модульные тесты: tests/tst_task3_test.cpp (tests/task3tests.pro)
  • Тест-кейс: таблицы/V_test_case_task3.xlsx
  • Подробная страница с описанием: documentation/Task3-метод-половинного-деления.md