Метод Ньютона
Инструкция . Введите выражение F(x) , нажмите Далее . Полученное решение сохраняется в файле Word . Также создается шаблон решения в Excel .
- Решение онлайн
- Видеоинструкция
- Оформление Word
Правила ввода функции, заданной в явном виде
- Примеры правильного написания F(x) :
- 10•x•e 2x = 10*x*exp(2*x)
- x•e -x +cos(3x) = x*exp(-x)+cos(3*x)
- x 3 -x 2 +3 = x^3-x^2+3
- Выражение 0.9*x=sin(x)+1 необходимо преобразовать к виду: sin(x)+1-0.9*x . Аналогично, x^2-7=5-3x к виду x^2+3x-12 .
Пусть дано уравнение f(x)=0 , где f(x) определено и непрерывно в некотором конечном или бесконечном интервале a ≤ x ≤ b . Всякое значение ξ, обращающее функцию f(x) в нуль, то есть такое, что f(ξ)=0 называется корнем уравнения или нулем функции f(x) . Число ξ называется корнем k -ой кратности, если при x = ξ вместе с функцией f(x) обращаются в нуль ее производные до (k-1) порядка включительно: f(ξ)=f’(ξ)= … =f k-1 (ξ) = 0 . Однократный корень называется простым.
Приближенное нахождение корней уравнения складывается из двух этапов:- Отделение корней, то есть установление интервалов [αi,βi] , в которых содержится один корень уравнения.
- f(a)•f(b) , т.е. значения функции на его концах имеют противоположные знаки.
- f’(x) сохраняет постоянный знак, т.е. функция монотонна (эти два условия достаточны, но НЕ необходимы) для единственности корня на искомом отрезке).
- f”(x) сохраняет постоянный знак, т.е. функция выпукла вверх, либо – вниз.
- Уточнение приближенных корней, то есть доведение их до заданной точности.
Геометрическая интерпретация метода Ньютона (метод касательных)
Критерий завершения итерационного процесса имеет вид
Метод Ньютона
Единственные требования, накладываемые на функцию $f$ — что у неё есть хотя бы один корень и что она непрерывна и дифференцируема на интервале поиска.
#Описание алгоритма
Алгоритм начинает с какого-то изначального приближения $x_0$ и затем итеративно строит лучшее решение, строя касательную к графику в точке $x = x_i$ и присваивая в качестве следующего приближения $x_$ координату пересечения касательной с осью $x$. Интуиция в том, что если функция $f$ «хорошая», и $x_i$ уже достаточно близок к корню, то $x_$ будет ещё ближе.
Чтобы получить точку пересечения для $x_i$, нужно приравнять уравнение касательной к нулю:
$$ 0 = f(x_i) + (x_ — x_i) f'(x_i) $$ откуда можно выразить $$ x_ = x_i — \frac
$$ Метод Ньютона крайне важен в вычислительной математике: в большинстве случаев именно он используется для нахождения численных решений уравнений.
#Поиск квадратных корней
В качестве конкретного примера рассмотрим задачу нахождения квадратных корней, которую можно переформулировать как решение следующего уравнения:
$$ x = \sqrt n \iff x^2 = n \iff f(x) = x^2 — n = 0 $$ Если в методе Ньютона подставим $f(x) = x^2 — n$, мы получим следующее правило: $$ x_ = x_i — \frac
<2 x_i>= \frac <2>$$ Если нам нужно посчитать корень с некоторой заданной точностью $\epsilon$, можно на каждой итерации делать соответствующую проверку:
Алгоритм успешно сходится к правильному ответу для многих функций, однако это происходит надежно и доказуемо только для определенного множества функций (например, выпуклых). Другой вопрос — как быстра эта сходимость, если она происходит.
#Скорость сходимости
Запустим метод Ньютона для поиска квадратного корня $2$, начиная с $x_0 = 1$, и посмотрим, сколько первых цифр оказались правильными после каждой итерации:
Можно заметить, что число корректных цифр примерно удваивается после каждой итерации. Такая прекрасная скорость сходимости не просто совпадение.
Чтобы оценить скорость сходимости численно, рассмотрим небольшую относительную ошибку $\delta_i$ на $i$-ой итерации и посмотрим, насколько меньше станет ошибка $\delta_$ на следующей итерации.
$$ |\delta_i| = \frac<|x_n - x|>
$$ В терминах относительных ошибок, мы можем выразить $x_i$ как $x \cdot (1 + \delta_i)$. Подставляя это выражение в формулу для следующей итерации и деля обе стороны на $x$ получаем $$ 1 + \delta_ = \frac<1> <2>(1 + \delta_i + \frac<1><1 + \delta_i>) = \frac<1> <2>(1 + \delta_i + 1 — \delta_i + \delta_i^2 + o(\delta_i^2)) = 1 + \frac<\delta_i^2> <2>+ o(\delta_i^2) $$ Здесь мы разложили $(1 + \delta_i)^<-1>$ в ряд Тейлора в точке $0$, используя предположение что ошибка $d_i$ мала: так как последовательность $x_i$ сходится к $x$, то $d_i \ll 1$ для достаточно больших $n$.
Наконец, выражая $\delta_$, получаем
что означает, что относительная ошибка примерно возводится в квадрат и делится пополам на каждой итерации, когда мы уже близки к решению. Так как логарифм $(- \log_ <10>\delta_i)$ примерно равен числу правильных значимых цифр числа $x_i$, возведение ошибки в квадрат соответствует удвоению значимых цифр ответа, что мы и наблюдали ранее.
Это свойство называется квадратичной сходимостью, и оно относится не только к нахождению квадратных корней. Оставляя формальное доказательство в качестве упражнения, можно показать, что в общем случае
$$ |\delta_| = \frac<|f''(x_i)|> <2 \cdot |f'(x_n)|>\cdot \delta_i^2 $$ что означает хотя бы квадратичную сходимость при нескольких дополнительных предположениях, а именно что $f'(x)$ не равна нулю и $f»(x)$ непрерывна.
Нелинейные системы и уравнения
В более общем случае мы имеем не одно уравнение (1), а систему нелинейных уравнений $$ \begin
\tag <2>f_i(x_1, x_2, \ldots, x_n) = 0, \quad i = 1, 2, \ldots n. \end $$ Обозначим через \( \mathbf = (x_1, x_2, \ldots, x_n) \) вектор неизвестных и определим вектор-функцию \( \mathbf (\mathbf ) = (f_1(\mathbf ), f_2(\mathbf ), \ldots, f_n(\mathbf )) \). Тогда система (2) записывается в виде $$ \begin \tag <3>\mathbf (\mathbf ) = 0. \end $$ Частным случаем (3) является уравнение (1) (\( n = 1 \)). Второй пример (3) — система линейных алгебраических уравнений, когда \( \mathbf (\mathbf ) = A \mathbf — \mathbf \). Метод Ньютона
Решение нелинейных уравнений
При итерационном решении уравнений (1), (3) задается некоторое начальное приближение, достаточно близкое к искомому решению \( x^* \). В одношаговых итерационных методах новое приближение \( x_
\) определяется по предыдущему приближению \( x_k \). Говорят, что итерационный метод сходится с линейной скоростью, если \( x_ — x^* = O(x_k — x^*) \) и итерационный метод имеет квадратичную сходимость, если \( x_ — x^* = O(x_k — x^*)^2 \). В итерационном методе Ньютона (методе касательных) для нового приближения имеем $$ \begin
\tag <4>x_ = x_k + \frac , \quad k = 0, 1, \ldots, \end $$ Вычисления по (4) проводятся до тех пор, пока \( f(x_k) \) не станет близким к нулю. Более точно, до тех пор, пока \( |f_(x_k)| > \varepsilon \), где \( \varepsilon \) — малая величина.
Простейшая реализация метода Ньютона может выглядеть следующим образом:
Чтобы найти корень уравнения \( x^2 = 9 \) необходимо реализовать функции
Данная функция хорошо работает для приведенного примера. Однако, в общем случае могут возникать некоторые ошибки, которые нужно отлавливать. Например: пусть нужно решить уравнение \( \tanh(x) = 0 \), точное решение которого \( x = 0 \). Если \( |x_0| \leq 1.08 \), то метод сходится за шесть итераций.
Теперь зададим \( x_0 \) близким к \( 1.09 \). Возникнет переполнение
Возникнет деление на ноль, так как для \( x_7 = -126055892892.66042 \) значение \( \tanh(x_7) \) при машинном округлении равно \( 1.0 \) и поэтому \( f^\prime(x_7) = 1 — \tanh(x_7)^2 \) становится равной нулю в знаменателе.
Проблема заключается в том, что при таком начальном приближении метод Ньютона расходится.
Еще один недостаток функции naive_Newton заключается в том, что функция f(x) вызывается в два раза больше, чем необходимо.
Учитывая выше сказанное реализуем функцию с учетом следующего:
- обрабатывать деление на ноль
- задавать максимальное число итераций в случае расходимости метода
- убрать лишний вызов функции f(x)
Метод Ньютона сходится быстро, если начальное приближение близко к решению. Выбор начального приближение влияет не только на скорость сходимости, но и на сходимость вообще. Т.е. при неправильном выборе начального приближения метод Ньютона может расходиться. Неплохой стратегией в случае, когда начальное приближение далеко от точного решения, может быть использование нескольких итераций по методу бисекций, а затем использовать метод Ньютона.
При реализации метода Ньютона нужно знать аналитическое выражение для производной \( f^\prime(x) \). Python содержит пакет SymPy, который можно использовать для создания функции dfdx . Для нашей задачи это можно реализовать следующим образом:
Решение нелинейных систем
Идея метода Ньютона для приближенного решения системы (2) заключается в следующем: имея некоторое приближение \( \pmb
^ <(k)>\), мы находим следующее приближение \( \pmb ^ <(k+1)>\), аппроксимируя \( \pmb (\pmb ^<(k+1)>) \) линейным оператором и решая систему линейных алгебраических уравнений. Аппроксимируем нелинейную задачу \( \pmb (\pmb ^<(k+1)>) = 0 \) линейной $$ \begin \tag <5>\pmb (\pmb ^<(k)>) + \pmb (\pmb ^<(k)>)(\pmb ^ <(k+1)>— \pmb ^<(k)>) = 0, \end $$ где \( \pmb (\pmb ^<(k)>) \) — матрица Якоби (якобиан): $$ \pmb<\nabla F>(\pmb ^<(k)>) = \begin \frac<\partial f_1(\pmb ^<(k)>)> <\partial x_1>& \frac<\partial f_1(\pmb ^<(k)>)> <\partial x_2>& \ldots & \frac<\partial f_1(\pmb ^<(k)>)> <\partial x_n>\\ \frac<\partial f_2(\pmb ^<(k)>)> <\partial x_1>& \frac<\partial f_2(\pmb ^<(k)>)> <\partial x_2>& \ldots & \frac<\partial f_2(\pmb ^<(k)>)> <\partial x_n>\\ \vdots & \vdots & \ldots & \vdots \\ \frac<\partial f_n(\pmb ^<(k)>)> <\partial x_1>& \frac<\partial f_n(\pmb ^<(k)>)> <\partial x_2>& \ldots & \frac<\partial f_n(\pmb ^<(k)>)> <\partial x_n>\\ \end $$ Уравнение (5) является линейной системой с матрицей коэффициентов \( \pmb \) и вектором правой части \( -\pmb (\pmb ^<(k)>) \). Систему можно переписать в виде $$ \pmb (\pmb ^<(k)>)\pmb <\delta>= — \pmb (\pmb ^<(k)>), $$ где \( \pmb <\delta>= \pmb ^ <(k+1)>— \pmb ^ <(k)>\). Таким образом, \( k \)-я итерация метода Ньютона состоит из двух стадий:
1. Решается система линейных уравнений (СЛАУ) \( \pmb
(\pmb ^<(k)>)\pmb <\delta>= -\pmb (\pmb ^<(k)>) \) относительно \( \pmb <\delta>\). 2. Находится значение вектора на следующей итерации \( \pmb
^ <(k+1)>= \pmb ^ <(k)>+ \pmb <\delta>\). Для решения СЛАУ можно использовать приближенные методы. Можно также использовать метод Гаусса. Пакет numpy содержит модуль linalg , основанный на известной библиотеке LAPACK, в которой реализованы методы линейной алгебры. Инструкция x = numpy.linalg.solve(A, b) решает систему \( Ax = b \) методом Гаусса, реализованным в библиотеке LAPACK.
Когда система нелинейных уравнений возникает при решении задач для нелинейных уравнений в частных производных, матрица Якоби часто бывает разреженной. В этом случае целесообразно использовать специальные методы для разреженных матриц или итерационные методы.
Можно также воспользоваться методами, реализованными для систем линейных уравнений.
источники:http://ru.algorithmica.org/cs/numerical/newton/
http://slemeshevsky.github.io/num-mmf/snes/html/._snes-FlatUI001.html