Расчетная формула метода Ньютона имеет вид:
. Геометрически метод Ньютона означает, что следующее приближение к корню есть точка пересечения с осью ОХ касательной, проведенной к графику функции y=f(x) в точке .
Теорема о сходимости метода Ньютона. Пусть - простой корень уравнения , в некоторой окрестности которого функция дважды непрерывно дифференцируема. Тогда найдется такая малая - окрестность корня , что при произвольном выборе начального приближения из этой окрестности итерационная последовательность метода Ньютона не выходит за пределы окрестности и справедлива оценка
, где , .
Критерий окончания итерационного процесса. При заданной точности >0 вычисления следует вести до тех пор, пока не окажется выполненным неравенство .
ПРИМЕР 3. Решение уравнения методом Ньютона.
function ex3
% Решить уравнение f(x)=0, где где f(x)= x^3 - cos(x) + 1 методом Ньютона
% Введём функцию f(x)
f = inline('x.^3 - cos(x) + 1');
% Её производная
df = inline('3*x.^2 + sin(x)');
root1 = newton(f, df, -0.5);
% Проверим корни
f(root1)
root2 = newton(f, df, -0.1);
% Проверим корни
f(root2)
% Метод Ньютона
function root = newton(f, df, x0)
root = x0 - f(x0) / df(x0);
old_root = x0;
while abs(old_root - root) > 2 * eps
t = old_root;
old_root = root;
root = t - f(t) / df(t);
end
>>
ans = -9.5740e-005
ans = 8.3665e-004
Как указано в теореме, метод Ньютона обладает локальной сходимостью, то есть областью его сходимости является малая окрестность корня . Неудачный выбор может дать расходящуюся итерационную последовательность.
ПРИМЕР 4. Чувствительность метода Ньютона к выбору начального приближения.
function ex2
% Чувствительность метода Ньютона к выбору начальных значений.
% Введём функцию f(x)
syms x;
f = (x - 1.3) ./ ((x- 1.3).^2 + 1);
[root1, iter1] = newton(f, 1.87);
% Проверим корни
subs(f, root1)
[root2, iter2] = newton(f, 1.88);
% Проверим корни
subs(f, root2)
% Сравним число итераций
iter1
iter2
% Видим, что число итераций в первом случае намного меньше, чем во втором
% Метод Ньютона
function [root, iter] = newton(f, x0)
df = diff(f);
root = x0 - subs(f, x0) / subs(df, x0);
old_root = x0;
iter = 0;
while abs(subs(f, old_root)) > 10 * eps
t = old_root;
old_root = root;
root = t - subs(f, t) / subs(df, t);
iter = iter + 1;
if iter > 200
warning('Max number of iterations reached');
root = NaN;
return;
end
end
>>
ans = 0
ans = 1.1545e-015
iter1 = 13
iter2 = 103
>>
ans = 0
ans = 1.1545e-015
iter1 = 13
iter2 = 103