Метод деления пополам — Bisection method
В математике , то метод бисекции является корнем найти способом , который применяется к любым непрерывным функциям , для которых один знает два значения с противоположными знаками. Метод состоит из многократно рассекает на интервал , определенный этих значения , а затем выбрав подинтервал , в котором функция меняет знак, и , следовательно , должен содержать корень . Это очень простой и надежный метод, но он также относительно медленный. Из-за этого его часто используют для получения грубого приближения к решению, которое затем используется в качестве отправной точки для более быстро сходящихся методов. Этот метод также называется методом деления интервала вдвое, методом двоичного поиска или методом дихотомии .
Для полиномов , более изощренные методы существуют для проверки существования корня в интервале ( Теоремы Декарта , теорема Штурма , теорема Budan в ). Они позволяют расширить метод деления пополам на эффективные алгоритмы нахождения всех действительных корней многочлена; см. Изоляцию реального корня .
СОДЕРЖАНИЕ
Метод
Метод применим для численного решения уравнения 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 ) иметь противоположные знаки и заключать в скобки корень. Метод выбирает подинтервал, который гарантированно будет скобкой, в качестве нового интервала, который будет использоваться на следующем шаге. Таким образом, интервал, содержащий ноль f , уменьшается по ширине на 50% на каждом шаге. Процесс продолжается до тех пор, пока интервал не станет достаточно малым.
Явно, если f ( a ) и f ( c ) имеют противоположные знаки, тогда метод устанавливает c как новое значение для b , а если f ( b ) и f ( c ) имеют противоположные знаки, то метод устанавливает c как новое значение а . (Если f ( c ) = 0, то c может быть принято как решение, и процесс останавливается.) В обоих случаях новые f ( a ) и f ( b ) имеют противоположные знаки, поэтому метод применим к этому меньшему интервалу .
Итерационные задачи
Входными данными для метода являются непрерывная функция f , интервал [ a , b ] и значения функции f ( a ) и f ( b ). Значения функции имеют противоположный знак (в интервале есть хотя бы одно пересечение нуля). Каждая итерация выполняет следующие шаги:
- Вычислить c , середину интервала, c = а + б / 2 .
- Вычислите значение функции в средней точке f ( c ).
- Если сходимость удовлетворительная (т. Е. C — a достаточно мало или | f ( c ) | достаточно мало), верните c и прекратите повторение.
- Изучите знак f ( c ) и замените ( a , f ( a )) или ( b , f ( b )) на ( c , f ( c )), чтобы в новом интервале было пересечение нуля.
При реализации метода на компьютере могут возникнуть проблемы с конечной точностью, поэтому часто требуются дополнительные тесты сходимости или ограничения на количество итераций. Хотя f является непрерывным, конечная точность может препятствовать тому, чтобы значение функции было когда-либо равным нулю. Например, рассмотрим f ( x ) = x — π ; никогда не будет конечного представления x , дающего ноль. Кроме того, разница между a и b ограничена точностью с плавающей запятой; т.е. по мере того, как разница между a и b уменьшается, в какой-то момент средняя точка [ a , b ] будет численно идентична (в пределах точности с плавающей запятой) либо a, либо b .
Алгоритм
Этот метод можно записать в псевдокоде следующим образом:
Пример: поиск корня многочлена
Предположим, что метод деления пополам используется для нахождения корня многочлена
ж ( Икс ) знак равно Икс 3 — Икс — 2 . <\ Displaystyle е (х) = х ^ <3>-x-2 \ ,.>
Во-первых, должны быть найдены два числа и, у которых и есть противоположные знаки. Для указанной выше функции и удовлетворяют этому критерию, поскольку а <\ displaystyle a> б <\ displaystyle b>
ж ( а ) <\ Displaystyle f (а)>
ж ( б ) <\ displaystyle f (b)>
а знак равно 1 <\ displaystyle a = 1>
б знак равно 2 <\ displaystyle b = 2>
ж ( 1 ) знак равно ( 1 ) 3 — ( 1 ) — 2 знак равно — 2 <\ Displaystyle f (1) = (1) ^ <3>— (1) -2 = -2>
ж ( 2 ) знак равно ( 2 ) 3 — ( 2 ) — 2 знак равно + 4 . <\ Displaystyle f (2) = (2) ^ <3>— (2) -2 = + 4 \ ,.>
Поскольку функция непрерывна, корень должен находиться в интервале [1, 2].
В первой итерации конечными точками интервала, заключенного в скобки корня, являются и , поэтому средняя точка равна а 1 знак равно 1 <\ displaystyle a_ <1>= 1> б 1 знак равно 2 <\ displaystyle b_ <1>= 2>
c 1 знак равно 2 + 1 2 знак равно 1.5 <\ displaystyle c_ <1>= <\ frac <2 + 1><2>> = 1,5>
Значение функции в средней точке равно . Поскольку отрицательно, заменяется на для следующей итерации, чтобы гарантировать, что и имеют противоположные знаки. По мере того, как это продолжается, интервал между и будет становиться все меньше и больше, приближаясь к корню функции. Посмотрите, как это произошло в таблице ниже. ж ( c 1 ) знак равно ( 1.5 ) 3 — ( 1.5 ) — 2 знак равно — 0,125 <\ Displaystyle f (c_ <1>) = (1,5) ^ <3>— (1,5) -2 = -0,125> ж ( c 1 ) <\ displaystyle f (c_ <1>)>
а знак равно 1 <\ displaystyle a = 1>
а знак равно 1.5 <\ displaystyle a = 1,5>
ж ( а ) <\ Displaystyle f (а)>
ж ( б ) <\ displaystyle f (b)>
а <\ displaystyle a>
б <\ displaystyle b>
Итерация | а п <\ displaystyle a_ | б п <\ displaystyle b_ | c п <\ displaystyle c_ | ж ( c п ) <\ displaystyle f (c_ |
---|---|---|---|---|
1 | 1 | 2 | 1.5 | -0,125 |
2 | 1.5 | 2 | 1,75 | 1,6093750 |
3 | 1.5 | 1,75 | 1,625 | 0,6660156 |
4 | 1.5 | 1,625 | 1,5625 | 0,2521973 |
5 | 1.5 | 1,5625 | 1,5312500 | 0,0591125 |
6 | 1.5 | 1,5312500 | 1,5156250 | -0,0340538 |
7 | 1,5156250 | 1,5312500 | 1,5234375 | 0,0122504 |
8 | 1,5156250 | 1,5234375 | 1,5195313 | -0,0109712 |
9 | 1,5195313 | 1,5234375 | 1,5214844 | 0,0006222 |
10 | 1,5195313 | 1,5214844 | 1,5205078 | -0,0051789 |
11 | 1,5205078 | 1,5214844 | 1,5209961 | -0,0022794 |
12 | 1,5209961 | 1,5214844 | 1,5212402 | −0,0008289 |
13 | 1,5212402 | 1,5214844 | 1,5213623 | −0,0001034 |
14 | 1,5213623 | 1,5214844 | 1,5214233 | 0,0002594 |
15 | 1,5213623 | 1,5214233 | 1,5213928 | 0,0000780 |
После 13 итераций становится очевидным, что существует сходимость примерно к 1,521: корень для многочлена.
Анализ
Гарантируется, что метод сходится к корню f, если f — непрерывная функция на интервале [ a , b ] и f ( a ) и f ( b ) имеют противоположные знаки. Абсолютная погрешность уменьшается в два раза на каждом шаге поэтому метод сходится линейно . В частности, если c 1 = а + б / 2 — середина начального интервала, а c n — середина интервала на n- м шаге, тогда разница между c n и решением c ограничена
| c п — c | ≤ | б — а | 2 п . <\ displaystyle | c_
Эту формулу можно использовать для предварительного определения верхней границы количества итераций, необходимых для схождения метода деления пополам к корню с точностью до определенного допуска. Число итераций n, необходимых для достижения требуемого допуска ε (то есть, гарантированная ошибка не превосходит ε), ограничено величиной
п ≤ п 1 / 2 ≡ ⌈ бревно 2 ( ϵ 0 ϵ ) ⌉ , <\ Displaystyle п \ Leq N_ <1>\ Equiv \ left \ lceil \ log _ <2>\ left (<\ frac <\ epsilon _ <0>> <\ epsilon>> \ right) \ right \ rceil ,>
где начальный размер скобок и требуемый размер скобок.Основная мотивация для использования метода деления пополам состоит в том, что по набору непрерывных функций никакой другой метод не может гарантировать получение оценки c n для решения c, которое в худшем случае имеет абсолютную ошибка с менее чем n 1/2 итераций. Это также верно при нескольких общих предположениях относительно функции f и поведения функции в окрестности корня. ϵ 0 знак равно | б — а | <\ displaystyle \ epsilon _ <0>= | ba |> ϵ ≤ ϵ 0 . <\ displaystyle \ epsilon \ leq \ epsilon _ <0>.>
ϵ <\ displaystyle \ epsilon>
Однако, несмотря на то, что метод деления пополам является оптимальным в отношении производительности в наихудшем случае при критериях абсолютной ошибки, он неоптимален в отношении средней производительности при стандартных предположениях, а также асимптотической производительности . Популярные альтернативы методы бисекций, такие как секущий метод , метод Ridders’ или метод Брента (среди других), как правило , работают лучше , так как они Компромисс худшего случая производительности для достижения более высоких порядков сходимости к корню. И строгое улучшение метода деления пополам может быть достигнуто за счет более высокого порядка сходимости без потери производительности в худшем случае с помощью метода ITP .
Источник