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