В математике метод деления пополам — это метод поиска корня , который применяется к любой непрерывной функции , для которой известны два значения с противоположными знаками. Метод заключается в многократном делении пополам интервала , определенного этими значениями, а затем выборе подинтервала, в котором функция меняет знак и, следовательно, должна содержать корень . Это очень простой и надежный метод, но он также относительно медленный. По этой причине его часто используют для получения грубого приближения к решению, которое затем используется в качестве отправной точки для более быстро сходящихся методов. [1] Этот метод также называют методом деления интервала пополам , [2] методом бинарного поиска , [3] или методом дихотомии . [4]
Для многочленов существуют более сложные методы проверки существования корня в интервале ( правило знаков Декарта , теорема Штурма , теорема Будана ). Они позволяют расширить метод деления пополам до эффективных алгоритмов поиска всех действительных корней многочлена; см. Изоляция реального корня .
Метод применим для численного решения уравнения f ( x ) = 0 для действительной переменной x , где f — непрерывная функция , определенная на интервале [ a , b ] и где f ( a ) и f ( b ) имеют противоположные знаки. . В этом случае говорят, что a и b заключают в скобки корень, поскольку по теореме о промежуточном значении непрерывная функция f должна иметь хотя бы один корень в интервале ( a , b ).
На каждом шаге метод делит интервал на две части/половины, вычисляя среднюю точку c = ( a + b )/2 интервала и значение функции f ( c ) в этой точке. Если c сам по себе является корнем, то процесс завершился успешно и остановился. В противном случае теперь есть только две возможности: либо f ( a ) и f ( c ) имеют противоположные знаки и заключают в скобки корень, либо f ( c ) и f ( b ) имеют противоположные знаки и заключают в скобки корень. [5] Метод выбирает подинтервал, который гарантированно будет скобкой, в качестве нового интервала, который будет использоваться на следующем шаге. Таким образом, интервал, содержащий ноль f , уменьшается на 50% на каждом шаге. Процесс продолжается до тех пор, пока интервал не станет достаточно малым.
Явно, если f ( c )=0, то c можно принять за решение, и процесс останавливается. В противном случае, если f ( a ) и f ( c ) имеют противоположные знаки, то метод устанавливает c как новое значение для b , а если f ( b ) и f ( c ) имеют противоположные знаки, то метод устанавливает c как новое значение. а . В обоих случаях новые f ( a ) и f ( b ) имеют противоположные знаки, поэтому метод применим к этому меньшему интервалу. [6]
Входными данными для метода является непрерывная функция f , интервал [ a , b ] и значения функции f ( a ) и f ( b ). Значения функции имеют противоположный знак (в пределах интервала имеется хотя бы одно пересечение нуля). Каждая итерация выполняет следующие шаги:
При реализации метода на компьютере могут возникнуть проблемы с конечной точностью, поэтому часто существуют дополнительные тесты на сходимость или ограничения на количество итераций. Хотя f является непрерывным, конечная точность может помешать тому, чтобы значение функции когда-либо было равным нулю. Например, рассмотрим f ( x ) = cos x ; не существует значения с плавающей запятой, аппроксимирующего x = π /2 , которое давало бы ровно ноль. Кроме того, разница между a и b ограничена точностью чисел с плавающей запятой; т. е. по мере уменьшения разницы между a и b в какой-то момент средняя точка [ a , b ] будет численно идентична (в пределах точности с плавающей запятой) либо a , либо b .
Метод можно записать в псевдокоде следующим образом: [7]
ввод: Функция f , значения конечных точек a , b , толерантность ТОЛ , максимальное количество итераций Условия NMAX : a < b , либо f ( a ) < 0 и f ( b ) > 0, либо f ( a ) > 0 и f ( b ) < 0 вывод: значение, которое отличается от корня f ( x ) = 0 менее чем на TOL N ← 1 while N ≤ NMAX do // ограничиваем итерации, чтобы предотвратить бесконечный цикл c ← ( a + b )/2 // новая средняя точка , если f ( c ) = 0 или ( b – a )/2 < TOL , тогда // решение Found Output( c ) Остановить конец if N ← N + 1 // увеличить счетчик шагов if Sign( f ( c )) = Sign( f ( a )) then a ← c else b ← c // Конец нового интервала while Output( «Метод не выполнен.») // превышено максимальное количество шагов
Предположим, что метод деления пополам используется для нахождения корня многочлена
Сначала нужно найти два числа и такие, что и имеют противоположные знаки. Для вышеуказанной функции и удовлетворяют этому критерию, так как
и
Поскольку функция непрерывна, в интервале [1, 2] должен быть корень.
В первой итерации конечными точками интервала, заключающего в скобки корень, являются и , поэтому средняя точка равна
Значение функции в средней точке равно . Поскольку отрицательное значение, оно заменяется на для следующей итерации, чтобы гарантировать, что и имеют противоположные знаки. По мере продолжения интервал между и будет становиться все меньше, сходясь к корню функции. Посмотрите, как это происходит, в таблице ниже.
После 13 итераций становится очевидным, что наблюдается сходимость примерно до 1,521: корня многочлена.
Метод гарантированно сходится к корню f , если f — непрерывная функция на интервале [ a , b ] и f ( a ) и f ( b ) имеют противоположные знаки. Абсолютная ошибка уменьшается вдвое на каждом шаге, поэтому метод сходится линейно . В частности, если c 1 =а + б/2— середина начального интервала, а c n — середина интервала на n -м шаге, то разность между c n и решением c ограничена соотношением [8]
Эту формулу можно использовать для предварительного определения верхней границы количества итераций, необходимых методу деления пополам для сходимости к корню с точностью до определенного допуска. Число n итераций, необходимых для достижения требуемого допуска ε (т. е. ошибки, гарантированно не превышающей ε), ограничено
где начальный размер скобки и требуемый размер скобки. Основная мотивация использования метода деления пополам заключается в том, что на множестве непрерывных функций ни один другой метод не может гарантировать получение оценки c n для решения c, которое в худшем случае имеет абсолютную ошибка с менее чем n 1/2 итерациями. [9] Это также верно при нескольких общих предположениях о функции f и поведении функции в окрестности корня. [9] [10]
Однако, несмотря на то, что метод деления пополам является оптимальным в отношении производительности в худшем случае при критериях абсолютной ошибки, он неоптимален в отношении средней производительности при стандартных предположениях [11] [12] , а также асимптотической производительности . [13] Популярные альтернативы методу деления пополам, такие как метод секущего , метод Риддерса или метод Брента (среди прочих), обычно работают лучше, поскольку они компенсируют производительность в худшем случае для достижения более высоких порядков сходимости к корню. И строгое улучшение метода деления пополам может быть достигнуто с более высоким порядком сходимости без ущерба для производительности в худшем случае с помощью метода ITP . [13] [14]
Метод деления пополам был обобщен на многомерные функции. Такие методы называются обобщенными методами деления пополам . [15] [16]
Некоторые из этих методов основаны на вычислении топологической степени . [17]
Метод характеристического деления пополам использует только знаки функции в разных точках. Пусть f — функция от R d до R d для некоторого целого числа d ≥ 2. Характеристический многогранник [18] (также называемый допустимым многоугольником ) [19] функции f — это многогранник в R d , имеющий 2 d вершины, такой что в каждой вершине v комбинация знаков f ( v ) единственна. Например, для d = 2 характеристический многогранник f представляет собой четырехугольник с вершинами (скажем) A, B, C, D, такой что:
Правильное ребро характеристического многоугольника — это ребро между парой вершин, вектор знаков которого отличается только одним знаком. В приведенном выше примере собственные ребра характеристического четырехугольника — это AB, AC, BD и CD. Диагональю называется пара вершин, вектор знаков которой отличается всеми d знаками . В приведенном выше примере диагонали — AD и BC.
На каждой итерации алгоритм выбирает правильное ребро многогранника (скажем, A-B) и вычисляет знаки f в его средней точке (скажем, M). Дальше все происходит следующим образом:
Предположим, что диаметр (= длина самого длинного собственного ребра) исходного характеристического многогранника равен . Тогда необходимо как минимум разделить ребра пополам, чтобы диаметр оставшегося многоугольника был не более . [19] : 11, лемма.4.7.