Как найти начальное приближение корня уравнения

Как найти начальное приближение корня уравнения

Для решения одного уравнения с одним неизвестным используется функция root. Аргументами этой функции являются выражение и переменная, входящая в выражение. Ищется значение переменной, при котором выражение обращается в ноль. Функция возвращает значение переменной, которое обращает выражение в ноль.

root( f(z), z) Возвращает значение z, при котором выражение или функция f(z) обращается в 0. Оба аргумента этой функции должны быть скалярами. Функция возвращает скаляр.

Первый аргумент есть либо функция, определенная где-либо в рабочем документе, или выражение. Выражение должно возвращать скалярные значения.

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

Рассмотрим пример, как найти a — решение уравнения e x = x 3 . Для этого выполните следующие шаги:

  • Определите начальное значение переменной x. Введите x:3. Выбор начального приближения влияет на корень, возвращаемый Mathcad (если выражение имеет несколько корней).

  • Определите выражение, которое должно быть обращено в ноль. Для этого перепишите уравнение e x = x 3 в виде x 3 — e x = 0. Левая часть этого выражения и является вторым аргументом функции root
  • Определите переменную a как корень уравнения. Для этого введите a:root(x^3[Space]-e^x[Space],x).

  • Напечатайте a=, чтобы увидеть значение корня.

При использовании функции root имейте в виду следующее:

  • Удостоверьтесь, что переменной присвоено начальное значение до начала использования функции root.
  • Для выражения с несколькими корнями, например x 2 — 1 = 0, начальное значение определяет корень, который будет найден Mathcad. На Рисунке 1 приведен пример, в котором функция root возвращает различные значения, каждое из которых зависит от начального приближения.
  • Mathcad позволяет находить как комплексные, так и вещественные корни. Для поиска комплексного корня следует взять в качестве начального приближения комплексное число.
  • Задача решения уравнения вида f(x) = g(x) эквивалентна задаче поиска корня выражения f(x) — g(x) =0. Для этого функция root может быть использована следующим образом:

Функция root предназначена для решения одного уравнения с одним неизвестным. Для решения систем уравнений используйте методику, описанную в следующем разделе “Системы уравнений”. Для символьного решения уравнений или нахождения точного численного решения уравнения в терминах элементарных функций выберите Решить относительно переменной из меню Символика. См. Главу “Символьные вычисления”.

Рисунок 1: Использование графика и функции root для поиска корней уравнения.

Что делать, когда функция root не сходится

Mathcad в функции root использует для поиска корня метод секущей. Начальное значение, присвоенное переменной x, становится первым приближением к искомому корню. Когда значение выражения f(x) при очередном приближении становится меньше значения встроенной переменной TOL, корень считается найденным, и функция root возвращает результат.

Если после многих итераций Mathcad не может найти подходящего приближения, то появляется сообщение об ошибке “отсутствует сходимость”. Эта ошибка может быть вызвана следующими причинами:

  • Уравнение не имеет корней.
  • Корни уравнения расположены далеко от начального приближения.
  • Выражение имеет локальные максимумы или минимумы между начальным приближением и корнями.
  • Выражение имеет разрывы между начальным приближением и корнями.
  • Выражение имеет комплексный корень, но начальное приближение было вещественным (или наоборот).

Чтобы установить причину ошибки, исследуйте график f(x). Он поможет выяснить наличие корней уравнения f(x)=0 и, если они есть, то определить приблизительно их значения. Чем точнее выбрано начальное приближение корня, тем быстрее функция root будет сходиться к точному значению. roots;using plots to find

Некоторые советы по использованию функции root

В этом разделе приведены несколько советов по использованию функции root:

  • Для изменения точности, с которой функция root ищет корень, можно изменить значение встроенной переменной TOL. Если значение TOL увеличивается, функция root будет сходиться быстрее, но ответ будет менее точен. Если значение TOL уменьшается, функция root будет сходиться медленнее, но ответ будет более точен. Чтобы изменить значение TOL в определенной точке рабочего документа, используйте определение вида TOL := 0.01. Чтобы изменить значение TOL для всего рабочего документа, выберите из меню Математика команду Встроенные переменные и введите подходящее значение в поле TOL. Нажав “OK”, выберите из меню Математика команду Пересчитать всё, чтобы обновить все вычисления в рабочем документе с использованием нового значения переменной TOL.
  • Если уравнение имеет несколько корней, пробуйте использовать различные начальные приближения, чтобы найти их. Использование графика функции полезно для нахождения числа корней выражения, их расположения и определения подходящих начальных приближений. Рисунок 1 показывает пример. Если два корня расположены близко друг от друга, можно уменьшить TOL, чтобы различить их.
  • Если f(x) имеет малый наклон около искомого корня, функция может сходиться к значению r, отстоящему от корня достаточно далеко . В таких случаях для нахождения более точного значения корня необходимо уменьшить значение TOL. Другой вариант заключается в замене уравнения f(x)=0 на g(x)=0, где

  • Для выражения f(x) с известным корнем a нахождение дополнительных корней f(x) эквивалентно поиску корней уравнения h(x)=0, где h(x)=f(x)/(x-a). Подобный приём полезен для нахождения корней, расположенных близко друг к другу. Часто бывает проще искать корень выражения h(x), определенного выше, чем пробовать искать другой корень уравнения f(x)=0, выбирая различные начальные приближения.
  • Решение уравнений с параметром

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

    Чтобы решить уравнение для конкретного значения параметра a, присвойте значение параметру a и начальное значение переменной x как аргументам этой функции. Затем найдите искомое значение корня, вводя выражение f(a,x)=.

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

    Рисунок 2: Определение функции пользователя с функцией root.

    Нахождение корней полинома

    Для нахождения корней выражения, имеющего вид

    лучше использовать функцию polyroots, нежели root. В отличие от функции root, функция polyroots не требует начального приближения. Кроме того, функция polyroots возвращает сразу все корни, как вещественные, так и комплексные. На Рисунках 3 и 4 приведены примеры использования функции polyroots.

    polyroots(v) Возвращает корни полинома степени . Коэффициенты полинома находятся в векторе v длины n+1. Возвращает вектор длины n, состоящий из корней полинома.

    Функция polyroots всегда возвращает значения корней полинома, найденные численно. Чтобы находить корни символьно, используйте команду Решить относительно переменной из меню Символика. См. Главу “Символьные вычисления”.

    Рисунок 3: Использование функции polyroots для решения задачи, изображенной на Рисунке 1.

    Рисунок 4: Использование функции polyroots для поиска корней полинома.

    Исправляем ошибки: Нашли опечатку? Выделите ее мышкой и нажмите Ctrl+Enter

    Как найти начальное приближение корня уравнения

    Глава 4. Решение уравнений

    4.1 Функция root

    Функция root используется для решения одного уравнения с одним неизвестным. Перед началом решения желательно построить график функции, чтобы проверить, есть ли корни, то есть пересекает ли график ось абсцисс. Начальное приближение лучше всего выбрать по графику поближе к корню, так как итерационные методы весьма чувствительны к выбору начального приближения.

    Обращение к функции осуществляется следующим образом:

    root ( f ( x ), x ), где f ( x ) – выражение, равное нулю; x – аргумент, варьируя который, система ищет значение, обращающее в нуль ( рис. 4.1 ).

    Уравнение

    начальное приближение

    решение

    или

    другие корни

    Задан интервал поиска корней

    Рис. 4. 1 Использование функции root

    Функция f ( x ) и аргумент x должны быть скалярами, то есть результат вычисления функции – число, а не вектор или матрица. Функция root использует метод секущих. Корень уравнения – ближайшее к начальному приближению значение x , обращающее функцию f ( x ) в нуль. Если корней несколько, то для отыскания каждого корня необходимо задавать свое начальное приближение.

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

    root ( f ( x ), x , а, b ),

    где a и b – границы интервала, в котором лежит один корень уравнения. Внутри интервала не должно быть больше одного корня, так как Mathcad выводит на экран лишь один корень, лежащий внутри интервала.

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

    Если уравнение не имеет действительных корней, то есть на графике функция f ( x ) нигде не равна нулю, то для вывода комплексных корней надо ввести начальное приближение в комплексной форме (рис. 4.2) .

    Если функция имеет мнимый корень,

    то начальное приближение задается комплексным числом

    — начальное приближение

    Рис. 4. 2 Решение уравнения с комплексными корнями

    Для ввода мнимой единицы надо ввести с клавиатуры 1 i или 1 j .

    Если уравнение имеет несколько корней, то для их нахождения можно использовать разложение функции f ( x ) на простые множители:

    где x 1, x 2 , , xn – корни уравнения. Начальное приближение можно задать только для первого корня. В качестве функции f ( x ) нужно взять

    ,

    где ,

    и т. д. (рис. 4.3)

    у этой функции 3 корня

    диапазон значений х для вывода графика

    Рис. 4. 3 Определение трех корней уравнения

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

    1) в стандартном меню Mathcad выберите команду Tools → Worksheet Options → Built – In Variables (Инструменты → Параметры документов → Встроенные переменные);

    2) в открывшемся окне поменяйте значение Convergence Tolerance ( TOL ) (Погрешность сходимости).

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

    Для повышения точности расчета корня можно заменить f ( x ) на

    .

    Корень можно найти и по графику, увеличив масштаб. Для этого необходимо:

    1) выделить график, щелкнув левой кнопкой мыши внутри графика;

    2)в главном меню Mathcad выбрать команду Format → Graph → Zoom (Формат→График→Масштаб);

    3) при нажатии левой кнопки мыши обвести пунктирной линией область графика вблизи искомого корня, которую надо увеличить;

    4) в открытом окне X – Y Zoom (Масштаб по осям X – Y ) нажать кнопку Zoom .

    Прямо с графика можно передать в буфер обмена численное значение корня. Для этого выполните следующие действия:

    1) Выделите график, щелкнув левой кнопкой мыши внутри графика,

    2) в главном меню Mathcad выберите команду Format → Graph → Trace (Формат→График→Трассировка),

    3) щелкните левой кнопкой мыши внутри графика – появится перекрестье осей,

    4) двигая мышь при нажатой левой кнопке, установите перекрестье на пересечении графика с осью абсцисс. При этом численные значения координат перекрестья появляются в открытом окне X – Y Trace (Трассировка X и Y ).

    5) правильно выбрав положение перекрестья, нажмите кнопки Copy X и Copy Y – численные значения будут помещены в буфер

    6) вне поля графика запишите имя, которое хотите дать корню, и оператор присваивания :=. Нажмите кнопку Paste (Вставить) в стандартном меню Mathcad или в контекстном меню, открывающемся при нажатии правой кнопки мыши.

    Рис. 4. 4 Определение корня уравнения по графику

    В окне X – Y Trace есть пункт Track Data Points (Отмечать расчетные точки). Если установить этот флажок, при перемещении мыши пунктирное перекрестье на графике будет перемещаться скачками, отмечая расчетные значения функции. Если флажок снять, движение перекрестья становится плавным.

    При работе с Mathcad постоянно пользуйтесь правой кнопкой мыши (в контекстном меню каждый раз появляются новые, наиболее нужные в данный момент функции). Щелкните правой кнопкой мыши на графике: в открывшемся контекстном меню есть пункты Zoom и Trace .

    Численные методы: решение нелинейных уравнений

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

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

    В статистике при построении оценок методом наименьших квадратов или методом максимального правдоподобия также приходится решать нелинейные уравнения и системы уравнений.

    Итак, возникает целый класс задач, связанных с нахождением решений нелинейных уравнений, например, уравнения или уравнения и т.д.

    В простейшем случае у нас имеется функция , заданная на отрезке ( a , b ) и принимающая определенные значения.

    Каждому значению x из этого отрезка мы можем сопоставить число , это и есть функциональная зависимость, ключевое понятие математики.

    Нам нужно найти такое значение при котором такие называются корнями функции

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

    Метод деления пополам

    Простейшим методом нахождения корней уравнения является метод деления пополам или дихотомия.

    Этот метод является интуитивно ясным и каждый действовал бы при решении задачи подобным образом.

    Алгоритм состоит в следующем.

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

    Поделим отрезок пополам и введем среднюю точку .

    Тогда либо , либо .

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

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

    Заметьте, описанный алгоритм применим для любой непрерывной функции.

    К достоинствам метода деления пополам следует отнести его высокую надежность и простоту.

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

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

    Метод Ньютона: теоретические основы

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

    Уравнение касательной к функции в точке имеет вид:

    В уравнении касательной положим и .

    Тогда алгоритм последовательных вычислений в методе Ньютона состоит в следующем:

    Сходимость метода касательных квадратичная, порядок сходимости равен 2.

    Таким образом, сходимость метода касательных Ньютона очень быстрая.

    Запомните этот замечательный факт!

    Без всяких изменений метод обобщается на комплексный случай.

    Если корень является корнем второй кратности и выше, то порядок сходимости падает и становится линейным.

    Упражнение 1. Найти с помощью метода касательных решение уравнения на отрезке (0, 2).

    Упражнение 2. Найти с помощью метода касательных решение уравнения на отрезке (1, 3).

    К недостаткам метода Ньютона следует отнести его локальность, поскольку он гарантированно сходится при произвольном стартовом приближении только, если везде выполнено условие , в противной ситуации сходимость есть лишь в некоторой окрестности корня.

    Недостатком метода Ньютона является необходимость вычисления производных на каждом шаге.

    Визуализация метода Ньютона

    Метод Ньютона (метод касательных) применяется в том случае, если уравнение f(x) = 0 имеет корень , и выполняются условия:

    1) функция y= f(x) определена и непрерывна при ;

    2) f(af(b) 0. Таким образом, выбирается точка с абсциссой x0, в которой касательная к кривой y=f(x) на отрезке [a;b] пересекает ось Ox. За точку x0 сначала удобно выбирать один из концов отрезка.

    Рассмотрим метод Ньютона на конкретном примере.

    Пусть нам дана возрастающая функция y = f(x) =x 2 -2, непрерывная на отрезке (0;2), и имеющая f ‘(x) = 2x > 0 и f »(x) = 2 > 0.

    Уравнение касательной в общем виде имеет представление:

    В нашем случае: y-y0=2x0·(x-x0). В качестве точки x0 выбираем точку B1(b; f(b)) = (2,2). Проводим касательную к функции y = f(x) в точке B1, и обозначаем точку пересечения касательной и оси Ox точкой x1. Получаем уравнение первой касательной:y-2=2·2(x-2), y=4x-6.

    Точка пересечения касательной и оси Ox: x1 =

    Рисунок 2. Результат первой итерации

    Затем находим точку пересечения функции y=f(x) и перпендикуляра, проведенного к оси Ox через точку x1, получаем точку В2 =(1.5; 0.25). Снова проводим касательную к функции y = f(x) в точке В2, и обозначаем точку пересечения касательной и оси Ox точкой x2.

    Точка пересечения касательной и оси Ox: x2 = .

    Рисунок 3. Вторая итерация метода Ньютона

    Затем находим точку пересечения функции y=f(x) и перпендикуляра, проведенного к оси Ox через точку x2, получаем точку В3 и так далее.

    В3 = ()

    Рисунок 4. Третий шаг метода касательных

    Первое приближение корня определяется по формуле:

    = 1.5.

    Второе приближение корня определяется по формуле:

    =

    Третье приближение корня определяется по формуле:

    Таким образом, i-ое приближение корня определяется по формуле:

    Вычисления ведутся до тех пор, пока не будет достигнуто совпадение десятичных знаков, которые необходимы в ответе, или заданной точности e — до выполнения неравенства |xixi-1|

    using namespace std;

    float f(double x) //возвращает значение функции f(x) = x^2-2

    float df(float x) //возвращает значение производной

    float d2f(float x) // значение второй производной

    int _tmain(int argc, _TCHAR* argv[])

    int exit = 0, i=0;//переменные для выхода и цикла

    double x0,xn;// вычисляемые приближения для корня

    double a, b, eps;// границы отрезка и необходимая точность

    cin>>a>>b; // вводим границы отрезка, на котором будем искать корень

    cin>>eps; // вводим нужную точность вычислений

    if (a > b) // если пользователь перепутал границы отрезка, меняем их местами

    if (f(a)*f(b)>0) // если знаки функции на краях отрезка одинаковые, то здесь нет корня

    cout 0) x0 = a; // для выбора начальной точки проверяем f(x0)*d2f(x0)>0 ?

    xn = x0-f(x0)/df(x0); // считаем первое приближение

    cout eps) // пока не достигнем необходимой точности, будет продолжать вычислять

    xn = x0-f(x0)/df(x0); // непосредственно формула Ньютона

    > while (exit!=1); // пока пользователь не ввел exit = 1

    Посмотрим, как это работает. Нажмем на зеленый треугольник в верхнем левом углу экрана, или же клавишу F5.

    Если происходит ошибка компиляции «Ошибка error LNK1123: сбой при преобразовании в COFF: файл недопустим или поврежден», то это лечится либо установкой первого Service pack 1, либо в настройках проекта Свойства -> Компоновщик отключаем инкрементную компоновку.

    Рис. 4. Решение ошибки компиляции проекта

    Мы будем искать корни у функции f(x) = x2-2.

    Сначала проверим работу приложения на «неправильных» входных данных. На отрезке [3; 5] нет корней, наша программа должна выдать сообщение об ошибке.

    У нас появилось окно приложения:

    Рис. 5. Ввод входных данных

    Введем границы отрезка 3 и 5, и точность 0.05. Программа, как и надо, выдала сообщение об ошибке, что на данном отрезке корней нет.

    Рис. 6. Ошибка «На этом отрезке корней нет!»

    Выходить мы пока не собираемся, так что на сообщение «Exit?» вводим «0».

    Теперь проверим работу приложения на корректных входных данных. Введем отрезок [0; 2] и точность 0.0001.

    Рис. 7. Вычисление корня с необходимой точностью

    Как мы видим, необходимая точность была достигнута уже на 4-ой итерации.

    Чтобы выйти из приложения, введем «Exit?» => 1.

    Метод секущих

    Чтобы избежать вычисления производной, метод Ньютона можно упростить, заменив производную на приближенное значение, вычисленное по двум предыдущим точкам:

    /

    Итерационный процесс имеет вид:

    где .

    Это двухшаговый итерационный процесс, поскольку использует для нахождения последующего приближения два предыдущих.

    Порядок сходимости метода секущих ниже, чем у метода касательных и равен в случае однократного корня .

    Эта замечательная величина называется золотым сечением:

    Убедимся в этом, считая для удобства, что .

    Таким образом, с точностью до бесконечно малых более высокого порядка

    Отбрасывая остаточный член, получаем рекуррентное соотношение, решение которого естественно искать в виде .

    После подстановки имеем: и

    Для сходимости необходимо, чтобы было положительным, поэтому .

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

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

    Как только начнется рост, вычисления прекращают и последнюю итерацию не используют.

    Такая процедура определения момента окончания итераций называется приемом Гарвика.

    Метод парабол

    Рассмотрим трехшаговый метод, в котором приближение определяется по трем предыдущим точкам , и .

    Для этого заменим, аналогично методу секущих, функцию интерполяционной параболой проходящей через точки , и .

    В форме Ньютона она имеет вид:

    Точка определяется как тот из корней этого полинома, который ближе по модулю к точке .

    Порядок сходимости метода парабол выше, чем у метода секущих, но ниже, чем у метода Ньютона.

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

    Этот метод очень удобен для поиска корней многочленов высокой степени.

    Метод простых итераций

    Задачу нахождения решений уравнений можно формулировать как задачу нахождения корней: , или как задачу нахождения неподвижной точки.

    Пусть и — сжатие: (в частности, тот факт, что — сжатие, как легко видеть, означает, что).

    По теореме Банаха существует и единственна неподвижная точка

    Она может быть найдена как предел простой итерационной процедуры

    где начальное приближение — произвольная точка промежутка .

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

    Таким образом, если производная меньше единицы, то является сжатием.

    Условие существенно, ибо если, например, на [0,1] , то неподвижная точка отсутствует, хотя производная равна нулю. Скорость сходимости зависит от величины . Чем меньше , тем быстрее сходимость.

    Рассмотрим уравнение: .

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

    Однако можно в качестве можно взять, например, функцию . Соответствующая итерационная процедура имеет вид: .

    Эти итерации сходятся к неподвижной точке для любого начального приближения :

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

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

    т.е. такой итерационный процесс всегда сходится.

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

    Здесь нетрудно убедиться, что при существует окрестность корня, в которой .

    то если корень кратности , то в его окрестности и, следовательно,.

    Если — простой корень, то сходимость метода касательных квадратичная (то есть порядок сходимости равен 2).

    Поскольку , то

    Таким образом, сходимость метода Ньютона очень быстрая.

    Нахождение всех корней уравнения

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

    Чтобы найти другие корни, можно было бы брать новые стартовые точки и применять метод вновь, но нет гарантии, что при этом итерации сойдутся к новому корню, а не к уже найденному, если вообще сойдутся.

    Для поиска других корней используется метод удаления корней.

    Пусть — корень функции , рассмотрим функцию. Точка будет являться корнем функции на единицу меньшей кратности, чем, при этом все остальные корни у функций и совпадают с учетом кратности.

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

    Повторяя указанную процедуру, можно найти все корни с учетом кратности.

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

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

    Мы рассмотрели решение уравнений только в одномерном случае, нахождение решений многомерных уравнений существенно более трудная задача.

    источники:

    http://www.math.mrsu.ru/text/courses/mcad/4.1.htm

    http://statistica.ru/branches-maths/chislennye-metody-resheniya-uravneniy/

    У этого термина существуют и другие значения, см. Метод (значения).

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

    Описание метода[править | править код]

    Обоснование[править | править код]

    Чтобы численно решить уравнение f(x)=0 методом простой итерации, его необходимо привести к эквивалентному уравнению: x=varphi(x), где varphi  — сжимающее отображение.

    Для наилучшей сходимости метода в точке очередного приближения x^{*} должно выполняться условие {displaystyle varphi '(x^{*})=0}. Решение данного уравнения ищут в виде {displaystyle varphi (x)=x+alpha (x)f(x)}, тогда:

    {displaystyle varphi '(x^{*})=1+alpha '(x^{*})f(x^{*})+alpha (x^{*})f'(x^{*})=0.}

    В предположении, что точка приближения «достаточно близка» к корню {tilde  {x}} и что заданная функция непрерывна {displaystyle (f(x^{*})approx f({tilde {x}})=0)}, окончательная формула для alpha(x) такова:

    {displaystyle alpha (x)=-{frac {1}{f'(x)}}.}

    С учётом этого функция varphi (x) определяется:

    {displaystyle varphi (x)=x-{frac {f(x)}{f'(x)}}.}

    При некоторых условиях эта функция в окрестности корня осуществляет сжимающее отображение.

    В этом случае алгоритм нахождения численного решения уравнения f(x)=0 сводится к итерационной процедуре вычисления:

    {displaystyle x_{n+1}=x_{n}-{frac {f(x_{n})}{f'(x_{n})}}.}

    По теореме Банаха последовательность приближений стремится к корню уравнения f(x)=0.

    Иллюстрация метода Ньютона (синим изображена функция scriptstyle {f(x)}, ноль которой необходимо найти, красным — касательная в точке очередного приближения scriptstyle {x_{n}}). Здесь мы можем увидеть, что последующее приближение scriptstyle {x_{{n+1}}} лучше предыдущего scriptstyle {x_{n}}.

    Геометрическая интерпретация[править | править код]

    Основная идея метода заключается в следующем: задаётся начальное приближение вблизи предположительного корня, после чего строится касательная к графику исследуемой функции в точке приближения, для которой находится пересечение с осью абсцисс. Эта точка берётся в качестве следующего приближения. И так далее, пока не будет достигнута необходимая точность.

    Пусть 1) вещественнозначная функция {displaystyle f(x)colon (a,,b)to mathbb {R} } непрерывно дифференцируема на интервале {displaystyle (a,,b)} ;
    2) существует искомая точка {displaystyle x^{*}in (a,,b)} : {displaystyle f(x^{*})=0} ;
    3) существуют C > 0 и delta >0 такие, что
    {displaystyle vert f'(x)vert geqslant C}
    для {displaystyle xin (a,,x^{*}-delta ]cup [x^{*}+delta ,,b)}
    и {displaystyle f'(x)neq 0}
    для {displaystyle xin (x^{*}-delta ,,x^{*})cup (x^{*},,x^{*}+delta )} ;
    4) точка {displaystyle x_{n}in (a,,b)} такова, что {displaystyle f(x_{n})neq 0} .
    Тогда формула итеративного приближения x_{n} к x^{{*}}
    может быть выведена из геометрического смысла касательной следующим образом:

    {displaystyle f'(x_{n})=mathrm {tg} ,alpha _{n}={frac {Delta y}{Delta x}}={frac {f(x_{n})-0}{x_{n}-x_{n+1}}}={frac {0-f(x_{n})}{x_{n+1}-x_{n}}},}

    где {displaystyle alpha _{n}} — угол наклона касательной прямой
    {displaystyle y(x)=f(x_{n})+(x-x_{n})cdot mathrm {tg} ,alpha _{n}}
    к графику f
    в точке {displaystyle (x_{n};f(x_{n}))} .

    Следовательно (в уравнении касательной прямой полагаем {displaystyle y(x_{n+1})=0}) искомое выражение для x_{{n+1}} имеет вид :

    {displaystyle x_{n+1}=x_{n}-{frac {f(x_{n})}{f'(x_{n})}}.}

    Если {displaystyle x_{n+1}in (a,,b)}, то это значение можно использовать в качестве следующего приближения к
    x^{{*}} .

    Если {displaystyle x_{n+1}notin (a,,b)}, то имеет место «перелёт» (корень x^{{*}} лежит рядом с границей {displaystyle (a,,b)}). В этом случае надо (воспользовавшись идеей метода половинного деления) заменять
    x_{{n+1}} на
    {displaystyle {frac {x_{n}+x_{n+1}}{2}}}
    до тех пор, пока точка «не вернётся» в область поиска
    {displaystyle (a,,b)} .

    Замечания. 1) Наличие непрерывной производной даёт возможность строить непрерывно меняющуюся касательную на всей области поиска решения {displaystyle (a,,b);} .
    2) Случаи граничного (в точке a или в точке b) расположения искомого решения x^{{*}} рассматриваются аналогичным образом.
    3) С геометрической точки зрения равенство
    {displaystyle f'(x_{n})=0}
    означает, что касательная прямая к графику
    f
    в точке
    {displaystyle (x_{n};f(x_{n}))}
    параллельна оси
    OX
    и при
    {displaystyle f(x_{n})neq 0}
    не пересекается с ней в конечной части.
    4) Чем больше константа C > 0 и чем меньше константа delta >0 из пункта 3 условий,
    тем для {displaystyle x_{n}in (a,,x^{*}-delta ]cup [x^{*}+delta ,,b)}
    пересечение касательной к графику f и оси OX ближе к точке {displaystyle (x^{*};;0)} ,
    то есть тем ближе значение x_{{n+1}} к искомой {displaystyle x^{*}in (a,,b)} .

    Итерационный процесс начинается с некоторого начального приближения
    {displaystyle x_{0}in (a,,b)} ,
    причём между
    {displaystyle x_{0}in (a,,b)}
    и искомой точкой
    {displaystyle x^{*}in (a,,b)}
    не должно быть других нулей функции
    f ,
    то есть «чем ближе x_{0}
    к искомому корню x^{{*}} ,
    тем лучше». Если предположения о нахождении x^{{*}} отсутствуют, методом проб и ошибок можно сузить область возможных значений, применив теорему о промежуточных значениях.

    Для предварительно заданных {displaystyle varepsilon _{x}>0} , {displaystyle varepsilon _{f}>0}
    итерационный процесс завершается если
    {displaystyle leftvert {frac {f(x_{n})}{f'(x_{n})}}rightvert approx vert x_{n+1}-x_{n}vert <varepsilon _{x}} и
    {displaystyle vert f(x_{n+1})vert <varepsilon _{f}} .
    В частности, для матрицы дисплея {displaystyle varepsilon _{x}} и {displaystyle varepsilon _{f}} могут быть рассчитаны,
    исходя из масштаба отображения графика f ,
    то есть если x_{n} и x_{{n+1}} попадают в один вертикальный, а {displaystyle f(x_{n})} и {displaystyle f(x_{n+1})} в один горизонтальный ряд.

    Алгоритм[править | править код]

    1. Задается начальное приближение x_{0}.
    2. Пока не выполнено условие остановки, в качестве которого можно взять {displaystyle |x_{n+1}-x_{n}|<varepsilon } или {displaystyle |f(x_{n+1})|<varepsilon } (то есть погрешность в нужных пределах), вычисляют новое приближение: {displaystyle x_{n+1}=x_{n}-{frac {f(x_{n})}{f'(x_{n})}}}.

    Пример[править | править код]

    Иллюстрация применения метода Ньютона к функции f(x)=cos x-x^{3} с начальным приближением в точке x_{0}=0{,}5.

    График последовательных приближений.

    График сходимости.

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

    Рассмотрим задачу о нахождении положительных x, для которых cos x=x^{3}. Эта задача может быть представлена как задача нахождения нуля функции f(x)=cos x-x^{3}. Имеем выражение для производной f'(x)=-sin x-3x^{2}. Так как cos xleqslant 1 для всех x и x^{3}>1 для x>1, очевидно, что решение лежит между 0 и 1. Возьмём в качестве начального приближения значение x_{0}=0{,}5, тогда:

    {begin{matrix}x_{1}&=&x_{0}-{dfrac  {f(x_{0})}{f'(x_{0})}}&=&1{,}112;141;637;097,\x_{2}&=&x_{1}-{dfrac  {f(x_{1})}{f'(x_{1})}}&=&underline {0{,}}909;672;693;736,\x_{3}&=&x_{2}-{dfrac  {f(x_{2})}{f'(x_{2})}}&=&underline {0{,}86}7;263;818;209,\x_{4}&=&x_{3}-{dfrac  {f(x_{3})}{f'(x_{3})}}&=&underline {0{,}865;47}7;135;298,\x_{5}&=&x_{4}-{dfrac  {f(x_{4})}{f'(x_{4})}}&=&underline {0{,}865;474;033;1}11,\x_{6}&=&x_{5}-{dfrac  {f(x_{5})}{f'(x_{5})}}&=&underline {0{,}865;474;033;102}.end{matrix}}

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

    Условия применения[править | править код]

    Иллюстрация расхождения метода Ньютона, применённого к функции scriptstyle {f(x)=x^{3}-2x+2} с начальным приближением в точке scriptstyle {x_{0}=0}.

    Рассмотрим ряд примеров, указывающих на недостатки метода.

    Контрпримеры[править | править код]

    • Если начальное приближение недостаточно близко к решению, то метод может не сойтись.

    Пусть

    {displaystyle f(x)=x^{3}-2x+2.}

    Тогда

    x_{{n+1}}=x_{{n}}-{frac  {x_{n}^{3}-2x_{n}+2}{3x_{n}^{2}-2}}.

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

    График производной функции scriptstyle {f(x)=x+x^{2}sin(2/x)} при приближении scriptstyle {x} к нулю справа.

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

    Рассмотрим функцию:

    {displaystyle f(x)={begin{cases}0,&x=0,\x+x^{2}sin left({dfrac {2}{x}}right),&xneq 0.end{cases}}}

    Тогда {displaystyle f'(0)=1} и {displaystyle f'(x)=1+2xsin(2/x)-2cos(2/x)} всюду, кроме 0.

    В окрестности корня производная меняет знак при приближении x к нулю справа или слева. В то время, как {displaystyle f(x)geqslant x-x^{2}>0} для {displaystyle 0<x<1}.

    Таким образом {displaystyle f(x)/f'(x)} не ограничено вблизи корня, и метод будет расходиться, хотя функция всюду дифференцируема, её производная не равна нулю в корне, f бесконечно дифференцируема везде, кроме как в корне, а её производная ограничена в окрестности корня.

    • Если не существует вторая производная в точке корня, то скорость сходимости метода может быть заметно снижена.

    Рассмотрим пример:

    {displaystyle f(x)=x+x^{4/3}.}

    Тогда {displaystyle f'(x)=1+(4/3)x^{1/3}} и {displaystyle f''(x)=(4/9)x^{-2/3}} за исключением x=0, где она не определена.

    На очередном шаге имеем x_{n}:

    {displaystyle x_{n+1}=x_{n}-{frac {f(x_{n})}{f'(x_{n})}}={frac {(1/3)x_{n}^{4/3}}{(1+(4/3)x_{n}^{1/3})}}.}

    Скорость сходимости полученной последовательности составляет приблизительно 4/3. Это существенно меньше, нежели 2, необходимое для квадратичной сходимости, поэтому в данном случае можно говорить лишь о линейной сходимости, хотя функция всюду непрерывно дифференцируема, производная в корне не равна нулю, и f бесконечно дифференцируема везде, кроме как в корне.

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

    Пусть

    {displaystyle f(x)=x^{2}.}

    Тогда {displaystyle f'(x)=2x} и следовательно {displaystyle x-f(x)/f'(x)=x/2}. Таким образом сходимость метода не квадратичная, а линейная, хотя функция всюду бесконечно дифференцируема.

    Ограничения[править | править код]

    Пусть задано уравнение f(x)=0, где {displaystyle f(x)colon mathbb {X} to mathbb {R} } и надо найти его решение.

    Ниже приведена формулировка основной теоремы, которая позволяет дать чёткие условия применимости. Она носит имя советского математика и экономиста Леонида Витальевича Канторовича (1912—1986).

    Теорема Канторовича.

    Если существуют такие константы A,;B,;C, что:

    1. {displaystyle {frac {1}{|f'(x)|}}<A} на [a,;b], то есть f'(x) сут и не равна нулю;
    2. {displaystyle left|{frac {f(x)}{f'(x)}}right|<B} на [a,;b], то есть f(x) ограничена;
    3. {displaystyle exists f''(x)} на [a,;b], и {displaystyle |f''(x)|leqslant Cleqslant {frac {1}{2AB}}};

    Причём длина рассматриваемого отрезка {displaystyle |a-b|<{frac {1}{AB}}left(1-{sqrt {1-2ABC}}right)}. Тогда справедливы следующие утверждения:

    1. на [a,;b] существует корень x^{*} уравнения {displaystyle f(x)=0colon exists x^{*}in [a,;b]colon f(x^{*})=0};
    2. если {displaystyle x_{0}={frac {a+b}{2}}}, то итерационная последовательность сходится к этому корню: {displaystyle left{x_{n+1}=x_{n}-{frac {f(x_{n})}{f'(x_{n})}}right}to x^{*}};
    3. погрешность может быть оценена по формуле {displaystyle |x^{*}-x_{n}|leqslant {frac {B}{2^{n-1}}}(2ABC)^{2^{n-1}}}.

    Из последнего из утверждений теоремы в частности следует квадратичная сходимость метода:

    {displaystyle |x^{*}-x_{n}|leqslant {frac {B}{2^{n-1}}}(2ABC)^{2^{n-1}}={frac {1}{2}}{frac {B}{2^{n-2}}}left((2ABC)^{2^{n-2}}right)^{2}=alpha |x^{*}-x_{n-1}|^{2}.}

    Тогда ограничения на исходную функцию f(x) будут выглядеть так:

    1. функция должна быть ограничена;
    2. функция должна быть гладкой, дважды дифференцируемой;
    3. её первая производная f'(x) равномерно отделена от нуля;
    4. её вторая производная f''(x) должна быть равномерно ограничена.

    Историческая справка[править | править код]

    Метод был описан Исааком Ньютоном в рукописи «Об анализе уравнениями бесконечных рядов» (лат. «De analysi per aequationes numero terminorum infinitas»), адресованной в 1669 году Барроу, и в работе «Метод флюксий и бесконечные ряды» (лат. «De metodis fluxionum et serierum infinitarum») или «Аналитическая геометрия» (лат. «Geometria analytica») в собраниях трудов Ньютона, которая была написана в 1671 году. В своих работах Ньютон вводит такие понятия, как разложение функции в ряд, бесконечно малые и флюксии (производные в нынешнем понимании). Указанные работы были изданы значительно позднее: первая вышла в свет в 1711 году благодаря Уильяму Джонсону, вторая была издана Джоном Кользоном в 1736 году уже после смерти создателя. Однако описание метода существенно отличалось от его нынешнего изложения: Ньютон применял свой метод исключительно к полиномам. Он вычислял не последовательные приближения x_{n}, а последовательность полиномов и в результате получал приближённое решение x.

    Впервые метод был опубликован в трактате «Алгебра» Джона Валлиса в 1685 году, по просьбе которого он был кратко описан самим Ньютоном. В 1690 году Джозеф Рафсон опубликовал упрощённое описание в работе «Общий анализ уравнений» (лат. «Analysis aequationum universalis»). Рафсон рассматривал метод Ньютона как чисто алгебраический и ограничил его применение полиномами, однако при этом он описал метод на основе последовательных приближений x_{n} вместо более трудной для понимания последовательности полиномов, использованной Ньютоном. Наконец, в 1740 году метод Ньютона был описан Томасом Симпсоном как итеративный метод первого порядка решения нелинейных уравнений с использованием производной в том виде, в котором он излагается здесь. В той же публикации Симпсон обобщил метод на случай системы из двух уравнений и отметил, что метод Ньютона также может быть применён для решения задач оптимизации путём нахождения нуля производной или градиента.

    В 1879 году Артур Кэли в работе «Проблема комплексных чисел Ньютона — Фурье» (англ. «The Newton-Fourier imaginary problem») был первым, кто отметил трудности в обобщении метода Ньютона на случай мнимых корней полиномов степени выше второй и комплексных начальных приближений. Эта работа открыла путь к изучению теории фракталов.

    Обобщения и модификации[править | править код]

    Иллюстрация последовательных приближений метода одной касательной, применённого к функции scriptstyle {f(x)=e^{x}-2} с начальным приближением в точке scriptstyle {x_{0}=1{,}8}.

    Метод секущих[править | править код]

    Родственный метод секущих является «приближённым» методом Ньютона и позволяет не вычислять производную. Значение производной в итерационной формуле заменяется её оценкой по двум предыдущим точкам итераций:

    {displaystyle f'(x_{n})approx {frac {f(x_{n})-f(x_{n-1})}{x_{n}-x_{n-1}}}} .

    Таким образом, основная формула имеет вид

    {displaystyle x_{n+1}=x_{n}-f(x_{n})cdot {frac {x_{n}-x_{n-1}}{f(x_{n})-f(x_{n-1})}}.}

    Этот метод схож с методом Ньютона, но имеет немного меньшую скорость сходимости. Порядок сходимости метода равен золотому сечению — 1,618…

    Замечания. 1) Для начала итерационного процесса требуются два различных значения
    x_{0} и
    x_{1} .
    2) В отличие от «настоящего метода Ньютона» (метода касательных), требующего хранить только {displaystyle x_{n}}
    (и в ходе вычислений — временно {displaystyle f(x_{n})} и {displaystyle f'(x_{n})}),
    для метода секущих требуется сохранение
    {displaystyle x_{n-1}} ,
    {displaystyle x_{n}} ,
    {displaystyle f(x_{n-1})} ,
    {displaystyle f(x_{n})} .
    3) Применяется, если вычисление f'(x) затруднено
    (например, требует большого количества машинных ресурсов: времени и/или памяти).

    Метод одной касательной[править | править код]

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

    Формула итераций этого метода имеет вид:

    {displaystyle x_{n+1}=x_{n}-{frac {1}{f'(x_{0})}}f(x_{n}).}

    Суть метода заключается в том, чтобы вычислять производную лишь один раз, в точке начального приближения x_{0}, а затем использовать это значение на каждой последующей итерации:

    {displaystyle alpha (x)=alpha _{0}=-{dfrac {1}{f'(x_{0})}}.}

    При таком выборе alpha _{0} в точке x_{0} выполнено равенство:

    {displaystyle varphi '(x_{0})=1+alpha _{0}f'(x_{0})=0,}

    и если отрезок, на котором предполагается наличие корня x^{*} и выбрано начальное приближение x_{0}, достаточно мал, а производная {displaystyle varphi '(x)} непрерывна, то значение {displaystyle varphi '(x^{*})} будет не сильно отличаться от {displaystyle varphi '(x_{0})=0} и, следовательно, график {displaystyle y=varphi (x)} пройдёт почти горизонтально, пересекая прямую y=x, что в свою очередь обеспечит быструю сходимость последовательности точек приближений к корню.

    Этот метод является частным случаем метода простой итерации. Он имеет линейный порядок сходимости.

    Метод Ньютона-Фурье[править | править код]

    Метод Ньютона-Фурье – это расширение метода Ньютона, выведенное Жозефом Фурье для получения оценок на абсолютную ошибку аппроксимации корня, в то же время обеспечивая квадратичную сходимость с обеих сторон.

    Предположим, что f(x) дважды непрерывно дифференцируема на отрезке [a, b] и что f имеет корень на этом интервале. Дополнительно положим, что f(x), f(x) ≠ 0 на этом отрезке (например, это верно, если f(a) < 0, f(b) > 0, и f(x) > 0 на этом отрезке). Это гарантирует наличие единственного корня на этом отрезке, обозначим его α. Эти рассуждения относятся к вогнутой вверх функции. Если она вогнута вниз, то заменим f(x) на f(x), поскольку они имеют одни и те же корни.

    Пусть x0 = b будет правым концом отрезка, на котором мы ищем корень, а z0 = a – левым концом того же отрезка. Если xn найдено, определим

    {displaystyle x_{n+1}=x_{n}-{frac {f(x_{n})}{f'(x_{n})}},}

    которое выражает обычный метод Ньютона, как описано выше. Затем определим

    {displaystyle z_{n+1}=z_{n}-{frac {f(z_{n})}{f'(x_{n})}},}

    где знаменатель равен f(xn), а не f(zn). Итерации xn будут строго убывающими к корню, а итерации zn – строго возрастающими к корню. Также выполняется следующее соотношение:

    {displaystyle lim _{nto infty }{frac {x_{n+1}-z_{n+1}}{(x_{n}-z_{n})^{2}}}={frac {f''(alpha )}{2f'(alpha )}}},

    таким образом, расстояние между xn и zn уменьшается квадратичным образом.

    Многомерный случай[править | править код]

    Обобщим полученный результат на многомерный случай.

    Пусть необходимо найти решение системы:

    {displaystyle left{{begin{array}{lcr}f_{1}(x_{1},;x_{2},;ldots ,;x_{n})&=&0,\ldots &&\f_{m}(x_{1},;x_{2},;ldots ,;x_{n})&=&0.end{array}}right.}

    Выбирая некоторое начальное значение {displaystyle {vec {x}}^{[0]}}, последовательные приближения {displaystyle {vec {x}}^{[j+1]}} находят путём решения систем уравнений:

    {displaystyle f_{i}+sum _{k=1}^{n}{frac {partial f_{i}}{partial x_{k}}}(x_{k}^{[j+1]}-x_{k}^{[j]})=0,qquad i=1,;2,;ldots ,;m,}

    где {displaystyle {vec {x}}^{[j]}=(x_{1}^{[j]},;x_{2}^{[j]},;ldots ,;x_{n}^{[j]}),quad j=0,;1,;2,;ldots }.

    Применительно к задачам оптимизации[править | править код]

    Пусть необходимо найти минимум функции многих переменных {displaystyle f({vec {x}})colon mathbb {R} ^{n}to mathbb {R} }. Эта задача равносильна задаче нахождения нуля градиента {displaystyle nabla f({vec {x}})}. Применим изложенный выше метод Ньютона:

    {displaystyle nabla f({vec {x}}^{[j]})+H({vec {x}}^{[j]})({vec {x}}^{[j+1]}-{vec {x}}^{[j]})=0,quad j=1,;2,;ldots ,;n,}

    где {displaystyle H({vec {x}})} — гессиан функции f({vec  {x}}).

    В более удобном итеративном виде это выражение выглядит так:

    {displaystyle {vec {x}}^{[j+1]}={vec {x}}^{[j]}-H^{-1}({vec {x}}^{[j]})nabla f({vec {x}}^{[j]}).}

    Следует отметить, что в случае квадратичной функции метод Ньютона находит экстремум за одну итерацию.

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

    Метод Ньютона — Рафсона[править | править код]

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

    {displaystyle {vec {x}}^{[j+1]}={vec {x}}^{[j]}-lambda _{j}H^{-1}({vec {x}}^{[j]})nabla f({vec {x}}^{[j]}),}

    где {displaystyle lambda _{j}=arg min _{lambda }f({vec {x}}^{[j]}-lambda H^{-1}({vec {x}}^{[j]})nabla f({vec {x}}^{[j]})).}
    Для оптимизации вычислений применяют следующее улучшение: вместо того, чтобы на каждой итерации заново вычислять гессиан целевой функции, ограничиваются начальным приближением {displaystyle H(f({vec {x}}^{[0]}))} и обновляют его лишь раз в m шагов, либо не обновляют вовсе.

    Применительно к задачам о наименьших квадратах[править | править код]

    На практике часто встречаются задачи, в которых требуется произвести настройку свободных параметров объекта или подогнать математическую модель под реальные данные. В этих случаях появляются задачи о наименьших квадратах:

    F({vec  {x}})=|{vec  {f}}({vec  {x}})|=sum _{{i=1}}^{m}f_{i}^{2}({vec  {x}})=sum _{{i=1}}^{m}(varphi _{i}({vec  {x}})-{mathcal  {F}}_{i})^{2}to min .

    Эти задачи отличаются особым видом градиента и матрицы Гессе:

    nabla F({vec  {x}})=2J^{T}({vec  {x}}){vec  {f}}({vec  {x}}),
    H({vec  {x}})=2J^{T}({vec  {x}})J({vec  {x}})+2Q({vec  {x}}),qquad Q({vec  {x}})=sum _{{i=1}}^{m}f_{i}({vec  {x}})H_{i}({vec  {x}}),

    где J({vec  {x}}) — матрица Якоби вектор-функции {vec  {f}}({vec  {x}}), H_{i}({vec  {x}}) — матрица Гессе для её компоненты f_{i}({vec  {x}}).

    Тогда очередной шаг {vec  {p}} определяется из системы:

    left[J^{T}({vec  {x}})J({vec  {x}})+sum _{{i=1}}^{m}f_{i}({vec  {x}})H_{i}({vec  {x}})right]{vec  {p}}=-J^{T}({vec  {x}}){vec  {f}}({vec  {x}}).

    Метод Гаусса — Ньютона[править | править код]

    Метод Гаусса — Ньютона строится на предположении о том, что слагаемое J^{T}({vec  {x}})J({vec  {x}}) доминирует над Q({vec  {x}}). Это требование не соблюдается, если минимальные невязки велики, то есть если норма |{vec  {f}}({vec  {x}})| сравнима с максимальным собственным значением матрицы J^{T}({vec  {x}})J({vec  {x}}). В противном случае можно записать:

    J^{T}({vec  {x}})J({vec  {x}}){vec  {p}}=-J^{T}({vec  {x}}){vec  {f}}({vec  {x}}).

    Таким образом, когда норма |Q({vec  {x}})| близка к нулю, а матрица J({vec  {x}}) имеет полный столбцевой ранг, шаг {vec  {p}} мало отличается от ньютоновского (с учётом Q({vec  {x}})), и метод может достигать квадратичной скорости сходимости, хотя вторые производные и не учитываются. Улучшением метода является алгоритм Левенберга — Марквардта, основанный на эвристических соображениях.

    Обобщение на комплексную плоскость[править | править код]

    Бассейны Ньютона для полинома пятой степени scriptstyle {p(x)=x^{5}-1}. Разными цветами закрашены области притяжения для разных корней. Более тёмные области соответствуют большему числу итераций.

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

    {displaystyle z_{n+1}=z_{n}-{frac {f(z_{n})}{f'(z_{n})}}.}

    Особый интерес представляет выбор начального приближения z_{0}. Ввиду того, что функция может иметь несколько нулей, в различных случаях метод может сходиться к различным значениям, и вполне естественно возникает желание выяснить, какие области обеспечат сходимость к тому или иному корню. Этот вопрос заинтересовал Артура Кэли ещё в 1879 году, однако разрешить его смогли лишь в 70-х годах двадцатого столетия с появлением вычислительной техники. Оказалось, что на пересечениях этих областей (их принято называть областями притяжения) образуются так называемые фракталы — бесконечные самоподобные геометрические фигуры.

    Ввиду того, что Ньютон применял свой метод исключительно к полиномам, фракталы, образованные в результате такого применения, обрели название фракталов Ньютона или бассейнов Ньютона.

    Реализация[править | править код]

    Scala[править | править код]

    object NewtonMethod {
    
      val accuracy = 1e-6
    
      @tailrec
      def method(x0: Double, f: Double => Double, dfdx: Double => Double, e: Double): Double = {
        val x1 = x0 - f(x0) / dfdx(x0)
        if (abs(x1 - x0) < e) x1
        else method(x1, f, dfdx, e)
      }
    
      def g(C: Double) = (x: Double) => x*x - C
    
      def dgdx(x: Double) = 2*x
    
      def sqrt(x: Double) = x match {
        case 0 => 0
        case x if (x < 0) => Double.NaN
        case x if (x > 0) => method(x/2, g(x), dgdx, accuracy) 
      }
    }
    

    Python[править | править код]

    from math import sin, cos
    from typing import Callable
    import unittest
    
    
    def newton(f: Callable[[float], float], f_prime: Callable[[float], float], x0: float, 
    	eps: float=1e-7, kmax: int=1e3) -> float:
    	"""
    	solves f(x) = 0 by Newton's method with precision eps
    	:param f: f
    	:param f_prime: f'
    	:param x0: starting point
    	:param eps: precision wanted
    	:return: root of f(x) = 0
    	"""
    	x, x_prev, i = x0, x0 + 2 * eps, 0
    	
    	while abs(x - x_prev) >= eps and i < kmax:
    		x, x_prev, i = x - f(x) / f_prime(x), x, i + 1
    
    	return x
    
    
    class TestNewton(unittest.TestCase):
    	def test_0(self):
    		def f(x: float) -> float:
    			return x**2 - 20 * sin(x)
    
    
    		def f_prime(x: float) -> float:
    			return 2 * x - 20 * cos(x)
    
    
    		x0, x_star = 2, 2.7529466338187049383
    
    		self.assertAlmostEqual(newton(f, f_prime, x0), x_star)
    
    
    if __name__ == '__main__':
    	unittest.main()
    

    PHP[править | править код]

    <?php
    // PHP 5.4
    function newtons_method(
    	$a = -1, $b = 1, 
    	$f = function($x) {
    	
    		return pow($x, 4) - 1;
    	
    	},
    	$derivative_f = function($x) {
    
    		return 4 * pow($x, 3);
    	
    	}, $eps = 1E-3) {
    
            $xa = $a;
            $xb = $b;
    
            $iteration = 0;
    
            while (abs($xb) > $eps) {
    
                $p1 = $f($xa);
                $q1 = $derivative_f($xa);
                $xa -= $p1 / $q1;
                $xb = $p1;
                ++$iteration;
    
            }
    
            return $xa;
    
    }
    

    Octave[править | править код]

    function res = nt()
      eps = 1e-7;
      x0_1 = [-0.5,0.5];
      max_iter = 500;
      xopt = new(@resh, eps, max_iter);   
      xopt
    endfunction
    function a = new(f, eps, max_iter)
      x=-1;
      p0=1;
      i=0;
     while (abs(p0)>=eps)
        [p1,q1]=f(x);
        x=x-p1/q1;
       p0=p1;
       i=i+1;
     end
     i
     a=x;
    endfunction
    function[p,q]= resh(x)   % p= -5*x.^5+4*x.^4-12*x.^3+11*x.^2-2*x+1;
       p=-25*x.^4+16*x.^3-36*x.^2+22*x-2;
       q=-100*x.^3+48*x.^2-72*x+22;
    endfunction
    

    Delphi[править | править код]

    // вычисляемая функция
    function fx(x: Double): Double;
    begin
      Result := x * x - 17;
    end;
    
    // производная функция от f(x)
    function dfx(x: Double): Double;
    begin
      Result := 2 * x;
    end;
    
    function solve(fx, dfx: TFunc<Double, Double>; x0: Double): Double;
    const
      eps = 0.000001;
    var
      x1: Double;
    begin
      x1 := x0 - fx(x0) / dfx(x0); // первое приближение
      while (Abs(x1-x0) > eps) do begin // пока не достигнута точность 0.000001
        x0 := x1;
        x1 := x1 - fx(x1) / dfx(x1); // последующие приближения
      end;
      Result := x1;
    end;
    
    // Вызов
    solve(fx, dfx,4));
    

    С++[править | править код]

    #include <stdio.h>
    #include <math.h>
    
    #define eps 0.000001
    double fx(double x) { return x * x - 17;} // вычисляемая функция
    double dfx(double x) { return 2 * x;} // производная функции
    
    typedef double(*function)(double x); // задание типа function
    
    double solve(function fx, function dfx, double x0) {
      double x1  = x0 - fx(x0) / dfx(x0); // первое приближение
      while (fabs(x1 - x0) > eps) { // пока не достигнута точность 0.000001
        x0 = x1;
        x1 = x0 - fx(x0) / dfx(x0); // последующие приближения
      }
      return x1;
    }
    
    int main () {
      printf("%fn", solve(fx, dfx, 4)); // вывод на экран
      return 0;
    }
    

    C[править | править код]

    typedef double (*function)(double x);
    
    double TangentsMethod(function f, function df, double xn, double eps) {
       double x1  = xn - f(xn)/df(xn);
       double x0 = xn;
       while(abs(x0-x1) > eps) {
          x0 = x1;
          x1 = x1 - f(x1)/df(x1);
       }
       return x1;
    }
    
    //Выбор начального приближения
    xn = MyFunction(A)*My2Derivative(A) > 0 ? B : A;
    
    double MyFunction(double x) { return (pow(x, 5) - x - 0.2); } //Ваша функция
    double MyDerivative(double x) { return (5*pow(x, 4) - 1); } //Первая производная
    double My2Derivative(double x) { return (20*pow(x, 3)); } //Вторая производная
    
    //Пример вызова функции
    double x = TangentsMethod(MyFunction, MyDerivative, xn, 0.1)
    

    Haskell[править | править код]

    import Data.List ( iterate' )
    
    main :: IO ()
    main = print $ solve ( x -> x * x - 17) ( * 2) 4
    
    -- Функция solve универсальна для всех вещественных типов значения которых можно сравнивать.
    solve = esolve 0.000001
    
    esolve epsilon func deriv x0 = fst . head $ dropWhile pred pairs
      where
        pred (xn, xn1) = (abs $ xn - xn1) > epsilon -- Функция pred определяет достигнута ли необходимая точность.
        next xn = xn - func xn / deriv xn -- Функция next вычисляет новое приближение.
        iters   = iterate' next x0        -- Бесконечный список итераций.
        pairs   = zip iters (tail iters)  -- Бесконечный список пар итераций вида: [(x0, x1), (x1, x2) ..].
    

    Литература[править | править код]

    • Акулич И. Л. Математическое программирование в примерах и задачах : Учеб. пособие для студентов эконом. спец. вузов. — М. : Высшая школа, 1986. — 319 с. : ил. — ББК 22.1 А44. — УДК 517.8(G).
    • Амосов А. А., Дубинский Ю. А., Копченова Н. П. Вычислительные методы для инженеров : Учеб. пособие. — М. : Высшая школа, 1994. — 544 с. : ил. — ББК 32.97 А62. — УДК 683.1(G). — ISBN 5-06-000625-5.
    • Бахвалов Н. С., Жидков Н. П., Кобельков Г. Г. Численные методы. — 8-е изд. — М. : Лаборатория Базовых Знаний, 2000.
    • Вавилов С. И. Исаак Ньютон. — М. : Изд. АН СССР, 1945.
    • Волков Е. А. Численные методы. — М. : Физматлит, 2003.
    • Гилл Ф., Мюррей У., Райт М. Практическая оптимизация. Пер. с англ. — М. : Мир, 1985.
    • Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М. : Наука, 1970. — С. 575—576.
    • Коршунов Ю. М., Коршунов Ю. М. Математические основы кибернетики. — Энергоатомиздат, 1972.
    • Максимов Ю. А.,Филлиповская Е. А. Алгоритмы решения задач нелинейного программирования. — М. : МИФИ, 1982.
    • Морозов А. Д. Введение в теорию фракталов. — МИФИ, 2002.

    См. также[править | править код]

    • Метод простой итерации
    • Двоичный поиск
    • Метод дихотомии
    • Метод секущих
    • Метод Мюллера
    • Метод хорд
    • Метод бисекции
    • Фрактал
    • Численное решение уравнений
    • Целочисленный квадратный корень
    • Быстрый обратный квадратный корень

    Ссылки[править | править код]

    • «Бассейны Ньютона» на сайте fractalworld.xaoc.ru
    • «Исаак Ньютон» на сайте www.scottish-wetlands.org
    • «Математические работы Канторовича» на сайте Института математики СО РАН
    • Hazewinkel, Michiel, ed. (2001), Newton method, Encyclopedia of Mathematics, Springer, ISBN 978-1-55608-010-4
    • Weisstein, Eric W. Newton’s Method (англ.) на сайте Wolfram MathWorld.
    • Newton’s method, Citizendium.
    • Mathews, J., The Accelerated and Modified Newton Methods, Course notes.
    • Wu, X., Roots of Equations, Course notes.

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

    ,

    выражая
    отсюда
    ,
    получим

    .

    Аналогично
    могут быть найдены и следующие приближения.
    Формула для k+1-го
    приближения имеет вид

    ,

    (2.15)

    Из
    формулы (2.15) вытекает условие применимости
    метода: функция
    должна быть дифференцируемой и
    в окрестности корня не должна менять
    знак.

    Для
    окончания итерационного процесса могут
    быть использованы условия (2.12) или
    (2.14).

    ØЗамечание 1. В
    методе Ньютона, в отличие от предыдущих
    методов, не обязательно задавать отрезок
    ,
    содержащий корень уравнения, а достаточно
    найти некоторое начальное приближение
    корня
    .<

    ØЗамечание 2.
    Формула метода Ньютона может быть
    получена и из других соображений.
    Зададимся некоторым начальным приближением
    корня
    .
    Заменим функциюf(x)
    в окрестности точки
    отрезком ряда Тейлора:

    ,

    и
    вместо нелинейного уравнения
    решим линеаризованное уравнение

    рассматривая
    его решение как следующее (первое)
    приближение к искомому значению корня.
    Решение этого уравнение очевидно:

    Повторяя
    это процесс приходим к формуле Ньютона
    (2.15).<

    Сходимость
    метода Ньютона
    . Выясним основные
    условия сходимости последовательности
    значений
    ,
    вычисляемых по формуле (2.15), к корню
    уравнения (2.1). Предполагая, что
    дважды непрерывно дифференцируема,
    разложим
    в ряд Тейлора в окрестностиk-го
    приближения

    .

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

    .

    Учитывая,
    что выражение в квадратных скобках
    согласно (2.15) равно
    ,
    переписываем это соотношение в виде

    .

    Отсюда

    .
    (2.16)

    Из
    (2.16) следует оценка

    ,
    (2.17)

    где

    ,
    .

    Очевидно,
    что ошибка убывает, если

    .
    (2.18)

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

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

    Выбор
    начального приближения в методе Ньютона.
    Как следует из условия (2.18) сходимость
    итерационной последовательности,
    получаемой в методе Ньютона, зависит
    от выбора начального приближения
    .
    Это можно заметить и из геометрической
    интерпретации метода. Так, если в качестве
    начального приближения взять точку
    (рис. 2.9), то на сходимость итерационного
    процесса рассчитывать не приходится.

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

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

    Соседние файлы в папке Курсовая работа_ф_3

    • #
    • #
    • #

      02.04.2015207.87 Кб12Ведомость КР _11-12_фак_3.xls

    • #

      02.04.201525.09 Кб14График выполнения КР.xls

    • #
    • #
     

    Пусть имеется уравнение вида

    f(x)= 0

    где f(x) — заданная алгебраическая или трансцендентная функция.

    Решить уравнение — значит найти все его корни, то есть те значения x, которые обращают уравнение в тождество.
    Если уравнение достаточно сложно, то задача точного определения корней является в некоторых случаях нерешаемой. Поэтому ставится задача найти такое приближенное значение корня xПP, которое отличается от точного значения корня x* на величину, по модулю не превышающую указанной точности (малой положительной величины) ε, то есть

    │x* – xпр │< ε

    Величину ε также называют допустимой ошибкой, которую можно задать по своему усмотрению.

    Этапы приближенного решения нелинейных уравнений

    Приближенное решение уравнения состоит из двух этапов:

    • Отделение корней, то есть нахождение интервалов из области определения функции f(x), в каждом из которых содержится только один корень уравнения f(x)=0.
    • Уточнение корней до заданной точности.

    Отделение корней

    Отделение корней можно проводить графически и аналитически.
    Для того чтобы графически отделить корни уравнения, необходимо построить график функции f(x). Абсциссы точек его пересечения с осью Ox являются действительными корнями уравнения.

    Для примера рассмотрим задачу решения уравнения
    Уравнение
    где угол x задан в градусах. Указанное уравнение можно переписать в виде
    f(x)=0
    Для графического отсечения корней достаточно построить график функции
    График функции
    Из рисунка видно, что корень уравнения лежит в промежутке x∈(6;8).

    Аналитическое отделение корней

    Аналитическое отделение корней основано на следующих теоремах.
    Теорема 1. Если непрерывная функция f(x) принимает на концах отрезка [a; b] значения разных знаков, т.е.
    f(a)f(b)<0
    то на этом отрезке содержится по крайней мере один корень уравнения.
    Теорема 2. Если непрерывная на отрезке [a; b] функция f(x) принимает на концах отрезка значения разных знаков, а производная f'(x) сохраняет знак внутри указанного отрезка, то внутри отрезка существует единственный корень уравнения f(x) = 0.

    Уточнение корней

    Для уточнения корней может использоваться один из следующих методов:

    • Метод последовательных приближений (метод итераций)
    • Метод Ньютона (метод касательных)
    • Метод секущих (метод хорд)
    • Метод половинного деления (метод дихотомии)

    Метод последовательных приближений (метод итераций)

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

    Последовательность чисел x0, x1 ,…, xn называется итерационной, если для любого номера n>0 элемент xn выражается через элемент xn-1 по рекуррентной формуле
    xn=f(xn-1)
    а в качестве x0 взято любое число из области задания функции f(x).

    Реализация на C++ для рассмотренного выше примера
    Уравнение
    Уравнение может быть записано в форме
    x=1/sinx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    #define _USE_MATH_DEFINES
    #include <iostream>
    #include <cmath>
    using namespace std;
    double find(double x, double eps)
    {
      double rez; int iter = 0;
      cout << “x0= ” << x << ” “;
      do {
        rez = x;
        x = 1 / (sin(M_PI*x / 180));
        iter++;
      } while (fabs(rez – x) > eps && iter<20000);
      cout << iter << ” iterations” << endl;
      return x;
    }
    int main() 
    {
      cout << find(7, 0.00001);
      cin.get(); 
      return 0;
    }

    Результат выполнения
    Результат метода последовательных приближений

    Метод Ньютона (метод касательных)

    Если известно начальное приближение x0 корня уравнения f(x)=0, то последовательные приближения находят по формуле
    метод Ньютона
    Графическая интерпретация метода касательных имеет вид
    Метод касательных
    Реализация на C++
    Для заданного уравнения
    метод Ньютона
    производная будет иметь вид f'(x)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    #define _USE_MATH_DEFINES
    #include <iostream>
    #include <cmath>
    using namespace std;
    double find(double x, double eps)
    {
      double f, df; int iter = 0;
      cout << “x0= ” << x << ” “;
      do {
        f = sin(M_PI*x / 180) – 1 / x;
        df = M_PI / 180 * cos(M_PI*x / 180) + 1 / (x*x);
        x = x – f / df;
        iter++;
      } while (fabs(f) > eps && iter<20000);
      cout << iter << ” iterations” << endl;
      return x;
    }
    int main() 
    {
      cout << find(1, 0.00001);
      cin.get(); return 0;
    }

    Результат выполнения
    Метод Ньютона

    Метод секущих (метод хорд)

    Если x0, x1 – приближенные значения корня уравнения f(x) = 0 и выполняется условие
    f(a)f(b)
    то последующие приближения находят по формуле
    Метод хорд
    Методом хорд называют также метод, при котором один из концов отрезка закреплен, т.е. вычисление приближения корня уравнения f(x) = 0 производят по формулам:
    Метод секущих
    Геометрическая интерпретация метода хорд:
    Метод хорд
    Реализация на C++
    В отличие от двух рассмотренных выше методов, метод хорд предполагает наличие двух начальных приближений, представляющих собой концы отрезка, внутри которого располагается искомый корень.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    #define _USE_MATH_DEFINES
    #include <iostream>
    #include <cmath>
    using namespace std;
    double find(double x0, double x1, double eps)
    {
      double rez = x1, f0, f;
      int iter = 0;
      cout << “x0= ” << x0 << ” x1= ” << x1 << ” “;
      do {
        f = sin(M_PI*rez / 180) – 1 / rez;
        f0 = sin(M_PI*x0 / 180) – 1 / x0;
        rez = rez – f / (f – f0)*(rez – x0);
        iter++;
      } while (fabs(f) > eps && iter<20000);
      cout << iter << ” iterations” << endl;
      return rez;
    }
    int main() 
    {
      cout << find(1.0, 10.0, 0.000001);
      cin.get(); return 0;
    }

    Результат выполнения
    Реализация метода хорд

    Метод половинного деления (метод дихотомии)

    Если x0, x1 – приближенные значения корня уравнения f(x) = 0 и выполняется условие
    Метод половинного деления
    то последующие приближения находятся по формуле
    Метод дихотомии
    и вычисляется f(xi). Если f(xi)=0, то корень найден. В противном случае из отрезков выбирается тот, на концах которого f(x) принимает значения разных знаков, и проделывается аналогичная операция. Процесс продолжается до получения требуемой точности.

    Геометрическая интерпретация метода дихотомии
    Метод дихотомии
    Реализация на C++

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    #define _USE_MATH_DEFINES
    #include <iostream>
    #include <cmath>
    using namespace std;
    double func(double x)
    {
      return (sin(M_PI*x / 180) – 1 / x);
    }
    double find(double x0, double x1, double eps)
    {
      double left = x0, right = x1, x, fl, fr, f;
      int iter = 0;
      cout << “x0= ” << x0 << ” x1= ” << x1 << ” “;
      do {
        x = (left + right) / 2;
        f = func(x);
        if (f > 0) right = x;
        else left = x;
        iter++;
      } while (fabs(f) > eps && iter<20000);
      cout << iter << ” iterations” << endl;
      return x;
    }
    int main() 
    {
      cout << find(1.0, 10.0, 0.000001);
      cin.get(); return 0;
    }

    Результат выполнения
    Метод дихотомии
    Для численного поиска решения также можно использовать генетические алгоритмы.

    Назад: Алгоритмизация

    Добавить комментарий