В этом примере мы начинаем с места (z0), где первая производная по существу равна нулю:
В этой ситуации следующая итерация будет продолжаться до бесконечности (при условии, что мы используем производные). Наш код защищает от этого, настаивая на том, что корень всегда скобок, а затем никогда не выходит за эти рамки. В таком случае ни один алгоритм поиска корней не может работать лучше, чем бисектирование, пока не будет найден корень.
Отметим, что на графике нет шкалы, мы видели примеры такой ситуации на практикедаже тогда, когда несколько десятичных мест исходного предположения z0верны.
Это действительно частный случай более распространенной ситуации, когда корневой поиск с производными являетсядивергентным. Рассмотрим, начиная с z0в этом случае:
Начальный шаг Ньютона уведет вас дальше от корня, чем вы начали, как и все последующие шаги.
Первая производная по существу бесконечна, а вторая близка к нулю (и поэтому не предлагает никакой коррекции, если мы используем ее), в результате мы делаем очень маленький первый шаг. В худшем случае первый шаг настолько мал — возможно, даже настолько мал, что вычитание из z0не имеет никакого эффекта при текущей рабочей точности — что наш алгоритм будет предполагать, что мы уже находимся в корне и заканчиваем. В противном случае мы предпримем множество очень маленьких шагов, которые никогда не сходятся на корне: наши алгоритмы защитят от этого, обратившись к разделу.
Примером такой ситуации может служить попытка найти корень e-1/z2— эта функция имеет один корень приz = 0, но дляz0< 0ни шаги Ньютона, ни шаги Галлея никогда не сойдутся на корне, а дляz0>0шаги фактически расходятся.
Статья Examples Where Root Finding Goes Wrong раздела Math Toolkit 2.5.0 Root finding может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.