В математике метод бисекции — это метод нахождения корня , который применяется к любой непрерывной функции , для которой известны два значения с противоположными знаками. Метод состоит из многократного деления пополам интервала , определяемого этими значениями, и последующего выбора подынтервала, в котором функция меняет знак и, следовательно, должна содержать корень . Это очень простой и надежный метод, но он также относительно медленный. Из-за этого его часто используют для получения грубого приближения к решению, которое затем используют в качестве отправной точки для более быстро сходящихся методов. [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 как новое a . В обоих случаях новые 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 , толерантность TOL , Максимальные итерации 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 // новая средняя точка if f ( c ) = 0 or ( b – a )/2 < TOL then // решение найдено Output( c ) Stop end if N ← N + 1 // увеличить счетчик шагов if sign( f ( c )) = sign( f ( a )) then a ← c else b ← c // новый интервал end 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] Для того чтобы корень существовал, достаточно, чтобы , и это можно проверить с помощью поверхностного интеграла по границе . [18]
Метод характеристической бисекции использует только знаки функции в различных точках. Пусть f будет функцией из R d в R d для некоторого целого числа d ≥ 2. Характеристический многогранник [19] (также называемый допустимым многоугольником ) [20] функции f — это многогранник в R d , имеющий 2 d вершин, такой, что в каждой вершине v комбинация знаков f ( v ) уникальна, а топологическая степень f на ее внутренней стороне не равна нулю (необходимый критерий для обеспечения существования корня). [21] Например, при d = 2 характеристический многогранник функции f — это четырехугольник с вершинами (скажем) A, B, C, D, такой, что:
Собственное ребро характеристического многоугольника — это ребро между парой вершин, такое, что знаковый вектор отличается только одним знаком. В приведенном выше примере собственными ребрами характеристического четырехугольника являются AB, AC, BD и CD. Диагональ — это пара вершин, такая, что знаковый вектор отличается всеми d знаками. В приведенном выше примере диагонали — это AD и BC.
На каждой итерации алгоритм выбирает правильное ребро многогранника (скажем, A—B) и вычисляет знаки f в его средней точке (скажем, M). Затем он действует следующим образом:
Предположим, что диаметр (= длина самого длинного собственного ребра) исходного характеристического многогранника равен D. Тогда требуется по крайней мере деление ребер пополам, чтобы диаметр оставшегося многоугольника был не больше ε . [20] : 11, Лемма.4.7 Если топологическая степень исходного многогранника не равна нулю, то существует процедура, которая может выбрать ребро таким образом, что следующий многогранник также будет иметь ненулевую степень. [21] [22]