Interested Article - Метод бисекции

Несколько шагов метода деления пополам применяются к начальному диапазону [a 1 ;b 1 ]. Большая красная точка — это корень функции.

Метод бисекции или метод деления отрезка пополам — простейший численный метод для решения нелинейных уравнений вида f ( x )=0. Предполагается только непрерывность функции f ( x ). Поиск основывается на теореме о промежуточных значениях .

Обоснование

Алгоритм основан на следующем следствии из теоремы Больцано — Коши :

Пусть непрерывная функция , тогда, если , то .

Таким образом, если мы ищем ноль, то на концах отрезка функция должна быть противоположных знаков. Разделим отрезок пополам и возьмём ту из половинок, на концах которой функция по-прежнему принимает значения противоположных знаков. Если значение функции в серединной точке оказалось искомым нулём, то процесс завершается.

Точность вычислений задаётся одним из двух способов:

  1. по оси , что ближе к условию из описания алгоритма; или
  2. , по оси , что может оказаться удобным в некоторых случаях.

Процедуру следует продолжать до достижения заданной точности.

Для поиска произвольного значения достаточно вычесть из значения функции искомое значение и искать ноль получившейся функции.

Описание алгоритма

Задача заключается в нахождении корней нелинейного уравнения

Для начала итераций необходимо знать отрезок значений , на концах которого функция принимает значения противоположных знаков.

Противоположность знаков значений функции на концах отрезка можно определить множеством способов. Один из множества этих способов — умножение значений функции на концах отрезка и определение знака произведения путём сравнения результата умножения с нулём:

в действительных вычислениях такой способ проверки противоположности знаков при крутых функциях приводит к преждевременному переполнению .

Для устранения переполнения и уменьшения затрат времени, то есть для увеличения быстродействия, на некоторых программно-компьютерных комплексах противоположность знаков значений функции на концах отрезка нужно определять по формуле:

так как одна операция сравнения двух знаков двух чисел требует меньшего времени, чем две операции: умножение двух чисел (особенно с плавающей запятой и двойной длины) и сравнение результата с нулём. При данном сравнении, значения функции в точках и можно не вычислять, достаточно вычислить только знаки функции в этих точках, что требует меньшего машинного времени.

Из непрерывности функции и условия (2.2) следует, что на отрезке существует хотя бы один корень уравнения (в случае не монотонной функции функция может иметь несколько корней на отрезке, тогда метод приводит к нахождению одного из них).

Найдём значение в середине отрезка:

в действительных вычислениях, для уменьшения числа операций, в начале, вне цикла, вычисляют длину отрезка по формуле:

а в цикле вычисляют длину очередных новых отрезков по формуле: и новую середину по формуле:

Вычислим значение функции в середине отрезка :

  • Если или, в действительных вычислениях, , где — заданная точность по оси , то корень найден.
  • Иначе или, в действительных вычислениях, , то разобьём отрезок на два равных отрезка: и .

Теперь найдём новый отрезок, на котором функция меняет знак:

  • Если значения функции на концах отрезка имеют противоположные знаки на левом отрезке, или , то, соответственно, корень находится внутри левого отрезка . Тогда возьмём левый отрезок присвоением , и повторим описанную процедуру до достижения требуемой точности по оси .
  • Иначе значения функции на концах отрезка имеют противоположные знаки на правом отрезке, или , то, соответственно, корень находится внутри правого отрезка . Тогда возьмём правый отрезок присвоением , и повторим описанную процедуру до достижения требуемой точности по оси .

За количество итераций деление пополам осуществляется раз, поэтому длина конечного отрезка в раз меньше длины исходного отрезка.

Существует похожий метод, но с критерием останова вычислений по оси , в этом методе вычисления продолжаются до тех пор, пока, после очередного деления пополам, новый отрезок больше заданной точности по оси : . В этом методе отрезок на оси может достичь заданной величины , а значения функций (особенно крутых) на оси могут очень далеко отстоять от нуля, при пологих же функциях этот метод приводит к большому числу лишних вычислений.

В дискретных функциях и — это номера элементов массива, которые не могут быть дробными, и, в случае второго критерия останова вычислений, разность не может быть меньше .

Псевдокод

;Пусть

  • x n — начало отрезка по х;
  • x k — конец отрезка по х;
  • x i — середина отрезка по х;
  • eps y — требуемая точность вычислений по y (заданное приближение интервала [x n ; x k ] : x k — x n к нулю).

Тогда алгоритм метода бисекции можно записать в псевдокоде следующим образом:

  1. Начало.
  2. Ввод x n , x k , eps y .
  3. Если F(x n ) = 0, то Вывод (корень уравнения — x n ).
  4. Если F(x k ) = 0, то Вывод (корень уравнения — x k ).
  5. Пока x k — x n > eps y повторять:
  6. dx := (x k — x n )/2;
  7. x i := x n + dx;
  8. если sign(F(x n )) ≠ sign(F(x i )), то x k := x i;
  9. иначе x n := x i .
  10. конец повторять
  11. Вывод (Найден корень уравнения — x i с точностью по y — eps y ).
  12. Конец.

Поиск значения корня монотонной дискретной функции

Поиск наиболее приближённого к корню значения в монотонной дискретной функции, заданной таблично и записанной в массиве, заключается в разбиении массива пополам (на две части), выборе из двух новых частей той части, в которой значения элементов массива меняют знак путём сравнения знаков срединного элемента массива со знаком граничного значения и повторении алгоритма для половины в которой значения элементов массива меняют знак.

Пусть переменные леваяГраница и праваяГраница содержат, соответственно, левую левГран и правую правГран границы массива, в которой находится приближение к корню. Исследование начинается с разбиения массива пополам (на две части) путём нахождения номера среднего элемента массива середина .

Если знаки значений массива массив[леваяГраница] и массив[середина] противоположны, то приближение к корню ищут в левой половине массива, то есть значением праваяГраница становится середина и на следующей итерации исследуется только левая половина массива. Если знаки значений массив[леваяГраница] и массив[середина] одинаковы, то осуществляется переход к поиску приближения к корню в правой половине массива, то есть значением переменной леваяГраница становится середина и на следующей итерации исследуется только правая половина массива. Т.о., в результате каждой проверки область поиска сужается вдвое.

Например, если длина массива равна 1023, то после первого сравнения область сужается до 511 элементов, а после второго — до 255. Т.о. для поиска приближения к корню в массиве из 1023 элементов достаточно 10 проходов (итераций).

Псевдокод :

леваяГраница = левГран
праваяГраница = правГран
while (праваяГраница - леваяГраница > 1) {
   длинаОтрезка = правГран - левГран
   половинаОтрезка = int(длинаОтрезка / 2) 
   середина = леваяГраница + половинаОтрезка
   if (sign(массив[леваяГраница])  sign(массив[середина]))
      праваяГраница = середина
   else
      леваяГраница = середина
}
printf середина

См. также

Примечания

  1. Ю. Губарь, : Метод половинного деления // Интуит.ру , 15.03.2007

Литература

  • Волков Е. А. Глава 4. Методы решения нелинейных уравнений и систем. § 26. Метод деления отрезка пополам // Численные методы. — Учеб. пособие для вузов. — 2-е изд., испр.. — М. : Наука, 1987. — С. 190. — 248 с.
  • Burden, Richard L.; Faires, J. Douglas (1985), "2.1 The Bisection Algorithm", (3rd ed.), PWS Publishers, ISBN 0-87150-857-5

Ссылки

  • на сервере применения Mathcad.
  • Mathcad, Maple, Matlab, Mathematica
  • свободно распространяемая программа для вычисления изоэлектрической точки .
Источник —

Same as Метод бисекции