Вопрос от Анонимного юзера 21 апреля 2026 08:53
Установите последовательность шагов в алгоритме нахождения корня уравнения f(x)=0 на [a; b] методом половинного деления
Ответ нейросети
21 апреля 2026 08:53
Ниже — подробная последовательность шагов алгоритма нахождения корня уравнения f(x) = 0 на [a, b] методом половинного деления (бисекции).
Предпосылки (при которых алгоритм работает корректно)
- Функция f непрерывна на [a, b].
- На концах интервала выполняется условие f(a) · f(b) < 0 (есть хотя бы один корень в [a, b], по теореме intermediate value). Если f(a) = 0 или f(b) = 0, корень находится на границе и можно вернуть соответствующее значение.
- По желанию задаются допустимая погрешность tol и максимум итераций maxIter.
- Ввод и начальная проверка
- Ввести: функция f, интервал [a, b], допустимую погрешность tol (например, tol = 1e-6) и максимум итераций maxIter.
- Если f(a) = 0, вернуть a как корень.
- Если f(b) = 0, вернуть b как корень.
- Если f(a) · f(b) > 0, сообщить, что не гарантирован существование корня в [a, b], предложить выбрать другой интервал или проверить непрерывность, или применить другой метод.
- Инициализация переменных
- L = a, R = b — текущие левый и правый концы интервала, который содержит корень.
- k = 0 — счётчик итераций.
- fL = f(L), fR = f(R) — значения функции в концах интервала.
- Главный цикл (пока не удовлетворено условие останова)
- Пока (R − L) > tol и k < maxIter:
a) М = (L + R) / 2 — середина текущего интервала.
b) fM = f(M) — значение функции в середине.
c) Если fM = 0, то M — точный корень; вернуть M и завершить.
d) Иначе если fL · fM ≤ 0, то корень лежит в [L, M]:
- R = M
- fR = fM e) Иначе корень лежит в (M, R]:
- L = M
- fL = fM f) k = k + 1 — увеличиваем счётчик итераций.
- Завершение и результат
- После выхода из цикла корень можно взять как x ≈ (L + R) / 2 (середина последнего интервала) или как M из последней итерации, если она была проведена.
- При каждом шаге хорошо помнить: истинный корень x* лежит в текущем интервале [L, R], и его ошибка по отношению к x* удовлетворяет |x* − (L+R)/2| ≤ (R − L)/2. После k итераций размер интервала равен (b − a)/2^k, значит ошибка оценивается как ≤ (b − a)/2^k.
- Пояснения к работе алгоритма
- Почему работает: если f непрерывна на [a, b] и есть знак на концах (f(a)·f(b) < 0), то в интервале есть хотя бы один корень. Бисекция гарантированно сокращает длину интервала вдвое на каждой итерации, удерживая внутри интервала хотя бы один корень.
- Что делать при нескольких корнях: интервал [L, R] может содержать несколько корней. Алгоритм найдёт один из них — тот, который инициализирует начальное разбиение и чьи корни не нарушают условие f(L)·f(M) ≤ 0 или f(M)·f(R) ≤ 0 на каком‑то шаге.
- Что если корень на границе: если после стартовой проверки f(a) = 0 или f(b) = 0, корень найден сразу без цикла.
- Пример работы (для наглядности) Пусть f(x) = x^3 − 2x − 5 на интервале [2, 3].
- f(2) = 8 − 4 − 5 = −1, f(3) = 27 − 6 − 5 = 16 → знак разный, условие выполнено.
- tol = 1e-4, maxIter = 10.
- Шаги
- k=0: M=2.5, f(M)=2.5^3 − 2·2.5 − 5 = 15.625 − 5 − 5 = 5.625 > 0. f(L)·f(M) = (−1)·(5.625) < 0 → R=2.5.
- k=1: M=(2+2.5)/2=2.25, f(M)=2.25^3 − 2·2.25 − 5 ≈ 11.39 − 4.5 − 5 ≈ 1.89 > 0. f(L)·f(M) = (−1)·(1.89) < 0 → R=2.25.
- k=2: M=(2+2.25)/2=2.125, f(M)=2.125^3 − 2·2.125 − 5 ≈ 9.60 − 4.25 − 5 ≈ 0.35 > 0. f(L)·f(M) < 0 → R=2.125.
- k=3: M=(2+2.125)/2=2.0625, f(M) ≈ 2.0625^3 − 4.125 − 5 ≈ −0.46 < 0. f(L)·f(M) > 0? fL at L=2 is −1, fM ≈ −0.46, product positive, значит корень в [2.0625, 2.125] и продолжаем. Итог: после нескольких итераций интервал сузится вокруг корня примерно x ≈ 2.094...
- Важные заметки
- Параметры tol и maxIter подбирают точность и вычислительную устойчивость. Обычно выбирают tol = 1e-6 или 1e-8 и достаточно большое maxIter (например, 100).
- Если функция не является непрерывной на [a, b] или если f(a)·f(b) ≥ 0, бисекция не гарантирует наличие корня; в таких случаях следует выбрать другой интервал или применить другой метод (например, метод Ньютона, метод секущих, метод регуло).
- Если корень найден точно (f(M) = 0), можно остановиться мгновенно, иначе продолжаем до достижения tol.
Краткая компактная инструкция в виде псевдокода (для переписывания в код)
- Ввести f, a, b, tol, maxIter
- if f(a) == 0 return a
- if f(b) == 0 return b
- if f(a) · f(b) > 0: сообщить об отсутствии гарантии и выйти или переназначить интервал
- L = a, R = b, k = 0
- while (R − L) > tol and k < maxIter: M = (L + R) / 2 fM = f(M) if fM == 0: return M if fL · fM ≤ 0: R = M else: L = M k = k + 1
- вернуть x ≈ (L + R) / 2 как приближенное значение корня, интервал [L, R] содержит корень
Если нужно, могу привести конкретный числовой пример под ваш любимый пример функции и желаемые tol и maxIter, либо подготовить готовый шаблон кода на языке, который вы изучаете (Python, C++, Java и т.д.).
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



